| @@ -31,6 +31,8 @@ namespace lol | |||
| * Input implementation class | |||
| */ | |||
| Array<ButtonSetting> Input::InputAssocationList; | |||
| static class InputData | |||
| { | |||
| friend class Input; | |||
| @@ -113,6 +115,102 @@ 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); | |||
| } | |||
| } | |||
| //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) | |||
| { | |||
| if (data->nentities >= InputData::MAX_ENTITIES) | |||
| @@ -24,15 +24,146 @@ 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'; | |||
| 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 | |||
| { | |||
| 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: | |||
| /* These methods are general queries */ | |||
| static ivec2 GetMousePos(); | |||
| static ivec3 GetMouseButtons(); | |||
| //BH : Added this, is a v0.1 Alpha version. | |||
| //BH : Shouldn't use this | |||
| 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 */ | |||
| static void TrackMouse(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); | |||
| m_rigid_body = new btRigidBody(NewInfos); | |||
| m_collision_object = m_rigid_body; | |||
| m_collision_object->setUserPointer(this); | |||
| if (m_mass == .0f) | |||
| { | |||
| @@ -184,12 +185,53 @@ void EasyPhysic::InitBodyToGhost() | |||
| m_ghost_object = GetGhostObject(); | |||
| m_ghost_object->setCollisionShape(m_collision_shape); | |||
| m_collision_object = m_ghost_object; | |||
| m_collision_object->setUserPointer(this); | |||
| SetTransform(m_local_to_world.v3.xyz, lol::quat(m_local_to_world)); | |||
| 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 | |||
| void EasyPhysic::AddToSimulation(class Simulation* current_simulation) | |||
| { | |||