@@ -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) | ||||
{ | { | ||||