From 3b36fdc3d2fa209357814159eddaa02b49760c1a Mon Sep 17 00:00:00 2001 From: raziel1000 Date: Mon, 24 Jun 2024 09:31:55 -0600 Subject: [PATCH] switched gamepad buttons and axis to event gbutton/gaxis instead and moved it to WindowSDL::waitEvent() (just testing for now) --- src/core/libraries/pad/pad.cpp | 52 +++++------------ src/input/controller.cpp | 62 -------------------- src/input/controller.h | 2 - src/sdl_window.cpp | 100 +++++++++++++++++++++++++++++++++ src/sdl_window.h | 2 + 5 files changed, 116 insertions(+), 102 deletions(-) diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index d6110703f..852192981 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -252,25 +252,13 @@ int PS4_SYSV_ABI scePadRead(s32 handle, OrbisPadData* pData, s32 num) { } bool kb = (Config::getControllerType() == 0); for (int i = 0; i < ret_num; i++) { - pData[i].buttons = kb ? states[i].buttonsState : controller->GetGamepadButtons(); - pData[i].leftStick.x = - kb ? states[i].axes[static_cast(Input::Axis::LeftX)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::LeftX)]; - pData[i].leftStick.y = - kb ? states[i].axes[static_cast(Input::Axis::LeftY)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::LeftY)]; - pData[i].rightStick.x = - kb ? states[i].axes[static_cast(Input::Axis::RightX)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::RightX)]; - pData[i].rightStick.y = - kb ? states[i].axes[static_cast(Input::Axis::RightY)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::RightY)]; - pData[i].analogButtons.l2 = - kb ? states[i].axes[static_cast(Input::Axis::TriggerLeft)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::TriggerLeft)]; - pData[i].analogButtons.r2 = - kb ? states[i].axes[static_cast(Input::Axis::TriggerRight)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::TriggerRight)]; + pData[i].buttons = states[i].buttonsState; + pData[i].leftStick.x = states[i].axes[static_cast(Input::Axis::LeftX)]; + pData[i].leftStick.y = states[i].axes[static_cast(Input::Axis::LeftY)]; + pData[i].rightStick.x = states[i].axes[static_cast(Input::Axis::RightX)]; + pData[i].rightStick.y = states[i].axes[static_cast(Input::Axis::RightY)]; + pData[i].analogButtons.l2 = states[i].axes[static_cast(Input::Axis::TriggerLeft)]; + pData[i].analogButtons.r2 = states[i].axes[static_cast(Input::Axis::TriggerRight)]; pData[i].orientation.x = 0.0f; pData[i].orientation.y = 0.0f; pData[i].orientation.z = 0.0f; @@ -325,25 +313,13 @@ int PS4_SYSV_ABI scePadReadState(s32 handle, OrbisPadData* pData) { Input::State state; bool kb = (Config::getControllerType() == 0); controller->ReadState(&state, &isConnected, &connectedCount); - pData->buttons = kb ? state.buttonsState : controller->GetGamepadButtons(); - pData->leftStick.x = - kb ? state.axes[static_cast(Input::Axis::LeftX)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::LeftX)]; - pData->leftStick.y = - kb ? state.axes[static_cast(Input::Axis::LeftY)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::LeftY)]; - pData->rightStick.x = - kb ? state.axes[static_cast(Input::Axis::RightX)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::RightX)]; - pData->rightStick.y = - kb ? state.axes[static_cast(Input::Axis::RightY)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::RightY)]; - pData->analogButtons.l2 = - kb ? state.axes[static_cast(Input::Axis::TriggerLeft)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::TriggerLeft)]; - pData->analogButtons.r2 = - kb ? state.axes[static_cast(Input::Axis::TriggerRight)] - : controller->GetGamePadAxis().axes[static_cast(Input::Axis::TriggerRight)]; + pData->buttons = state.buttonsState; + pData->leftStick.x = state.axes[static_cast(Input::Axis::LeftX)]; + pData->leftStick.y = state.axes[static_cast(Input::Axis::LeftY)]; + pData->rightStick.x = state.axes[static_cast(Input::Axis::RightX)]; + pData->rightStick.y = state.axes[static_cast(Input::Axis::RightY)]; + pData->analogButtons.l2 = state.axes[static_cast(Input::Axis::TriggerLeft)]; + pData->analogButtons.r2 = state.axes[static_cast(Input::Axis::TriggerRight)]; pData->orientation.x = 0; pData->orientation.y = 0; pData->orientation.z = 0; diff --git a/src/input/controller.cpp b/src/input/controller.cpp index 6dbb7b285..ef8adbac1 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -123,68 +123,6 @@ void GameController::InitGamePad() { gamepad = SDL_OpenGamepad(instance_id); } -u32 GameController::GetGamepadButtons() { - u32 buttons = 0; - if (gamepad) { - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_LEFT_STICK) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_L3) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_RIGHT_STICK) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_R3) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_START) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_OPTIONS) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_DPAD_UP) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_UP) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_DPAD_RIGHT) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_RIGHT) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_DPAD_DOWN) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_DOWN) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_DPAD_LEFT) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_LEFT) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_LEFT_SHOULDER) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_L1) - : 0; - buttons |= SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_LEFT_TRIGGER) - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_L2) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_R1) - : 0; - buttons |= SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER) - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_R2) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_NORTH) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_TRIANGLE) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_EAST) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_CIRCLE) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_SOUTH) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_CROSS) - : 0; - buttons |= SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_WEST) == SDL_PRESSED - ? (Libraries::Pad::OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_SQUARE) - : 0; - } - return buttons; -} - -State GameController::GetGamePadAxis() { - u8 lx = static_cast((SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_LEFTX) + 32768) / 257); - u8 ly = static_cast((SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_LEFTY) + 32768) / 257); - u8 rx = static_cast((SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_RIGHTX) + 32768) / 257); - u8 ry = static_cast((SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_RIGHTY) + 32768) / 257); - u8 lt = static_cast(SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_LEFT_TRIGGER)); - u8 rt = static_cast(SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER)); - return {0, 0, {lx, ly, rx, ry, lt, rt}}; -} - int GameController::GetRumble(u16 smallFreq, u16 bigFreq) { return SDL_RumbleGamepad(gamepad, smallFreq, bigFreq, -1); } diff --git a/src/input/controller.h b/src/input/controller.h index 8eb4bc0e0..15fb205a2 100644 --- a/src/input/controller.h +++ b/src/input/controller.h @@ -47,8 +47,6 @@ public: void Axis(int id, Input::Axis axis, int value); void InitGamePad(); - u32 GetGamepadButtons(); - State GetGamePadAxis(); int GetRumble(u16 smallFreq, u16 bigFreq); private: diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index b684dd7bb..c5c947af2 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -82,6 +82,15 @@ void WindowSDL::waitEvent() { case SDL_EVENT_KEY_UP: onKeyPress(&event); break; + case SDL_EVENT_GAMEPAD_BUTTON_DOWN: + case SDL_EVENT_GAMEPAD_BUTTON_UP: { + onGamePadPress(&event); + break; + } + case SDL_EVENT_GAMEPAD_AXIS_MOTION: { + onGamePadAxisMotion(&event); + break; + } case SDL_EVENT_QUIT: is_open = false; break; @@ -247,4 +256,95 @@ void WindowSDL::onKeyPress(const SDL_Event* event) { } } +void WindowSDL::onGamePadPress(const SDL_Event* event) { + using Libraries::Pad::OrbisPadButtonDataOffset; + + u32 button = 0; + switch (event->gbutton.button) { + case SDL_GAMEPAD_BUTTON_DPAD_UP: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_UP; + break; + case SDL_GAMEPAD_BUTTON_DPAD_DOWN: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_DOWN; + break; + case SDL_GAMEPAD_BUTTON_DPAD_LEFT: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_LEFT; + break; + case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_RIGHT; + break; + case SDL_GAMEPAD_BUTTON_NORTH: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_TRIANGLE; + break; + case SDL_GAMEPAD_BUTTON_SOUTH: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_CROSS; + break; + case SDL_GAMEPAD_BUTTON_EAST: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_CIRCLE; + break; + case SDL_GAMEPAD_BUTTON_WEST: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_SQUARE; + break; + case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_L1; + break; + case SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_R1; + break; + case SDL_GAMEPAD_BUTTON_LEFT_STICK: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_L3; + break; + case SDL_GAMEPAD_BUTTON_RIGHT_STICK: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_R3; + break; + } + + if (button != 0) { + controller->CheckButton(0, button, event->type == SDL_EVENT_GAMEPAD_BUTTON_DOWN); + } +} + +void WindowSDL::onGamePadAxisMotion(const SDL_Event* event) { + using Libraries::Pad::OrbisPadButtonDataOffset; + u32 button = 0; + Input::Axis axis = Input::Axis::AxisMax; + int ax = 0; + switch (event->gaxis.axis) { + case SDL_GAMEPAD_AXIS_LEFTX: + axis = Input::Axis::LeftX; + ax = ((event->gaxis.value + 32768) / 257); + break; + case SDL_GAMEPAD_AXIS_LEFTY: + axis = Input::Axis::LeftY; + ax = ((event->gaxis.value + 32768) / 257); + break; + case SDL_GAMEPAD_AXIS_RIGHTX: + axis = Input::Axis::RightX; + ax = ((event->gaxis.value + 32768) / 257); + break; + case SDL_GAMEPAD_AXIS_RIGHTY: + axis = Input::Axis::RightY; + ax = ((event->gaxis.value + 32768) / 257); + break; + case SDL_GAMEPAD_AXIS_LEFT_TRIGGER: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_L2; + axis = Input::Axis::TriggerLeft; + ax = ((event->gaxis.value + 32768) / 257); + break; + case SDL_GAMEPAD_AXIS_RIGHT_TRIGGER: + button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_L2; + axis = Input::Axis::TriggerRight; + ax = ((event->gaxis.value + 32768) / 257); + break; + } + + if (axis != Input::Axis::AxisMax) { + controller->Axis(0, axis, ax); + } + + if (button != 0) { + controller->CheckButton(0, button, event->type == SDL_EVENT_GAMEPAD_AXIS_MOTION); + } +} + } // namespace Frontend diff --git a/src/sdl_window.h b/src/sdl_window.h index 13ee78649..163424450 100644 --- a/src/sdl_window.h +++ b/src/sdl_window.h @@ -63,6 +63,8 @@ public: private: void onResize(); void onKeyPress(const SDL_Event* event); + void onGamePadPress(const SDL_Event* event); + void onGamePadAxisMotion(const SDL_Event* event); private: s32 width;