summaryrefslogtreecommitdiff
path: root/include/engine
diff options
context:
space:
mode:
author0scar <qgt268@alumni.ku.dk>2023-08-02 07:22:57 +0000
committer0scar <qgt268@alumni.ku.dk>2023-08-02 13:35:35 +0000
commit1713482a2af615daa83887278716736799389c3d (patch)
treeedec5cf88101dccf6f55340e7fbed73b21216fd1 /include/engine
parent760464c6b14d8f573d49ce67fbdabe490c4912d3 (diff)
Update input handling method
Diffstat (limited to 'include/engine')
-rw-r--r--include/engine/engine.h20
-rw-r--r--include/engine/input.h79
-rw-r--r--include/engine/state.h5
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