partially done work on total source tree rework, separation of engine context and game context, generalization of renderer for different backends as well as web platform target
This commit is contained in:
101
include/twn_input.h
Normal file
101
include/twn_input.h
Normal file
@@ -0,0 +1,101 @@
|
||||
#ifndef TWN_INPUT_H
|
||||
#define TWN_INPUT_H
|
||||
|
||||
#include "twn_config.h"
|
||||
#include "twn_vec.h"
|
||||
#include "twn_util.h"
|
||||
#include "twn_engine_api.h"
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
enum button_source {
|
||||
BUTTON_SOURCE_NOT_SET,
|
||||
BUTTON_SOURCE_KEYBOARD_PHYSICAL,
|
||||
BUTTON_SOURCE_KEYBOARD_CHARACTER,
|
||||
BUTTON_SOURCE_GAMEPAD,
|
||||
BUTTON_SOURCE_MOUSE,
|
||||
};
|
||||
|
||||
|
||||
union button_code {
|
||||
SDL_Scancode scancode;
|
||||
SDL_Keycode keycode;
|
||||
SDL_GameControllerButton gamepad_button;
|
||||
uint8_t mouse_button; /* SDL_BUTTON_ enum */
|
||||
};
|
||||
|
||||
|
||||
/* an input to which an action is bound */
|
||||
/* it is not limited to literal buttons */
|
||||
struct button {
|
||||
enum button_source source;
|
||||
union button_code code;
|
||||
};
|
||||
|
||||
|
||||
/* represents the collective state of a group of buttons */
|
||||
/* that is, changes in the states of any of the bound buttons will affect it */
|
||||
struct action {
|
||||
size_t num_bindings;
|
||||
|
||||
/* if you bind more than NUM_KEYBIND_SLOTS (set in config.h) */
|
||||
/* it forgets the first button to add the new one at the end */
|
||||
struct button bindings[NUM_KEYBIND_SLOTS];
|
||||
|
||||
t_fvec2 position; /* set if applicable, e.g. mouse click */
|
||||
bool is_pressed;
|
||||
bool just_changed;
|
||||
};
|
||||
|
||||
|
||||
struct action_hash_item {
|
||||
char *key;
|
||||
struct action value;
|
||||
};
|
||||
|
||||
|
||||
struct input_state {
|
||||
struct action_hash_item *action_hash;
|
||||
const uint8_t *keyboard_state; /* array of booleans indexed by scancode */
|
||||
uint32_t mouse_state; /* SDL mouse button bitmask */
|
||||
t_vec2 mouse_window_position;
|
||||
t_vec2 mouse_relative_position;
|
||||
enum button_source last_active_source;
|
||||
bool is_anything_just_pressed;
|
||||
};
|
||||
|
||||
|
||||
TWN_API void input_state_init(struct input_state *input);
|
||||
TWN_API void input_state_deinit(struct input_state *input);
|
||||
TWN_API void input_state_update(struct input_state *input);
|
||||
|
||||
TWN_API void input_bind_action_scancode(struct input_state *input,
|
||||
char *action_name,
|
||||
SDL_Scancode scancode);
|
||||
TWN_API void input_unbind_action_scancode(struct input_state *input,
|
||||
char *action_name,
|
||||
SDL_Scancode scancode);
|
||||
TWN_API void input_bind_action_mouse(struct input_state *input,
|
||||
char *action_name,
|
||||
uint8_t mouse_button);
|
||||
TWN_API void input_unbind_action_mouse(struct input_state *input,
|
||||
char *action_name,
|
||||
uint8_t mouse_button);
|
||||
|
||||
TWN_API void input_add_action(struct input_state *input, char *action_name);
|
||||
TWN_API void input_delete_action(struct input_state *input, char *action_name);
|
||||
|
||||
TWN_API bool input_is_action_pressed(struct input_state *input, char *action_name);
|
||||
TWN_API bool input_is_action_just_pressed(struct input_state *input, char *action_name);
|
||||
TWN_API bool input_is_action_just_released(struct input_state *input, char *action_name);
|
||||
|
||||
TWN_API t_fvec2 input_get_action_position(struct input_state *input, char *action_name);
|
||||
|
||||
TWN_API void input_set_mouse_captured(struct input_state *input, bool value);
|
||||
TWN_API bool input_is_mouse_captured(struct input_state *input);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user