diff --git a/include/gamepad.h b/include/gamepad.h index fb2ec69..49f34d6 100644 --- a/include/gamepad.h +++ b/include/gamepad.h @@ -3,6 +3,38 @@ #include "types.h" +#ifdef __EMSCRIPTEN__ + +#define SW_MAX_GAMEPADS 1 +#define SW_MAX_GAMEPAD_AXES 6 +#define SW_MAX_GAMEPAD_BUTTONS 16 + +#define SW_GAMEPAD_BUTTON_FACE_DOWN 0 +#define SW_GAMEPAD_BUTTON_FACE_RIGHT 1 +#define SW_GAMEPAD_BUTTON_FACE_LEFT 2 +#define SW_GAMEPAD_BUTTON_FACE_UP 3 +#define SW_GAMEPAD_BUTTON_LEFT_SHOULDER 4 +#define SW_GAMEPAD_BUTTON_RIGHT_SHOULDER 5 +#define SW_GAMEPAD_BUTTON_LEFT_TRIGGER 6 +#define SW_GAMEPAD_BUTTON_RIGHT_TRIGGER 7 +#define SW_GAMEPAD_BUTTON_BACK 8 +#define SW_GAMEPAD_BUTTON_START 9 +#define SW_GAMEPAD_BUTTON_LEFT_STICK 11 +#define SW_GAMEPAD_BUTTON_RIGHT_STICK 10 +#define SW_GAMEPAD_BUTTON_DPAD_UP 12 +#define SW_GAMEPAD_BUTTON_DPAD_RIGHT 15 +#define SW_GAMEPAD_BUTTON_DPAD_DOWN 13 +#define SW_GAMEPAD_BUTTON_DPAD_LEFT 14 + +#define SW_GAMEPAD_AXIS_LEFT_X 0 +#define SW_GAMEPAD_AXIS_RIGHT_X 1 +#define SW_GAMEPAD_AXIS_LEFT_Y 2 +#define SW_GAMEPAD_AXIS_RIGHT_Y 3 +#define SW_GAMEPAD_AXIS_LEFT_TRIGGER 4 +#define SW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 + +#else /* __EMSCRIPTEN__ */ + #define SW_MAX_GAMEPADS 4 #define SW_MAX_GAMEPAD_AXES 6 #define SW_MAX_GAMEPAD_BUTTONS 15 @@ -30,6 +62,8 @@ #define SW_GAMEPAD_AXIS_LEFT_TRIGGER 4 #define SW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 +#endif /* __EMSCRIPTEN__ */ + struct sw_gamepad { f32 axes[SW_MAX_GAMEPAD_AXES]; bool button_down[SW_MAX_GAMEPAD_BUTTONS]; diff --git a/src/gamepad.c b/src/gamepad.c index e5da0d2..1ad41fe 100644 --- a/src/gamepad.c +++ b/src/gamepad.c @@ -10,6 +10,31 @@ void sw_gamepad_static_init() { } void sw_gamepad_tick() { +#ifdef __EMSCRIPTEN__ + i32 i, j, count; + const f32 *axes; + const unsigned char *buttons; + + for(i = 0; i < SW_MAX_GAMEPADS; ++i) { + if(glfwJoystickPresent(i)) { + axes = glfwGetJoystickAxes(i, &count); + count = i32_min(count, SW_MAX_GAMEPAD_AXES); + + for(j = 0; j < count; ++j) { + sw_gamepads[i].axes[j] = axes[j]; + } + + buttons = glfwGetJoystickButtons(i, &count); + count = i32_min(count, SW_MAX_GAMEPAD_BUTTONS); + + for(j = 0; j < SW_MAX_GAMEPAD_BUTTONS; ++j) { + sw_gamepads[i].button_pressed[j] = + !sw_gamepads[i].button_pressed[j] && buttons[j]; + sw_gamepads[i].button_down[j] = buttons[j]; + } + } + } +#else /* __EMSCRIPTEN__ */ i32 i, j; GLFWgamepadstate state; @@ -26,4 +51,5 @@ void sw_gamepad_tick() { } } } +#endif /* __EMSCRIPTEN__ */ }