From ba1b6e4fa1f9cec5e15d0ff52257007a92fecc5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Sat, 17 Jul 2021 21:26:02 +0700 Subject: [PATCH] Use GLFW pad bindings (#450) * Unhardcode some input vars * Use GLFW pad mappings * Remove unused types * Clean --- input/binds_darwin.go | 133 ---------------------------------------- input/binds_joypad.go | 28 +++++++++ input/binds_linux.go | 136 ----------------------------------------- input/binds_windows.go | 111 --------------------------------- input/input.go | 113 +++++++++++++++------------------- 5 files changed, 77 insertions(+), 444 deletions(-) delete mode 100644 input/binds_darwin.go create mode 100644 input/binds_joypad.go delete mode 100644 input/binds_linux.go delete mode 100644 input/binds_windows.go diff --git a/input/binds_darwin.go b/input/binds_darwin.go deleted file mode 100644 index 4598e7fe..00000000 --- a/input/binds_darwin.go +++ /dev/null @@ -1,133 +0,0 @@ -package input - -import "github.com/libretro/ludo/libretro" - -var joyBinds = map[string]joybinds{ - "Xbox 360 Wired Controller": xbox360JoyBinds, - "Xbox One Wired Controller": xboxOneJoyBinds, - "Wireless Controller": ds4JoyBinds, - "DUALSHOCK 4 Wireless Controller": ds4JoyBinds, - "PLAYSTATION(R)3 Controller": ds3JoyBinds, - "8Bitdo NES30 Pro": nes30proJoyBinds, - "SFC30 Joystick": sfc30JoyBinds, -} - -// Joypad bindings fox Xbox 360 pad on OSX -var xbox360JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 10, 0, 0}: ActionMenuToggle, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 12, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadRight, - bind{axis, 2, 1, 0}: libretro.DeviceIDJoypadL2, - bind{axis, 5, 1, 0}: libretro.DeviceIDJoypadR2, -} - -// Joypad bindings fox Xbox One pad on OSX -var xboxOneJoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 10, 0, 0}: ActionMenuToggle, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 12, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadRight, - bind{axis, 2, 1, 0}: libretro.DeviceIDJoypadL2, - bind{axis, 5, 1, 0}: libretro.DeviceIDJoypadR2, -} - -// Joypad bindings fox DualShock 4 pad on OSX -var ds4JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL2, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR2, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 12, 0, 0}: ActionMenuToggle, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 15, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 16, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 17, 0, 0}: libretro.DeviceIDJoypadLeft, -} - -// Joypad bindings fox DualShock 3 pad on OSX -var ds3JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadL2, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadR2, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 12, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 15, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 16, 0, 0}: ActionMenuToggle, -} - -// Joypad bindings fox the 8BITDO NES30 PRO pad (Wired) on OSX -var nes30proJoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadL2, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadR2, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 15, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 16, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 17, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 18, 0, 0}: libretro.DeviceIDJoypadLeft, -} - -// Joypad bindings fox the 8BITDO SFC30 pad (Wired) on OSX -var sfc30JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadStart, - bind{axis, 0, -1, -0.5}: libretro.DeviceIDJoypadLeft, - bind{axis, 1, -1, -0.5}: libretro.DeviceIDJoypadUp, - bind{axis, 0, 1, 0.5}: libretro.DeviceIDJoypadRight, - bind{axis, 1, 1, 0.5}: libretro.DeviceIDJoypadDown, -} diff --git a/input/binds_joypad.go b/input/binds_joypad.go new file mode 100644 index 00000000..4a9cd52e --- /dev/null +++ b/input/binds_joypad.go @@ -0,0 +1,28 @@ +package input + +import ( + "github.com/go-gl/glfw/v3.3/glfw" + "github.com/libretro/ludo/libretro" +) + +var joyBinds = map[glfw.GamepadButton]uint32{ + glfw.ButtonDpadUp: libretro.DeviceIDJoypadUp, + glfw.ButtonDpadDown: libretro.DeviceIDJoypadDown, + glfw.ButtonDpadLeft: libretro.DeviceIDJoypadLeft, + glfw.ButtonDpadRight: libretro.DeviceIDJoypadRight, + + glfw.ButtonCircle: libretro.DeviceIDJoypadA, + glfw.ButtonCross: libretro.DeviceIDJoypadB, + glfw.ButtonSquare: libretro.DeviceIDJoypadY, + glfw.ButtonTriangle: libretro.DeviceIDJoypadX, + + glfw.ButtonLeftBumper: libretro.DeviceIDJoypadL, + glfw.ButtonRightBumper: libretro.DeviceIDJoypadR, + + glfw.ButtonLeftThumb: libretro.DeviceIDJoypadL3, + glfw.ButtonRightThumb: libretro.DeviceIDJoypadR3, + + glfw.ButtonStart: libretro.DeviceIDJoypadStart, + glfw.ButtonBack: libretro.DeviceIDJoypadSelect, + glfw.ButtonGuide: ActionMenuToggle, +} diff --git a/input/binds_linux.go b/input/binds_linux.go deleted file mode 100644 index c01b7cf7..00000000 --- a/input/binds_linux.go +++ /dev/null @@ -1,136 +0,0 @@ -package input - -import "github.com/libretro/ludo/libretro" - -var joyBinds = map[string]joybinds{ - "Microsoft X-Box 360 pad": xbox360JoyBinds, - "Microsoft X-Box One S pad": xboxOneJoyBinds, - "Sony Computer Entertainment Wireless Controller": ds4JoyBinds, - "Sony Interactive Entertainment Wireless Controller": ds4JoyBinds, - "Wireless Controller": ds4JoyBinds, - "Sony PLAYSTATION(R)3 Controller": ds3JoyBinds, - "SHANWAN PS3 GamePad": ds3JoyBinds, - "8Bitdo NES30 Pro 8Bitdo NES30 Pro": nes30proJoyBinds, - "SFC30 SFC30 Joystick": sfc30JoyBinds, - "SNES30 SNES30 Joy ": sfc30JoyBinds, -} - -// Joypad bindings fox Xbox360 pad on Linux -var xbox360JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 8, 0, 0}: ActionMenuToggle, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 11, 1, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 12, 1, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{axis, 2, 1, 0.5}: libretro.DeviceIDJoypadL2, - bind{axis, 5, 1, 0.5}: libretro.DeviceIDJoypadR2, -} - -// Joypad bindings fox Xbox One pad on Linux -var xboxOneJoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 8, 0, 0}: ActionMenuToggle, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 11, 1, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 12, 1, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{axis, 2, 1, 0.5}: libretro.DeviceIDJoypadL2, - bind{axis, 5, 1, 0.5}: libretro.DeviceIDJoypadR2, -} - -// Joypad bindings fox DualShock 4 pad on Linux -var ds4JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL2, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR2, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 10, 0, 0}: ActionMenuToggle, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 12, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 16, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 15, 0, 0}: libretro.DeviceIDJoypadDown, -} - -// Joypad bindings fox DualShock 3 pad on Linux -var ds3JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL2, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR2, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 10, 0, 0}: ActionMenuToggle, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 12, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 15, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{btn, 16, 0, 0}: libretro.DeviceIDJoypadRight, -} - -// Joypad bindings fox the 8BITDO NES30 PRO GamePad (Wired) on Linux -var nes30proJoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadL2, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadR2, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 17, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 18, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{btn, 16, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 15, 0, 0}: libretro.DeviceIDJoypadUp, -} - -// Joypad bindings fox the 8BITDO SFC30 pad (Wired) on Linux -var sfc30JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadStart, - bind{axis, 0, -1, -0.5}: libretro.DeviceIDJoypadLeft, - bind{axis, 1, -1, -0.5}: libretro.DeviceIDJoypadUp, - bind{axis, 0, 1, 0.5}: libretro.DeviceIDJoypadRight, - bind{axis, 1, 1, 0.5}: libretro.DeviceIDJoypadDown, -} diff --git a/input/binds_windows.go b/input/binds_windows.go deleted file mode 100644 index c550635e..00000000 --- a/input/binds_windows.go +++ /dev/null @@ -1,111 +0,0 @@ -package input - -import "github.com/libretro/ludo/libretro" - -var joyBinds = map[string]joybinds{ - "Microsoft X-Box 360 pad": xbox360JoyBinds, - "Xbox 360 Controller": xboxOneJoyBinds, - "Xbox Controller": xboxOneJoyBinds, - "Wireless Xbox Controller": xboxOneJoyBinds, - "Wireless Controller": ds4JoyBinds, - "PLAYSTATION(R)3 Controller": ds3JoyBinds, - "8Bitdo NES30 Pro": nes30proJoyBinds, - "SFC30 Joystick": sfc30JoyBinds, -} - -var xbox360JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 12, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{axis, 4, 1, 0}: libretro.DeviceIDJoypadL2, - bind{axis, 5, 1, 0}: libretro.DeviceIDJoypadL3, -} - -var xboxOneJoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 12, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{axis, 4, 1, 0}: libretro.DeviceIDJoypadL2, - bind{axis, 5, 1, 0}: libretro.DeviceIDJoypadL3, -} - -var ds4JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 2, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 5, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL2, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR2, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 12, 0, 0}: ActionMenuToggle, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadUp, - bind{btn, 15, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 16, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 17, 0, 0}: libretro.DeviceIDJoypadLeft, -} - -// Detected but doesn't send inputs -var ds3JoyBinds = joybinds{} - -// Joypad bindings fox the 8BITDO NES30 PRO GamePad (Wired) on Windows -var nes30proJoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 8, 0, 0}: libretro.DeviceIDJoypadL2, - bind{btn, 9, 0, 0}: libretro.DeviceIDJoypadR2, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadStart, - bind{btn, 13, 0, 0}: libretro.DeviceIDJoypadL3, - bind{btn, 14, 0, 0}: libretro.DeviceIDJoypadR3, - bind{btn, 17, 0, 0}: libretro.DeviceIDJoypadDown, - bind{btn, 18, 0, 0}: libretro.DeviceIDJoypadLeft, - bind{btn, 16, 0, 0}: libretro.DeviceIDJoypadRight, - bind{btn, 15, 0, 0}: libretro.DeviceIDJoypadUp, -} - -// Joypad bindings fox the 8BITDO SFC30 pad (Wired) on Windows -var sfc30JoyBinds = joybinds{ - bind{btn, 0, 0, 0}: libretro.DeviceIDJoypadA, - bind{btn, 1, 0, 0}: libretro.DeviceIDJoypadB, - bind{btn, 3, 0, 0}: libretro.DeviceIDJoypadX, - bind{btn, 4, 0, 0}: libretro.DeviceIDJoypadY, - bind{btn, 6, 0, 0}: libretro.DeviceIDJoypadL, - bind{btn, 7, 0, 0}: libretro.DeviceIDJoypadR, - bind{btn, 10, 0, 0}: libretro.DeviceIDJoypadSelect, - bind{btn, 11, 0, 0}: libretro.DeviceIDJoypadStart, - bind{axis, 0, -1, -0.5}: libretro.DeviceIDJoypadLeft, - bind{axis, 1, -1, -0.5}: libretro.DeviceIDJoypadUp, - bind{axis, 0, 1, 0.5}: libretro.DeviceIDJoypadRight, - bind{axis, 1, 1, 0.5}: libretro.DeviceIDJoypadDown, -} diff --git a/input/input.go b/input/input.go index b0e4f1de..248b88a4 100644 --- a/input/input.go +++ b/input/input.go @@ -5,7 +5,7 @@ package input import ( "github.com/go-gl/glfw/v3.3/glfw" - "github.com/libretro/ludo/libretro" + lr "github.com/libretro/ludo/libretro" ntf "github.com/libretro/ludo/notifications" "github.com/libretro/ludo/settings" "github.com/libretro/ludo/video" @@ -14,18 +14,6 @@ import ( // MaxPlayers is the maximum number of players to poll input for const MaxPlayers = 5 -type joybinds map[bind]uint32 - -const btn = 0 -const axis = 1 - -type bind struct { - kind uint32 - index uint32 - direction float32 - threshold float32 -} - // States can store the state of inputs for all players type States [MaxPlayers][ActionLast]int16 @@ -45,15 +33,15 @@ var ( // Hot keys const ( // ActionMenuToggle toggles the menu UI - ActionMenuToggle uint32 = libretro.DeviceIDJoypadR3 + 1 + ActionMenuToggle uint32 = lr.DeviceIDJoypadR3 + 1 // ActionFullscreenToggle switches between fullscreen and windowed mode - ActionFullscreenToggle uint32 = libretro.DeviceIDJoypadR3 + 2 + ActionFullscreenToggle uint32 = lr.DeviceIDJoypadR3 + 2 // ActionShouldClose will cause the program to shutdown - ActionShouldClose uint32 = libretro.DeviceIDJoypadR3 + 3 + ActionShouldClose uint32 = lr.DeviceIDJoypadR3 + 3 // ActionFastForwardToggle will run the core as fast as possible - ActionFastForwardToggle uint32 = libretro.DeviceIDJoypadR3 + 4 + ActionFastForwardToggle uint32 = lr.DeviceIDJoypadR3 + 4 // ActionLast is used for iterating - ActionLast uint32 = libretro.DeviceIDJoypadR3 + 5 + ActionLast uint32 = lr.DeviceIDJoypadR3 + 5 ) // joystickCallback is triggered when a joypad is plugged. @@ -87,48 +75,48 @@ func floatToAnalog(v float32) int16 { // pollJoypads process joypads of all players func pollJoypads(state States, analogState AnalogStates) (States, AnalogStates) { for p := range state { - buttonState := glfw.Joystick.GetButtons(glfw.Joystick(p)) - axisState := glfw.Joystick.GetAxes(glfw.Joystick(p)) - name := glfw.Joystick.GetName(glfw.Joystick(p)) - jb := joyBinds[name] - if len(buttonState) > 0 { - for k, v := range jb { - switch k.kind { - case btn: - if int(k.index) < len(buttonState) && - glfw.Action(buttonState[k.index]) == glfw.Press { - state[p][v] = 1 - } - case axis: - if int(k.index) < len(axisState) && - k.direction*axisState[k.index] > k.threshold*k.direction { - state[p][v] = 1 - } - } - - if settings.Current.MapAxisToDPad { - if axisState[0] < -0.5 { - state[p][libretro.DeviceIDJoypadLeft] = 1 - } else if axisState[0] > 0.5 { - state[p][libretro.DeviceIDJoypadRight] = 1 - } - if axisState[1] > 0.5 { - state[p][libretro.DeviceIDJoypadDown] = 1 - } else if axisState[1] < -0.5 { - state[p][libretro.DeviceIDJoypadUp] = 1 - } - } + joystik := glfw.Joystick(p) + if !joystik.IsGamepad() { + continue + } + pad := glfw.Joystick.GetGamepadState(joystik) + if pad == nil { + continue + } + + // mapping pad buttons + for k, v := range joyBinds { + if pad.Buttons[k] == glfw.Press { + state[p][v] = 1 } } - } - for p := range analogState { - axisState := glfw.Joystick.GetAxes(glfw.Joystick(p)) - if len(axisState) > 3 { - analogState[p][0][0] = floatToAnalog(axisState[0]) - analogState[p][0][1] = floatToAnalog(axisState[1]) - analogState[p][1][0] = floatToAnalog(axisState[2]) - analogState[p][1][1] = floatToAnalog(axisState[3]) + // mapping pad triggers + if pad.Axes[glfw.AxisLeftTrigger] > 0.5 { + state[p][lr.DeviceIDJoypadL2] = 1 + } + if pad.Axes[glfw.AxisRightTrigger] > 0.5 { + state[p][lr.DeviceIDJoypadR2] = 1 + } + + // mapping analog sticks + analogState[p][lr.DeviceIndexAnalogLeft][lr.DeviceIDAnalogX] = floatToAnalog(pad.Axes[glfw.AxisLeftX]) + analogState[p][lr.DeviceIndexAnalogLeft][lr.DeviceIDAnalogY] = floatToAnalog(pad.Axes[glfw.AxisLeftY]) + analogState[p][lr.DeviceIndexAnalogRight][lr.DeviceIDAnalogX] = floatToAnalog(pad.Axes[glfw.AxisRightX]) + analogState[p][lr.DeviceIndexAnalogRight][lr.DeviceIDAnalogY] = floatToAnalog(pad.Axes[glfw.AxisRightY]) + + // optionally mapping analog sticks to dpad + if settings.Current.MapAxisToDPad { + if pad.Axes[glfw.AxisLeftX] < -0.5 { + state[p][lr.DeviceIDJoypadLeft] = 1 + } else if pad.Axes[glfw.AxisLeftX] > 0.5 { + state[p][lr.DeviceIDJoypadRight] = 1 + } + if pad.Axes[glfw.AxisLeftY] > 0.5 { + state[p][lr.DeviceIDJoypadDown] = 1 + } else if pad.Axes[glfw.AxisLeftY] < -0.5 { + state[p][lr.DeviceIDJoypadUp] = 1 + } } } @@ -182,15 +170,14 @@ func State(port uint, device uint32, index uint, id uint) int16 { return 0 } - if device == libretro.DeviceJoypad { + if device == lr.DeviceJoypad { if id >= uint(ActionLast) || index > 0 { return 0 } return NewState[port][id] } - if device == libretro.DeviceAnalog { - if id > 1 || index > 1 { - // invalid + if device == lr.DeviceAnalog { + if index > uint(lr.DeviceIndexAnalogRight) || id > uint(lr.DeviceIDAnalogY) { return 0 } @@ -202,7 +189,5 @@ func State(port uint, device uint32, index uint, id uint) int16 { // HasBinding returns true if the joystick has an autoconfig binding func HasBinding(joy glfw.Joystick) bool { - name := glfw.Joystick.GetName(joy) - _, ok := joyBinds[name] - return ok + return joy.GetGUID() != "" }