From e15cdab4ff079cc705a700f0bf900fc7ef26316d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Wed, 26 Oct 2022 09:04:17 +0200 Subject: [PATCH] input system --- code/foundation/src/platform/input.c | 160 +++++++++++++++++++++++++++ code/foundation/src/platform/input.h | 39 +++++++ 2 files changed, 199 insertions(+) create mode 100644 code/foundation/src/platform/input.c create mode 100644 code/foundation/src/platform/input.h diff --git a/code/foundation/src/platform/input.c b/code/foundation/src/platform/input.c new file mode 100644 index 0000000..2dd7e29 --- /dev/null +++ b/code/foundation/src/platform/input.c @@ -0,0 +1,160 @@ +#include "input.h" +#include "raylib.h" + +const static input_map maps[] = { + { + "left", + IN_LEFT, + (input_bind[]){ + {DEV_KEYBOARD, KEY_LEFT}, + {DEV_KEYBOARD, KEY_A}, + {0} + } + }, + { + "right", + IN_RIGHT, + (input_bind[]){ + {DEV_KEYBOARD, KEY_RIGHT}, + {DEV_KEYBOARD, KEY_D}, + {0} + } + }, + { + "up", + IN_UP, + (input_bind[]){ + {DEV_KEYBOARD, KEY_UP}, + {DEV_KEYBOARD, KEY_W}, + {0} + } + }, + { + "down", + IN_DOWN, + (input_bind[]){ + {DEV_KEYBOARD, KEY_DOWN}, + {DEV_KEYBOARD, KEY_S}, + {0} + } + }, + { + "use", + IN_USE, + (input_bind[]){ + {DEV_KEYBOARD, KEY_SPACE}, + {0} + } + }, + { + "sprint", + IN_SPRINT, + (input_bind[]){ + {DEV_KEYBOARD, KEY_LEFT_SHIFT}, + {DEV_KEYBOARD, KEY_RIGHT_SHIFT}, + {0} + } + }, + { + "drop", + IN_DROP, + (input_bind[]){ + {DEV_KEYBOARD, KEY_G}, + {0} + } + }, + { + "ctrl", + IN_CTRL, + (input_bind[]){ + {DEV_KEYBOARD, KEY_LEFT_CONTROL}, + {DEV_KEYBOARD, KEY_RIGHT_CONTROL}, + {0} + } + }, + { + "toggle inventory", + IN_TOGGLE_INV, + (input_bind[]){ + {DEV_KEYBOARD, KEY_TAB}, + {0} + } + }, + { + "toggle build", + IN_TOGGLE_DEMOLITION, + (input_bind[]){ + {DEV_KEYBOARD, KEY_B}, + {0} + } + }, + {0} +}; + +input_map input__get_map(uint8_t action) { + for (const input_map *map = maps; map->action > 0; ++map) { + if (map->action == action) { + return *map; + } + } + + ZPL_PANIC("key not bound!"); + return maps[0]; +} + +uint8_t input_is_down(uint8_t action) { + input_map map = input__get_map(action); + for (input_bind *bind = map.binds; bind->device > 0; ++bind) { + switch (bind->device) { + case DEV_KEYBOARD: { + if (IsKeyDown(bind->id)) return 1; + }break; + case DEV_MOUSE: { + if (IsMouseButtonDown(bind->id)) return 1; + }break; + case DEV_JOYSTICK: { + // TODO(zaklaus): + }break; + } + } + + return 0; +} + +uint8_t input_is_pressed(uint8_t action) { + input_map map = input__get_map(action); + for (input_bind *bind = map.binds; bind->device > 0; ++bind) { + switch (bind->device) { + case DEV_KEYBOARD: { + if (IsKeyPressed(bind->id)) return 1; + }break; + case DEV_MOUSE: { + if (IsMouseButtonPressed(bind->id)) return 1; + }break; + case DEV_JOYSTICK: { + // TODO(zaklaus): + }break; + } + } + + return 0; +} + +uint8_t input_is_released(uint8_t action) { + input_map map = input__get_map(action); + for (input_bind *bind = map.binds; bind->device > 0; ++bind) { + switch (bind->device) { + case DEV_KEYBOARD: { + if (IsKeyReleased(bind->id)) return 1; + }break; + case DEV_MOUSE: { + if (IsMouseButtonReleased(bind->id)) return 1; + }break; + case DEV_JOYSTICK: { + // TODO(zaklaus): + }break; + } + } + + return 0; +} diff --git a/code/foundation/src/platform/input.h b/code/foundation/src/platform/input.h new file mode 100644 index 0000000..336f5df --- /dev/null +++ b/code/foundation/src/platform/input.h @@ -0,0 +1,39 @@ +#pragma once +#include "system.h" + +enum { + IN_NONE, + IN_LEFT, + IN_RIGHT, + IN_UP, + IN_DOWN, + IN_USE, + IN_SPRINT, + IN_DROP, + IN_CTRL, + IN_TOGGLE_INV, + IN_TOGGLE_DEMOLITION, +}; + +enum { + DEV_NONE, + DEV_KEYBOARD, + DEV_MOUSE, + DEV_JOYSTICK +}; + +typedef struct { + uint8_t device; + uint32_t id; +} input_bind; + +typedef struct { + const char* name; + uint8_t action; + input_bind *binds; +} input_map; + +uint8_t input_is_down(uint8_t action); +uint8_t input_is_pressed(uint8_t action); +uint8_t input_is_released(uint8_t action); +