| @@ -31,6 +31,8 @@ namespace lol | |||||
| * Input implementation class | * Input implementation class | ||||
| */ | */ | ||||
| Array<ButtonSetting> Input::InputAssocationList; | |||||
| static class InputData | static class InputData | ||||
| { | { | ||||
| friend class Input; | friend class Input; | ||||
| @@ -113,6 +115,102 @@ int Input::GetButtonState(int button) | |||||
| #endif | #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); | |||||
| } | |||||
| } | |||||
| //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); | |||||
| } | |||||
| } | |||||
| //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; | |||||
| } | |||||
| } | |||||
| 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; | |||||
| } | |||||
| } | |||||
| return FALSE; | |||||
| } | |||||
| //-- | |||||
| void Input::TrackMouse(WorldEntity *e) | void Input::TrackMouse(WorldEntity *e) | ||||
| { | { | ||||
| if (data->nentities >= InputData::MAX_ENTITIES) | if (data->nentities >= InputData::MAX_ENTITIES) | ||||
| @@ -24,15 +24,146 @@ namespace lol | |||||
| class WorldEntity; | 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'; | |||||
| struct ActionSetting | |||||
| { | |||||
| int ActionId; | |||||
| float BufferingTime; | |||||
| float BufferedSince; | |||||
| ActionSetting(int NewActionId) | |||||
| { | |||||
| memset(this, 0, sizeof(ActionSetting)); | |||||
| ActionId = NewActionId; | |||||
| } | |||||
| }; | |||||
| struct ButtonSetting | |||||
| { | |||||
| int RawButtonId; | |||||
| int CurStatus; | |||||
| int PrevStatus; | |||||
| Array<ActionSetting> AssociatedActionList; | |||||
| ButtonSetting(int NewRawButtonId) | |||||
| { | |||||
| memset(this, 0, sizeof(ButtonSetting)); | |||||
| RawButtonId = NewRawButtonId; | |||||
| } | |||||
| int GetActionSettingIdx(int ActionId) | |||||
| { | |||||
| for (int i = 0; i < AssociatedActionList.Count(); i++) | |||||
| if (AssociatedActionList[i].ActionId == ActionId) | |||||
| return i; | |||||
| return -1; | |||||
| } | |||||
| }; | |||||
| class Input | class Input | ||||
| { | { | ||||
| private: | |||||
| static Array<ButtonSetting> InputAssocationList; | |||||
| static int GetButtonSettingIdx(int ButtonId) | |||||
| { | |||||
| for (int i = 0; i < InputAssocationList.Count(); i++) | |||||
| if (InputAssocationList[i].RawButtonId == ButtonId) | |||||
| return i; | |||||
| return -1; | |||||
| } | |||||
| static void UpdateActionStatus(float seconds); | |||||
| public: | public: | ||||
| /* These methods are general queries */ | /* These methods are general queries */ | ||||
| static ivec2 GetMousePos(); | static ivec2 GetMousePos(); | ||||
| static ivec3 GetMouseButtons(); | static ivec3 GetMouseButtons(); | ||||
| //BH : Added this, is a v0.1 Alpha version. | |||||
| //BH : Shouldn't use this | |||||
| static int GetButtonState(int button); | 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); | |||||
| /* Entities can subscribe to events */ | /* Entities can subscribe to events */ | ||||
| static void TrackMouse(WorldEntity *e); | static void TrackMouse(WorldEntity *e); | ||||
| static void UntrackMouse(WorldEntity *e); | static void UntrackMouse(WorldEntity *e); | ||||
| @@ -156,6 +156,7 @@ void EasyPhysic::InitBodyToRigid(bool SetToKinematic) | |||||
| btRigidBody::btRigidBodyConstructionInfo NewInfos(m_mass, m_motion_state, m_collision_shape, m_local_inertia); | btRigidBody::btRigidBodyConstructionInfo NewInfos(m_mass, m_motion_state, m_collision_shape, m_local_inertia); | ||||
| m_rigid_body = new btRigidBody(NewInfos); | m_rigid_body = new btRigidBody(NewInfos); | ||||
| m_collision_object = m_rigid_body; | m_collision_object = m_rigid_body; | ||||
| m_collision_object->setUserPointer(this); | |||||
| if (m_mass == .0f) | if (m_mass == .0f) | ||||
| { | { | ||||
| @@ -184,12 +185,53 @@ void EasyPhysic::InitBodyToGhost() | |||||
| m_ghost_object = GetGhostObject(); | m_ghost_object = GetGhostObject(); | ||||
| m_ghost_object->setCollisionShape(m_collision_shape); | m_ghost_object->setCollisionShape(m_collision_shape); | ||||
| m_collision_object = m_ghost_object; | m_collision_object = m_ghost_object; | ||||
| m_collision_object->setUserPointer(this); | |||||
| SetTransform(m_local_to_world.v3.xyz, lol::quat(m_local_to_world)); | SetTransform(m_local_to_world.v3.xyz, lol::quat(m_local_to_world)); | ||||
| m_ghost_object->setCollisionFlags(m_ghost_object->getCollisionFlags()); | m_ghost_object->setCollisionFlags(m_ghost_object->getCollisionFlags()); | ||||
| } | } | ||||
| //------------- | |||||
| //Touch logic | |||||
| //------------- | |||||
| // btManifoldArray manifoldArray; | |||||
| // btBroadphasePairArray& pairArray = ghostObject->getOverlappingPairCache()->getOverlappingPairArray(); | |||||
| // int numPairs = pairArray.size(); | |||||
| // for (int i=0;i<numPairs;i++) | |||||
| // { | |||||
| // manifoldArray.clear(); | |||||
| // const btBroadphasePair& pair = pairArray[i]; | |||||
| // | |||||
| // //unless we manually perform collision detection on this pair, the contacts are in the dynamics world paircache: | |||||
| // btBroadphasePair* collisionPair = dynamicsWorld->getPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1); | |||||
| // if (!collisionPair) | |||||
| // continue; | |||||
| // if (collisionPair->m_algorithm) | |||||
| // collisionPair->m_algorithm->getAllContactManifolds(manifoldArray); | |||||
| // for (int j=0;j<manifoldArray.size();j++) | |||||
| // { | |||||
| // btPersistentManifold* manifold = manifoldArray[j]; | |||||
| // btScalar directionSign = manifold->getBody0() == m_ghostObject ? btScalar(-1.0) : btScalar(1.0); | |||||
| // for (int p=0;p<manifold->getNumContacts();p++) | |||||
| // { | |||||
| // const btManifoldPoint&pt = manifold->getContactPoint(p); | |||||
| // if (pt.getDistance()<0.f) | |||||
| //{ | |||||
| // const btVector3& ptA = pt.getPositionWorldOnA(); | |||||
| // const btVector3& ptB = pt.getPositionWorldOnB(); | |||||
| // const btVector3& normalOnB = pt.m_normalWorldOnB; | |||||
| // /// work here | |||||
| //} | |||||
| // } | |||||
| // } | |||||
| // } | |||||
| //Add Physic object to the simulation | //Add Physic object to the simulation | ||||
| void EasyPhysic::AddToSimulation(class Simulation* current_simulation) | void EasyPhysic::AddToSimulation(class Simulation* current_simulation) | ||||
| { | { | ||||