Remapped XInput to be the same as DirectInput buttons, so that

existing configs works as expected. Hard-coded 6 axis for xbox
controller to allow for triggers to be reported as two different
axis (instead of as one axis). Updated gamepad config to use
proper names for triggers.
This commit is contained in:
hiker 2017-08-06 22:56:59 +10:00
parent 68d41a07ba
commit 891e439264
2 changed files with 39 additions and 7 deletions

View File

@ -197,6 +197,11 @@ struct SJoystickWin32Control
activeJoystick.axisValid[i+caxis]=1;
}
// On Xbox 360 devices left and right trigger are reported as two
// different axes (instead of 1 with DirectInput), so we need one
// additional axis:
if (activeJoystick.m_use_xinput && activeJoystick.devcaps.dwAxes == 5)
activeJoystick.devcaps.dwAxes = 6;
ActiveJoysticks.push_back(activeJoystick);
}
@ -355,7 +360,36 @@ void pollJoysticks()
XINPUT_STATE state;
memset(&state, 0, sizeof(state));
DWORD result = XInputGetState(ActiveJoysticks[joystick].Index, &state);
event.JoystickEvent.ButtonStates = state.Gamepad.wButtons;
// XInput reports the buttons in a different order. So to keep
// old configs to work as expected, remap the buttons.
int abxy = (state.Gamepad.wButtons & (XINPUT_GAMEPAD_A |
XINPUT_GAMEPAD_B |
XINPUT_GAMEPAD_X |
XINPUT_GAMEPAD_Y )
) >> 12;
int shoulder = (state.Gamepad.wButtons & (XINPUT_GAMEPAD_LEFT_SHOULDER|
XINPUT_GAMEPAD_RIGHT_SHOULDER)
) >> 4;
int start = (state.Gamepad.wButtons & XINPUT_GAMEPAD_START) << 3;
int back = (state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK ) << 1;
event.JoystickEvent.ButtonStates = abxy | shoulder | start | back;
int angle = 65535;
if (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)
{
if (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) angle = 22500;
else if (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) angle = 13500;
else angle = 18000;
}
else if (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)
{
if (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) angle = 31500;
else if (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) angle = 4500;
else angle = 0;
}
else if (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) angle = 9000;
else if (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) angle = 27000;
event.JoystickEvent.POV = angle;
// Map the axis as they were previously, so existing configs
// still work as expected. The Y axis needs to be reversed:
// -32768 --> 32767, ..., 32767 --> -32768

View File

@ -236,10 +236,7 @@ core::stringw GamepadConfig::getBindingAsString(const PlayerAction action) const
// I18N: name of stick on gamepads
: _("Left thumb up");
// I18N: name of stick on gamepads
case 2: return (ad==Input::AD_POSITIVE) ? _("Left trigger")
// I18N: name of stick on gamepads
: _("Right trigger");
// I18N: name of stick on gamepads
case 2: return _("Left trigger"); // I18N: name of trigger on gamepads
case 3: return (ad==Input::AD_POSITIVE) ? _("Right thumb down")
// I18N: name of stick on gamepads
: _("Right thumb up");
@ -248,6 +245,7 @@ core::stringw GamepadConfig::getBindingAsString(const PlayerAction action) const
// I18N: name of stick on gamepads
: _("Right thumb left");
// I18N: name of buttons on gamepads
case 5: return _("Right trigger"); // I18N: name of trigger on gamepads
case Input::HAT_H_ID: return (ad == Input::AD_POSITIVE) ? _("DPad up")
// I18N: name of buttons on gamepads
: _("DPad down");