@@ -72,6 +72,10 @@ vec3 Camera::GetTarget() | |||||
{ | { | ||||
return m_target; | return m_target; | ||||
} | } | ||||
vec3 Camera::GetPosition() | |||||
{ | |||||
return m_position; | |||||
} | |||||
mat4 const &Camera::GetViewMatrix() | mat4 const &Camera::GetViewMatrix() | ||||
{ | { | ||||
@@ -36,6 +36,7 @@ public: | |||||
float near, float far); | float near, float far); | ||||
void SetTarget(vec3 const &pos); | void SetTarget(vec3 const &pos); | ||||
vec3 GetTarget(); | vec3 GetTarget(); | ||||
vec3 GetPosition(); | |||||
mat4 const &GetViewMatrix(); | mat4 const &GetViewMatrix(); | ||||
mat4 const &GetProjMatrix(); | mat4 const &GetProjMatrix(); | ||||
@@ -51,8 +51,8 @@ int gNumObjects = 64; | |||||
#define USE_WALL 1 | #define USE_WALL 1 | ||||
#define USE_PLATFORM 1 | #define USE_PLATFORM 1 | ||||
#define USE_ROPE 0 | |||||
#define USE_BODIES 0 | |||||
#define USE_ROPE 1 | |||||
#define USE_BODIES 1 | |||||
#define USE_ROTATION 0 | #define USE_ROTATION 0 | ||||
#define USE_CHARACTER 1 | #define USE_CHARACTER 1 | ||||
@@ -70,6 +70,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
m_ready = false; | m_ready = false; | ||||
m_simulation = new Simulation(); | m_simulation = new Simulation(); | ||||
m_simulation->SetWorldLimit(vec3(-1000.0f, -1000.0f, -1000.0f), vec3(1000.0f, 1000.0f, 1000.0f)); | |||||
m_simulation->Init(); | m_simulation->Init(); | ||||
vec3 NewGravity = vec3(.0f, -10.0f, .0f); | vec3 NewGravity = vec3(.0f, -10.0f, .0f); | ||||
m_simulation->SetGravity(NewGravity); | m_simulation->SetGravity(NewGravity); | ||||
@@ -109,7 +110,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
if (USE_PLATFORM) | if (USE_PLATFORM) | ||||
{ | { | ||||
quat NewRotation = quat::fromeuler_xyz(5.f, 0.f, 0.f); | quat NewRotation = quat::fromeuler_xyz(5.f, 0.f, 0.f); | ||||
vec3 NewPosition = pos_offset + vec3(5.0f, -20.0f, -15.0f); | |||||
vec3 NewPosition = pos_offset + vec3(5.0f, -25.0f, -15.0f); | |||||
PhysicsObject* NewPhyobj = new PhysicsObject(m_simulation, NewPosition, NewRotation, 1); | PhysicsObject* NewPhyobj = new PhysicsObject(m_simulation, NewPosition, NewRotation, 1); | ||||
@@ -127,7 +128,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||||
if (USE_CHARACTER) | if (USE_CHARACTER) | ||||
{ | { | ||||
quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f); | quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f); | ||||
vec3 NewPosition = pos_offset + vec3(.0f, 40.0f, .0f); | |||||
vec3 NewPosition = pos_offset + vec3(.0f, 20.0f, .0f); | |||||
PhysicsObject* NewPhyobj = new PhysicsObject(m_simulation, NewPosition, NewRotation, 2); | PhysicsObject* NewPhyobj = new PhysicsObject(m_simulation, NewPosition, NewRotation, 2); | ||||
@@ -406,6 +407,23 @@ void BtPhysTest::TickGame(float seconds) | |||||
if (USE_CHARACTER) | if (USE_CHARACTER) | ||||
{ | { | ||||
for (int i = 0; i < m_character_list.Count(); i++) | |||||
{ | |||||
PhysicsObject* PhysObj = m_character_list[i]; | |||||
EasyCharacterController* Character = (EasyCharacterController*)PhysObj->GetCharacter(); | |||||
int HMovement = Input::GetButtonState(275 /*SDLK_RIGHT*/) - Input::GetButtonState(276 /*SDLK_LEFT*/); | |||||
int VMovement = Input::GetButtonState(273 /*SDLK_UP*/) - Input::GetButtonState(274 /*SDLK_DOWN*/); | |||||
Character->SetMovementForFrame(vec3((float)VMovement * seconds * 4.f, .0f, (float)HMovement * seconds * 4.f)); | |||||
} | |||||
} | |||||
if (USE_CHARACTER) | |||||
{ | |||||
PhysObjBarycenter = vec3(.0f); | |||||
factor = .0f; | |||||
for (int i = 0; i < m_character_list.Count(); i++) | for (int i = 0; i < m_character_list.Count(); i++) | ||||
{ | { | ||||
PhysicsObject* PhysObj = m_character_list[i]; | PhysicsObject* PhysObj = m_character_list[i]; | ||||
@@ -417,8 +435,9 @@ void BtPhysTest::TickGame(float seconds) | |||||
PhysObjBarycenter /= factor; | PhysObjBarycenter /= factor; | ||||
m_camera->SetTarget(PhysObjBarycenter); | |||||
m_camera->SetPosition(PhysObjBarycenter + vec3(-80.0f, 80.0f, .0f)); | |||||
m_camera->SetTarget(m_camera->GetTarget() + (seconds / (seconds + 0.18f)) * (PhysObjBarycenter - m_camera->GetTarget())); | |||||
vec3 CamPosCenter = m_camera->GetTarget() + vec3(.0f, 20.0f, .0f); | |||||
m_camera->SetPosition(CamPosCenter + normalize(m_camera->GetPosition() - CamPosCenter) * 5.0f); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -40,8 +40,6 @@ public: | |||||
if (dummy == 1) //for Rope purpose | if (dummy == 1) //for Rope purpose | ||||
{ | { | ||||
m_mesh.Compile("[sc#ddd afcb20 1 20 -.1]"); | m_mesh.Compile("[sc#ddd afcb20 1 20 -.1]"); | ||||
//m_mesh.Compile("[sc#f00 afcb10 10 10 -.1]"); | |||||
vec3 BoxSize = vec3(20.f, 1.f, 20.f); | vec3 BoxSize = vec3(20.f, 1.f, 20.f); | ||||
m_physics.SetCollisionChannel(0, 0xFF); | m_physics.SetCollisionChannel(0, 0xFF); | ||||
m_physics.SetShapeToBox(BoxSize); | m_physics.SetShapeToBox(BoxSize); | ||||
@@ -53,9 +51,30 @@ public: | |||||
else if (dummy == 2) //for character purpose | else if (dummy == 2) //for character purpose | ||||
{ | { | ||||
m_is_character = true; | m_is_character = true; | ||||
m_mesh.Compile("[sc#f00 afcb10 10 10 -.1]"); | |||||
//m_mesh.Compile("[sc#fff scb#fff ac1 2 2 2 0 0]"); | |||||
vec3 BoxSize = vec3(2.f, 2.f, 2.f); | |||||
//m_mesh.Compile("[sc#f00 afcb10 10 10 -.1]"); | |||||
m_mesh.Compile( | |||||
"[sc#000 scb#000" | |||||
//"[sc#aaa scb#aaa" | |||||
"[ad8 2 0 rx180 ty-1]" | |||||
"[asph8 .5 .5 .5 ty1]" | |||||
"[ac32 2 .5 .5 0 0]" | |||||
"[asph6 .1 .1 .1 ty.9 tx.5 tz.15]" | |||||
"[asph6 .1 .1 .1 ty.9 tx.5 tz-.15]" | |||||
"[asph8 .05 .5 .05 ty.6 tz.5]" | |||||
"[asph8 .05 .5 .05 ty.6 tz-.5]" | |||||
"]" | |||||
"[sc#fd0 scb#fd0" | |||||
"[ac8 .4 .1 0 0 0 ty.25 rz-90 ty.7 tx.5]" | |||||
"]" | |||||
"[" | |||||
"[sc#fff scb#fff" | |||||
"[ad8 2 0 rx180 ty-1]" | |||||
"[asph8 .5 .5 .5 ty1]" | |||||
"[ac32 1.9 .5 .5 0 0]" | |||||
"]" | |||||
" ty-.1 tx.05]" | |||||
); | |||||
vec3 BoxSize = vec3(.5f, 2.f, .5f); | |||||
m_character.SetCollisionChannel(0, 0xFF); | m_character.SetCollisionChannel(0, 0xFF); | ||||
m_character.SetShapeToCapsule(BoxSize.x, BoxSize.y); | m_character.SetShapeToCapsule(BoxSize.x, BoxSize.y); | ||||
m_character.SetMass(.0f); | m_character.SetMass(.0f); | ||||
@@ -88,21 +107,21 @@ public: | |||||
int ConeLimit = MeshRand.Count(); | int ConeLimit = MeshRand.Count(); | ||||
MeshRand << "[sc#add scb#add ad1 2 0 rx180 ty-1 ac1 2 2 0 0 0]"; | |||||
MeshRand << "[sc#dad scb#dad ad1 2 0 rx180 ty-1 ac1 2 2 0 0 0]"; | |||||
MeshRand << "[sc#dda scb#dda ad1 2 0 rx180 ty-1 ac1 2 2 0 0 0]"; | |||||
MeshRand << "[sc#daa scb#daa ad1 2 0 rx180 ty-1 ac1 2 2 0 0 0]"; | |||||
MeshRand << "[sc#ada scb#ada ad1 2 0 rx180 ty-1 ac1 2 2 0 0 0]"; | |||||
MeshRand << "[sc#aad scb#aad ad1 2 0 rx180 ty-1 ac1 2 2 0 0 0]"; | |||||
MeshRand << "[sc#add scb#add ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]"; | |||||
MeshRand << "[sc#dad scb#dad ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]"; | |||||
MeshRand << "[sc#dda scb#dda ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]"; | |||||
MeshRand << "[sc#daa scb#daa ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]"; | |||||
MeshRand << "[sc#ada scb#ada ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]"; | |||||
MeshRand << "[sc#aad scb#aad ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]"; | |||||
int CylLimit = MeshRand.Count(); | int CylLimit = MeshRand.Count(); | ||||
MeshRand << "[sc#add scb#add ad1 2 0 rx180 ty-1 my ac1 2 2 2 0 0]"; | |||||
MeshRand << "[sc#dad scb#dad ad1 2 0 rx180 ty-1 my ac1 2 2 2 0 0]"; | |||||
MeshRand << "[sc#dda scb#dda ad1 2 0 rx180 ty-1 my ac1 2 2 2 0 0]"; | |||||
MeshRand << "[sc#daa scb#daa ad1 2 0 rx180 ty-1 my ac1 2 2 2 0 0]"; | |||||
MeshRand << "[sc#ada scb#ada ad1 2 0 rx180 ty-1 my ac1 2 2 2 0 0]"; | |||||
MeshRand << "[sc#aad scb#aad ad1 2 0 rx180 ty-1 my ac1 2 2 2 0 0]"; | |||||
MeshRand << "[sc#add scb#add ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]"; | |||||
MeshRand << "[sc#dad scb#dad ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]"; | |||||
MeshRand << "[sc#dda scb#dda ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]"; | |||||
MeshRand << "[sc#daa scb#daa ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]"; | |||||
MeshRand << "[sc#ada scb#ada ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]"; | |||||
MeshRand << "[sc#aad scb#aad ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]"; | |||||
int CapsLimit = MeshRand.Count(); | int CapsLimit = MeshRand.Count(); | ||||
@@ -307,6 +307,13 @@ void EasyCharacterController::RemoveFromSimulation(class Simulation* current_sim | |||||
} | } | ||||
} | } | ||||
//Set movement for this frame | |||||
void EasyCharacterController::SetMovementForFrame(vec3 &MoveQuantity) | |||||
{ | |||||
m_character->setWalkDirection(LOL2BT_VEC3(MoveQuantity)); | |||||
} | |||||
//------------------------------------------------------------------------- | //------------------------------------------------------------------------- | ||||
//EASY_CONSTRAINT | //EASY_CONSTRAINT | ||||
//-- | //-- | ||||
@@ -142,6 +142,7 @@ public: | |||||
virtual void InitBodyToGhost(); | virtual void InitBodyToGhost(); | ||||
virtual void AddToSimulation(class Simulation* current_simulation); | virtual void AddToSimulation(class Simulation* current_simulation); | ||||
virtual void RemoveFromSimulation(class Simulation* current_simulation); | virtual void RemoveFromSimulation(class Simulation* current_simulation); | ||||
virtual void SetMovementForFrame(vec3 &MoveQuantity); | |||||
protected: | protected: | ||||
@@ -45,7 +45,14 @@ public: | |||||
void Init() | void Init() | ||||
{ | { | ||||
// Build the broadphase | // Build the broadphase | ||||
m_broadphase = new btDbvtBroadphase(); | |||||
if (1) | |||||
{ | |||||
m_Sweep_broadphase = new btAxisSweep3(LOL2BT_VEC3(m_world_min), LOL2BT_VEC3(m_world_max)); | |||||
m_Sweep_broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); | |||||
m_broadphase = m_Sweep_broadphase; | |||||
} | |||||
else | |||||
m_broadphase = new btDbvtBroadphase(); | |||||
// Set up the collision configuration and dispatcher | // Set up the collision configuration and dispatcher | ||||
m_collision_configuration = new btDefaultCollisionConfiguration(); | m_collision_configuration = new btDefaultCollisionConfiguration(); | ||||
@@ -98,10 +105,15 @@ private: | |||||
m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity * LOL2BT_UNIT)); | m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity * LOL2BT_UNIT)); | ||||
} | } | ||||
void CustomSetWorldLimit(vec3 &NewWorldMin, vec3 &NewWorldMax) | |||||
{ | |||||
} | |||||
void CustomSetTimestep(float NewTimestep) { } | void CustomSetTimestep(float NewTimestep) { } | ||||
//broadphase | //broadphase | ||||
btBroadphaseInterface* m_broadphase; | btBroadphaseInterface* m_broadphase; | ||||
btAxisSweep3* m_Sweep_broadphase; | |||||
// Set up the collision configuration and dispatc | // Set up the collision configuration and dispatc | ||||
btDefaultCollisionConfiguration* m_collision_configuration; | btDefaultCollisionConfiguration* m_collision_configuration; | ||||
btCollisionDispatcher* m_dispatcher; | btCollisionDispatcher* m_dispatcher; | ||||
@@ -119,6 +131,7 @@ public: | |||||
private: | private: | ||||
void CustomSetContinuousDetection(bool ShouldUseCCD) { } | void CustomSetContinuousDetection(bool ShouldUseCCD) { } | ||||
void CustomSetGravity(vec3 &NewGravity) { } | void CustomSetGravity(vec3 &NewGravity) { } | ||||
void CustomSetWorldLimit(vec3 &NewWorldMin, vec3 &NewWorldMax) { } | |||||
void CustomSetTimestep(float NewTimestep) { } | void CustomSetTimestep(float NewTimestep) { } | ||||
#endif // PHYSIC IMPLEMENTATION | #endif // PHYSIC IMPLEMENTATION | ||||
@@ -142,6 +155,14 @@ public: | |||||
CustomSetGravity(NewGravity); | CustomSetGravity(NewGravity); | ||||
} | } | ||||
//Sets the simulation gravity. | |||||
void SetWorldLimit(vec3 &NewWorldMin, vec3 &NewWorldMax) | |||||
{ | |||||
m_world_min = NewWorldMin; | |||||
m_world_max = NewWorldMax; | |||||
CustomSetWorldLimit(NewWorldMin, NewWorldMax); | |||||
} | |||||
//Sets the simulation fixed timestep. | //Sets the simulation fixed timestep. | ||||
void SetTimestep(float NewTimestep) | void SetTimestep(float NewTimestep) | ||||
{ | { | ||||
@@ -172,6 +193,8 @@ private: | |||||
float m_timestep; | float m_timestep; | ||||
bool m_using_CCD; | bool m_using_CCD; | ||||
vec3 m_gravity; | vec3 m_gravity; | ||||
vec3 m_world_min; | |||||
vec3 m_world_max; | |||||
}; | }; | ||||
} /* namespace phys */ | } /* namespace phys */ | ||||