Browse Source

engine: platform: sdl: sanitize buttons/axes from SDL, add ABXY->BAYX swap for NSwitch

pull/2/head
Alibek Omarov 2 years ago
parent
commit
33c9f7118b
  1. 62
      engine/platform/sdl/events.c

62
engine/platform/sdl/events.c

@ -91,6 +91,34 @@ GNU General Public License for more details.
#define SDL_JoystickID Uint8 #define SDL_JoystickID Uint8
#endif #endif
static int SDLash_GameControllerButtonMapping[] =
{
#if XASH_NSWITCH // devkitPro/SDL has inverted Nintendo layout for SDL_GameController
K_B_BUTTON, K_A_BUTTON, K_Y_BUTTON, K_X_BUTTON,
#else
K_A_BUTTON, K_B_BUTTON, K_X_BUTTON, K_Y_BUTTON,
#endif
K_BACK_BUTTON, K_MODE_BUTTON, K_START_BUTTON,
K_LSTICK, K_RSTICK,
K_L1_BUTTON, K_R1_BUTTON,
K_DPAD_UP, K_DPAD_DOWN, K_DPAD_LEFT, K_DPAD_RIGHT,
K_MISC_BUTTON,
K_PADDLE1_BUTTON, K_PADDLE2_BUTTON, K_PADDLE3_BUTTON, K_PADDLE4_BUTTON,
K_TOUCHPAD,
};
// Swap axis to follow default axis binding:
// LeftX, LeftY, RightX, RightY, TriggerRight, TriggerLeft
static int SDLash_GameControllerAxisMapping[] =
{
JOY_AXIS_SIDE, // SDL_CONTROLLER_AXIS_LEFTX,
JOY_AXIS_FWD, // SDL_CONTROLLER_AXIS_LEFTY,
JOY_AXIS_PITCH, // SDL_CONTROLLER_AXIS_RIGHTX,
JOY_AXIS_YAW, // SDL_CONTROLLER_AXIS_RIGHTY,
JOY_AXIS_LT, // SDL_CONTROLLER_AXIS_TRIGGERLEFT,
JOY_AXIS_RT, // SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
};
static qboolean SDLash_IsInstanceIDAGameController( SDL_JoystickID joyId ) static qboolean SDLash_IsInstanceIDAGameController( SDL_JoystickID joyId )
{ {
#if !SDL_VERSION_ATLEAST( 2, 0, 4 ) #if !SDL_VERSION_ATLEAST( 2, 0, 4 )
@ -544,37 +572,27 @@ static void SDLash_EventFilter( SDL_Event *event )
/* GameController API */ /* GameController API */
case SDL_CONTROLLERAXISMOTION: case SDL_CONTROLLERAXISMOTION:
{ {
// Swap axis to follow default axis binding: if( !Joy_IsActive( ))
// LeftX, LeftY, RightX, RightY, TriggerRight, TriggerLeft break;
static int sdlControllerAxisToEngine[] =
if( event->caxis.axis >= 0 && event->caxis.axis < ARRAYSIZE( SDLash_GameControllerAxisMapping ))
{ {
JOY_AXIS_SIDE, // SDL_CONTROLLER_AXIS_LEFTX, Joy_KnownAxisMotionEvent( SDLash_GameControllerAxisMapping[event->caxis.axis], event->caxis.value );
JOY_AXIS_FWD, // SDL_CONTROLLER_AXIS_LEFTY, }
JOY_AXIS_PITCH, // SDL_CONTROLLER_AXIS_RIGHTX,
JOY_AXIS_YAW, // SDL_CONTROLLER_AXIS_RIGHTY,
JOY_AXIS_LT, // SDL_CONTROLLER_AXIS_TRIGGERLEFT,
JOY_AXIS_RT, // SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
};
if( Joy_IsActive() && event->caxis.axis != (Uint8)SDL_CONTROLLER_AXIS_INVALID )
Joy_KnownAxisMotionEvent( sdlControllerAxisToEngine[event->caxis.axis], event->caxis.value );
break; break;
} }
case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP: case SDL_CONTROLLERBUTTONUP:
{ {
static int sdlControllerButtonToEngine[] = if( !Joy_IsActive( ))
{ break;
K_A_BUTTON, K_B_BUTTON, K_X_BUTTON, K_Y_BUTTON,
K_BACK_BUTTON, K_MODE_BUTTON, K_START_BUTTON,
K_LSTICK, K_RSTICK,
K_L1_BUTTON, K_R1_BUTTON,
K_DPAD_UP, K_DPAD_DOWN, K_DPAD_LEFT, K_DPAD_RIGHT
};
// TODO: Use joyinput funcs, for future multiple gamepads support // TODO: Use joyinput funcs, for future multiple gamepads support
if( Joy_IsActive() && event->cbutton.button != (Uint8)SDL_CONTROLLER_BUTTON_INVALID ) if( event->cbutton.button >= 0 && event->cbutton.button < ARRAYSIZE( SDLash_GameControllerButtonMapping ))
Key_Event( sdlControllerButtonToEngine[event->cbutton.button], event->cbutton.state ); {
Key_Event( SDLash_GameControllerButtonMapping[event->cbutton.button], event->cbutton.state );
}
break; break;
} }

Loading…
Cancel
Save