diff --git a/src/input/input.cpp b/src/input/input.cpp index e75fa91e..9be64885 100644 --- a/src/input/input.cpp +++ b/src/input/input.cpp @@ -60,6 +60,18 @@ inputdata; static InputData * const data = &inputdata; +/* + * ButtonSetting class + */ + +int ButtonSetting::GetActionSettingIdx(ACTION_TYPE SearchAction) +{ + for (int i = 0; i < m_associated_action_list.Count(); i++) + if (ACTION_CMP(m_associated_action_list[i].m_action, SearchAction)) + return i; + return -1; +} + /* * InputTracker class */ @@ -68,77 +80,116 @@ InputTracker::InputTracker() { m_gamegroup = GAMEGROUP_BEFORE; + for (int i = 0; i < Key::K_LAST * 2; ++i) + m_input_status << 0; + Ticker::Ref(this); } +//Internal +int InputTracker::GetButtonSettingIdx(Key Button) +{ + for (int i = 0; i < m_input_assocation_list.Count(); i++) + if (m_input_assocation_list[i].m_raw_button == Button) + return i; + return -1; +} + +//----- +int InputTracker::GetCurrentButtonStatus(Key Button) +{ + if (Button < m_input_status.Count()) + return m_input_status[Button]; + return 0; +} + +//----- +int InputTracker::GetPreviousButtonStatus(Key Button) +{ + if (Button < m_input_status.Count()) + return m_input_status[Button + Key::K_LAST]; + return 0; +} + //Internal : Updates the action status & timers void InputTracker::UpdateActionStatus(float seconds) { +#if defined USE_SDL +#if SDL_MAJOR_VERSION == 1 && SDL_MINOR_VERSION >= 3 + Uint8 *keystate = SDL_GetKeyboardState(NULL); +#else + Uint8 *keystate = SDL_GetKeyState(NULL); +#endif + //SOOOoooo ugly. + for (int i = 0; i < Key::K_LAST; ++i) + { + m_input_status[i + Key::K_LAST] = m_input_status[i]; + m_input_status[i] = keystate[i]; + } +#endif + for (int i = 0; i < m_input_assocation_list.Count(); i++) { ButtonSetting &CurIT = m_input_assocation_list[i]; - CurIT.m_previous_status = CurIT.m_current_status; - CurIT.m_current_status = Input::GetButtonState(CurIT.m_raw_button_id); - for (int j = 0; j < CurIT.m_associated_action_list.Count(); j++) { ActionSetting &CurAS = CurIT.m_associated_action_list[j]; - if (CurAS.BufferedSince <= CurAS.BufferingTime) - CurAS.BufferedSince += seconds; + if (CurAS.m_buffered_since <= CurAS.m_buffering_time) + CurAS.m_buffered_since += seconds; - if (CurIT.m_current_status && CurAS.BufferingTime >= .0f) - CurAS.BufferedSince = .0f; + if (GetCurrentButtonStatus(CurIT.m_raw_button) && + CurAS.m_buffering_time >= .0f) + CurAS.m_buffered_since = .0f; } } - } //Helps link a software input Action-Id to an hardware input Button-Id. -void InputTracker::LinkActionIdToButtonId(int ActionId, int ButtonId) +void InputTracker::LinkActionToKey(ACTION_TYPE Action, Key Button) { - int ITIdx = GetButtonSettingIdx(ButtonId); + int ITIdx = GetButtonSettingIdx(Button); if (ITIdx == -1) { ITIdx = m_input_assocation_list.Count(); - m_input_assocation_list << ButtonSetting(ButtonId); + m_input_assocation_list << ButtonSetting(Button); } ButtonSetting &CurIT = m_input_assocation_list[ITIdx]; - int ASIdx = CurIT.GetActionSettingIdx(ActionId); + int ASIdx = CurIT.GetActionSettingIdx(Action); if (ASIdx == -1) { ASIdx = CurIT.m_associated_action_list.Count(); - CurIT.m_associated_action_list << ActionSetting(ActionId); + CurIT.m_associated_action_list << ActionSetting(Action); } } //Helps unlink a software input Action-Id to an hardware input Button-Id. -void InputTracker::UnlinkActionId(int ActionId) +void InputTracker::UnlinkAction(ACTION_TYPE Action) { for (int i = 0; i < m_input_assocation_list.Count(); i++) { ButtonSetting &CurIT = m_input_assocation_list[i]; - int ASIdx = CurIT.GetActionSettingIdx(ActionId); + int ASIdx = CurIT.GetActionSettingIdx(Action); if (ASIdx != -1) CurIT.m_associated_action_list.Remove(ASIdx); } } //Returns the current status of a given action -int InputTracker::GetActionStatus(int ActionId) +int InputTracker::GetStatus(ACTION_TYPE Action) { for (int i = 0; i < m_input_assocation_list.Count(); i++) { ButtonSetting &CurIT = m_input_assocation_list[i]; - int ASIdx = CurIT.GetActionSettingIdx(ActionId); + int ASIdx = CurIT.GetActionSettingIdx(Action); if (ASIdx != -1) { ActionSetting &CurAS = CurIT.m_associated_action_list[ASIdx]; - if (CurAS.BufferingTime >= .0f && CurAS.BufferedSince <= CurAS.BufferingTime) + if (CurAS.m_buffering_time >= .0f && CurAS.m_buffered_since <= CurAS.m_buffering_time) return 1; return 0; } @@ -146,16 +197,85 @@ int InputTracker::GetActionStatus(int ActionId) return 0; } -//Returns TRUE if action status when from Active to Inactive this frame -bool InputTracker::WasActionJustReleased(int ActionId) +//Returns TRUE if action status went from Active to Inactive this frame +bool InputTracker::WasReleased(ACTION_TYPE Action) { for (int i = 0; i < m_input_assocation_list.Count(); i++) { ButtonSetting &CurIT = m_input_assocation_list[i]; - int ASIdx = CurIT.GetActionSettingIdx(ActionId); + int ASIdx = CurIT.GetActionSettingIdx(Action); if (ASIdx != -1) { - if (!CurIT.m_current_status && CurIT.m_previous_status) + + if (GetPreviousButtonStatus(CurIT.m_raw_button) && + !GetCurrentButtonStatus(CurIT.m_raw_button)) + return true; + return false; + } + } + return false; +} + +//Returns TRUE if action status went from Inactive to Active this frame +bool InputTracker::WasPressed(ACTION_TYPE Action) +{ + for (int i = 0; i < m_input_assocation_list.Count(); i++) + { + ButtonSetting &CurIT = m_input_assocation_list[i]; + int ASIdx = CurIT.GetActionSettingIdx(Action); + if (ASIdx != -1) + { + if (!GetPreviousButtonStatus(CurIT.m_raw_button) && + GetCurrentButtonStatus(CurIT.m_raw_button)) + return true; + return false; + } + } + return false; +} + +//Returns the current status of a given action +int InputTracker::GetStatus(Key Button) +{ + for (int i = 0; i < m_input_assocation_list.Count(); i++) + { + ButtonSetting &CurIT = m_input_assocation_list[i]; + + if (Button == CurIT.m_raw_button) + return GetCurrentButtonStatus(CurIT.m_raw_button); + } + return 0; +} + +//Returns TRUE if action status went from Active to Inactive this frame +bool InputTracker::WasReleased(Key Button) +{ + for (int i = 0; i < m_input_assocation_list.Count(); i++) + { + ButtonSetting &CurIT = m_input_assocation_list[i]; + + if (Button == CurIT.m_raw_button) + { + if (GetPreviousButtonStatus(CurIT.m_raw_button) && + !GetCurrentButtonStatus(CurIT.m_raw_button)) + return true; + return false; + } + } + return false; +} + +//Returns TRUE if action status went from Inactive to Active this frame +bool InputTracker::WasPressed(Key Button) +{ + for (int i = 0; i < m_input_assocation_list.Count(); i++) + { + ButtonSetting &CurIT = m_input_assocation_list[i]; + + if (Button == CurIT.m_raw_button) + { + if (!GetPreviousButtonStatus(CurIT.m_raw_button) && + GetCurrentButtonStatus(CurIT.m_raw_button)) return true; return false; } @@ -219,32 +339,64 @@ int Input::GetButtonState(int button) } //Helps link a software input Action-Id to an hardware input Button-Id. -void Input::LinkActionIdToButtonId(int ActionId, int ButtonId) +void Input::LinkActionToKey(ACTION_TYPE Action, struct Key Button) { if (CheckInputTrackerInit()) - Input::m_input_tracker->LinkActionIdToButtonId(ActionId, ButtonId); + Input::m_input_tracker->LinkActionToKey(Action, Button); } //Helps unlink a software input Action-Id to an hardware input Button-Id. -void Input::UnlinkActionId(int ActionId) +void Input::UnlinkAction(ACTION_TYPE Action) { if (CheckInputTrackerInit()) - Input::m_input_tracker->UnlinkActionId(ActionId); + Input::m_input_tracker->UnlinkAction(Action); } //Returns the current status of a given action -int Input::GetActionStatus(int ActionId) +int Input::GetStatus(ACTION_TYPE Action) { if (CheckInputTrackerInit()) - return Input::m_input_tracker->GetActionStatus(ActionId); + return Input::m_input_tracker->GetStatus(Action); return 0; } //Returns TRUE if action status when from Active to Inactive this frame -bool Input::WasActionJustReleased(int ActionId) +bool Input::WasPressed(ACTION_TYPE Action) +{ + if (CheckInputTrackerInit()) + return Input::m_input_tracker->WasPressed(Action); + return false; +} + +//Returns TRUE if action status when from Active to Inactive this frame +bool Input::WasReleased(ACTION_TYPE Action) +{ + if (CheckInputTrackerInit()) + return Input::m_input_tracker->WasReleased(Action); + return false; +} + +//Returns the current status of a given action +int Input::GetStatus(Key Button) +{ + if (CheckInputTrackerInit()) + return Input::m_input_tracker->GetStatus(Button); + return 0; +} + +//Returns TRUE if action status when from Active to Inactive this frame +bool Input::WasPressed(Key Button) +{ + if (CheckInputTrackerInit()) + return Input::m_input_tracker->WasPressed(Button); + return false; +} + +//Returns TRUE if action status when from Active to Inactive this frame +bool Input::WasReleased(Key Button) { if (CheckInputTrackerInit()) - return Input::m_input_tracker->WasActionJustReleased(ActionId); + return Input::m_input_tracker->WasReleased(Button); return false; } diff --git a/src/input/input.h b/src/input/input.h index 88ac0ad8..7c17888e 100644 --- a/src/input/input.h +++ b/src/input/input.h @@ -17,6 +17,7 @@ #define __LOL_INPUT_INPUT_H__ #include +#include #include "core.h" #include "lol/math/vector.h" #include "input/stick.h" @@ -24,336 +25,341 @@ namespace lol { -class WorldEntity; +#define ACTION_TYPE std::string +#define ACTION_CMP(A, B) (A.compare(B) == 0) -//FULL Key reap-off of the SDLK enum -typedef enum { - /** @name ASCII mapped keysyms - * The keyboard syms have been cleverly chosen to map to ASCII - */ - /*@{*/ - LOLK_UNKNOWN = 0, - LOLK_FIRST = 0, - LOLK_BACKSPACE = 8, - LOLK_TAB = 9, - LOLK_CLEAR = 12, - LOLK_RETURN = 13, - LOLK_PAUSE = 19, - LOLK_ESCAPE = 27, - LOLK_SPACE = 32, - LOLK_EXCLAIM = 33, - LOLK_QUOTEDBL = 34, - LOLK_HASH = 35, - LOLK_DOLLAR = 36, - LOLK_AMPERSAND = 38, - LOLK_QUOTE = 39, - LOLK_LEFTPAREN = 40, - LOLK_RIGHTPAREN = 41, - LOLK_ASTERISK = 42, - LOLK_PLUS = 43, - LOLK_COMMA = 44, - LOLK_MINUS = 45, - LOLK_PERIOD = 46, - LOLK_SLASH = 47, - LOLK_0 = 48, - LOLK_1 = 49, - LOLK_2 = 50, - LOLK_3 = 51, - LOLK_4 = 52, - LOLK_5 = 53, - LOLK_6 = 54, - LOLK_7 = 55, - LOLK_8 = 56, - LOLK_9 = 57, - LOLK_COLON = 58, - LOLK_SEMICOLON = 59, - LOLK_LESS = 60, - LOLK_EQUALS = 61, - LOLK_GREATER = 62, - LOLK_QUESTION = 63, - LOLK_AT = 64, - /* - Skip uppercase letters - */ - LOLK_LEFTBRACKET = 91, - LOLK_BACKSLASH = 92, - LOLK_RIGHTBRACKET = 93, - LOLK_CARET = 94, - LOLK_UNDERSCORE = 95, - LOLK_BACKQUOTE = 96, - LOLK_a = 97, - LOLK_b = 98, - LOLK_c = 99, - LOLK_d = 100, - LOLK_e = 101, - LOLK_f = 102, - LOLK_g = 103, - LOLK_h = 104, - LOLK_i = 105, - LOLK_j = 106, - LOLK_k = 107, - LOLK_l = 108, - LOLK_m = 109, - LOLK_n = 110, - LOLK_o = 111, - LOLK_p = 112, - LOLK_q = 113, - LOLK_r = 114, - LOLK_s = 115, - LOLK_t = 116, - LOLK_u = 117, - LOLK_v = 118, - LOLK_w = 119, - LOLK_x = 120, - LOLK_y = 121, - LOLK_z = 122, - LOLK_DELETE = 127, - /* End of ASCII mapped keysyms */ - /*@}*/ - - /** @name International keyboard syms */ - /*@{*/ - LOLK_WORLD_0 = 160, /* 0xA0 */ - LOLK_WORLD_1 = 161, - LOLK_WORLD_2 = 162, - LOLK_WORLD_3 = 163, - LOLK_WORLD_4 = 164, - LOLK_WORLD_5 = 165, - LOLK_WORLD_6 = 166, - LOLK_WORLD_7 = 167, - LOLK_WORLD_8 = 168, - LOLK_WORLD_9 = 169, - LOLK_WORLD_10 = 170, - LOLK_WORLD_11 = 171, - LOLK_WORLD_12 = 172, - LOLK_WORLD_13 = 173, - LOLK_WORLD_14 = 174, - LOLK_WORLD_15 = 175, - LOLK_WORLD_16 = 176, - LOLK_WORLD_17 = 177, - LOLK_WORLD_18 = 178, - LOLK_WORLD_19 = 179, - LOLK_WORLD_20 = 180, - LOLK_WORLD_21 = 181, - LOLK_WORLD_22 = 182, - LOLK_WORLD_23 = 183, - LOLK_WORLD_24 = 184, - LOLK_WORLD_25 = 185, - LOLK_WORLD_26 = 186, - LOLK_WORLD_27 = 187, - LOLK_WORLD_28 = 188, - LOLK_WORLD_29 = 189, - LOLK_WORLD_30 = 190, - LOLK_WORLD_31 = 191, - LOLK_WORLD_32 = 192, - LOLK_WORLD_33 = 193, - LOLK_WORLD_34 = 194, - LOLK_WORLD_35 = 195, - LOLK_WORLD_36 = 196, - LOLK_WORLD_37 = 197, - LOLK_WORLD_38 = 198, - LOLK_WORLD_39 = 199, - LOLK_WORLD_40 = 200, - LOLK_WORLD_41 = 201, - LOLK_WORLD_42 = 202, - LOLK_WORLD_43 = 203, - LOLK_WORLD_44 = 204, - LOLK_WORLD_45 = 205, - LOLK_WORLD_46 = 206, - LOLK_WORLD_47 = 207, - LOLK_WORLD_48 = 208, - LOLK_WORLD_49 = 209, - LOLK_WORLD_50 = 210, - LOLK_WORLD_51 = 211, - LOLK_WORLD_52 = 212, - LOLK_WORLD_53 = 213, - LOLK_WORLD_54 = 214, - LOLK_WORLD_55 = 215, - LOLK_WORLD_56 = 216, - LOLK_WORLD_57 = 217, - LOLK_WORLD_58 = 218, - LOLK_WORLD_59 = 219, - LOLK_WORLD_60 = 220, - LOLK_WORLD_61 = 221, - LOLK_WORLD_62 = 222, - LOLK_WORLD_63 = 223, - LOLK_WORLD_64 = 224, - LOLK_WORLD_65 = 225, - LOLK_WORLD_66 = 226, - LOLK_WORLD_67 = 227, - LOLK_WORLD_68 = 228, - LOLK_WORLD_69 = 229, - LOLK_WORLD_70 = 230, - LOLK_WORLD_71 = 231, - LOLK_WORLD_72 = 232, - LOLK_WORLD_73 = 233, - LOLK_WORLD_74 = 234, - LOLK_WORLD_75 = 235, - LOLK_WORLD_76 = 236, - LOLK_WORLD_77 = 237, - LOLK_WORLD_78 = 238, - LOLK_WORLD_79 = 239, - LOLK_WORLD_80 = 240, - LOLK_WORLD_81 = 241, - LOLK_WORLD_82 = 242, - LOLK_WORLD_83 = 243, - LOLK_WORLD_84 = 244, - LOLK_WORLD_85 = 245, - LOLK_WORLD_86 = 246, - LOLK_WORLD_87 = 247, - LOLK_WORLD_88 = 248, - LOLK_WORLD_89 = 249, - LOLK_WORLD_90 = 250, - LOLK_WORLD_91 = 251, - LOLK_WORLD_92 = 252, - LOLK_WORLD_93 = 253, - LOLK_WORLD_94 = 254, - LOLK_WORLD_95 = 255, /* 0xFF */ - /*@}*/ - - /** @name Numeric keypad */ - /*@{*/ - LOLK_KP0 = 256, - LOLK_KP1 = 257, - LOLK_KP2 = 258, - LOLK_KP3 = 259, - LOLK_KP4 = 260, - LOLK_KP5 = 261, - LOLK_KP6 = 262, - LOLK_KP7 = 263, - LOLK_KP8 = 264, - LOLK_KP9 = 265, - LOLK_KP_PERIOD = 266, - LOLK_KP_DIVIDE = 267, - LOLK_KP_MULTIPLY = 268, - LOLK_KP_MINUS = 269, - LOLK_KP_PLUS = 270, - LOLK_KP_ENTER = 271, - LOLK_KP_EQUALS = 272, - /*@}*/ - - /** @name Arrows + Home/End pad */ - /*@{*/ - LOLK_UP = 273, - LOLK_DOWN = 274, - LOLK_RIGHT = 275, - LOLK_LEFT = 276, - LOLK_INSERT = 277, - LOLK_HOME = 278, - LOLK_END = 279, - LOLK_PAGEUP = 280, - LOLK_PAGEDOWN = 281, - /*@}*/ - - /** @name Function keys */ - /*@{*/ - LOLK_F1 = 282, - LOLK_F2 = 283, - LOLK_F3 = 284, - LOLK_F4 = 285, - LOLK_F5 = 286, - LOLK_F6 = 287, - LOLK_F7 = 288, - LOLK_F8 = 289, - LOLK_F9 = 290, - LOLK_F10 = 291, - LOLK_F11 = 292, - LOLK_F12 = 293, - LOLK_F13 = 294, - LOLK_F14 = 295, - LOLK_F15 = 296, - /*@}*/ - - /** @name Key state modifier keys */ - /*@{*/ - LOLK_NUMLOCK = 300, - LOLK_CAPSLOCK = 301, - LOLK_SCROLLOCK = 302, - LOLK_RSHIFT = 303, - LOLK_LSHIFT = 304, - LOLK_RCTRL = 305, - LOLK_LCTRL = 306, - LOLK_RALT = 307, - LOLK_LALT = 308, - LOLK_RMETA = 309, - LOLK_LMETA = 310, - LOLK_LSUPER = 311, /**< Left "Windows" key */ - LOLK_RSUPER = 312, /**< Right "Windows" key */ - LOLK_MODE = 313, /**< "Alt Gr" key */ - LOLK_COMPOSE = 314, /**< Multi-key compose key */ - /*@}*/ - - /** @name Miscellaneous function keys */ - /*@{*/ - LOLK_HELP = 315, - LOLK_PRINT = 316, - LOLK_SYSREQ = 317, - LOLK_BREAK = 318, - LOLK_MENU = 319, - LOLK_POWER = 320, /**< Power Macintosh power key */ - LOLK_EURO = 321, /**< Some european keyboards */ - LOLK_UNDO = 322, /**< Atari keyboard has Undo */ - /*@}*/ - - /* Add any other keys here */ - - LOLK_LAST -} LOLKey; - -/** Enumeration of valid key mods (possibly OR'd together) */ -typedef enum { - LOLKMOD_NONE = 0x0000, - LOLKMOD_LSHIFT= 0x0001, - LOLKMOD_RSHIFT= 0x0002, - LOLKMOD_LCTRL = 0x0040, - LOLKMOD_RCTRL = 0x0080, - LOLKMOD_LALT = 0x0100, - LOLKMOD_RALT = 0x0200, - LOLKMOD_LMETA = 0x0400, - LOLKMOD_RMETA = 0x0800, - LOLKMOD_NUM = 0x1000, - LOLKMOD_CAPS = 0x2000, - LOLKMOD_MODE = 0x4000, - LOLKMOD_RESERVED = 0x8000 -} LOLKeyMod; - -#define LOLKMOD_CTRL (LOLKMOD_LCTRL|LOLKMOD_RCTRL) -#define LOLKMOD_SHIFT (LOLKMOD_LSHIFT|LOLKMOD_RSHIFT) -#define LOLKMOD_ALT (LOLKMOD_LALT|LOLKMOD_RALT) -#define LOLKMOD_META (LOLKMOD_LMETA|LOLKMOD_RMETA) +class WorldEntity; -struct ActionSetting +//FULL Key rip-off of the SDLK enum +struct Key { - int ActionId; - float BufferingTime; - float BufferedSince; - - ActionSetting(int NewActionId) + enum Value { - memset(this, 0, sizeof(ActionSetting)); - ActionId = NewActionId; + /** @name ASCII mapped keysyms + * The keyboard syms have been cleverly chosen to map to ASCII + */ + /*@{*/ + K_UNKNOWN = 0, + K_FIRST = 0, + K_BACKSPACE = 8, + K_TAB = 9, + K_CLEAR = 12, + K_RETURN = 13, + K_PAUSE = 19, + K_ESCAPE = 27, + K_SPACE = 32, + K_EXCLAIM = 33, + K_QUOTEDBL = 34, + K_HASH = 35, + K_DOLLAR = 36, + K_AMPERSAND = 38, + K_QUOTE = 39, + K_LEFTPAREN = 40, + K_RIGHTPAREN = 41, + K_ASTERISK = 42, + K_PLUS = 43, + K_COMMA = 44, + K_MINUS = 45, + K_PERIOD = 46, + K_SLASH = 47, + K_0 = 48, + K_1 = 49, + K_2 = 50, + K_3 = 51, + K_4 = 52, + K_5 = 53, + K_6 = 54, + K_7 = 55, + K_8 = 56, + K_9 = 57, + K_COLON = 58, + K_SEMICOLON = 59, + K_LESS = 60, + K_EQUALS = 61, + K_GREATER = 62, + K_QUESTION = 63, + K_AT = 64, + /* + Skip uppercase letters + */ + K_LEFTBRACKET = 91, + K_BACKSLASH = 92, + K_RIGHTBRACKET = 93, + K_CARET = 94, + K_UNDERSCORE = 95, + K_BACKQUOTE = 96, + K_a = 97, + K_b = 98, + K_c = 99, + K_d = 100, + K_e = 101, + K_f = 102, + K_g = 103, + K_h = 104, + K_i = 105, + K_j = 106, + K_k = 107, + K_l = 108, + K_m = 109, + K_n = 110, + K_o = 111, + K_p = 112, + K_q = 113, + K_r = 114, + K_s = 115, + K_t = 116, + K_u = 117, + K_v = 118, + K_w = 119, + K_x = 120, + K_y = 121, + K_z = 122, + K_DELETE = 127, + /* End of ASCII mapped keysyms */ + /*@}*/ + + /** @name International keyboard syms */ + /*@{*/ + K_WORLD_0 = 160, /* 0xA0 */ + K_WORLD_1 = 161, + K_WORLD_2 = 162, + K_WORLD_3 = 163, + K_WORLD_4 = 164, + K_WORLD_5 = 165, + K_WORLD_6 = 166, + K_WORLD_7 = 167, + K_WORLD_8 = 168, + K_WORLD_9 = 169, + K_WORLD_10 = 170, + K_WORLD_11 = 171, + K_WORLD_12 = 172, + K_WORLD_13 = 173, + K_WORLD_14 = 174, + K_WORLD_15 = 175, + K_WORLD_16 = 176, + K_WORLD_17 = 177, + K_WORLD_18 = 178, + K_WORLD_19 = 179, + K_WORLD_20 = 180, + K_WORLD_21 = 181, + K_WORLD_22 = 182, + K_WORLD_23 = 183, + K_WORLD_24 = 184, + K_WORLD_25 = 185, + K_WORLD_26 = 186, + K_WORLD_27 = 187, + K_WORLD_28 = 188, + K_WORLD_29 = 189, + K_WORLD_30 = 190, + K_WORLD_31 = 191, + K_WORLD_32 = 192, + K_WORLD_33 = 193, + K_WORLD_34 = 194, + K_WORLD_35 = 195, + K_WORLD_36 = 196, + K_WORLD_37 = 197, + K_WORLD_38 = 198, + K_WORLD_39 = 199, + K_WORLD_40 = 200, + K_WORLD_41 = 201, + K_WORLD_42 = 202, + K_WORLD_43 = 203, + K_WORLD_44 = 204, + K_WORLD_45 = 205, + K_WORLD_46 = 206, + K_WORLD_47 = 207, + K_WORLD_48 = 208, + K_WORLD_49 = 209, + K_WORLD_50 = 210, + K_WORLD_51 = 211, + K_WORLD_52 = 212, + K_WORLD_53 = 213, + K_WORLD_54 = 214, + K_WORLD_55 = 215, + K_WORLD_56 = 216, + K_WORLD_57 = 217, + K_WORLD_58 = 218, + K_WORLD_59 = 219, + K_WORLD_60 = 220, + K_WORLD_61 = 221, + K_WORLD_62 = 222, + K_WORLD_63 = 223, + K_WORLD_64 = 224, + K_WORLD_65 = 225, + K_WORLD_66 = 226, + K_WORLD_67 = 227, + K_WORLD_68 = 228, + K_WORLD_69 = 229, + K_WORLD_70 = 230, + K_WORLD_71 = 231, + K_WORLD_72 = 232, + K_WORLD_73 = 233, + K_WORLD_74 = 234, + K_WORLD_75 = 235, + K_WORLD_76 = 236, + K_WORLD_77 = 237, + K_WORLD_78 = 238, + K_WORLD_79 = 239, + K_WORLD_80 = 240, + K_WORLD_81 = 241, + K_WORLD_82 = 242, + K_WORLD_83 = 243, + K_WORLD_84 = 244, + K_WORLD_85 = 245, + K_WORLD_86 = 246, + K_WORLD_87 = 247, + K_WORLD_88 = 248, + K_WORLD_89 = 249, + K_WORLD_90 = 250, + K_WORLD_91 = 251, + K_WORLD_92 = 252, + K_WORLD_93 = 253, + K_WORLD_94 = 254, + K_WORLD_95 = 255, /* 0xFF */ + /*@}*/ + + /** @name Numeric keypad */ + /*@{*/ + K_KP0 = 256, + K_KP1 = 257, + K_KP2 = 258, + K_KP3 = 259, + K_KP4 = 260, + K_KP5 = 261, + K_KP6 = 262, + K_KP7 = 263, + K_KP8 = 264, + K_KP9 = 265, + K_KP_PERIOD = 266, + K_KP_DIVIDE = 267, + K_KP_MULTIPLY = 268, + K_KP_MINUS = 269, + K_KP_PLUS = 270, + K_KP_ENTER = 271, + K_KP_EQUALS = 272, + /*@}*/ + + /** @name Arrows + Home/End pad */ + /*@{*/ + K_UP = 273, + K_DOWN = 274, + K_RIGHT = 275, + K_LEFT = 276, + K_INSERT = 277, + K_HOME = 278, + K_END = 279, + K_PAGEUP = 280, + K_PAGEDOWN = 281, + /*@}*/ + + /** @name Function keys */ + /*@{*/ + K_F1 = 282, + K_F2 = 283, + K_F3 = 284, + K_F4 = 285, + K_F5 = 286, + K_F6 = 287, + K_F7 = 288, + K_F8 = 289, + K_F9 = 290, + K_F10 = 291, + K_F11 = 292, + K_F12 = 293, + K_F13 = 294, + K_F14 = 295, + K_F15 = 296, + /*@}*/ + + /** @name Key state modifier keys */ + /*@{*/ + K_NUMLOCK = 300, + K_CAPSLOCK = 301, + K_SCROLLOCK = 302, + K_RSHIFT = 303, + K_LSHIFT = 304, + K_RCTRL = 305, + K_LCTRL = 306, + K_RALT = 307, + K_LALT = 308, + K_RMETA = 309, + K_LMETA = 310, + K_LSUPER = 311, /**< Left "Windows" key */ + K_RSUPER = 312, /**< Right "Windows" key */ + K_MODE = 313, /**< "Alt Gr" key */ + K_COMPOSE = 314, /**< Multi-key compose key */ + /*@}*/ + + /** @name Miscellaneous function keys */ + /*@{*/ + K_HELP = 315, + K_PRINT = 316, + K_SYSREQ = 317, + K_BREAK = 318, + K_MENU = 319, + K_POWER = 320, /**< Power Macintosh power key */ + K_EURO = 321, /**< Some european keyboards */ + K_UNDO = 322, /**< Atari keyboard has Undo */ + /*@}*/ + + /* Add any other keys here */ + + K_LAST + } + m_value; + + //BH : Removed KMod from main enum, because I don't have any idea about handling them correctly for now. + /* + //Enumeration of valid key mods (possibly OR'd together) + KM_NONE = 0x0000, + KM_LSHIFT = 0x0001, + KM_RSHIFT = 0x0002, + KM_LCTRL = 0x0040, + KM_RCTRL = 0x0080, + KM_LALT = 0x0100, + KM_RALT = 0x0200, + KM_LMETA = 0x0400, + KM_RMETA = 0x0800, + KM_NUM = 0x1000, + KM_CAPS = 0x2000, + KM_MODE = 0x4000, + + KM_RESERVED = 0x8000, + + //Left/Right independent key mods definition + KM_CTRL = (KM_LCTRL|KM_RCTRL), + KM_SHIFT = (KM_LSHIFT|KM_RSHIFT), + KM_ALT = (KM_LALT|KM_RALT), + KM_META = (KM_LMETA|KM_RMETA), + */ + + inline Key(Value v) { m_value = v; } + inline operator Value() { return m_value; } + inline bool operator==(const Key& CompareButton) { return m_value == CompareButton.m_value; } +}; + +struct ActionSetting +{ + ACTION_TYPE m_action; + float m_buffering_time; + float m_buffered_since; + + ActionSetting(ACTION_TYPE NewAction) : + m_action(NewAction), + m_buffering_time(.0f), + m_buffered_since(.0f) + { } }; struct ButtonSetting { - int m_raw_button_id; - int m_current_status; - int m_previous_status; + Key m_raw_button; Array m_associated_action_list; - ButtonSetting(int NewRawButtonId) - { - memset(this, 0, sizeof(ButtonSetting)); - m_raw_button_id = NewRawButtonId; - } - int GetActionSettingIdx(int ActionId) - { - for (int i = 0; i < m_associated_action_list.Count(); i++) - if (m_associated_action_list[i].ActionId == ActionId) - return i; - return -1; - } + ButtonSetting(Key NewRawButton) + : m_raw_button(NewRawButton) { } + int GetActionSettingIdx(ACTION_TYPE SearchAction); }; class InputTracker : public Entity @@ -365,17 +371,13 @@ public: InputTracker(); private: + Array m_input_status; Array m_input_assocation_list; - int GetButtonSettingIdx(int ButtonId) - { - for (int i = 0; i < m_input_assocation_list.Count(); i++) - if (m_input_assocation_list[i].m_raw_button_id == ButtonId) - return i; - return -1; - } - - void UpdateActionStatus(float seconds); + int GetButtonSettingIdx(struct Key Button); + int GetCurrentButtonStatus(struct Key Button); + int GetPreviousButtonStatus(struct Key Button); + void UpdateActionStatus(float seconds); protected: virtual void TickGame(float seconds) @@ -383,10 +385,16 @@ protected: UpdateActionStatus(seconds); } - void LinkActionIdToButtonId(int ActionId, int ButtonId); - void UnlinkActionId(int ActionId); - int GetActionStatus(int ActionId); - bool WasActionJustReleased(int ActionId); + void LinkActionToKey(ACTION_TYPE Action, struct Key Button); + void UnlinkAction(ACTION_TYPE Action); + int GetStatus(ACTION_TYPE Action); + bool WasPressed(ACTION_TYPE Action); + bool WasReleased(ACTION_TYPE Action); + + //You should probably use the Action System + int GetStatus(Key Button); + bool WasPressed(Key Button); + bool WasReleased(Key Button); }; class Input @@ -413,10 +421,16 @@ public: static int GetButtonState(int button); /* Action management */ - static void LinkActionIdToButtonId(int ActionId, int ButtonId); - static void UnlinkActionId(int ActionId); - static int GetActionStatus(int ActionId); - static bool WasActionJustReleased(int ActionId); + static void LinkActionToKey(ACTION_TYPE Action, struct Key Button); + static void UnlinkAction(ACTION_TYPE Action); + static int GetStatus(ACTION_TYPE Action); + static bool WasPressed(ACTION_TYPE Action); + static bool WasReleased(ACTION_TYPE Action); + + /* Raw Button management. You should use actions. */ + static int GetStatus(Key Button); + static bool WasPressed(Key Button); + static bool WasReleased(Key Button); /* Entities can subscribe to events */ static void TrackMouse(WorldEntity *e); diff --git a/test/BtPhysTest.cpp b/test/BtPhysTest.cpp index a6aeac42..9d69eb65 100644 --- a/test/BtPhysTest.cpp +++ b/test/BtPhysTest.cpp @@ -56,14 +56,11 @@ int gNumObjects = 64; #define USE_ROTATION 0 #define USE_CHARACTER 1 -enum eInputAction -{ - IPT_MOVE_FORWARD, - IPT_MOVE_BACKWARD, - IPT_MOVE_STRAFE_LEFT, - IPT_MOVE_STRAFE_RIGHT, - IPT_MOVE_JUMP, -}; +#define IPT_MOVE_FORWARD "Move_Forward" +#define IPT_MOVE_BACKWARD "Move_Backward" +#define IPT_MOVE_STRAFE_LEFT "Strafe_Left" +#define IPT_MOVE_STRAFE_RIGHT "Strafe_right" +#define IPT_MOVE_JUMP "Move_Jump" BtPhysTest::BtPhysTest(bool editor) { @@ -172,11 +169,11 @@ BtPhysTest::BtPhysTest(bool editor) Ticker::Ref(NewPhyobj); - Input::LinkActionIdToButtonId(IPT_MOVE_FORWARD, LOLK_UP); - Input::LinkActionIdToButtonId(IPT_MOVE_BACKWARD, LOLK_DOWN); - Input::LinkActionIdToButtonId(IPT_MOVE_STRAFE_LEFT, LOLK_LEFT); - Input::LinkActionIdToButtonId(IPT_MOVE_STRAFE_RIGHT, LOLK_RIGHT); - Input::LinkActionIdToButtonId(IPT_MOVE_JUMP, LOLK_SPACE); + Input::LinkActionToKey(IPT_MOVE_FORWARD, Key::K_UP); + Input::LinkActionToKey(IPT_MOVE_BACKWARD, Key::K_DOWN); + Input::LinkActionToKey(IPT_MOVE_STRAFE_LEFT, Key::K_LEFT); + Input::LinkActionToKey(IPT_MOVE_STRAFE_RIGHT, Key::K_RIGHT); + Input::LinkActionToKey(IPT_MOVE_JUMP, Key::K_SPACE); //NewPhyobj->GetCharacter()->AttachTo(BasePhyobj->GetPhysic(), true, true); } @@ -317,12 +314,12 @@ void BtPhysTest::TickGame(float seconds) EasyCharacterController* Character = (EasyCharacterController*)PhysObj->GetCharacter(); mat4 CtlrMx = Character->GetTransform(); - int HMovement = Input::GetActionStatus(IPT_MOVE_STRAFE_LEFT) - Input::GetActionStatus(IPT_MOVE_STRAFE_RIGHT); + int HMovement = Input::GetActionStatus(IPT_MOVE_STRAFE_RIGHT) - Input::GetActionStatus(IPT_MOVE_STRAFE_LEFT); int VMovement = Input::GetActionStatus(IPT_MOVE_FORWARD) - Input::GetActionStatus(IPT_MOVE_BACKWARD); int RMovement = 0;//Input::GetButtonState(280 /*SDLK_PAGEUP*/) - Input::GetButtonState(281 /*SDLK_PAGEDOWN*/); vec3 CharMove = vec3((float)VMovement * seconds * 4.f, (float)RMovement * seconds * 10.f, (float)HMovement * seconds * 4.f); - if (Input::WasActionJustReleased(IPT_MOVE_JUMP)) + if (Input::WasReleased(IPT_MOVE_JUMP)) Character->Jump(); Character->SetMovementForFrame(CharMove);