#ifndef PKE_PLAYER_INPUT_HPP #define PKE_PLAYER_INPUT_HPP #include "pk.h" #include TypeSafeInt_H(InputActionSetHandle, uint8_t, 0xFF); TypeSafeInt_constexpr(InputActionSetFlags, uint8_t, 0xFF); TypeSafeInt_constexpr(InputEventHash, uint16_t, 0xFFFF); constexpr InputActionSetFlags PKE_INPUT_ACTION_SET_FLAG_NONE = InputActionSetFlags{0x00}; constexpr InputActionSetFlags PKE_INPUT_ACTION_SET_FLAG_DO_NOT_SERIALIZE = InputActionSetFlags{0x01}; constexpr InputActionSetFlags PKE_INPUT_ACTION_SET_FLAG_AUTO_ENABLE = InputActionSetFlags{0x02}; const InputEventHash PKE_INPUT_HASH_EVENT_TYPE_CURSOR_ENTER = InputEventHash {0x0001}; const InputEventHash PKE_INPUT_HASH_EVENT_TYPE_CURSOR_POS = InputEventHash {0x0002}; const InputEventHash PKE_INPUT_HASH_EVENT_TYPE_KEY = InputEventHash {0x0004}; const InputEventHash PKE_INPUT_HASH_EVENT_TYPE_MOUSE_BUTTON = InputEventHash {0x0008}; const InputEventHash PKE_INPUT_HASH_EVENT_TYPE_SCROLL = InputEventHash {0x0010}; const InputEventHash PKE_INPUT_HASH_EVENT_TYPE_WINDOW_FOCUS = InputEventHash {0x0020}; const InputEventHash PKE_INPUT_HASH_CURSOR_ENTERED_FALSE = InputEventHash {0x0040}; const InputEventHash PKE_INPUT_HASH_CURSOR_ENTERED_TRUE = InputEventHash {0x0080}; const InputEventHash PKE_INPUT_HASH_KEYBOARD_KEY_ACTION_RELEASE = InputEventHash{0x0100}; const InputEventHash PKE_INPUT_HASH_KEYBOARD_KEY_ACTION_PRESS = InputEventHash {0x0200}; const InputEventHash PKE_INPUT_HASH_KEYBOARD_KEY_ACTION_REPEAT = InputEventHash {0x0400}; const InputEventHash PKE_INPUT_HASH_MOUSE_BUTTON_ACTION_RELEASE = InputEventHash{0x0800}; const InputEventHash PKE_INPUT_HASH_MOUSE_BUTTON_ACTION_PRESS = InputEventHash {0x1000}; const InputEventHash PKE_INPUT_HASH_WINDOW_FOCUSED_FALSE = InputEventHash {0x2000}; const InputEventHash PKE_INPUT_HASH_WINDOW_FOCUSED_TRUE = InputEventHash {0x4000}; const InputEventHash PKE_INPUT_HASH_ALL_EVENTS = PKE_INPUT_HASH_EVENT_TYPE_CURSOR_ENTER | PKE_INPUT_HASH_EVENT_TYPE_CURSOR_POS | PKE_INPUT_HASH_EVENT_TYPE_KEY | PKE_INPUT_HASH_EVENT_TYPE_MOUSE_BUTTON | PKE_INPUT_HASH_EVENT_TYPE_SCROLL | PKE_INPUT_HASH_EVENT_TYPE_WINDOW_FOCUS; const InputEventHash PKE_INPUT_HASH_ALL_CURSOR_ENTER_EVENTS = PKE_INPUT_HASH_EVENT_TYPE_CURSOR_ENTER | PKE_INPUT_HASH_CURSOR_ENTERED_FALSE | PKE_INPUT_HASH_CURSOR_ENTERED_TRUE; const InputEventHash PKE_INPUT_HASH_ALL_CURSOR_POS_EVENTS = PKE_INPUT_HASH_EVENT_TYPE_CURSOR_POS; const InputEventHash PKE_INPUT_HASH_ALL_KEY_EVENTS = PKE_INPUT_HASH_EVENT_TYPE_KEY | PKE_INPUT_HASH_KEYBOARD_KEY_ACTION_RELEASE | PKE_INPUT_HASH_KEYBOARD_KEY_ACTION_PRESS | PKE_INPUT_HASH_KEYBOARD_KEY_ACTION_REPEAT; const InputEventHash PKE_INPUT_HASH_ALL_MOUSE_BUTTON_EVENTS = PKE_INPUT_HASH_EVENT_TYPE_MOUSE_BUTTON | PKE_INPUT_HASH_MOUSE_BUTTON_ACTION_RELEASE | PKE_INPUT_HASH_MOUSE_BUTTON_ACTION_PRESS; const InputEventHash PKE_INPUT_HASH_ALL_SCROLL_EVENTS = PKE_INPUT_HASH_EVENT_TYPE_SCROLL; const InputEventHash PKE_INPUT_HASH_ALL_WINDOW_FOCUS_EVENTS = PKE_INPUT_HASH_EVENT_TYPE_WINDOW_FOCUS | PKE_INPUT_HASH_WINDOW_FOCUSED_FALSE | PKE_INPUT_HASH_WINDOW_FOCUSED_FALSE; struct PkeInputEventBase { InputActionSetHandle sourceSet; }; struct PkeInputEventHolder { InputEventHash type = InputEventHash{0}; PkeInputEventBase *ptr = nullptr; }; struct PkeCursorEnterEvent : public PkeInputEventBase { bool isEntered; }; struct PkeCursorPosEvent : public PkeInputEventBase { double xMotion; double yMotion; }; struct PkeKeyEvent : public PkeInputEventBase { bool isPressed; bool thisTick; int32_t button; int32_t mods; }; struct PkeMouseButtonEvent : public PkeInputEventBase { bool isPressed; bool thisTick; int32_t button; int32_t mods; }; struct PkeScrollEvent : public PkeInputEventBase { double xMotion; double yMotion; }; struct PkeWindowFocusEvent : public PkeInputEventBase { bool isFocused; }; struct PkeInputEventMask { InputEventHash computedHash = InputEventHash{0}; int32_t button = -1; int32_t mods = 0; }; #define PKE_INPUT_ACTION_MASK_INDEX_PRIMARY 0 #define PKE_INPUT_ACTION_MASK_INDEX_SECONDARY 1 #define PKE_INPUT_ACTION_MASK_INDEX_COUNT 2 struct PkeInputAction { const char *name; PkeInputEventMask masks[2] = {{},{}}; int32_t event_indices[2] = {-1,-1}; }; struct PkeInputSet { const char *title; int64_t actionCount; PkeInputAction *actions; InputActionSetFlags flags; }; void PkeInput_Tick(double delta); PkeInputEventHolder PkeInput_Query(const char *actionName); void PkeInput_Init(); InputActionSetHandle PkeInput_RegisterSet(const PkeInputSet &set); void PkeInput_ActivateSet(InputActionSetHandle handle); void PkeInput_DeactivateSet(InputActionSetHandle handle); void PkeInput_UnregisterSet(InputActionSetHandle handle); pk_arr_t &PkeInput_GetInputSets(); void PkeInput_Teardown(); #endif /* PKE_PLAYER_INPUT_HPP */