You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
5.4 KiB
173 lines
5.4 KiB
#include "controls/devices/game_controller.h" |
|
|
|
#ifndef USE_SDL1 |
|
#include "controls/controller_motion.h" |
|
#include "controls/devices/joystick.h" |
|
#include "stubs.h" |
|
|
|
namespace dvl { |
|
|
|
static SDL_GameController *current_game_controller = NULL; |
|
static bool sgbTriggerLeftDown = false; |
|
static bool sgbTriggerRightDown = false; |
|
|
|
ControllerButton GameControllerToControllerButton(const SDL_Event &event) |
|
{ |
|
switch (event.type) { |
|
case SDL_CONTROLLERAXISMOTION: |
|
switch (event.caxis.axis) { |
|
case SDL_CONTROLLER_AXIS_TRIGGERLEFT: |
|
if (event.caxis.value < 8192) { // 25% pressed |
|
sgbTriggerLeftDown = false; |
|
} |
|
if (event.caxis.value > 16384 && !sgbTriggerLeftDown) { // 50% pressed |
|
sgbTriggerLeftDown = true; |
|
return ControllerButton_AXIS_TRIGGERLEFT; |
|
} |
|
return ControllerButton_NONE; |
|
case SDL_CONTROLLER_AXIS_TRIGGERRIGHT: |
|
if (event.caxis.value < 8192) { // 25% pressed |
|
sgbTriggerRightDown = false; |
|
} |
|
if (event.caxis.value > 16384 && !sgbTriggerRightDown) { // 50% pressed |
|
sgbTriggerRightDown = true; |
|
return ControllerButton_AXIS_TRIGGERRIGHT; |
|
} |
|
return ControllerButton_NONE; |
|
} |
|
break; |
|
case SDL_CONTROLLERBUTTONDOWN: |
|
case SDL_CONTROLLERBUTTONUP: |
|
switch (event.cbutton.button) { |
|
case SDL_CONTROLLER_BUTTON_A: |
|
return ControllerButton_BUTTON_A; |
|
case SDL_CONTROLLER_BUTTON_B: |
|
return ControllerButton_BUTTON_B; |
|
case SDL_CONTROLLER_BUTTON_X: |
|
return ControllerButton_BUTTON_X; |
|
case SDL_CONTROLLER_BUTTON_Y: |
|
return ControllerButton_BUTTON_Y; |
|
case SDL_CONTROLLER_BUTTON_LEFTSTICK: |
|
return ControllerButton_BUTTON_LEFTSTICK; |
|
case SDL_CONTROLLER_BUTTON_RIGHTSTICK: |
|
return ControllerButton_BUTTON_RIGHTSTICK; |
|
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: |
|
return ControllerButton_BUTTON_LEFTSHOULDER; |
|
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: |
|
return ControllerButton_BUTTON_RIGHTSHOULDER; |
|
case SDL_CONTROLLER_BUTTON_START: |
|
return ControllerButton_BUTTON_START; |
|
case SDL_CONTROLLER_BUTTON_BACK: |
|
return ControllerButton_BUTTON_BACK; |
|
case SDL_CONTROLLER_BUTTON_DPAD_UP: |
|
return ControllerButton_BUTTON_DPAD_UP; |
|
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: |
|
return ControllerButton_BUTTON_DPAD_DOWN; |
|
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: |
|
return ControllerButton_BUTTON_DPAD_LEFT; |
|
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: |
|
return ControllerButton_BUTTON_DPAD_RIGHT; |
|
default: |
|
break; |
|
} |
|
default: |
|
break; |
|
} |
|
return ControllerButton_NONE; |
|
} |
|
|
|
namespace { |
|
|
|
SDL_GameControllerButton ControllerButtonToGameControllerButton(ControllerButton button) |
|
{ |
|
if (button == ControllerButton_AXIS_TRIGGERLEFT || button == ControllerButton_AXIS_TRIGGERRIGHT) |
|
UNIMPLEMENTED(); |
|
switch (button) { |
|
case ControllerButton_BUTTON_A: |
|
return SDL_CONTROLLER_BUTTON_A; |
|
case ControllerButton_BUTTON_B: |
|
return SDL_CONTROLLER_BUTTON_B; |
|
case ControllerButton_BUTTON_X: |
|
return SDL_CONTROLLER_BUTTON_X; |
|
case ControllerButton_BUTTON_Y: |
|
return SDL_CONTROLLER_BUTTON_Y; |
|
case ControllerButton_BUTTON_BACK: |
|
return SDL_CONTROLLER_BUTTON_BACK; |
|
case ControllerButton_BUTTON_START: |
|
return SDL_CONTROLLER_BUTTON_START; |
|
case ControllerButton_BUTTON_LEFTSTICK: |
|
return SDL_CONTROLLER_BUTTON_LEFTSTICK; |
|
case ControllerButton_BUTTON_RIGHTSTICK: |
|
return SDL_CONTROLLER_BUTTON_RIGHTSTICK; |
|
case ControllerButton_BUTTON_LEFTSHOULDER: |
|
return SDL_CONTROLLER_BUTTON_LEFTSHOULDER; |
|
case ControllerButton_BUTTON_RIGHTSHOULDER: |
|
return SDL_CONTROLLER_BUTTON_RIGHTSHOULDER; |
|
case ControllerButton_BUTTON_DPAD_UP: |
|
return SDL_CONTROLLER_BUTTON_DPAD_UP; |
|
case ControllerButton_BUTTON_DPAD_DOWN: |
|
return SDL_CONTROLLER_BUTTON_DPAD_DOWN; |
|
case ControllerButton_BUTTON_DPAD_LEFT: |
|
return SDL_CONTROLLER_BUTTON_DPAD_LEFT; |
|
case ControllerButton_BUTTON_DPAD_RIGHT: |
|
return SDL_CONTROLLER_BUTTON_DPAD_RIGHT; |
|
default: |
|
return SDL_CONTROLLER_BUTTON_INVALID; |
|
} |
|
} |
|
|
|
} // namespace |
|
|
|
bool IsGameControllerButtonPressed(ControllerButton button) |
|
{ |
|
if (current_game_controller == NULL) |
|
return false; |
|
const SDL_GameControllerButton gc_button = ControllerButtonToGameControllerButton(button); |
|
return gc_button != SDL_CONTROLLER_BUTTON_INVALID && SDL_GameControllerGetButton(current_game_controller, gc_button); |
|
} |
|
|
|
bool ProcessGameControllerAxisMotion(const SDL_Event &event) |
|
{ |
|
if (event.type != SDL_CONTROLLERAXISMOTION) |
|
return false; |
|
switch (event.caxis.axis) { |
|
case SDL_CONTROLLER_AXIS_LEFTX: |
|
leftStickXUnscaled = event.caxis.value; |
|
leftStickNeedsScaling = true; |
|
break; |
|
case SDL_CONTROLLER_AXIS_LEFTY: |
|
leftStickYUnscaled = -event.caxis.value; |
|
leftStickNeedsScaling = true; |
|
break; |
|
case SDL_CONTROLLER_AXIS_RIGHTX: |
|
rightStickXUnscaled = event.caxis.value; |
|
rightStickNeedsScaling = true; |
|
break; |
|
case SDL_CONTROLLER_AXIS_RIGHTY: |
|
rightStickYUnscaled = -event.caxis.value; |
|
rightStickNeedsScaling = true; |
|
break; |
|
default: |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
SDL_GameController *CurrentGameController() |
|
{ |
|
return current_game_controller; |
|
} |
|
|
|
void InitGameController() |
|
{ |
|
if (CurrentJoystickIndex() == -1) |
|
return; |
|
const SDL_JoystickGUID guid = SDL_JoystickGetGUID(CurrentJoystick()); |
|
SDL_Log("Opening gamepad %d: %s", CurrentJoystickIndex(), SDL_GameControllerMappingForGUID(guid)); |
|
current_game_controller = SDL_GameControllerOpen(CurrentJoystickIndex()); |
|
if (current_game_controller == NULL) |
|
SDL_Log(SDL_GetError()); |
|
} |
|
|
|
} // namespace dvl |
|
#endif
|
|
|