1 module Engine.Input;
2 
3 import Engine.Core;
4 import derelict.glfw3.glfw3;
5 
6 public static class Input
7 {
8 	package static shared state[int] keysState;
9 	package static __gshared vec2 mousePos = vec2i(0,0);
10 	package static __gshared vec2 mouseScroll = vec2(0,0);
11 
12 	package enum state {
13 		notPressed = 0,
14 		press = 1,
15 		wasPressed = 2,
16 		firstPress = press | wasPressed,
17 	}
18 
19 	package static void Initialize() {
20 		glfwSetKeyCallback(Core.window,&KeyCallback);
21 		glfwSetMouseButtonCallback(Core.window,&MouseKeyCallback);
22 		glfwSetScrollCallback(Core.window,&MouseScrollCallback);
23 		double x,y;
24 		glfwGetCursorPos(Core.window, &x, &y);
25 		mousePos.x = x;
26 		mousePos.y = y;
27 	}
28 	
29 	extern (C) package static void MouseScrollCallback(GLFWwindow* window, double x, double y) nothrow {
30 		mouseScroll.x = x;
31 		mouseScroll.y = y;
32 	}
33 		
34 	extern (C) package static void MouseKeyCallback(GLFWwindow* window, int key, int action, int mods) nothrow {
35 		switch (action) {
36 			case GLFW_PRESS:
37 				keysState[key] = state.firstPress;
38 				break;
39 			case GLFW_RELEASE:
40 				keysState[key] = state.wasPressed;
41 				break;
42 			default:
43 				break;
44 		}	
45 	}
46 
47 	extern (C) package static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) nothrow {
48 		switch (action) {
49 			case GLFW_PRESS:
50 				keysState[key] = state.firstPress;
51 				break;
52 			case GLFW_RELEASE:
53 				keysState[key] = state.wasPressed;
54 				break;
55 			default:
56 				break;
57 		}	
58 	}
59 
60 		
61 	package static void Update() {
62 		foreach (ref s; keysState) {
63 			switch (s)  {
64 				case state.firstPress:
65 					s = state.press;
66 					break;
67 				case state.wasPressed:
68 					s = state.notPressed;
69 					break;
70 				default:
71 					break;
72 			} 
73 		}
74 		double x,y;
75 		glfwGetCursorPos(Core.window, &x, &y);
76 		mousePos.x = x;
77 		mousePos.y = y;
78 	
79 		mouseScroll = vec2(0,0);
80 	}	
81 
82 	private static state getState(int key) {
83 		auto s = key in keysState;
84 		if (s is null)
85 			return state.notPressed;
86 		return *s;
87 	}
88 
89 	public static bool KeyDown(Key key) {
90 		return (getState(key) & state.press) == state.press;
91 	}
92 
93 	public static bool KeyUp(Key key) {
94 		return !KeyDown(key);
95 	}
96 
97 	public static bool KeyPressDown(Key key) {
98 		return (getState(key) & state.firstPress) == state.firstPress;
99 	}
100 
101 	public static bool KeyPressUp(Key key) {
102 		return (getState(key) & state.wasPressed) == state.wasPressed;
103 	}	
104 
105 
106 	public static vec2 MousePosition()   {
107 		return vec2(mousePos.x, mousePos.y);
108 	}
109 
110 	public static vec2 MouseScroll()   {
111 		return mouseScroll;
112 	}
113 
114 }
115 
116 public enum Key {
117 	//UNKNOWN               = GLFW_KEY_UNKNOWN               ,
118 	SPACE                 = GLFW_KEY_SPACE                 ,
119 		APOSTROPHE            = GLFW_KEY_APOSTROPHE            ,
120 		COMMA                 = GLFW_KEY_COMMA                 ,
121 		MINUS                 = GLFW_KEY_MINUS                 ,
122 		PERIOD                = GLFW_KEY_PERIOD                ,
123 		SLASH                 = GLFW_KEY_SLASH                 ,
124 		KEY_0                     = GLFW_KEY_0                     ,
125 		KEY_1                     = GLFW_KEY_1                     ,
126 		KEY_2                     = GLFW_KEY_2                     ,
127 		KEY_3                     = GLFW_KEY_3                     ,
128 		KEY_4                     = GLFW_KEY_4                     ,
129 		KEY_5                     = GLFW_KEY_5                     ,
130 		KEY_6                     = GLFW_KEY_6                     ,
131 		KEY_7                     = GLFW_KEY_7                     ,
132 		KEY_8                     = GLFW_KEY_8                     ,
133 		KEY_9                     = GLFW_KEY_9                     ,
134 		SEMICOLON             = GLFW_KEY_SEMICOLON             ,
135 		EQUAL                 = GLFW_KEY_EQUAL                 ,
136 		A                     = GLFW_KEY_A                     ,
137 		B                     = GLFW_KEY_B                     ,
138 		C                     = GLFW_KEY_C                     ,
139 		D                     = GLFW_KEY_D                     ,
140 		E                     = GLFW_KEY_E                     ,
141 		F                     = GLFW_KEY_F                     ,
142 		G                     = GLFW_KEY_G                     ,
143 		H                     = GLFW_KEY_H                     ,
144 		I                     = GLFW_KEY_I                     ,
145 		J                     = GLFW_KEY_J                     ,
146 		K                     = GLFW_KEY_K                     ,
147 		L                     = GLFW_KEY_L                     ,
148 		M                     = GLFW_KEY_M                     ,
149 		N                     = GLFW_KEY_N                     ,
150 		O                     = GLFW_KEY_O                     ,
151 		P                     = GLFW_KEY_P                     ,
152 		Q                     = GLFW_KEY_Q                     ,
153 		R                     = GLFW_KEY_R                     ,
154 		S                     = GLFW_KEY_S                     ,
155 		T                     = GLFW_KEY_T                     ,
156 		U                     = GLFW_KEY_U                     ,
157 		V                     = GLFW_KEY_V                     ,
158 		W                     = GLFW_KEY_W                     ,
159 		X                     = GLFW_KEY_X                     ,
160 		Y                     = GLFW_KEY_Y                     ,
161 		Z                     = GLFW_KEY_Z                     ,
162 		LEFT_BRACKET          = GLFW_KEY_LEFT_BRACKET          ,
163 		BACKSLASH             = GLFW_KEY_BACKSLASH             ,
164 		RIGHT_BRACKET         = GLFW_KEY_RIGHT_BRACKET         ,
165 		GRAVE_ACCENT          = GLFW_KEY_GRAVE_ACCENT          ,
166 		WORLD_1               = GLFW_KEY_WORLD_1               ,
167 		WORLD_2               = GLFW_KEY_WORLD_2               ,
168 
169 		ESCAPE                = GLFW_KEY_ESCAPE                ,
170 		ENTER                 = GLFW_KEY_ENTER                 ,
171 		TAB                   = GLFW_KEY_TAB                   ,
172 		BACKSPACE             = GLFW_KEY_BACKSPACE             ,
173 		INSERT                = GLFW_KEY_INSERT                ,
174 		DELETE                = GLFW_KEY_DELETE                ,
175 		RIGHT                 = GLFW_KEY_RIGHT                 ,
176 		LEFT                  = GLFW_KEY_LEFT                  ,
177 		DOWN                  = GLFW_KEY_DOWN                  ,
178 		UP                    = GLFW_KEY_UP                    ,
179 		PAGE_UP               = GLFW_KEY_PAGE_UP               ,
180 		PAGE_DOWN             = GLFW_KEY_PAGE_DOWN             ,
181 		HOME                  = GLFW_KEY_HOME                  ,
182 		END                   = GLFW_KEY_END                   ,
183 		CAPS_LOCK             = GLFW_KEY_CAPS_LOCK             ,
184 		SCROLL_LOCK           = GLFW_KEY_SCROLL_LOCK           ,
185 		NUM_LOCK              = GLFW_KEY_NUM_LOCK              ,
186 		PRINT_SCREEN          = GLFW_KEY_PRINT_SCREEN          ,
187 		PAUSE                 = GLFW_KEY_PAUSE                 ,
188 		F1                    = GLFW_KEY_F1                    ,
189 		F2                    = GLFW_KEY_F2                    ,
190 		F3                    = GLFW_KEY_F3                    ,
191 		F4                    = GLFW_KEY_F4                    ,
192 		F5                    = GLFW_KEY_F5                    ,
193 		F6                    = GLFW_KEY_F6                    ,
194 		F7                    = GLFW_KEY_F7                    ,
195 		F8                    = GLFW_KEY_F8                    ,
196 		F9                    = GLFW_KEY_F9                    ,
197 		F10                   = GLFW_KEY_F10                   ,
198 		F11                   = GLFW_KEY_F11                   ,
199 		F12                   = GLFW_KEY_F12                   ,
200 		F13                   = GLFW_KEY_F13                   ,
201 		F14                   = GLFW_KEY_F14                   ,
202 		F15                   = GLFW_KEY_F15                   ,
203 		F16                   = GLFW_KEY_F16                   ,
204 		F17                   = GLFW_KEY_F17                   ,
205 		F18                   = GLFW_KEY_F18                   ,
206 		F19                   = GLFW_KEY_F19                   ,
207 		F20                   = GLFW_KEY_F20                   ,
208 		F21                   = GLFW_KEY_F21                   ,
209 		F22                   = GLFW_KEY_F22                   ,
210 		F23                   = GLFW_KEY_F23                   ,
211 		F24                   = GLFW_KEY_F24                   ,
212 		F25                   = GLFW_KEY_F25                   ,
213 		KP_0                  = GLFW_KEY_KP_0                  ,
214 		KP_1                  = GLFW_KEY_KP_1                  ,
215 		KP_2                  = GLFW_KEY_KP_2                  ,
216 		KP_3                  = GLFW_KEY_KP_3                  ,
217 		KP_4                  = GLFW_KEY_KP_4                  ,
218 		KP_5                  = GLFW_KEY_KP_5                  ,
219 		KP_6                  = GLFW_KEY_KP_6                  ,
220 		KP_7                  = GLFW_KEY_KP_7                  ,
221 		KP_8                  = GLFW_KEY_KP_8                  ,
222 		KP_9                  = GLFW_KEY_KP_9                  ,
223 		KP_DECIMAL            = GLFW_KEY_KP_DECIMAL            ,
224 		KP_DIVIDE             = GLFW_KEY_KP_DIVIDE             ,
225 		KP_MULTIPLY           = GLFW_KEY_KP_MULTIPLY           ,
226 		KP_SUBTRACT           = GLFW_KEY_KP_SUBTRACT           ,
227 		KP_ADD                = GLFW_KEY_KP_ADD                ,
228 		KP_ENTER              = GLFW_KEY_KP_ENTER              ,
229 		KP_EQUAL              = GLFW_KEY_KP_EQUAL              ,
230 		LEFT_SHIFT            = GLFW_KEY_LEFT_SHIFT            ,
231 		LEFT_CONTROL          = GLFW_KEY_LEFT_CONTROL          ,
232 		LEFT_ALT              = GLFW_KEY_LEFT_ALT              ,
233 		LEFT_SUPER            = GLFW_KEY_LEFT_SUPER            ,
234 		RIGHT_SHIFT           = GLFW_KEY_RIGHT_SHIFT           ,
235 		RIGHT_CONTROL         = GLFW_KEY_RIGHT_CONTROL         ,
236 		RIGHT_ALT             = GLFW_KEY_RIGHT_ALT             ,
237 		RIGHT_SUPER           = GLFW_KEY_RIGHT_SUPER           ,
238 		MENU                  = GLFW_KEY_MENU                  ,
239 		LAST                  = GLFW_KEY_LAST,
240 
241 		ESC           = GLFW_KEY_ESCAPE,
242 		DEL           = GLFW_KEY_DELETE,
243 		PAGEUP        = GLFW_KEY_PAGE_UP,
244 		PAGEDOWN      = GLFW_KEY_PAGE_DOWN,
245 		KP_NUM_LOCK   = GLFW_KEY_NUM_LOCK,
246 		LCTRL         = GLFW_KEY_LEFT_CONTROL,
247 		LSHIFT        = GLFW_KEY_LEFT_SHIFT,
248 		LALT          = GLFW_KEY_LEFT_ALT,
249 		LSUPER        = GLFW_KEY_LEFT_SUPER,
250 		RCTRL         = GLFW_KEY_RIGHT_CONTROL,
251 		RSHIFT        = GLFW_KEY_RIGHT_SHIFT,
252 		RALT          = GLFW_KEY_RIGHT_ALT,
253 		RSUPER        = GLFW_KEY_RIGHT_SUPER,
254 
255 		MOD_SHIFT   = GLFW_MOD_SHIFT  ,
256 		MOD_CONTROL = GLFW_MOD_CONTROL,
257 		MOD_ALT     = GLFW_MOD_ALT    ,
258 		MOD_SUPER   = GLFW_MOD_SUPER  ,
259 
260 		MOUSE_BUTTON_1      = GLFW_MOUSE_BUTTON_1     ,
261 		MOUSE_BUTTON_2      = GLFW_MOUSE_BUTTON_2     ,
262 		MOUSE_BUTTON_3      = GLFW_MOUSE_BUTTON_3     ,
263 		MOUSE_BUTTON_4      = GLFW_MOUSE_BUTTON_4     ,
264 		MOUSE_BUTTON_5      = GLFW_MOUSE_BUTTON_5     ,
265 		MOUSE_BUTTON_6      = GLFW_MOUSE_BUTTON_6     ,
266 		MOUSE_BUTTON_7      = GLFW_MOUSE_BUTTON_7     ,
267 		MOUSE_BUTTON_8      = GLFW_MOUSE_BUTTON_8     ,
268 		MOUSE_BUTTON_LAST   = GLFW_MOUSE_BUTTON_LAST  ,
269 		MOUSE_BUTTON_LEFT   = GLFW_MOUSE_BUTTON_LEFT  ,
270 		MOUSE_BUTTON_RIGHT  = GLFW_MOUSE_BUTTON_RIGHT ,
271 		MOUSE_BUTTON_MIDDLE = GLFW_MOUSE_BUTTON_MIDDLE,
272 
273 		JOYSTICK_1         =  GLFW_JOYSTICK_1       ,
274 		JOYSTICK_2         =  GLFW_JOYSTICK_2       ,
275 		JOYSTICK_3         =  GLFW_JOYSTICK_3       ,
276 		JOYSTICK_4         =  GLFW_JOYSTICK_4       ,
277 		JOYSTICK_5         =  GLFW_JOYSTICK_5       ,
278 		JOYSTICK_6         =  GLFW_JOYSTICK_6       ,
279 		JOYSTICK_7         =  GLFW_JOYSTICK_7       ,
280 		JOYSTICK_8         =  GLFW_JOYSTICK_8       ,
281 		JOYSTICK_9         =  GLFW_JOYSTICK_9       ,
282 		JOYSTICK_10        =  GLFW_JOYSTICK_10      ,
283 		JOYSTICK_11        =  GLFW_JOYSTICK_11      ,
284 		JOYSTICK_12        =  GLFW_JOYSTICK_12      ,
285 		JOYSTICK_13        =  GLFW_JOYSTICK_13      ,
286 		JOYSTICK_14        =  GLFW_JOYSTICK_14      ,
287 		JOYSTICK_15        =  GLFW_JOYSTICK_15      ,
288 		JOYSTICK_16        =  GLFW_JOYSTICK_16      ,
289 		JOYSTICK_LAST      =  GLFW_JOYSTICK_LAST    ,
290 }