From ba29985151b1c95703a60aaa7d1e1a5956ffb468 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 25 Apr 2025 20:20:25 +0200 Subject: [PATCH] This time for sure --- src/input/controller.cpp | 17 +++++++++++++---- src/input/controller.h | 3 +++ src/input/input_handler.cpp | 12 ++---------- src/input/input_handler.h | 2 -- src/sdl_window.cpp | 22 ++++++++++++---------- 5 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/input/controller.cpp b/src/input/controller.cpp index 41e35eaaf..dd98ec2e6 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "common/config.h" #include "common/logging/log.h" #include "core/libraries/kernel/time.h" @@ -287,10 +288,7 @@ void GameControllers::TryOpenSDLControllers(GameControllers& controllers) { controllers[i]->m_sdl_gamepad = pad; controllers[i]->user_id = i + 1; slot_taken[i] = true; - bool err = SDL_SetGamepadPlayerIndex(pad, i); - if (!err) { - LOG_ERROR(Input, "Failed to set controller index: {}", SDL_GetError()); - } + controllers[i]->player_index = i; AddUserServiceEvent( {OrbisUserServiceEventType::Login, SDL_GetGamepadPlayerIndex(pad) + 1}); @@ -347,4 +345,15 @@ u32 GameController::Poll() { return 100; } +u8 GameControllers::GetGamepadIndexFromJoystickId(SDL_JoystickID id) { + auto& controllers = *Common::Singleton::Instance(); + auto gamepad = SDL_GetGamepadFromID(id); + for (int i = 0; i < 4; i++) { + if (controllers[i]->m_sdl_gamepad == gamepad) { + return controllers[i]->player_index; + } + } + UNREACHABLE_MSG("Gamepad not registered!"); +} + } // namespace Input diff --git a/src/input/controller.h b/src/input/controller.h index a33c3ce60..b62c9e05f 100644 --- a/src/input/controller.h +++ b/src/input/controller.h @@ -4,6 +4,7 @@ #pragma once #include +#include "SDL3/SDL_joystick.h" #include "common/assert.h" #include "common/types.h" #include "core/libraries/pad/pad.h" @@ -89,6 +90,7 @@ private: std::array m_private; SDL_Gamepad* m_sdl_gamepad = nullptr; + u8 player_index = -1; }; class GameControllers { @@ -106,6 +108,7 @@ public: return controllers[i]; } static void TryOpenSDLControllers(GameControllers& controllers); + static u8 GetGamepadIndexFromJoystickId(SDL_JoystickID id); }; } // namespace Input diff --git a/src/input/input_handler.cpp b/src/input/input_handler.cpp index ba7686a95..c6f8120d2 100644 --- a/src/input/input_handler.cpp +++ b/src/input/input_handler.cpp @@ -468,11 +468,11 @@ InputEvent InputBinding::GetInputEventFromSDLEvent(const SDL_Event& e) { e.type == SDL_EVENT_MOUSE_WHEEL, 0); case SDL_EVENT_GAMEPAD_BUTTON_DOWN: case SDL_EVENT_GAMEPAD_BUTTON_UP: - gamepad = GetGamepadIndexFromJoystickId(e.gbutton.which); + gamepad = GameControllers::GetGamepadIndexFromJoystickId(e.gbutton.which) + 1; return InputEvent({InputType::Controller, (u32)e.gbutton.button, gamepad}, e.gbutton.down, 0); case SDL_EVENT_GAMEPAD_AXIS_MOTION: - gamepad = GetGamepadIndexFromJoystickId(e.gaxis.which); + gamepad = GameControllers::GetGamepadIndexFromJoystickId(e.gaxis.which) + 1; return InputEvent({InputType::Axis, (u32)e.gaxis.axis, gamepad}, true, e.gaxis.value / 256); default: return InputEvent(); @@ -753,12 +753,4 @@ void ActivateOutputsFromInputs() { } } -u8 GetGamepadIndexFromJoystickId(SDL_JoystickID id) { - u8 index = SDL_GetGamepadPlayerIndex(SDL_GetGamepadFromID(id)); - if (index > 3) [[unlikely]] { - UNREACHABLE_MSG("Index out of bounds: {}", index); - } - return index; -} - } // namespace Input diff --git a/src/input/input_handler.h b/src/input/input_handler.h index 3484ab446..173fb341c 100644 --- a/src/input/input_handler.h +++ b/src/input/input_handler.h @@ -471,6 +471,4 @@ bool UpdatePressedKeys(InputEvent event); void ActivateOutputsFromInputs(); -u8 GetGamepadIndexFromJoystickId(SDL_JoystickID id); - } // namespace Input diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index cf2d101ae..3f4723da9 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -191,7 +191,8 @@ void WindowSDL::WaitEvent() { OnGamepadEvent(&event); break; case SDL_EVENT_GAMEPAD_SENSOR_UPDATE: { - int controller_id = Input::GetGamepadIndexFromJoystickId(event.gsensor.which); + int controller_id = + Input::GameControllers::GetGamepadIndexFromJoystickId(event.gsensor.which); switch ((SDL_SensorType)event.gsensor.sensor) { case SDL_SENSOR_GYRO: controllers[controller_id]->Gyro(0, event.gsensor.data); @@ -354,8 +355,8 @@ void WindowSDL::OnGamepadEvent(const SDL_Event* event) { // as it would break the entire touchpad handling // You can still bind other things to it though if (event->gbutton.button == SDL_GAMEPAD_BUTTON_TOUCHPAD) { - controllers[Input::GetGamepadIndexFromJoystickId(event->gbutton.which)]->CheckButton( - 0, OrbisPadButtonDataOffset::TouchPad, input_down); + controllers[Input::GameControllers::GetGamepadIndexFromJoystickId(event->gbutton.which)] + ->CheckButton(0, OrbisPadButtonDataOffset::TouchPad, input_down); return; } @@ -363,12 +364,12 @@ void WindowSDL::OnGamepadEvent(const SDL_Event* event) { case SDL_EVENT_GAMEPAD_SENSOR_UPDATE: switch ((SDL_SensorType)event->gsensor.sensor) { case SDL_SENSOR_GYRO: - controllers[Input::GetGamepadIndexFromJoystickId(event->gsensor.which)]->Gyro( - 0, event->gsensor.data); + controllers[Input::GameControllers::GetGamepadIndexFromJoystickId(event->gsensor.which)] + ->Gyro(0, event->gsensor.data); break; case SDL_SENSOR_ACCEL: - controllers[Input::GetGamepadIndexFromJoystickId(event->gsensor.which)]->Acceleration( - 0, event->gsensor.data); + controllers[Input::GameControllers::GetGamepadIndexFromJoystickId(event->gsensor.which)] + ->Acceleration(0, event->gsensor.data); break; default: break; @@ -377,9 +378,10 @@ void WindowSDL::OnGamepadEvent(const SDL_Event* event) { case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: case SDL_EVENT_GAMEPAD_TOUCHPAD_UP: case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: - controllers[Input::GetGamepadIndexFromJoystickId(event->gtouchpad.which)]->SetTouchpadState( - event->gtouchpad.finger, event->type != SDL_EVENT_GAMEPAD_TOUCHPAD_UP, - event->gtouchpad.x, event->gtouchpad.y); + controllers[Input::GameControllers::GetGamepadIndexFromJoystickId(event->gtouchpad.which)] + ->SetTouchpadState(event->gtouchpad.finger, + event->type != SDL_EVENT_GAMEPAD_TOUCHPAD_UP, event->gtouchpad.x, + event->gtouchpad.y); return; default: break;