MxEngine
KeyEvent.h
1 // Copyright(c) 2019 - 2020, #Momo
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met :
6 //
7 // 1. Redistributions of source code must retain the above copyright notice, this
8 // list of conditions and the following disclaimer.
9 //
10 // 2. Redistributions in binary form must reproduce the above copyright notice,
11 // this list of conditions and the following disclaimer in the documentation
12 // and /or other materials provided with the distribution.
13 //
14 // 3. Neither the name of the copyright holder nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 
29 #pragma once
30 
31 #include "Core/Event/IEvent.h"
32 #include <bitset>
33 
34 namespace MxEngine
35 {
36  // from glfw header file
37  enum class KeyCode
38  {
39  UNKNOWN = -1,
40  SPACE = 32,
41  APOSTROPHE = 39,
42  COMMA = 44,
43  MINUS = 45,
44  PERIOD = 46,
45  SLASH = 47,
46  D0 = 48,
47  D1 = 49,
48  D2 = 50,
49  D3 = 51,
50  D4 = 52,
51  D5 = 53,
52  D6 = 54,
53  D7 = 55,
54  D8 = 56,
55  D9 = 57,
56  SEMICOLON = 59,
57  EQUAL = 61,
58  A = 65,
59  B = 66,
60  C = 67,
61  D = 68,
62  E = 69,
63  F = 70,
64  G = 71,
65  H = 72,
66  I = 73,
67  J = 74,
68  K = 75,
69  L = 76,
70  M = 77,
71  N = 78,
72  O = 79,
73  P = 80,
74  Q = 81,
75  R = 82,
76  S = 83,
77  T = 84,
78  U = 85,
79  V = 86,
80  W = 87,
81  X = 88,
82  Y = 89,
83  Z = 90,
84  LEFT_BRACKET = 91,
85  BACKSLASH = 92,
86  RIGHT_BRACKET = 93,
87  GRAVE_ACCENT = 96,
88  WORLD_1 = 16,
89  WORLD_2 = 16,
90  ESCAPE = 256,
91  ENTER = 257,
92  TAB = 258,
93  BACKSPACE = 259,
94  INSERT = 260,
95  DELETE = 261,
96  RIGHT = 262,
97  LEFT = 263,
98  DOWN = 264,
99  UP = 265,
100  PAGE_UP = 266,
101  PAGE_DOWN = 267,
102  HOME = 268,
103  END = 269,
104  CAPS_LOCK = 280,
105  SCROLL_LOCK = 281,
106  NUM_LOCK = 282,
107  PRINT_SCREEN = 283,
108  PAUSE = 284,
109  F1 = 290,
110  F2 = 291,
111  F3 = 292,
112  F4 = 293,
113  F5 = 294,
114  F6 = 295,
115  F7 = 296,
116  F8 = 297,
117  F9 = 298,
118  F10 = 299,
119  F11 = 300,
120  F12 = 301,
121  F13 = 302,
122  F14 = 303,
123  F15 = 304,
124  F16 = 305,
125  F17 = 306,
126  F18 = 307,
127  F19 = 308,
128  F20 = 309,
129  F21 = 310,
130  F22 = 311,
131  F23 = 312,
132  F24 = 313,
133  F25 = 314,
134  KP_0 = 320,
135  KP_1 = 321,
136  KP_2 = 322,
137  KP_3 = 323,
138  KP_4 = 324,
139  KP_5 = 325,
140  KP_6 = 326,
141  KP_7 = 327,
142  KP_8 = 328,
143  KP_9 = 329,
144  KP_DECIMAL = 330,
145  KP_DIVIDE = 331,
146  KP_MULTIPLY = 332,
147  KP_SUBTRACT = 333,
148  KP_ADD = 334,
149  KP_ENTER = 335,
150  KP_EQUAL = 336,
151  LEFT_SHIFT = 340,
152  LEFT_CONTROL = 341,
153  LEFT_ALT = 342,
154  LEFT_SUPER = 343,
155  RIGHT_SHIFT = 344,
156  RIGHT_CONTROL = 345,
157  RIGHT_ALT = 346,
158  RIGHT_SUPER = 347,
159  MENU = 348,
160  };
161 
162  inline const char* EnumToString(KeyCode key)
163  {
164  #define STRKEY(val) case MxEngine::KeyCode::val: return #val
165  switch (key)
166  {
167  STRKEY(UNKNOWN);
168  STRKEY(SPACE);
169  STRKEY(APOSTROPHE);
170  STRKEY(COMMA);
171  STRKEY(MINUS);
172  STRKEY(PERIOD);
173  STRKEY(SLASH);
174  STRKEY(D0);
175  STRKEY(D1);
176  STRKEY(D2);
177  STRKEY(D3);
178  STRKEY(D4);
179  STRKEY(D5);
180  STRKEY(D6);
181  STRKEY(D7);
182  STRKEY(D8);
183  STRKEY(D9);
184  STRKEY(SEMICOLON);
185  STRKEY(EQUAL);
186  STRKEY(A);
187  STRKEY(B);
188  STRKEY(C);
189  STRKEY(D);
190  STRKEY(E);
191  STRKEY(F);
192  STRKEY(G);
193  STRKEY(H);
194  STRKEY(I);
195  STRKEY(J);
196  STRKEY(K);
197  STRKEY(L);
198  STRKEY(M);
199  STRKEY(N);
200  STRKEY(O);
201  STRKEY(P);
202  STRKEY(Q);
203  STRKEY(R);
204  STRKEY(S);
205  STRKEY(T);
206  STRKEY(U);
207  STRKEY(V);
208  STRKEY(W);
209  STRKEY(X);
210  STRKEY(Y);
211  STRKEY(Z);
212  STRKEY(LEFT_BRACKET);
213  STRKEY(BACKSLASH);
214  STRKEY(RIGHT_BRACKET);
215  STRKEY(GRAVE_ACCENT);
216  STRKEY(WORLD_1);
217  STRKEY(ESCAPE);
218  STRKEY(ENTER);
219  STRKEY(TAB);
220  STRKEY(BACKSPACE);
221  STRKEY(INSERT);
222  STRKEY(DELETE);
223  STRKEY(RIGHT);
224  STRKEY(LEFT);
225  STRKEY(DOWN);
226  STRKEY(UP);
227  STRKEY(PAGE_UP);
228  STRKEY(PAGE_DOWN);
229  STRKEY(HOME);
230  STRKEY(END);
231  STRKEY(CAPS_LOCK);
232  STRKEY(SCROLL_LOCK);
233  STRKEY(NUM_LOCK);
234  STRKEY(PRINT_SCREEN);
235  STRKEY(PAUSE);
236  STRKEY(F1);
237  STRKEY(F2);
238  STRKEY(F3);
239  STRKEY(F4);
240  STRKEY(F5);
241  STRKEY(F6);
242  STRKEY(F7);
243  STRKEY(F8);
244  STRKEY(F9);
245  STRKEY(F10);
246  STRKEY(F11);
247  STRKEY(F12);
248  STRKEY(F13);
249  STRKEY(F14);
250  STRKEY(F15);
251  STRKEY(F16);
252  STRKEY(F17);
253  STRKEY(F18);
254  STRKEY(F19);
255  STRKEY(F20);
256  STRKEY(F21);
257  STRKEY(F22);
258  STRKEY(F23);
259  STRKEY(F24);
260  STRKEY(F25);
261  STRKEY(KP_0);
262  STRKEY(KP_1);
263  STRKEY(KP_2);
264  STRKEY(KP_3);
265  STRKEY(KP_4);
266  STRKEY(KP_5);
267  STRKEY(KP_6);
268  STRKEY(KP_7);
269  STRKEY(KP_8);
270  STRKEY(KP_9);
271  STRKEY(KP_DECIMAL);
272  STRKEY(KP_DIVIDE);
273  STRKEY(KP_MULTIPLY);
274  STRKEY(KP_SUBTRACT);
275  STRKEY(KP_ADD);
276  STRKEY(KP_ENTER);
277  STRKEY(KP_EQUAL);
278  STRKEY(LEFT_SHIFT);
279  STRKEY(LEFT_CONTROL);
280  STRKEY(LEFT_ALT);
281  STRKEY(LEFT_SUPER);
282  STRKEY(RIGHT_SHIFT);
283  STRKEY(RIGHT_CONTROL);
284  STRKEY(RIGHT_ALT);
285  STRKEY(RIGHT_SUPER);
286  STRKEY(MENU);
287  }
288  #undef STRKEY
289  return "INVALID_KEY";
290  }
291 
292  class KeyEvent : public IEvent
293  {
294  MAKE_EVENT(KeyEvent);
295 
296  using KeyVectorPointer = const std::bitset<350>*;
297 
298  // pointer to bitset. Is is okay as event lives less than bitset
299  KeyVectorPointer keyHeld;
300  KeyVectorPointer keyPressed;
301  KeyVectorPointer keyReleased;
302  public:
303  inline KeyEvent(KeyVectorPointer held, KeyVectorPointer pressed, KeyVectorPointer released) noexcept
304  : keyHeld(held), keyPressed(pressed), keyReleased(released) { }
305 
306  inline bool IsHeld(KeyCode key) const { return (key != KeyCode::UNKNOWN) && (*keyHeld)[size_t(key)]; }
307  inline bool IsPressed(KeyCode key) const { return (key != KeyCode::UNKNOWN) && (*keyPressed)[size_t(key)]; }
308  inline bool IsReleased(KeyCode key) const { return (key != KeyCode::UNKNOWN) && (*keyReleased)[size_t(key)]; }
309  };
310 }
Definition: KeyEvent.h:292
Definition: Application.cpp:49