From 3171686814ecb314b0b874e37e448fad386b1f94 Mon Sep 17 00:00:00 2001 From: Ivan Vashchaev Date: Fri, 12 Feb 2016 20:53:24 +0300 Subject: [PATCH] Support SDL2 GameController API On OS X DualShock4 works perfectly --- neo/sys/sdl/sdl_events.cpp | 72 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index b2bcda23..3a474523 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -649,7 +649,26 @@ void Sys_InitInput() SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); #endif in_keyboard.SetModified(); - + +#if SDL_VERSION_ATLEAST(2, 0, 0) + // GameController + if (SDL_Init(SDL_INIT_GAMECONTROLLER)) + common->Printf("Sys_InitInput: SDL_INIT_GAMECONTROLLER error: %s\n", SDL_GetError()); + + SDL_GameController *controller = NULL; + for (int i = 0; i < SDL_NumJoysticks(); ++i) { + if (SDL_IsGameController(i)) { + controller = SDL_GameControllerOpen(i); + if (controller) { + common->Printf("GameController %i name: %s\n", i, SDL_GameControllerName(controller)); + common->Printf("GameController %i is mapped as \"%s\".\n", i, SDL_GameControllerMapping(controller)); + } else { + common->Printf("Could not open gamecontroller %i: %s\n", i, SDL_GetError()); + } + + } + } +#else // WM0110: Initialise SDL Joystick common->Printf( "Sys_InitInput: Joystick subsystem init\n" ); if( SDL_Init( SDL_INIT_JOYSTICK ) ) @@ -702,6 +721,7 @@ void Sys_InitInput() joy = NULL; } // WM0110 +#endif } /* @@ -1231,7 +1251,54 @@ sysEvent_t Sys_GetEvent() res.evValue2 = ev.button.state == SDL_PRESSED ? 1 : 0; return res; - + +#if SDL_VERSION_ATLEAST(2, 0, 0) + // GameController + case SDL_JOYAXISMOTION: + case SDL_JOYHATMOTION: + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + case SDL_JOYDEVICEADDED: + case SDL_JOYDEVICEREMOVED: + // Avoid 'unknown event' spam + continue; + + case SDL_CONTROLLERAXISMOTION: + res.evType = SE_JOYSTICK; + res.evValue = J_AXIS_LEFT_X + (ev.caxis.axis - SDL_CONTROLLER_AXIS_LEFTX); + res.evValue2 = ev.caxis.value; + + joystick_polls.Append(joystick_poll_t(res.evValue, res.evValue2)); + return res; + + case SDL_CONTROLLERBUTTONDOWN: + case SDL_CONTROLLERBUTTONUP: + static int controllerButtonRemap[][2] = { + {K_JOY1, J_ACTION1}, + {K_JOY2, J_ACTION2}, + {K_JOY3, J_ACTION3}, + {K_JOY4, J_ACTION4}, + {K_JOY9, J_ACTION9}, + {K_JOY11, J_ACTION11}, + {K_JOY10, J_ACTION10}, + {K_JOY7, J_ACTION7}, + {K_JOY8, J_ACTION8}, + {K_JOY5, J_ACTION5}, + {K_JOY6, J_ACTION6}, + {K_JOY_DPAD_UP, J_DPAD_UP}, + {K_JOY_DPAD_DOWN, J_DPAD_DOWN}, + {K_JOY_DPAD_LEFT, J_DPAD_LEFT}, + {K_JOY_DPAD_RIGHT, J_DPAD_RIGHT}, + }; + joystick_polls.Append(joystick_poll_t(controllerButtonRemap[ev.cbutton.button][1], ev.cbutton.state == SDL_PRESSED ? 1 : 0)); + + res.evType = SE_KEY; + res.evValue = controllerButtonRemap[ev.cbutton.button][0]; + res.evValue2 = ev.cbutton.state == SDL_PRESSED ? 1 : 0; + + joystick_polls.Append(joystick_poll_t(res.evValue, res.evValue2)); + return res; +#else // WM0110 // NOTE: it seems that the key bindings for the GUI and for the game are // totally independant. I think the event returned by this function seems to work @@ -1592,6 +1659,7 @@ sysEvent_t Sys_GetEvent() return res; // WM0110 +#endif case SDL_QUIT: PushConsoleEvent( "quit" );