Introduce event-based input system

This commit is contained in:
2023-06-11 00:23:44 +02:00
parent 3fcf6414f8
commit 1f89ca59f0
18 changed files with 434 additions and 423 deletions

View File

@@ -1,21 +1,44 @@
#include "input.h"
void Input::handle_keyboard_input(entt::registry &registry, Key const &key_input)
#include <GLFW/glfw3.h>
namespace Input {
void KeyListener::key_event(KeyInput const& key_input_event)
{
registry.ctx().erase<Key>();
registry.ctx().emplace<Key>(key_input);
auto& key_state = registry.ctx().emplace<State<KeyCode>>();
if (key_input_event.action == static_cast<Action>(GLFW_PRESS)) {
key_state.press(key_input_event.key_code);
} else if (key_input_event.action == static_cast<Action>(GLFW_RELEASE)) {
key_state.release(key_input_event.key_code);
}
}
void Input::handle_mouse_button_input(entt::registry &registry,
MouseButton const &mouse_button_input)
void CursorListener::cursor_event(MouseMotion const& mouse_motion_event)
{
registry.ctx().erase<MouseButton>();
registry.ctx().emplace<MouseButton>(mouse_button_input);
auto& mouse_motion = registry.ctx().emplace<MouseMotion>();
mouse_motion.delta += mouse_motion_event.delta;
}
void Input::handle_mouse_cursor_input(entt::registry &registry,
MouseCursor const &mouse_cursor_input)
void reset_mouse_motion(entt::registry& registry)
{
registry.ctx().erase<MouseCursor>();
registry.ctx().emplace<MouseCursor>(mouse_cursor_input);
auto& mouse_motion = registry.ctx().emplace<MouseMotion>();
mouse_motion = {};
}
template <typename T> void State<T>::init_state(entt::registry& registry)
{
registry.ctx().emplace<State<T>>();
}
template <typename T> void State<T>::update_state(entt::registry& registry)
{
auto& state = registry.ctx().get<State<T>>();
state.just_pressed_keys.clear();
state.just_released_keys.clear();
}
template class State<KeyCode>;
} // namespace Input