VoxelEngine
 
Loading...
Searching...
No Matches
InputSystem.h
1#pragma once
2
3#include <array>
4
5#define GLFW_INCLUDE_NONE
6#include <GLFW/glfw3.h>
7
8#include "InputTypes.h"
9#include "events/GLFWEventSource.h"
10
11
12struct GLFWwindow;
13
14namespace engine {
15
17 public:
19 InputSystem(GLFWwindow* window);
20
21 void beginFrame();
22
23 template <KeyState state>
24 bool isKey(GLFWKey k) const {
25 static_assert(false, "Invalid key state");
26 return false;
27 }
28 KeyState getKeyState(GLFWKey k) const;
29 float getAxis(InputAxis axis);
30
31 template <KeyState state>
32 bool isMouse(GLFWKey k) const {
33 static_assert(false, "Invalid key state");
34 return false;
35 }
36
37 private:
38 GLFWwindow* m_window = nullptr;
39
40 std::array<KeyState, GLFW_KEY_LAST + 1> m_keyStates{KeyState::None};
41 std::array<KeyState, GLFW_MOUSE_BUTTON_LAST + 1> m_mouseButtonStates{KeyState::None};
42 std::array<float, static_cast<int>(InputAxis::End)> m_axisStates{0.0f};
43
44 float m_mouseX = 0.0f;
45 float m_mouseY = 0.0f;
46
47 void setAxis(InputAxis axis, float value);
48
49 void registerCallbacks();
50 int keyIndex(GLFWKey k) const;
51 };
52
53
54 template <>
55 inline bool InputSystem::isKey<KeyState::Pressed>(GLFWKey k) const {
56 return m_keyStates[keyIndex(k)] == KeyState::Pressed;
57 }
58
59 template <>
60 inline bool InputSystem::isKey<KeyState::Released>(GLFWKey k) const {
61 return m_keyStates[keyIndex(k)] == KeyState::Released;
62 }
63
64 template <>
65 inline bool InputSystem::isKey<KeyState::Held>(GLFWKey k) const {
66 return m_keyStates[keyIndex(k)] == KeyState::Held;
67 }
68
69 template <>
70 inline bool InputSystem::isKey<KeyState::Down>(GLFWKey k) const {
71 KeyState state = m_keyStates[keyIndex(k)];
72 return state & KeyState::Pressed || state & KeyState::Held;
73 }
74
75 template <>
76 inline bool InputSystem::isKey<KeyState::Up>(GLFWKey k) const {
77 KeyState state = m_keyStates[keyIndex(k)];
78 return state & KeyState::Released || state & KeyState::None;
79 }
80
81
82 template <>
83 inline bool InputSystem::isMouse<KeyState::Pressed>(GLFWKey k) const {
84 return m_mouseButtonStates[keyIndex(k)] == KeyState::Pressed;
85 }
86
87 template <>
88 inline bool InputSystem::isMouse<KeyState::Released>(GLFWKey k) const {
89 return m_mouseButtonStates[keyIndex(k)] == KeyState::Released;
90 }
91
92 template <>
93 inline bool InputSystem::isMouse<KeyState::Held>(GLFWKey k) const {
94 return m_mouseButtonStates[keyIndex(k)] == KeyState::Held;
95 }
96
97 template <>
98 inline bool InputSystem::isMouse<KeyState::Down>(GLFWKey k) const {
99 KeyState state = m_mouseButtonStates[keyIndex(k)];
100 return state & KeyState::Pressed || state & KeyState::Held;
101 }
102
103 template <>
104 inline bool InputSystem::isMouse<KeyState::Up>(GLFWKey k) const {
105 KeyState state = m_mouseButtonStates[keyIndex(k)];
106 return state & KeyState::Released || state & KeyState::None;
107 }
108
109} // namespace engine
Definition GLFWEventSource.h:10
Definition InputSystem.h:16