diff options
Diffstat (limited to 'src/ctrl')
| -rw-r--r-- | src/ctrl/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/ctrl/include/engine/ctrl/input.h | 11 | ||||
| -rw-r--r-- | src/ctrl/include/engine/ctrl/scancodes.h | 82 | ||||
| -rw-r--r-- | src/ctrl/src/input.c | 65 |
4 files changed, 153 insertions, 6 deletions
diff --git a/src/ctrl/CMakeLists.txt b/src/ctrl/CMakeLists.txt index 3f76069..e7dd0a9 100644 --- a/src/ctrl/CMakeLists.txt +++ b/src/ctrl/CMakeLists.txt @@ -7,3 +7,4 @@ add_library(daw_ctrl ) target_include_directories(daw_ctrl PRIVATE ${DAW_INCLUDE_DIRS}) +target_link_libraries(daw_ctrl PRIVATE cglm glfw) diff --git a/src/ctrl/include/engine/ctrl/input.h b/src/ctrl/include/engine/ctrl/input.h index 26a5f5b..d06dcfe 100644 --- a/src/ctrl/include/engine/ctrl/input.h +++ b/src/ctrl/include/engine/ctrl/input.h @@ -1,9 +1,10 @@ -#ifndef INPUT_H -#define INPUT_H +#ifndef ENGINE_CTRL_INPUT_H +#define ENGINE_CTRL_INPUT_H #include <engine/core/types.h> +#include <engine/ctrl/scancodes.h> -typedef void input_callback_t(void*); +typedef void input_callback_t(f64, void*); typedef i32 scancode_t; typedef enum InputType { @@ -49,9 +50,11 @@ typedef struct i_ctx { void i_ctx_t_free(i_ctx* c); /* Executes all callbacks that has been pushed onto the callstack and resets the * callstack */ -void i_flush_bindings(usize numcalls, void* state_mem, input_callback_t* c[]); +void i_flush_bindings(f64 dt, usize numcalls, input_callback_t* c[], void* state_mem); action_t i_get_action(const i_ctx* restrict ctx, u32 time, scancode_t scancode); +void key_callback(void* window, int key, int scancode, int action, int mods); + void i_ctx_push(i_ctx* ctx); void i_ctx_pop(void); void i_ctx_reset(void); diff --git a/src/ctrl/include/engine/ctrl/scancodes.h b/src/ctrl/include/engine/ctrl/scancodes.h new file mode 100644 index 0000000..90bd749 --- /dev/null +++ b/src/ctrl/include/engine/ctrl/scancodes.h @@ -0,0 +1,82 @@ +#ifndef ENGINE_CTRL_SCANCODES_H + +// We want to reserve the following bytes marked with X for MODS, +// one bit per MODIFIER (shift, control, alt, super): +// XXXX 0000 0000 0000 0000 0000 0000 0000 +// +// We want to reserve the following bytes marked with X for ACTIONS +// enumerate by action type, pressed, released, repeat +// 0000 0000 XXXX 0000 0000 0000 0000 0000 +// +// We want to reserve the following bytes marked with X for the SCANCODE +// 0000 0000 0000 0000 XXXX XXXX XXXX XXXX +#define MOD(x) 1 << (32-4 + x) +#define ACTION(x) (1 << (32-8)) + x + +typedef enum { + KEY_SPACE = ' ', + KEY_APOSTROPHE = '\'', + KEY_COMMA = ',', + KEY_MINUS = '-', + KEY_PERIOD = '.', + KEY_SLASH = '/', + + KEY_0 = '0', + KEY_1 = '1', + KEY_2 = '2', + KEY_3 = '3', + KEY_4 = '4', + KEY_5 = '5', + KEY_6 = '6', + KEY_7 = '7', + KEY_8 = '8', + KEY_9 = '9', + + KEY_SEMICOLON = ';', + KEY_EQUAL = '=', + + KEY_A = 'A', + KEY_B = 'B', + KEY_C = 'C', + KEY_D = 'D', + KEY_E = 'E', + KEY_F = 'F', + KEY_G = 'G', + KEY_H = 'H', + KEY_I = 'I', + KEY_J = 'J', + KEY_K = 'K', + KEY_L = 'L', + KEY_M = 'M', + KEY_N = 'N', + KEY_O = 'O', + KEY_P = 'P', + KEY_Q = 'Q', + KEY_R = 'R', + KEY_S = 'S', + KEY_T = 'T', + KEY_U = 'U', + KEY_V = 'V', + KEY_W = 'W', + KEY_X = 'X', + KEY_Y = 'Y', + KEY_Z = 'Z', + + KEY_LEFT_BRACKET = '[', + KEY_BACKSLASH = '\\', + KEY_RIGHT_BRACKET = ']', + KEY_GRAVE_ACCENT = '`', + + ACTION_PRESS = ACTION(0), + ACTION_RELEASE = ACTION(1), + ACTION_REPEAT = ACTION(2), + + MOD_SHIFT = MOD(0), + MOD_CONTROL = MOD(1), + MOD_ALT = MOD(2), + MOD_SUPER = MOD(3), +} ScanCode; +#undef ACTION +#undef MOD + +#endif diff --git a/src/ctrl/src/input.c b/src/ctrl/src/input.c index 3b6a4df..5fe643e 100644 --- a/src/ctrl/src/input.c +++ b/src/ctrl/src/input.c @@ -1,8 +1,13 @@ #include <engine/core/dltools.h> #include <engine/core/logging.h> +#include <engine/core/platform.h> #include <engine/ctrl/input.h> #include <string.h> +extern input_callback_t* callbacks[128]; +extern usize callbacks_len; + +extern Platform* GLOBAL_PLATFORM; /* Lazy binds, used internally. They are similar to BindAction and friends. * The only difference is that we set callbacks and such to NULL, but populate * the function name strings such that can be reloaded. */ @@ -30,6 +35,60 @@ .scancode = key, .scancode_alt = altkey, .since_last_activation = 0 \ } +void key_callback(void* window, int key, int scancode, int action, int mods) { + + const i_ctx* bindings = *GLOBAL_PLATFORM->bindings; + const usize bindings_len = GLOBAL_PLATFORM->bindings_len; + + const f64 now = get_time(); + + for (usize b = 0; b < bindings_len; b++) { + const action_t a = i_get_action(&bindings[b], now, scancode); + switch (action) { + case GLFW_PRESS: + + switch (a.type) { + case InputType_action: + if (a.action.callback != NULL) { + callbacks[callbacks_len++] = a.action.callback; + } + break; + + case InputType_state: + if (a.state.activate != NULL) { + callbacks[callbacks_len++] = a.state.activate; + } + break; + case InputType_range: + WARN("Range inputs not supported yet!"); + break; + case InputType_error: + WARN("Unhandled scancode: %lu", scancode); + + default: + break; + } + break; + + case GLFW_RELEASE: + switch (a.type) { + case InputType_state: + if (a.state.deactivate != NULL) { + callbacks[callbacks_len++] = a.state.deactivate; + } + break; + default:break; + } + break; + case GLFW_REPEAT: + /* unhandled so far */ + break; + default: + break; + } + } +} + void binding_t_free(binding_t* b) { switch (b->action.type) { case InputType_error: @@ -129,10 +188,12 @@ bool i_update_unique_binding(i_ctx* ctx, binding_t* binding) { return false; } -void i_flush_bindings(usize numcalls, void* state_mem, input_callback_t* c[]) { +void i_flush_bindings(f64 dt, usize numcalls, input_callback_t* c[], void* state_mem) { for (usize i = 0; i < numcalls; i++) { - (c[i])(state_mem); + (c[i])(dt, state_mem); } + // reset callback len and be ready for more + callbacks_len = 0; } action_t i_get_action(const i_ctx* restrict ctx, u32 time, |
