diff options
| author | 0scar <qgt268@alumni.ku.dk> | 2023-08-02 07:22:57 +0000 |
|---|---|---|
| committer | 0scar <qgt268@alumni.ku.dk> | 2023-08-02 13:35:35 +0000 |
| commit | 1713482a2af615daa83887278716736799389c3d (patch) | |
| tree | edec5cf88101dccf6f55340e7fbed73b21216fd1 /include | |
| parent | 760464c6b14d8f573d49ce67fbdabe490c4912d3 (diff) | |
Update input handling method
Diffstat (limited to 'include')
| -rw-r--r-- | include/engine/engine.h | 20 | ||||
| -rw-r--r-- | include/engine/input.h | 79 | ||||
| -rw-r--r-- | include/engine/state.h | 5 |
3 files changed, 95 insertions, 9 deletions
diff --git a/include/engine/engine.h b/include/engine/engine.h index bd961a6..cf2283f 100644 --- a/include/engine/engine.h +++ b/include/engine/engine.h @@ -4,10 +4,11 @@ #include <stdbool.h> #include <engine/types.h> +#include <engine/logging.h> #include <engine/stack.h> #include <engine/vector.h> #include <engine/memory.h> -#include <engine/logging.h> +#include <engine/input.h> #include <engine/state.h> typedef struct { @@ -29,12 +30,7 @@ typedef struct { typedef struct Window Window; -typedef struct Keybinding { - i32 keycode; - i32 modifiers; - void (*action)(void*); -} Keybinding; - +#define NUM_GLOBAL_BINDINGS 1 typedef struct { void *data; /* Contains textures and such */ u64 data_len; @@ -45,6 +41,7 @@ typedef struct { u64 frame; f32 fps_target; + /* TODO: Move mouse data to input ctx */ v2_i32 mouse_pos; v2_i32 mousedown; @@ -62,7 +59,11 @@ typedef struct { memory *mem; - void *bindings; + i_ctx **bindings; + usize bindings_sz; + usize bindings_len; + + binding_t bindings_global[NUM_GLOBAL_BINDINGS]; } Platform; /* Essential functions */ @@ -81,7 +82,8 @@ void engine_stop(Platform *p); /* Utility functions */ void engine_fps_max(u64 cap); -void engine_bindkey(i32 key, void (*action)(void*)); +void engine_input_ctx_push(i_ctx *ctx); +void engine_input_ctx_pop(void); void render_set_zoom(f32 new_zoom); void render_adjust_zoom(f32 diff); diff --git a/include/engine/input.h b/include/engine/input.h new file mode 100644 index 0000000..d200e62 --- /dev/null +++ b/include/engine/input.h @@ -0,0 +1,79 @@ +#ifndef INPUT_H +#define INPUT_H + +#include <engine/types.h> + +typedef void input_callback_t(void*); +typedef i32 scancode_t; + +typedef enum InputType { + InputType_error = 0, + InputType_action, + InputType_state, + InputType_range, /* TBD */ +} InputType; + +typedef union action_t { + InputType type; + + struct { + InputType type; + input_callback_t* callback; + const char* callback_str; + } action; + + struct { + InputType type; + input_callback_t* activate; + input_callback_t* deactivate; + const char* activate_str; + const char* deactivate_str; + } state; +} action_t; + +typedef struct binding_t { + action_t action; + + // Change type depending on input handling back-end. like u16 for GLFW_KEY + //enum SDL_Scancode keycode; + scancode_t scancode; + scancode_t scancode_alt; + + u64 since_last_activation; +} binding_t; + +typedef struct i_ctx { + binding_t* bindings; + isize len; +} i_ctx; + +void i_flush_bindings(usize numcalls, void* state_mem, input_callback_t* c[]); +action_t i_get_action(const i_ctx *ctx, u32 time, scancode_t scancode); + +#define BindAction(key, altkey, f_action) \ + (binding_t){\ + .action = (action_t){.action = {\ + .type = InputType_action,\ + .callback = (input_callback_t*)&f_action,\ + .callback_str = #f_action,\ + }},\ + .scancode = key,\ + .scancode_alt = altkey,\ + .since_last_activation = 0\ +} + +#define BindState(key, altkey, f_activate, f_deactivate) \ + (binding_t){\ + .action = (action_t){.state = {\ + .type = InputType_state,\ + .activate = (input_callback_t*)&f_activate,\ + .deactivate = (input_callback_t*)&f_deactivate,\ + .activate_str = #f_activate,\ + .deactivate_str = #f_deactivate,\ + }},\ + .scancode = key,\ + .scancode_alt = altkey,\ + .since_last_activation = 0\ +} + +#endif diff --git a/include/engine/state.h b/include/engine/state.h index dcd2966..68228b1 100644 --- a/include/engine/state.h +++ b/include/engine/state.h @@ -23,8 +23,13 @@ StateType State_update(StateType type, memory *mem); /* Reloads shared object file associated with state */ #ifdef DAW_BUILD_HOTRELOAD bool State_reload(StateType type); + +#define get_statelib_var(type) libstate_##name +#define State_load_binding(type, function_name) dynamic_library_get_symbol(get_statelib_var(type), #function_name) + #else #define State_reload(_) true +#define State_load_binding(_, __) true #endif #endif |
