refactor(input/sdl): store key/pad/mouse button state as bitmasks
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user