source: trunk/src/input/input.h @ 1785

Last change on this file since 1785 was 1785, checked in by touky, 8 years ago

Added InputTracker test initPhysTest

  • Property svn:keywords set to Id
File size: 9.3 KB
Line 
1//
2// Lol Engine
3//
4// Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net>
5//   This program is free software; you can redistribute it and/or
6//   modify it under the terms of the Do What The Fuck You Want To
7//   Public License, Version 2, as published by Sam Hocevar. See
8//   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
9//
10
11//
12// The Input static class
13// ----------------------
14//
15
16#if !defined __LOL_INPUT_INPUT_H__
17#define __LOL_INPUT_INPUT_H__
18
19#include <cstring>
20#include "core.h"
21#include "lol/math/vector.h"
22#include "input/stick.h"
23
24namespace lol
25{
26
27class WorldEntity;
28
29//FULL Key reap-off of the SDLK enum
30typedef enum {
31    /** @name ASCII mapped keysyms
32        *  The keyboard syms have been cleverly chosen to map to ASCII
33        */
34    /*@{*/
35        LOLK_UNKNOWN            = 0,
36        LOLK_FIRST              = 0,
37        LOLK_BACKSPACE          = 8,
38        LOLK_TAB                = 9,
39        LOLK_CLEAR              = 12,
40        LOLK_RETURN             = 13,
41        LOLK_PAUSE              = 19,
42        LOLK_ESCAPE             = 27,
43        LOLK_SPACE              = 32,
44        LOLK_EXCLAIM            = 33,
45        LOLK_QUOTEDBL           = 34,
46        LOLK_HASH               = 35,
47        LOLK_DOLLAR             = 36,
48        LOLK_AMPERSAND          = 38,
49        LOLK_QUOTE              = 39,
50        LOLK_LEFTPAREN          = 40,
51        LOLK_RIGHTPAREN         = 41,
52        LOLK_ASTERISK           = 42,
53        LOLK_PLUS               = 43,
54        LOLK_COMMA              = 44,
55        LOLK_MINUS              = 45,
56        LOLK_PERIOD             = 46,
57        LOLK_SLASH              = 47,
58        LOLK_0                  = 48,
59        LOLK_1                  = 49,
60        LOLK_2                  = 50,
61        LOLK_3                  = 51,
62        LOLK_4                  = 52,
63        LOLK_5                  = 53,
64        LOLK_6                  = 54,
65        LOLK_7                  = 55,
66        LOLK_8                  = 56,
67        LOLK_9                  = 57,
68        LOLK_COLON              = 58,
69        LOLK_SEMICOLON          = 59,
70        LOLK_LESS               = 60,
71        LOLK_EQUALS             = 61,
72        LOLK_GREATER            = 62,
73        LOLK_QUESTION           = 63,
74        LOLK_AT                 = 64,
75        /*
76           Skip uppercase letters
77         */
78        LOLK_LEFTBRACKET        = 91,
79        LOLK_BACKSLASH          = 92,
80        LOLK_RIGHTBRACKET       = 93,
81        LOLK_CARET              = 94,
82        LOLK_UNDERSCORE         = 95,
83        LOLK_BACKQUOTE          = 96,
84        LOLK_a                  = 97,
85        LOLK_b                  = 98,
86        LOLK_c                  = 99,
87        LOLK_d                  = 100,
88        LOLK_e                  = 101,
89        LOLK_f                  = 102,
90        LOLK_g                  = 103,
91        LOLK_h                  = 104,
92        LOLK_i                  = 105,
93        LOLK_j                  = 106,
94        LOLK_k                  = 107,
95        LOLK_l                  = 108,
96        LOLK_m                  = 109,
97        LOLK_n                  = 110,
98        LOLK_o                  = 111,
99        LOLK_p                  = 112,
100        LOLK_q                  = 113,
101        LOLK_r                  = 114,
102        LOLK_s                  = 115,
103        LOLK_t                  = 116,
104        LOLK_u                  = 117,
105        LOLK_v                  = 118,
106        LOLK_w                  = 119,
107        LOLK_x                  = 120,
108        LOLK_y                  = 121,
109        LOLK_z                  = 122,
110        LOLK_DELETE             = 127,
111        /* End of ASCII mapped keysyms */
112        /*@}*/
113
114        /** @name International keyboard syms */
115        /*@{*/
116        LOLK_WORLD_0            = 160,          /* 0xA0 */
117        LOLK_WORLD_1            = 161,
118        LOLK_WORLD_2            = 162,
119        LOLK_WORLD_3            = 163,
120        LOLK_WORLD_4            = 164,
121        LOLK_WORLD_5            = 165,
122        LOLK_WORLD_6            = 166,
123        LOLK_WORLD_7            = 167,
124        LOLK_WORLD_8            = 168,
125        LOLK_WORLD_9            = 169,
126        LOLK_WORLD_10           = 170,
127        LOLK_WORLD_11           = 171,
128        LOLK_WORLD_12           = 172,
129        LOLK_WORLD_13           = 173,
130        LOLK_WORLD_14           = 174,
131        LOLK_WORLD_15           = 175,
132        LOLK_WORLD_16           = 176,
133        LOLK_WORLD_17           = 177,
134        LOLK_WORLD_18           = 178,
135        LOLK_WORLD_19           = 179,
136        LOLK_WORLD_20           = 180,
137        LOLK_WORLD_21           = 181,
138        LOLK_WORLD_22           = 182,
139        LOLK_WORLD_23           = 183,
140        LOLK_WORLD_24           = 184,
141        LOLK_WORLD_25           = 185,
142        LOLK_WORLD_26           = 186,
143        LOLK_WORLD_27           = 187,
144        LOLK_WORLD_28           = 188,
145        LOLK_WORLD_29           = 189,
146        LOLK_WORLD_30           = 190,
147        LOLK_WORLD_31           = 191,
148        LOLK_WORLD_32           = 192,
149        LOLK_WORLD_33           = 193,
150        LOLK_WORLD_34           = 194,
151        LOLK_WORLD_35           = 195,
152        LOLK_WORLD_36           = 196,
153        LOLK_WORLD_37           = 197,
154        LOLK_WORLD_38           = 198,
155        LOLK_WORLD_39           = 199,
156        LOLK_WORLD_40           = 200,
157        LOLK_WORLD_41           = 201,
158        LOLK_WORLD_42           = 202,
159        LOLK_WORLD_43           = 203,
160        LOLK_WORLD_44           = 204,
161        LOLK_WORLD_45           = 205,
162        LOLK_WORLD_46           = 206,
163        LOLK_WORLD_47           = 207,
164        LOLK_WORLD_48           = 208,
165        LOLK_WORLD_49           = 209,
166        LOLK_WORLD_50           = 210,
167        LOLK_WORLD_51           = 211,
168        LOLK_WORLD_52           = 212,
169        LOLK_WORLD_53           = 213,
170        LOLK_WORLD_54           = 214,
171        LOLK_WORLD_55           = 215,
172        LOLK_WORLD_56           = 216,
173        LOLK_WORLD_57           = 217,
174        LOLK_WORLD_58           = 218,
175        LOLK_WORLD_59           = 219,
176        LOLK_WORLD_60           = 220,
177        LOLK_WORLD_61           = 221,
178        LOLK_WORLD_62           = 222,
179        LOLK_WORLD_63           = 223,
180        LOLK_WORLD_64           = 224,
181        LOLK_WORLD_65           = 225,
182        LOLK_WORLD_66           = 226,
183        LOLK_WORLD_67           = 227,
184        LOLK_WORLD_68           = 228,
185        LOLK_WORLD_69           = 229,
186        LOLK_WORLD_70           = 230,
187        LOLK_WORLD_71           = 231,
188        LOLK_WORLD_72           = 232,
189        LOLK_WORLD_73           = 233,
190        LOLK_WORLD_74           = 234,
191        LOLK_WORLD_75           = 235,
192        LOLK_WORLD_76           = 236,
193        LOLK_WORLD_77           = 237,
194        LOLK_WORLD_78           = 238,
195        LOLK_WORLD_79           = 239,
196        LOLK_WORLD_80           = 240,
197        LOLK_WORLD_81           = 241,
198        LOLK_WORLD_82           = 242,
199        LOLK_WORLD_83           = 243,
200        LOLK_WORLD_84           = 244,
201        LOLK_WORLD_85           = 245,
202        LOLK_WORLD_86           = 246,
203        LOLK_WORLD_87           = 247,
204        LOLK_WORLD_88           = 248,
205        LOLK_WORLD_89           = 249,
206        LOLK_WORLD_90           = 250,
207        LOLK_WORLD_91           = 251,
208        LOLK_WORLD_92           = 252,
209        LOLK_WORLD_93           = 253,
210        LOLK_WORLD_94           = 254,
211        LOLK_WORLD_95           = 255,          /* 0xFF */
212        /*@}*/
213
214        /** @name Numeric keypad */
215        /*@{*/
216        LOLK_KP0                = 256,
217        LOLK_KP1                = 257,
218        LOLK_KP2                = 258,
219        LOLK_KP3                = 259,
220        LOLK_KP4                = 260,
221        LOLK_KP5                = 261,
222        LOLK_KP6                = 262,
223        LOLK_KP7                = 263,
224        LOLK_KP8                = 264,
225        LOLK_KP9                = 265,
226        LOLK_KP_PERIOD          = 266,
227        LOLK_KP_DIVIDE          = 267,
228        LOLK_KP_MULTIPLY        = 268,
229        LOLK_KP_MINUS           = 269,
230        LOLK_KP_PLUS            = 270,
231        LOLK_KP_ENTER           = 271,
232        LOLK_KP_EQUALS          = 272,
233        /*@}*/
234
235        /** @name Arrows + Home/End pad */
236        /*@{*/
237        LOLK_UP                 = 273,
238        LOLK_DOWN               = 274,
239        LOLK_RIGHT              = 275,
240        LOLK_LEFT               = 276,
241        LOLK_INSERT             = 277,
242        LOLK_HOME               = 278,
243        LOLK_END                = 279,
244        LOLK_PAGEUP             = 280,
245        LOLK_PAGEDOWN           = 281,
246        /*@}*/
247
248        /** @name Function keys */
249        /*@{*/
250        LOLK_F1                 = 282,
251        LOLK_F2                 = 283,
252        LOLK_F3                 = 284,
253        LOLK_F4                 = 285,
254        LOLK_F5                 = 286,
255        LOLK_F6                 = 287,
256        LOLK_F7                 = 288,
257        LOLK_F8                 = 289,
258        LOLK_F9                 = 290,
259        LOLK_F10                = 291,
260        LOLK_F11                = 292,
261        LOLK_F12                = 293,
262        LOLK_F13                = 294,
263        LOLK_F14                = 295,
264        LOLK_F15                = 296,
265        /*@}*/
266
267        /** @name Key state modifier keys */
268        /*@{*/
269        LOLK_NUMLOCK            = 300,
270        LOLK_CAPSLOCK           = 301,
271        LOLK_SCROLLOCK          = 302,
272        LOLK_RSHIFT             = 303,
273        LOLK_LSHIFT             = 304,
274        LOLK_RCTRL              = 305,
275        LOLK_LCTRL              = 306,
276        LOLK_RALT               = 307,
277        LOLK_LALT               = 308,
278        LOLK_RMETA              = 309,
279        LOLK_LMETA              = 310,
280        LOLK_LSUPER             = 311,          /**< Left "Windows" key */
281        LOLK_RSUPER             = 312,          /**< Right "Windows" key */
282        LOLK_MODE               = 313,          /**< "Alt Gr" key */
283        LOLK_COMPOSE            = 314,          /**< Multi-key compose key */
284        /*@}*/
285
286        /** @name Miscellaneous function keys */
287        /*@{*/
288        LOLK_HELP               = 315,
289        LOLK_PRINT              = 316,
290        LOLK_SYSREQ             = 317,
291        LOLK_BREAK              = 318,
292        LOLK_MENU               = 319,
293        LOLK_POWER              = 320,          /**< Power Macintosh power key */
294        LOLK_EURO               = 321,          /**< Some european keyboards */
295        LOLK_UNDO               = 322,          /**< Atari keyboard has Undo */
296        /*@}*/
297
298        /* Add any other keys here */
299
300        LOLK_LAST
301} LOLKey;
302
303/** Enumeration of valid key mods (possibly OR'd together) */
304typedef enum {
305        LOLKMOD_NONE  = 0x0000,
306        LOLKMOD_LSHIFT= 0x0001,
307        LOLKMOD_RSHIFT= 0x0002,
308        LOLKMOD_LCTRL = 0x0040,
309        LOLKMOD_RCTRL = 0x0080,
310        LOLKMOD_LALT  = 0x0100,
311        LOLKMOD_RALT  = 0x0200,
312        LOLKMOD_LMETA = 0x0400,
313        LOLKMOD_RMETA = 0x0800,
314        LOLKMOD_NUM   = 0x1000,
315        LOLKMOD_CAPS  = 0x2000,
316        LOLKMOD_MODE  = 0x4000,
317        LOLKMOD_RESERVED = 0x8000
318} LOLKeyMod;
319
320#define LOLKMOD_CTRL    (LOLKMOD_LCTRL|LOLKMOD_RCTRL)
321#define LOLKMOD_SHIFT   (LOLKMOD_LSHIFT|LOLKMOD_RSHIFT)
322#define LOLKMOD_ALT             (LOLKMOD_LALT|LOLKMOD_RALT)
323#define LOLKMOD_META    (LOLKMOD_LMETA|LOLKMOD_RMETA)
324
325struct ActionSetting
326{
327        int                                             ActionId;
328        float                                   BufferingTime;
329        float                                   BufferedSince;
330
331        ActionSetting(int NewActionId)
332        {
333                memset(this, 0, sizeof(ActionSetting));
334                ActionId = NewActionId;
335        }
336};
337
338struct ButtonSetting
339{
340        int                                             m_raw_button_id;
341        int                                             m_current_status;
342        int                                             m_previous_status;
343        Array<ActionSetting>    m_associated_action_list;
344
345        ButtonSetting(int NewRawButtonId)
346        {
347                memset(this, 0, sizeof(ButtonSetting));
348                m_raw_button_id = NewRawButtonId;
349        }
350        int GetActionSettingIdx(int ActionId)
351        {
352                for (int i = 0; i < m_associated_action_list.Count(); i++)
353                        if (m_associated_action_list[i].ActionId == ActionId)
354                                return i;
355                return -1;
356        }
357};
358
359class InputTracker : public Entity
360{
361
362        friend class Input;
363
364public:
365        InputTracker();
366
367private:
368        Array<ButtonSetting>    m_input_assocation_list;
369
370        int GetButtonSettingIdx(int ButtonId)
371        {
372                for (int i = 0; i < m_input_assocation_list.Count(); i++)
373                        if (m_input_assocation_list[i].m_raw_button_id == ButtonId)
374                                return i;
375                return -1;
376        }
377
378        void UpdateActionStatus(float seconds);
379
380protected:
381        virtual void                    TickGame(float seconds)
382        {
383                UpdateActionStatus(seconds);
384        }
385
386        void                                    LinkActionIdToButtonId(int ActionId, int ButtonId);
387        void                                    UnlinkActionId(int ActionId);
388        int                                             GetActionStatus(int ActionId);
389        bool                                    WasActionJustReleased(int ActionId);
390};
391
392class Input
393{
394private:
395        static InputTracker*            m_input_tracker;
396
397        static bool                                     CheckInputTrackerInit()
398        {
399                if (Input::m_input_tracker)
400                        return true;
401
402                Input::m_input_tracker = new InputTracker();
403                return true;
404        }
405
406public:
407
408    /* These methods are general queries */
409    static ivec2 GetMousePos();
410    static ivec3 GetMouseButtons();
411
412        //BH : Shouldn't use this
413    static int GetButtonState(int button);
414
415        /* Action management */
416        static void LinkActionIdToButtonId(int ActionId, int ButtonId);
417        static void UnlinkActionId(int ActionId);
418        static int GetActionStatus(int ActionId);
419        static bool WasActionJustReleased(int ActionId);
420
421    /* Entities can subscribe to events */
422    static void TrackMouse(WorldEntity *e);
423    static void UntrackMouse(WorldEntity *e);
424
425    /* These methods are called by the underlying input listeners */
426    static void SetMousePos(ivec2 coord);
427    static void SetMouseButton(int index);
428    static void UnsetMouseButton(int index);
429
430    /* Joystick handling */
431    static Stick *CreateStick();
432    static void DestroyStick(Stick *stick);
433
434    static Stick *TrackStick(int desired);
435    static void UntrackStick(Stick *stick);
436};
437
438} /* namespace lol */
439
440#endif // __LOL_INPUT_INPUT_H__
441
Note: See TracBrowser for help on using the repository browser.