[Win] Correct XInput axes/button/hat mapping

This commit is contained in:
thefiddler 2014-08-01 00:42:39 +02:00
parent f81046f27d
commit 1e5b2e57cd

View file

@ -60,31 +60,62 @@ namespace OpenTK.Platform.Windows
state.SetAxis(JoystickAxis.Axis0, xstate.GamePad.ThumbLX); state.SetAxis(JoystickAxis.Axis0, xstate.GamePad.ThumbLX);
state.SetAxis(JoystickAxis.Axis1, xstate.GamePad.ThumbLY); state.SetAxis(JoystickAxis.Axis1, xstate.GamePad.ThumbLY);
state.SetAxis(JoystickAxis.Axis2, xstate.GamePad.ThumbRX); state.SetAxis(JoystickAxis.Axis2, (short)Common.HidHelper.ScaleValue(xstate.GamePad.LeftTrigger, 0, byte.MaxValue, 0, short.MaxValue));
state.SetAxis(JoystickAxis.Axis3, xstate.GamePad.ThumbRY); state.SetAxis(JoystickAxis.Axis3, xstate.GamePad.ThumbRX);
state.SetAxis(JoystickAxis.Axis4, xstate.GamePad.LeftTrigger); state.SetAxis(JoystickAxis.Axis4, xstate.GamePad.ThumbRY);
state.SetAxis(JoystickAxis.Axis5, xstate.GamePad.RightTrigger); state.SetAxis(JoystickAxis.Axis5, (short)Common.HidHelper.ScaleValue(xstate.GamePad.RightTrigger, 0, byte.MaxValue, 0, short.MaxValue));
state.SetButton(JoystickButton.Button0, (xstate.GamePad.Buttons & XInputButtons.DPadUp) != 0); state.SetButton(JoystickButton.Button0, (xstate.GamePad.Buttons & XInputButtons.A) != 0);
state.SetButton(JoystickButton.Button1, (xstate.GamePad.Buttons & XInputButtons.DPadDown) != 0); state.SetButton(JoystickButton.Button1, (xstate.GamePad.Buttons & XInputButtons.B) != 0);
state.SetButton(JoystickButton.Button2, (xstate.GamePad.Buttons & XInputButtons.DPadLeft) != 0); state.SetButton(JoystickButton.Button2, (xstate.GamePad.Buttons & XInputButtons.X) != 0);
state.SetButton(JoystickButton.Button3, (xstate.GamePad.Buttons & XInputButtons.DPadRight) != 0); state.SetButton(JoystickButton.Button3, (xstate.GamePad.Buttons & XInputButtons.Y) != 0);
state.SetButton(JoystickButton.Button4, (xstate.GamePad.Buttons & XInputButtons.Start) != 0); state.SetButton(JoystickButton.Button4, (xstate.GamePad.Buttons & XInputButtons.LeftShoulder) != 0);
state.SetButton(JoystickButton.Button5, (xstate.GamePad.Buttons & XInputButtons.Back) != 0); state.SetButton(JoystickButton.Button5, (xstate.GamePad.Buttons & XInputButtons.RightShoulder) != 0);
state.SetButton(JoystickButton.Button6, (xstate.GamePad.Buttons & XInputButtons.LeftThumb) != 0); state.SetButton(JoystickButton.Button6, (xstate.GamePad.Buttons & XInputButtons.Back) != 0);
state.SetButton(JoystickButton.Button7, (xstate.GamePad.Buttons & XInputButtons.RightThumb) != 0); state.SetButton(JoystickButton.Button7, (xstate.GamePad.Buttons & XInputButtons.Start) != 0);
state.SetButton(JoystickButton.Button8, (xstate.GamePad.Buttons & XInputButtons.LeftShoulder) != 0); state.SetButton(JoystickButton.Button8, (xstate.GamePad.Buttons & XInputButtons.LeftThumb) != 0);
state.SetButton(JoystickButton.Button9, (xstate.GamePad.Buttons & XInputButtons.RightShoulder) != 0); state.SetButton(JoystickButton.Button9, (xstate.GamePad.Buttons & XInputButtons.RightThumb) != 0);
state.SetButton(JoystickButton.Button10, (xstate.GamePad.Buttons & XInputButtons.A) != 0); state.SetButton(JoystickButton.Button10, (xstate.GamePad.Buttons & XInputButtons.Guide) != 0);
state.SetButton(JoystickButton.Button11, (xstate.GamePad.Buttons & XInputButtons.B) != 0);
state.SetButton(JoystickButton.Button12, (xstate.GamePad.Buttons & XInputButtons.X) != 0); state.SetHat(JoystickHat.Hat0, new JoystickHatState(TranslateHat(xstate.GamePad.Buttons)));
state.SetButton(JoystickButton.Button13, (xstate.GamePad.Buttons & XInputButtons.Y) != 0);
state.SetButton(JoystickButton.Button14, (xstate.GamePad.Buttons & XInputButtons.Guide) != 0);
} }
return state; return state;
} }
private HatPosition TranslateHat(XInputButtons buttons)
{
XInputButtons dir = 0;
dir =XInputButtons.DPadUp | XInputButtons.DPadLeft;
if ((buttons & dir) == dir)
return HatPosition.UpLeft;
dir = XInputButtons.DPadUp | XInputButtons.DPadRight;
if ((buttons & dir) == dir)
return HatPosition.UpRight;
dir = XInputButtons.DPadDown | XInputButtons.DPadLeft;
if ((buttons & dir) == dir)
return HatPosition.DownLeft;
dir = XInputButtons.DPadDown | XInputButtons.DPadRight;
if ((buttons & dir) == dir)
return HatPosition.DownRight;
dir = XInputButtons.DPadUp;
if ((buttons & dir) == dir)
return HatPosition.Up;
dir = XInputButtons.DPadRight;
if ((buttons & dir) == dir)
return HatPosition.Right;
dir = XInputButtons.DPadDown;
if ((buttons & dir) == dir)
return HatPosition.Down;
dir = XInputButtons.DPadLeft;
if ((buttons & dir) == dir)
return HatPosition.Left;
return HatPosition.Centered;
}
public JoystickCapabilities GetCapabilities(int index) public JoystickCapabilities GetCapabilities(int index)
{ {
XInputDeviceCapabilities xcaps; XInputDeviceCapabilities xcaps;