diff --git a/src/platform/client/input/sdl.c b/src/platform/client/input/sdl.c index 8025974..b3564ee 100644 --- a/src/platform/client/input/sdl.c +++ b/src/platform/client/input/sdl.c @@ -3,16 +3,16 @@ #include #include -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; }