From fe1d465b852b18b4d0f4f60fbd50bd35965f3df4 Mon Sep 17 00:00:00 2001 From: Andrew O'Connor Date: Sun, 27 Jul 2014 14:54:36 +0100 Subject: [PATCH] [Input][SDL] Fix JoystickHat bugs On SDL, DPad inputs were not correctly translated from joystick hat inputs. Updated MappedGamePadDriver so that it will correctly recognize combined joystick hat directions e.g. DPadLeft should be true when DownLeft, Left, or UpLeft are returned from the joystick hat. --- Source/OpenTK/Platform/MappedGamePadDriver.cs | 21 ++++++++++++++++++- Source/OpenTK/Platform/SDL2/Sdl2.cs | 4 ++-- .../Platform/SDL2/Sdl2JoystickDriver.cs | 16 +++++++------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/Source/OpenTK/Platform/MappedGamePadDriver.cs b/Source/OpenTK/Platform/MappedGamePadDriver.cs index e6902af2..2b8b313c 100644 --- a/Source/OpenTK/Platform/MappedGamePadDriver.cs +++ b/Source/OpenTK/Platform/MappedGamePadDriver.cs @@ -122,7 +122,26 @@ namespace OpenTK.Platform { // JoystickHat -> Buttons/GamePadAxes mapping JoystickHat source_hat = map.Source.Hat; - bool pressed = joy.GetHat(source_hat).Position == map.Source.HatPosition; + + bool pressed = false; + switch (map.Source.HatPosition) + { + case HatPosition.Down: + pressed = joy.GetHat(source_hat).IsDown; + break; + + case HatPosition.Up: + pressed = joy.GetHat(source_hat).IsUp; + break; + + case HatPosition.Left: + pressed = joy.GetHat(source_hat).IsLeft; + break; + + case HatPosition.Right: + pressed = joy.GetHat(source_hat).IsRight; + break; + } switch (map.Target.Type) { diff --git a/Source/OpenTK/Platform/SDL2/Sdl2.cs b/Source/OpenTK/Platform/SDL2/Sdl2.cs index 2a9bba15..53418e44 100644 --- a/Source/OpenTK/Platform/SDL2/Sdl2.cs +++ b/Source/OpenTK/Platform/SDL2/Sdl2.cs @@ -753,8 +753,8 @@ namespace OpenTK.Platform.SDL2 Centered = 0x00, Up = 0x01, Right = 0x02, - Down = 0x03, - Left = 0x04, + Down = 0x04, + Left = 0x08, RightUp = Right | Up, RightDown = Right | Down, LeftUp = Left | Up, diff --git a/Source/OpenTK/Platform/SDL2/Sdl2JoystickDriver.cs b/Source/OpenTK/Platform/SDL2/Sdl2JoystickDriver.cs index 41726c62..32d8a59f 100644 --- a/Source/OpenTK/Platform/SDL2/Sdl2JoystickDriver.cs +++ b/Source/OpenTK/Platform/SDL2/Sdl2JoystickDriver.cs @@ -127,28 +127,28 @@ namespace OpenTK.Platform.SDL2 OpenTK.Input.HatPosition TranslateHat(HatPosition value) { - if ((value & HatPosition.LeftUp) == value) + if ((value & HatPosition.LeftUp) == HatPosition.LeftUp) return OpenTK.Input.HatPosition.UpLeft; - if ((value & HatPosition.RightUp) == value) + if ((value & HatPosition.RightUp) == HatPosition.RightUp) return OpenTK.Input.HatPosition.UpRight; - if ((value & HatPosition.LeftDown) == value) + if ((value & HatPosition.LeftDown) == HatPosition.LeftDown) return OpenTK.Input.HatPosition.DownLeft; - if ((value & HatPosition.RightDown) == value) + if ((value & HatPosition.RightDown) == HatPosition.RightDown) return OpenTK.Input.HatPosition.DownRight; - if ((value & HatPosition.Up) == value) + if ((value & HatPosition.Up) == HatPosition.Up) return OpenTK.Input.HatPosition.Up; - if ((value & HatPosition.Right) == value) + if ((value & HatPosition.Right) == HatPosition.Right) return OpenTK.Input.HatPosition.Right; - if ((value & HatPosition.Down) == value) + if ((value & HatPosition.Down) == HatPosition.Down) return OpenTK.Input.HatPosition.Down; - if ((value & HatPosition.Left) == value) + if ((value & HatPosition.Left) == HatPosition.Left) return OpenTK.Input.HatPosition.Left; return OpenTK.Input.HatPosition.Centered; -- 2.34.1