citra-emu
/
citra
Archived
1
0
Fork 0

Merge pull request #4193 from B3n30/controller5

Joystick: Allow for background events; Add deadzone to SDLAnalog
This commit is contained in:
Weiyi Wang 2018-10-17 10:49:21 -04:00 committed by GitHub
commit 53a3498aee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 6 deletions

View File

@ -330,17 +330,24 @@ private:
class SDLAnalog final : public Input::AnalogDevice { class SDLAnalog final : public Input::AnalogDevice {
public: public:
SDLAnalog(std::shared_ptr<SDLJoystick> joystick_, int axis_x_, int axis_y_) SDLAnalog(std::shared_ptr<SDLJoystick> joystick_, int axis_x_, int axis_y_, float deadzone_)
: joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_) {} : joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_) {}
std::tuple<float, float> GetStatus() const override { std::tuple<float, float> GetStatus() const override {
return joystick->GetAnalog(axis_x, axis_y); const auto [x, y] = joystick->GetAnalog(axis_x, axis_y);
const float r = std::sqrt((x * x) + (y * y));
if (r > deadzone) {
return std::make_tuple(x / r * (r - deadzone) / (1 - deadzone),
y / r * (r - deadzone) / (1 - deadzone));
}
return std::make_tuple<float, float>(0.0f, 0.0f);
} }
private: private:
std::shared_ptr<SDLJoystick> joystick; std::shared_ptr<SDLJoystick> joystick;
int axis_x; const int axis_x;
int axis_y; const int axis_y;
const float deadzone;
}; };
/// A button device factory that creates button devices from SDL joystick /// A button device factory that creates button devices from SDL joystick
@ -435,13 +442,14 @@ public:
const int port = params.Get("port", 0); const int port = params.Get("port", 0);
const int axis_x = params.Get("axis_x", 0); const int axis_x = params.Get("axis_x", 0);
const int axis_y = params.Get("axis_y", 1); const int axis_y = params.Get("axis_y", 1);
float deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, .99f);
auto joystick = state.GetSDLJoystickByGUID(guid, port); auto joystick = state.GetSDLJoystickByGUID(guid, port);
// This is necessary so accessing GetAxis with axis_x and axis_y won't crash // This is necessary so accessing GetAxis with axis_x and axis_y won't crash
joystick->SetAxis(axis_x, 0); joystick->SetAxis(axis_x, 0);
joystick->SetAxis(axis_y, 0); joystick->SetAxis(axis_y, 0);
return std::make_unique<SDLAnalog>(joystick, axis_x, axis_y); return std::make_unique<SDLAnalog>(joystick, axis_x, axis_y, deadzone);
} }
private: private:
@ -459,6 +467,9 @@ SDLState::SDLState() {
LOG_CRITICAL(Input, "SDL_Init(SDL_INIT_JOYSTICK) failed with: {}", SDL_GetError()); LOG_CRITICAL(Input, "SDL_Init(SDL_INIT_JOYSTICK) failed with: {}", SDL_GetError());
return; return;
} }
if (SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1") == SDL_FALSE) {
LOG_ERROR(Input, "Failed to set Hint for background events", SDL_GetError());
}
SDL_AddEventWatch(&SDLEventWatcher, this); SDL_AddEventWatch(&SDLEventWatcher, this);