#include "ASW.h" #ifndef ASW_INPUT_H #define ASW_INPUT_H class Input { public: /* Input::KeyType enumerates all possible keys */ enum KeyType { KEY_UNKNOWN = 0, KEY_ESCAPE = 1, KEY_F1 = 2, KEY_F2 = 3, KEY_F3 = 4, KEY_F4 = 5, KEY_F5 = 6, KEY_F6 = 7, KEY_F7 = 8, KEY_F8 = 9, KEY_F9 = 10, KEY_F10 = 11, KEY_F11 = 12, KEY_F12 = 13, KEY_PRNTSCN = 14, KEY_SCRLCK = 15, KEY_PAUSE = 16, KEY_ACCENT = 17, KEY_1 = 18, KEY_2 = 19, KEY_3 = 20, KEY_4 = 21, KEY_5 = 22, KEY_6 = 23, KEY_7 = 24, KEY_8 = 25, KEY_9 = 26, KEY_0 = 27, KEY_MINUS = 28, KEY_EQUALS = 29, KEY_BACKSPACE = 30, KEY_INSERT = 31, KEY_HOME = 32, KEY_PAGEUP = 33, KEY_KEYPAD_NUMLOCK = 34, KEY_KEYPAD_DIVIDE = 35, KEY_KEYPAD_MULTIPLY = 36, KEY_KEYPAD_SUBTRACT = 37, KEY_TAB = 38, KEY_Q = 39, KEY_W = 40, KEY_E = 41, KEY_R = 42, KEY_T = 43, KEY_Y = 44, KEY_U = 45, KEY_I = 46, KEY_O = 47, KEY_P = 48, KEY_BRACKETL = 49, KEY_BRACKETR = 50, KEY_BACKSLASH = 51, KEY_DELETE = 52, KEY_END = 53, KEY_PAGEDOWN = 54, KEY_KEYPAD_7 = 55, KEY_KEYPAD_8 = 56, KEY_KEYPAD_9 = 57, KEY_KEYPAD_ADD = 58, KEY_CAPSLOCK = 59, KEY_A = 60, KEY_S = 61, KEY_D = 62, KEY_F = 63, KEY_G = 64, KEY_H = 65, KEY_J = 66, KEY_K = 67, KEY_L = 68, KEY_SEMICOLON = 69, KEY_QUOTE = 70, KEY_ENTER = 71, KEY_KEYPAD_4 = 72, KEY_KEYPAD_5 = 73, KEY_KEYPAD_6 = 74, KEY_SHIFTL = 75, KEY_Z = 76, KEY_X = 77, KEY_C = 78, KEY_V = 79, KEY_B = 80, KEY_N = 81, KEY_M = 82, KEY_COMMA = 83, KEY_PERIOD = 84, KEY_FORWARDSLASH = 85, KEY_SHIFTR = 86, KEY_UP = 87, KEY_KEYPAD_1 = 88, KEY_KEYPAD_2 = 89, KEY_KEYPAD_3 = 90, KEY_KEYPAD_ENTER = 91, KEY_CONTROLL = 92, KEY_WINDOWSL = 93, KEY_ALTL = 94, KEY_SPACE = 95, KEY_ALTR = 96, KEY_WINDOWSR = 97, KEY_CONTROLR = 98, KEY_LEFT = 99, KEY_DOWN = 100, KEY_RIGHT = 101, KEY_KEYPAD_0 = 102, KEY_KEYPAD_PERIOD = 103, KEY_MB0 = 104, KEY_MB1 = 105, KEY_MB2 = 106, KEY_MB3 = 107, KEY_MB4 = 108, KEY_MB5 = 109, KEY_MB6 = 110, KEY_MB7 = 111, KEY_COUNT = 111 }; struct Action { unsigned int m_uintAction; bool m_blnOn; }; struct KeyChange { ASW::Input::KeyType m_enmKey; bool m_blnDown; }; private: struct ActionInfo { ASW::Input::KeyType * m_ptrKeys; unsigned int m_uintAction; unsigned char m_uchrKeys; ActionInfo() : m_ptrKeys(NULL), m_uchrKeys(0), m_uintAction(0) {} }; std::vector m_clsActions; protected: bool m_blnKeys[KEY_COUNT]; unsigned int * m_ptrActionIndices[KEY_COUNT]; virtual bool Sync(ASW::Input::KeyChange * Changes, unsigned int & Amount, ASW::Point3i & MouseMovement) = 0; public: static const char * m_ptrKeys[ASW::Input::KEY_COUNT]; Input(); virtual ~Input(); virtual bool Acquire() = 0; bool Get(ASW::Input::Action * Actions, unsigned int & Amount, ASW::Point3i & MouseMovement); unsigned int GetActionAmount() const {return m_clsActions.size();} const ASW::Input::KeyType * GetAction(const unsigned int Index, unsigned int & Action, unsigned char & Amount) const; static ASW::Input::KeyType ParseKeyType(const char * KeyTypeString); bool Set(const unsigned int Id, const KeyType * Keys, const unsigned char Amount); }; #endif