From 8838ef06b68424369df01b2ca37392935e104e21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20=E2=80=98Touky=E2=80=99=20Huet?= Date: Tue, 21 Aug 2012 16:38:40 +0000 Subject: [PATCH] Added InputTracker test initPhysTest --- src/entity.h | 3 +- src/input/input.cpp | 186 +++++--- src/input/input.h | 436 ++++++++++++++---- test/BtPhysTest.cpp | 26 +- test/PhysicObject.h | 2 +- .../Physics/Include/EasyCharacterController.h | 16 +- .../Physics/Include/LolBtPhysicsIntegration.h | 9 +- test/Physics/Src/EasyCharacterController.cpp | 16 +- 8 files changed, 511 insertions(+), 183 deletions(-) diff --git a/src/entity.h b/src/entity.h index cdbcac60..2f5ca93c 100644 --- a/src/entity.h +++ b/src/entity.h @@ -46,7 +46,8 @@ protected: GAMEGROUP_BEFORE = 0, GAMEGROUP_DEFAULT, GAMEGROUP_AFTER, - GAMEGROUP_AFTER_POST, + GAMEGROUP_AFTER_0, + GAMEGROUP_AFTER_1, // Must be the last element GAMEGROUP_END diff --git a/src/input/input.cpp b/src/input/input.cpp index 791bc479..e75fa91e 100644 --- a/src/input/input.cpp +++ b/src/input/input.cpp @@ -31,7 +31,7 @@ namespace lol * Input implementation class */ -Array Input::InputAssocationList; +InputTracker* Input::m_input_tracker = NULL; static class InputData { @@ -60,6 +60,109 @@ inputdata; static InputData * const data = &inputdata; +/* + * InputTracker class + */ + +InputTracker::InputTracker() +{ + m_gamegroup = GAMEGROUP_BEFORE; + + Ticker::Ref(this); +} + +//Internal : Updates the action status & timers +void InputTracker::UpdateActionStatus(float seconds) +{ + 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 (CurIT.m_current_status && CurAS.BufferingTime >= .0f) + CurAS.BufferedSince = .0f; + } + } + +} + +//Helps link a software input Action-Id to an hardware input Button-Id. +void InputTracker::LinkActionIdToButtonId(int ActionId, int ButtonId) +{ + int ITIdx = GetButtonSettingIdx(ButtonId); + if (ITIdx == -1) + { + ITIdx = m_input_assocation_list.Count(); + m_input_assocation_list << ButtonSetting(ButtonId); + } + + ButtonSetting &CurIT = m_input_assocation_list[ITIdx]; + + int ASIdx = CurIT.GetActionSettingIdx(ActionId); + if (ASIdx == -1) + { + ASIdx = CurIT.m_associated_action_list.Count(); + CurIT.m_associated_action_list << ActionSetting(ActionId); + } +} + +//Helps unlink a software input Action-Id to an hardware input Button-Id. +void InputTracker::UnlinkActionId(int ActionId) +{ + for (int i = 0; i < m_input_assocation_list.Count(); i++) + { + ButtonSetting &CurIT = m_input_assocation_list[i]; + int ASIdx = CurIT.GetActionSettingIdx(ActionId); + if (ASIdx != -1) + CurIT.m_associated_action_list.Remove(ASIdx); + } +} + +//Returns the current status of a given action +int InputTracker::GetActionStatus(int ActionId) +{ + for (int i = 0; i < m_input_assocation_list.Count(); i++) + { + ButtonSetting &CurIT = m_input_assocation_list[i]; + int ASIdx = CurIT.GetActionSettingIdx(ActionId); + if (ASIdx != -1) + { + ActionSetting &CurAS = CurIT.m_associated_action_list[ASIdx]; + + if (CurAS.BufferingTime >= .0f && CurAS.BufferedSince <= CurAS.BufferingTime) + return 1; + return 0; + } + } + return 0; +} + +//Returns TRUE if action status when from Active to Inactive this frame +bool InputTracker::WasActionJustReleased(int ActionId) +{ + for (int i = 0; i < m_input_assocation_list.Count(); i++) + { + ButtonSetting &CurIT = m_input_assocation_list[i]; + int ASIdx = CurIT.GetActionSettingIdx(ActionId); + if (ASIdx != -1) + { + if (!CurIT.m_current_status && CurIT.m_previous_status) + return true; + return false; + } + } + return false; +} + /* * Public Input class */ @@ -115,98 +218,33 @@ int Input::GetButtonState(int button) #endif } -//-- - -//--- -//Internal : Updates the action status & timers -void Input::UpdateActionStatus(float seconds) -{ - for (int i = 0; i < InputAssocationList.Count(); i++) - { - ButtonSetting &CurIT = InputAssocationList[i]; - - CurIT.PrevStatus = CurIT.CurStatus; - CurIT.CurStatus = Input::GetButtonState(CurIT.RawButtonId); - - for (int j = 0; j < CurIT.AssociatedActionList.Count(); j++) - { - ActionSetting &CurAS = CurIT.AssociatedActionList[j]; - - if (CurAS.BufferedSince <= CurAS.BufferingTime) - CurAS.BufferedSince += seconds; - - if (CurIT.CurStatus && CurAS.BufferingTime >= .0f) - CurAS.BufferedSince = .0f; - } - } - -} - //Helps link a software input Action-Id to an hardware input Button-Id. void Input::LinkActionIdToButtonId(int ActionId, int ButtonId) { - int ITIdx = GetButtonSettingIdx(ButtonId); - if (ITIdx == -1) - { - ITIdx = InputAssocationList.Count(); - InputAssocationList << ButtonSetting(ButtonId); - } - - ButtonSetting &CurIT = InputAssocationList[ITIdx]; - - int ASIdx = CurIT.GetActionSettingIdx(ActionId); - if (ASIdx == -1) - { - ASIdx = CurIT.AssociatedActionList.Count(); - CurIT.AssociatedActionList << ActionSetting(ActionId); - } + if (CheckInputTrackerInit()) + Input::m_input_tracker->LinkActionIdToButtonId(ActionId, ButtonId); } //Helps unlink a software input Action-Id to an hardware input Button-Id. void Input::UnlinkActionId(int ActionId) { - for (int i = 0; i < InputAssocationList.Count(); i++) - { - ButtonSetting &CurIT = InputAssocationList[i]; - int ASIdx = CurIT.GetActionSettingIdx(ActionId); - if (ASIdx != -1) - CurIT.AssociatedActionList.Remove(ASIdx); - } + if (CheckInputTrackerInit()) + Input::m_input_tracker->UnlinkActionId(ActionId); } //Returns the current status of a given action int Input::GetActionStatus(int ActionId) { - for (int i = 0; i < InputAssocationList.Count(); i++) - { - ButtonSetting &CurIT = InputAssocationList[i]; - int ASIdx = CurIT.GetActionSettingIdx(ActionId); - if (ASIdx != -1) - { - ActionSetting &CurAS = CurIT.AssociatedActionList[ASIdx]; - - if (CurAS.BufferingTime >= .0f && CurAS.BufferedSince <= CurAS.BufferingTime) - return 1; - return 0; - } - } + if (CheckInputTrackerInit()) + return Input::m_input_tracker->GetActionStatus(ActionId); return 0; } //Returns TRUE if action status when from Active to Inactive this frame bool Input::WasActionJustReleased(int ActionId) { - for (int i = 0; i < InputAssocationList.Count(); i++) - { - ButtonSetting &CurIT = InputAssocationList[i]; - int ASIdx = CurIT.GetActionSettingIdx(ActionId); - if (ASIdx != -1) - { - if (!CurIT.CurStatus && CurIT.PrevStatus) - return true; - return false; - } - } + if (CheckInputTrackerInit()) + return Input::m_input_tracker->WasActionJustReleased(ActionId); return false; } diff --git a/src/input/input.h b/src/input/input.h index 0d3194d8..88ac0ad8 100644 --- a/src/input/input.h +++ b/src/input/input.h @@ -17,6 +17,7 @@ #define __LOL_INPUT_INPUT_H__ #include +#include "core.h" #include "lol/math/vector.h" #include "input/stick.h" @@ -25,81 +26,301 @@ namespace lol class WorldEntity; -//Partial Key reap-off of the SDLK enum -#define LOLK_UNKNOWN = 0; - -#define LOLK_RETURN = '\r'; -#define LOLK_ESCAPE = '\033'; -#define LOLK_BACKSPACE = '\b'; -#define LOLK_TAB = '\t'; -#define LOLK_SPACE = ' '; -#define LOLK_EXCLAIM = '!'; -#define LOLK_QUOTEDBL = '"'; -#define LOLK_HASH = '#'; -#define LOLK_PERCENT = '%'; -#define LOLK_DOLLAR = '$'; -#define LOLK_AMPERSAND = '&'; -#define LOLK_QUOTE = '\''; -#define LOLK_LEFTPAREN = '('; -#define LOLK_RIGHTPAREN = ')'; -#define LOLK_ASTERISK = '*'; -#define LOLK_PLUS = '+'; -#define LOLK_COMMA = ';'; -#define LOLK_MINUS = '-'; -#define LOLK_PERIOD = '.'; -#define LOLK_SLASH = '/'; -#define LOLK_0 = '0'; -#define LOLK_1 = '1'; -#define LOLK_2 = '2'; -#define LOLK_3 = '3'; -#define LOLK_4 = '4'; -#define LOLK_5 = '5'; -#define LOLK_6 = '6'; -#define LOLK_7 = '7'; -#define LOLK_8 = '8'; -#define LOLK_9 = '9'; -#define LOLK_COLON = ':'; -#define LOLK_SEMICOLON = ';'; -#define LOLK_LESS = '<'; -#define LOLK_EQUALS = '='; -#define LOLK_GREATER = '>'; -#define LOLK_QUESTION = '?'; -#define LOLK_AT = '@'; -/* - Skip uppercase letters - */ -#define LOLK_LEFTBRACKET = '['; -#define LOLK_BACKSLASH = '\\'; -#define LOLK_RIGHTBRACKET = ']'; -#define LOLK_CARET = '^'; -#define LOLK_UNDERSCORE = '_'; -#define LOLK_BACKQUOTE = '`'; -#define LOLK_a = 'a'; -#define LOLK_b = 'b'; -#define LOLK_c = 'c'; -#define LOLK_d = 'd'; -#define LOLK_e = 'e'; -#define LOLK_f = 'f'; -#define LOLK_g = 'g'; -#define LOLK_h = 'h'; -#define LOLK_i = 'i'; -#define LOLK_j = 'j'; -#define LOLK_k = 'k'; -#define LOLK_l = 'l'; -#define LOLK_m = 'm'; -#define LOLK_n = 'n'; -#define LOLK_o = 'o'; -#define LOLK_p = 'p'; -#define LOLK_q = 'q'; -#define LOLK_r = 'r'; -#define LOLK_s = 's'; -#define LOLK_t = 't'; -#define LOLK_u = 'u'; -#define LOLK_v = 'v'; -#define LOLK_w = 'w'; -#define LOLK_x = 'x'; -#define LOLK_y = 'y'; -#define LOLK_z = 'z'; +//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) struct ActionSetting { @@ -116,39 +337,71 @@ struct ActionSetting struct ButtonSetting { - int RawButtonId; - int CurStatus; - int PrevStatus; - Array AssociatedActionList; + int m_raw_button_id; + int m_current_status; + int m_previous_status; + Array m_associated_action_list; ButtonSetting(int NewRawButtonId) { memset(this, 0, sizeof(ButtonSetting)); - RawButtonId = NewRawButtonId; + m_raw_button_id = NewRawButtonId; } int GetActionSettingIdx(int ActionId) { - for (int i = 0; i < AssociatedActionList.Count(); i++) - if (AssociatedActionList[i].ActionId == ActionId) + for (int i = 0; i < m_associated_action_list.Count(); i++) + if (m_associated_action_list[i].ActionId == ActionId) return i; return -1; } }; -class Input +class InputTracker : public Entity { + + friend class Input; + +public: + InputTracker(); + private: - static Array InputAssocationList; + Array m_input_assocation_list; - static int GetButtonSettingIdx(int ButtonId) + int GetButtonSettingIdx(int ButtonId) { - for (int i = 0; i < InputAssocationList.Count(); i++) - if (InputAssocationList[i].RawButtonId == 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; } - static void UpdateActionStatus(float seconds); + void UpdateActionStatus(float seconds); + +protected: + virtual void TickGame(float seconds) + { + UpdateActionStatus(seconds); + } + + void LinkActionIdToButtonId(int ActionId, int ButtonId); + void UnlinkActionId(int ActionId); + int GetActionStatus(int ActionId); + bool WasActionJustReleased(int ActionId); +}; + +class Input +{ +private: + static InputTracker* m_input_tracker; + + static bool CheckInputTrackerInit() + { + if (Input::m_input_tracker) + return true; + + Input::m_input_tracker = new InputTracker(); + return true; + } public: @@ -159,7 +412,7 @@ public: //BH : Shouldn't use this static int GetButtonState(int button); - //Action management + /* Action management */ static void LinkActionIdToButtonId(int ActionId, int ButtonId); static void UnlinkActionId(int ActionId); static int GetActionStatus(int ActionId); @@ -174,10 +427,7 @@ public: static void SetMouseButton(int index); static void UnsetMouseButton(int index); - /* - * Joystick handling - */ - + /* Joystick handling */ static Stick *CreateStick(); static void DestroyStick(Stick *stick); diff --git a/test/BtPhysTest.cpp b/test/BtPhysTest.cpp index bb708e83..a6aeac42 100644 --- a/test/BtPhysTest.cpp +++ b/test/BtPhysTest.cpp @@ -56,6 +56,15 @@ 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, +}; + BtPhysTest::BtPhysTest(bool editor) { m_loop_value = .0f; @@ -162,6 +171,13 @@ BtPhysTest::BtPhysTest(bool editor) m_character_list << NewPhyobj; 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); + //NewPhyobj->GetCharacter()->AttachTo(BasePhyobj->GetPhysic(), true, true); } @@ -300,12 +316,14 @@ void BtPhysTest::TickGame(float seconds) PhysicsObject* PhysObj = m_character_list[i]; EasyCharacterController* Character = (EasyCharacterController*)PhysObj->GetCharacter(); mat4 CtlrMx = Character->GetTransform(); - - int HMovement = Input::GetButtonState(275 /*SDLK_RIGHT*/) - Input::GetButtonState(276 /*SDLK_LEFT*/); - int VMovement = Input::GetButtonState(273 /*SDLK_UP*/) - Input::GetButtonState(274 /*SDLK_DOWN*/); - int RMovement = Input::GetButtonState(280 /*SDLK_PAGEUP*/) - Input::GetButtonState(281 /*SDLK_PAGEDOWN*/); + + int HMovement = Input::GetActionStatus(IPT_MOVE_STRAFE_LEFT) - Input::GetActionStatus(IPT_MOVE_STRAFE_RIGHT); + 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)) + Character->Jump(); Character->SetMovementForFrame(CharMove); RayCastResult HitResult; diff --git a/test/PhysicObject.h b/test/PhysicObject.h index 4240a49e..a11ce004 100644 --- a/test/PhysicObject.h +++ b/test/PhysicObject.h @@ -234,7 +234,7 @@ public: EasyMesh *GetMesh() { return &m_mesh; } EasyPhysic *GetPhysic() { return m_physics; } - EasyPhysic *GetCharacter() { return m_character; } + EasyCharacterController *GetCharacter() { return m_character; } ~PhysicsObject() { diff --git a/test/Physics/Include/EasyCharacterController.h b/test/Physics/Include/EasyCharacterController.h index 69d944e9..6a8c6129 100644 --- a/test/Physics/Include/EasyCharacterController.h +++ b/test/Physics/Include/EasyCharacterController.h @@ -49,11 +49,14 @@ public: m_step_height(.0f), m_base_is_updating(false), m_base_cached_movement(vec3(0.f)), - m_frame_cached_movement(vec3(0.f)) + m_frame_cached_movement(vec3(0.f)), + m_walk_velocity(vec3(0.f)), + m_current_velocity(vec3(0.f)) { m_gamegroup = GAMEGROUP_EZP_CHAR_CTRLR; m_up_axis = 1; m_gravity = vec3(.0f, -9.81f, .0f); + m_walk_velocity_damping = 0.2f; } ~EasyCharacterController() { @@ -65,6 +68,7 @@ public: virtual void AddToSimulation(class Simulation* current_simulation); virtual void RemoveFromSimulation(class Simulation* current_simulation); virtual void SetMovementForFrame(vec3 const &MoveQuantity); + virtual void Jump(); virtual void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation); protected: @@ -84,8 +88,16 @@ protected: bool m_base_is_updating; vec3 m_base_cached_movement; vec3 m_frame_cached_movement; + + //---- + float m_walk_velocity_damping; + + //---- vec3 m_gravity; - vec3 m_velocity; + + //---- + vec3 m_walk_velocity; + vec3 m_current_velocity; #else // NO PHYSIC IMPLEMENTATION diff --git a/test/Physics/Include/LolBtPhysicsIntegration.h b/test/Physics/Include/LolBtPhysicsIntegration.h index 7b1f6fe9..5e6786dd 100644 --- a/test/Physics/Include/LolBtPhysicsIntegration.h +++ b/test/Physics/Include/LolBtPhysicsIntegration.h @@ -22,10 +22,11 @@ namespace lol //Override Gamegroups names for Physic-useage //"_ENT_" means that this is a group for Entities that use EasyPhysic primitives. //"_EZP_" means that this is a group for EasyPhysic primitives. -#define GAMEGROUP_ENT_PLATFORM GAMEGROUP_BEFORE -#define GAMEGROUP_ENT_MAIN GAMEGROUP_DEFAULT -#define GAMEGROUP_EZP_CHAR_CTRLR GAMEGROUP_AFTER -#define GAMEGROUP_SIMULATION GAMEGROUP_AFTER_POST +#define GAMEGROUP_ENT_INPUT GAMEGROUP_BEFORE +#define GAMEGROUP_ENT_PLATFORM GAMEGROUP_DEFAULT +#define GAMEGROUP_ENT_MAIN GAMEGROUP_AFTER +#define GAMEGROUP_EZP_CHAR_CTRLR GAMEGROUP_AFTER_0 +#define GAMEGROUP_SIMULATION GAMEGROUP_AFTER_1 #ifdef HAVE_PHYS_USE_BULLET diff --git a/test/Physics/Src/EasyCharacterController.cpp b/test/Physics/Src/EasyCharacterController.cpp index 96b8b7ca..7f31ddae 100644 --- a/test/Physics/Src/EasyCharacterController.cpp +++ b/test/Physics/Src/EasyCharacterController.cpp @@ -90,6 +90,11 @@ void EasyCharacterController::RemoveFromSimulation(class Simulation* current_sim } } +void EasyCharacterController::Jump() +{ + m_character->jump(); +} + //Set movement for this frame void EasyCharacterController::SetMovementForFrame(vec3 const &MoveQuantity) { @@ -125,10 +130,13 @@ void EasyCharacterController::TickGame(float seconds) { Entity::TickGame(seconds); - int IterationsNb = (int)(seconds / m_owner_simulation->m_timestep); - float NewSeconds = IterationsNb * m_owner_simulation->m_timestep; - m_character->setVelocityForTimeInterval(LOL2BT_VEC3(LOL2BT_UNIT * (m_base_cached_movement + m_frame_cached_movement)) / NewSeconds, NewSeconds); - m_base_cached_movement = vec3(.0f); + //Send final velocity in Bullet + { + int IterationsNb = (int)(seconds / m_owner_simulation->m_timestep); + float NewSeconds = IterationsNb * m_owner_simulation->m_timestep; + m_character->setVelocityForTimeInterval(LOL2BT_VEC3(LOL2BT_UNIT * (m_base_cached_movement + m_frame_cached_movement)) / NewSeconds, NewSeconds); + m_base_cached_movement = vec3(.0f); + } } #endif // HAVE_PHYS_USE_BULLET