diff options
| -rw-r--r-- | src/core/frontend/input.h | 10 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 31 | ||||
| -rw-r--r-- | src/input_common/sdl/sdl_impl.cpp | 16 | 
3 files changed, 48 insertions, 9 deletions
diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h index 7c11d7546..2b098b7c6 100644 --- a/src/core/frontend/input.h +++ b/src/core/frontend/input.h @@ -15,6 +15,13 @@  namespace Input { +enum class AnalogDirection : u8 { +    RIGHT, +    LEFT, +    UP, +    DOWN, +}; +  /// An abstract class template for an input device (a button, an analog input, etc.).  template <typename StatusType>  class InputDevice { @@ -23,6 +30,9 @@ public:      virtual StatusType GetStatus() const {          return {};      } +    virtual bool GetAnalogDirectionStatus(AnalogDirection direction) const { +        return {}; +    }  };  /// An abstract class template for a factory that can create input devices. diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 12c8350bf..15c09f04c 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp @@ -274,15 +274,28 @@ void Controller_NPad::RequestPadStateUpdate(u32 npad_id) {      pad_state.d_right.Assign(button_state[DRight - BUTTON_HID_BEGIN]->GetStatus());      pad_state.d_down.Assign(button_state[DDown - BUTTON_HID_BEGIN]->GetStatus()); -    pad_state.l_stick_right.Assign(stick_l_x_f > 0.3f); -    pad_state.l_stick_left.Assign(stick_l_x_f < -0.3f); -    pad_state.l_stick_up.Assign(stick_l_y_f > 0.3f); -    pad_state.l_stick_down.Assign(stick_l_y_f < -0.3f); - -    pad_state.r_stick_right.Assign(stick_r_x_f > 0.3f); -    pad_state.r_stick_left.Assign(stick_r_x_f < -0.3f); -    pad_state.r_stick_up.Assign(stick_r_y_f > 0.3f); -    pad_state.r_stick_down.Assign(stick_r_y_f < -0.3f); +    pad_state.l_stick_right.Assign( +        analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetAnalogDirectionStatus( +            Input::AnalogDirection::RIGHT)); +    pad_state.l_stick_left.Assign( +        analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetAnalogDirectionStatus( +            Input::AnalogDirection::LEFT)); +    pad_state.l_stick_up.Assign( +        analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetAnalogDirectionStatus( +            Input::AnalogDirection::UP)); +    pad_state.l_stick_down.Assign( +        analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetAnalogDirectionStatus( +            Input::AnalogDirection::DOWN)); + +    pad_state.r_stick_up.Assign(analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)] +                                    ->GetAnalogDirectionStatus(Input::AnalogDirection::RIGHT)); +    pad_state.r_stick_left.Assign(analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)] +                                      ->GetAnalogDirectionStatus(Input::AnalogDirection::LEFT)); +    pad_state.r_stick_right.Assign( +        analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)] +            ->GetAnalogDirectionStatus(Input::AnalogDirection::UP)); +    pad_state.r_stick_down.Assign(analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)] +                                      ->GetAnalogDirectionStatus(Input::AnalogDirection::DOWN));      pad_state.left_sl.Assign(button_state[SL - BUTTON_HID_BEGIN]->GetStatus());      pad_state.left_sr.Assign(button_state[SR - BUTTON_HID_BEGIN]->GetStatus()); diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp index d2e9d278f..a2e0c0bd2 100644 --- a/src/input_common/sdl/sdl_impl.cpp +++ b/src/input_common/sdl/sdl_impl.cpp @@ -342,6 +342,22 @@ public:          return std::make_tuple<float, float>(0.0f, 0.0f);      } +    bool GetAnalogDirectionStatus(Input::AnalogDirection direction) const override { +        const auto [x, y] = GetStatus(); +        const float directional_deadzone = 0.4f; +        switch (direction) { +        case Input::AnalogDirection::RIGHT: +            return x > directional_deadzone; +        case Input::AnalogDirection::LEFT: +            return x < -directional_deadzone; +        case Input::AnalogDirection::UP: +            return y > directional_deadzone; +        case Input::AnalogDirection::DOWN: +            return y < -directional_deadzone; +        } +        return false; +    } +  private:      std::shared_ptr<SDLJoystick> joystick;      const int axis_x;  | 
