refactor(input/sdl): store key/pad/mouse button state as bitmasks

This commit is contained in:
2026-08-19 21:49:59 +02:00
parent 0d0590a4d7
commit 4e7049f49a
+29 -27
View File
@@ -3,16 +3,16 @@
#include <SDL3/SDL.h>
#include <string.h>
static uint8_t key_held[SKELE_KEY_COUNT];
static uint8_t key_down[SKELE_KEY_COUNT];
static uint64_t key_held = 0;
static uint64_t key_down = 0;
static SDL_Gamepad *pads[SKELE_MAX_PADS];
static uint8_t pad_btn_held[SKELE_MAX_PADS][SKELE_PAD_BUTTON_COUNT];
static uint8_t pad_btn_down[SKELE_MAX_PADS][SKELE_PAD_BUTTON_COUNT];
static uint16_t pad_btn_held[SKELE_MAX_PADS];
static uint16_t pad_btn_down[SKELE_MAX_PADS];
static float pad_axes[SKELE_MAX_PADS][SKELE_PAD_AXIS_COUNT];
static uint8_t mouse_btn_held[SKELE_MOUSE_BUTTON_COUNT];
static uint8_t mouse_btn_down[SKELE_MOUSE_BUTTON_COUNT];
static uint8_t mouse_btn_held = 0;
static uint8_t mouse_btn_down = 0;
static int32_t mouse_dx = 0;
static int32_t mouse_dy = 0;
@@ -249,9 +249,9 @@ uint8_t skele_input_poll(void)
skele_pad_button_t btn;
skele_mouse_button_t mbtn;
memset(key_down, 0, sizeof(key_down));
key_down = 0;
memset(pad_btn_down, 0, sizeof(pad_btn_down));
memset(mouse_btn_down, 0, sizeof(mouse_btn_down));
mouse_btn_down = 0;
mouse_dx = 0;
mouse_dy = 0;
@@ -268,15 +268,15 @@ uint8_t skele_input_poll(void)
case SDL_EVENT_MOUSE_BUTTON_DOWN:
mbtn = sdl_btn_to_mouse(e.button.button);
if (mbtn != SKELE_MOUSE_BUTTON_COUNT) {
mouse_btn_down[mbtn] = 1;
mouse_btn_held[mbtn] = 1;
mouse_btn_down |= (uint8_t)(1u << mbtn);
mouse_btn_held |= (uint8_t)(1u << mbtn);
}
break;
case SDL_EVENT_MOUSE_BUTTON_UP:
mbtn = sdl_btn_to_mouse(e.button.button);
if (mbtn != SKELE_MOUSE_BUTTON_COUNT)
mouse_btn_held[mbtn] = 0;
mouse_btn_held &= (uint8_t)~(1u << mbtn);
break;
case SDL_EVENT_KEY_DOWN:
@@ -292,8 +292,8 @@ uint8_t skele_input_poll(void)
default:
key = scancode_to_key(e.key.scancode);
if (key != SKELE_KEY_UNKNOWN) {
key_down[key] = 1;
key_held[key] = 1;
key_down |= (uint64_t)1 << key;
key_held |= (uint64_t)1 << key;
}
break;
}
@@ -302,7 +302,7 @@ uint8_t skele_input_poll(void)
case SDL_EVENT_KEY_UP:
key = scancode_to_key(e.key.scancode);
if (key != SKELE_KEY_UNKNOWN)
key_held[key] = 0;
key_held &= ~((uint64_t)1 << key);
break;
case SDL_EVENT_GAMEPAD_ADDED:
@@ -310,8 +310,7 @@ uint8_t skele_input_poll(void)
if (slot >= 0) {
pads[slot] = SDL_OpenGamepad(e.gdevice.which);
if (pads[slot])
memset(pad_btn_held[slot], 0,
sizeof(pad_btn_held[slot]));
pad_btn_held[slot] = 0;
}
break;
@@ -320,8 +319,7 @@ uint8_t skele_input_poll(void)
if (slot >= 0) {
SDL_CloseGamepad(pads[slot]);
pads[slot] = NULL;
memset(pad_btn_held[slot], 0,
sizeof(pad_btn_held[slot]));
pad_btn_held[slot] = 0;
memset(pad_axes[slot], 0,
sizeof(pad_axes[slot]));
}
@@ -332,8 +330,8 @@ uint8_t skele_input_poll(void)
btn =
sdl_btn_to_pad((SDL_GamepadButton)e.gbutton.button);
if (slot >= 0 && btn != SKELE_PAD_BUTTON_COUNT) {
pad_btn_down[slot][btn] = 1;
pad_btn_held[slot][btn] = 1;
pad_btn_down[slot] |= (uint16_t)(1u << btn);
pad_btn_held[slot] |= (uint16_t)(1u << btn);
}
break;
@@ -342,7 +340,7 @@ uint8_t skele_input_poll(void)
btn =
sdl_btn_to_pad((SDL_GamepadButton)e.gbutton.button);
if (slot >= 0 && btn != SKELE_PAD_BUTTON_COUNT)
pad_btn_held[slot][btn] = 0;
pad_btn_held[slot] &= (uint16_t)~(1u << btn);
break;
default:
@@ -359,12 +357,12 @@ uint8_t skele_input_poll(void)
uint8_t skele_key_down(skele_key_t key)
{
return key < SKELE_KEY_COUNT ? key_down[key] : 0;
return key < SKELE_KEY_COUNT ? (uint8_t)((key_down >> key) & 1) : 0;
}
uint8_t skele_key_held(skele_key_t key)
{
return key < SKELE_KEY_COUNT ? key_held[key] : 0;
return key < SKELE_KEY_COUNT ? (uint8_t)((key_held >> key) & 1) : 0;
}
uint8_t skele_pad_connected(uint8_t pad)
@@ -375,14 +373,14 @@ uint8_t skele_pad_connected(uint8_t pad)
uint8_t skele_pad_button_down(uint8_t pad, skele_pad_button_t btn)
{
return (pad < SKELE_MAX_PADS && btn < SKELE_PAD_BUTTON_COUNT)
? pad_btn_down[pad][btn]
? (uint8_t)((pad_btn_down[pad] >> btn) & 1)
: 0;
}
uint8_t skele_pad_button_held(uint8_t pad, skele_pad_button_t btn)
{
return (pad < SKELE_MAX_PADS && btn < SKELE_PAD_BUTTON_COUNT)
? pad_btn_held[pad][btn]
? (uint8_t)((pad_btn_held[pad] >> btn) & 1)
: 0;
}
@@ -403,10 +401,14 @@ void skele_mouse_delta(int32_t *dx, int32_t *dy)
uint8_t skele_mouse_button_down(skele_mouse_button_t btn)
{
return btn < SKELE_MOUSE_BUTTON_COUNT ? mouse_btn_down[btn] : 0;
return btn < SKELE_MOUSE_BUTTON_COUNT
? (uint8_t)((mouse_btn_down >> btn) & 1)
: 0;
}
uint8_t skele_mouse_button_held(skele_mouse_button_t btn)
{
return btn < SKELE_MOUSE_BUTTON_COUNT ? mouse_btn_held[btn] : 0;
return btn < SKELE_MOUSE_BUTTON_COUNT
? (uint8_t)((mouse_btn_held >> btn) & 1)
: 0;
}