| @@ -72,6 +72,10 @@ vec3 Camera::GetTarget() | |||
| { | |||
| return m_target; | |||
| } | |||
| vec3 Camera::GetPosition() | |||
| { | |||
| return m_position; | |||
| } | |||
| mat4 const &Camera::GetViewMatrix() | |||
| { | |||
| @@ -36,6 +36,7 @@ public: | |||
| float near, float far); | |||
| void SetTarget(vec3 const &pos); | |||
| vec3 GetTarget(); | |||
| vec3 GetPosition(); | |||
| mat4 const &GetViewMatrix(); | |||
| mat4 const &GetProjMatrix(); | |||
| @@ -51,8 +51,8 @@ int gNumObjects = 64; | |||
| #define USE_WALL 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_CHARACTER 1 | |||
| @@ -70,6 +70,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||
| m_ready = false; | |||
| m_simulation = new Simulation(); | |||
| m_simulation->SetWorldLimit(vec3(-1000.0f, -1000.0f, -1000.0f), vec3(1000.0f, 1000.0f, 1000.0f)); | |||
| m_simulation->Init(); | |||
| vec3 NewGravity = vec3(.0f, -10.0f, .0f); | |||
| m_simulation->SetGravity(NewGravity); | |||
| @@ -109,7 +110,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||
| if (USE_PLATFORM) | |||
| { | |||
| 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); | |||
| @@ -127,7 +128,7 @@ BtPhysTest::BtPhysTest(bool editor) | |||
| if (USE_CHARACTER) | |||
| { | |||
| 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); | |||
| @@ -406,6 +407,23 @@ void BtPhysTest::TickGame(float seconds) | |||
| 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++) | |||
| { | |||
| PhysicsObject* PhysObj = m_character_list[i]; | |||
| @@ -417,8 +435,9 @@ void BtPhysTest::TickGame(float seconds) | |||
| 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 | |||
| { | |||
| @@ -40,8 +40,6 @@ public: | |||
| if (dummy == 1) //for Rope purpose | |||
| { | |||
| 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); | |||
| m_physics.SetCollisionChannel(0, 0xFF); | |||
| m_physics.SetShapeToBox(BoxSize); | |||
| @@ -53,9 +51,30 @@ public: | |||
| else if (dummy == 2) //for character purpose | |||
| { | |||
| 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.SetShapeToCapsule(BoxSize.x, BoxSize.y); | |||
| m_character.SetMass(.0f); | |||
| @@ -88,21 +107,21 @@ public: | |||
| 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(); | |||
| 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(); | |||
| @@ -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 | |||
| //-- | |||
| @@ -142,6 +142,7 @@ public: | |||
| virtual void InitBodyToGhost(); | |||
| virtual void AddToSimulation(class Simulation* current_simulation); | |||
| virtual void RemoveFromSimulation(class Simulation* current_simulation); | |||
| virtual void SetMovementForFrame(vec3 &MoveQuantity); | |||
| protected: | |||
| @@ -45,7 +45,14 @@ public: | |||
| void Init() | |||
| { | |||
| // 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 | |||
| m_collision_configuration = new btDefaultCollisionConfiguration(); | |||
| @@ -98,10 +105,15 @@ private: | |||
| m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity * LOL2BT_UNIT)); | |||
| } | |||
| void CustomSetWorldLimit(vec3 &NewWorldMin, vec3 &NewWorldMax) | |||
| { | |||
| } | |||
| void CustomSetTimestep(float NewTimestep) { } | |||
| //broadphase | |||
| btBroadphaseInterface* m_broadphase; | |||
| btAxisSweep3* m_Sweep_broadphase; | |||
| // Set up the collision configuration and dispatc | |||
| btDefaultCollisionConfiguration* m_collision_configuration; | |||
| btCollisionDispatcher* m_dispatcher; | |||
| @@ -119,6 +131,7 @@ public: | |||
| private: | |||
| void CustomSetContinuousDetection(bool ShouldUseCCD) { } | |||
| void CustomSetGravity(vec3 &NewGravity) { } | |||
| void CustomSetWorldLimit(vec3 &NewWorldMin, vec3 &NewWorldMax) { } | |||
| void CustomSetTimestep(float NewTimestep) { } | |||
| #endif // PHYSIC IMPLEMENTATION | |||
| @@ -142,6 +155,14 @@ public: | |||
| 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. | |||
| void SetTimestep(float NewTimestep) | |||
| { | |||
| @@ -172,6 +193,8 @@ private: | |||
| float m_timestep; | |||
| bool m_using_CCD; | |||
| vec3 m_gravity; | |||
| vec3 m_world_min; | |||
| vec3 m_world_max; | |||
| }; | |||
| } /* namespace phys */ | |||