From 6f89fbc89cbda70a331043799d7c746bb59f659b Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Mon, 19 Jan 2026 13:23:47 +0000 Subject: [PATCH] begin binding gamepad functions from GLFW to SML --- ffi/glfw-input.c | 26 ++++++++++++++++++++++++++ ffi/glfw-input.sml | 8 ++++++++ shell/gl-draw.sml | 29 +++++++++++++++++++++++++++++ todo.md | 1 + 4 files changed, 64 insertions(+) diff --git a/ffi/glfw-input.c b/ffi/glfw-input.c index 9b0da6b..9e6a7fa 100644 --- a/ffi/glfw-input.c +++ b/ffi/glfw-input.c @@ -40,3 +40,29 @@ void setKeyCallback(GLFWwindow *window) { glfwSetKeyCallback(window, keyCallback); } +// gamepad code +GLFWgamepadstate state; +float* axes; +int axesCount = -1; + +void getGamepadState(int joystickID) { + if (glfwGetGamepadState(joystickID, &state)) { + axes = glfwGetJoystickAxes(joystickID, &axesCount); + } +} + +float getLeftJoystickXAxisState() { + if (axesCount >= 2) { + return axes[0]; + } else { + return 99.0; + } +} + +float getLeftJoystickYAxisState() { + if (axesCount >= 2) { + return axes[1]; + } else { + return 99.0; + } +} diff --git a/ffi/glfw-input.sml b/ffi/glfw-input.sml index bfe0121..b34144e 100644 --- a/ffi/glfw-input.sml +++ b/ffi/glfw-input.sml @@ -52,4 +52,12 @@ struct val (KEY_ARROW_DOWN, _) = _symbol "KEY_ARROW_DOWN" public : ( unit -> int ) * ( int -> unit ); val KEY_ARROW_DOWN = KEY_ARROW_DOWN () + + val getGamepadState = + _import "getGamepadState" public : int -> unit; + + val getLeftJoystickXAxisState = + _import "getLeftJoystickXAxisState" public : unit -> Real32.real; + val getLeftJoystickYAxisState = + _import "getLeftJoystickYAxisState" public : unit -> Real32.real; end diff --git a/shell/gl-draw.sml b/shell/gl-draw.sml index 30cd67b..1d30760 100644 --- a/shell/gl-draw.sml +++ b/shell/gl-draw.sml @@ -145,6 +145,28 @@ struct updateLoop (0, InputMailbox.getMessagesAndClear (), app) end +fun getGamepadState () = + let + val () = Input.getGamepadState 0 + val () = Input.getGamepadState 1 + val () = Input.getGamepadState 2 + val () = Input.getGamepadState 3 + val () = Input.getGamepadState 4 + val () = Input.getGamepadState 5 + val () = Input.getGamepadState 6 + val () = Input.getGamepadState 7 + val () = Input.getGamepadState 8 + val () = Input.getGamepadState 9 + val () = Input.getGamepadState 10 + val () = Input.getGamepadState 11 + val () = Input.getGamepadState 12 + val () = Input.getGamepadState 13 + val () = Input.getGamepadState 14 + val () = Input.getGamepadState 15 + in + () + end + fun helpLoop (app, shellState as {window, ...}: t) = case Glfw.windowShouldClose window of false => @@ -154,6 +176,13 @@ struct val _ = Gles3.clearColor (0.89, 0.89, 0.89, 1.0) val _ = Gles3.clear () + val () = getGamepadState () + val xAxis = Input.getLeftJoystickXAxisState () + val yAxis = Input.getLeftJoystickYAxisState () + val () = print ("x axis = " ^ Real32.toString xAxis ^ "\n") + val () = print ("y axis = " ^ Real32.toString yAxis ^ "\n") + val () = print "\n" + val app = update app val _ = draw shellState diff --git a/todo.md b/todo.md index 5175342..b173e9f 100644 --- a/todo.md +++ b/todo.md @@ -1,3 +1,4 @@ # To-do list +- Bind gamepad functions from GLFW - Modify deletion functions to use `PersistentVector.delete` - Implement 'yj' motion and add tests for it