input_common: Rewrite sdl analog mapping

This commit is contained in:
german77 2021-05-14 21:17:08 -05:00
parent 904584e4ba
commit 85eeae7aad
1 changed files with 25 additions and 25 deletions

View File

@ -1168,51 +1168,51 @@ public:
void Start(const std::string& device_id) override {
SDLPoller::Start(device_id);
// Reset stored axes
analog_x_axis = -1;
analog_y_axis = -1;
first_axis = -1;
}
Common::ParamPackage GetNextInput() override {
SDL_Event event;
while (state.event_queue.Pop(event)) {
// Filter out axis events that are below a threshold
if (event.type == SDL_JOYAXISMOTION && std::abs(event.jaxis.value / 32767.0) < 0.5) {
continue;
}
if (event.type == SDL_JOYAXISMOTION) {
const auto axis = event.jaxis.axis;
// In order to return a complete analog param, we need inputs for both axes.
// First we take the x-axis (horizontal) input, then the y-axis (vertical) input.
if (analog_x_axis == -1) {
analog_x_axis = axis;
} else if (analog_y_axis == -1 && analog_x_axis != axis) {
analog_y_axis = axis;
}
} else {
// If the press wasn't accepted as a joy axis, check for a button press
if (event.type != SDL_JOYAXISMOTION) {
// Check for a button press
auto button_press = button_poller.FromEvent(event);
if (button_press) {
return *button_press;
}
continue;
}
const auto axis = event.jaxis.axis;
// Filter out axis events that are below a threshold
if (std::abs(event.jaxis.value / 32767.0) < 0.5) {
continue;
}
// Filter out axis events that are the same
if (first_axis == axis) {
continue;
}
// In order to return a complete analog param, we need inputs for both axes.
// If the first axis isn't set we set the value then wait till next event
if (first_axis == -1) {
first_axis = axis;
continue;
}
}
if (analog_x_axis != -1 && analog_y_axis != -1) {
if (const auto joystick = state.GetSDLJoystickBySDLID(event.jaxis.which)) {
auto params = BuildParamPackageForAnalog(joystick->GetPort(), joystick->GetGUID(),
analog_x_axis, analog_y_axis);
analog_x_axis = -1;
analog_y_axis = -1;
first_axis, axis);
first_axis = -1;
return params;
}
}
return {};
}
private:
int analog_x_axis = -1;
int analog_y_axis = -1;
int first_axis = -1;
SDLButtonPoller button_poller;
};
} // namespace Polling