diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index d765b934c..310589e89 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -1,14 +1,23 @@ #include "btDiscreteDynamicsWorld.h" + +//collision detection #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" #include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" #include "BulletCollision/CollisionShapes/btCollisionShape.h" #include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" +//rigidbody & constraints #include "BulletDynamics/Dynamics/btRigidBody.h" #include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" #include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" + +//vehicle +#include "BulletDynamics/Vehicle/btRaycastVehicle.h" +#include "BulletDynamics/Vehicle/btVehicleRaycaster.h" +#include "BulletDynamics/Vehicle/btWheelInfo.h" + #include btDiscreteDynamicsWorld::btDiscreteDynamicsWorld() @@ -41,6 +50,9 @@ btDiscreteDynamicsWorld::~btDiscreteDynamicsWorld() void btDiscreteDynamicsWorld::stepSimulation(float timeStep) { + ///update aabbs information + updateAabbs(); + ///apply gravity, predict motion predictUnconstraintMotion(timeStep); @@ -55,19 +67,32 @@ void btDiscreteDynamicsWorld::stepSimulation(float timeStep) ///solve non-contact constraints solveNoncontactConstraints(infoGlobal); + ///solve contact constraints solveContactConstraints(infoGlobal); - //CallbackTriggers(); + ///update vehicle simulation + updateVehicles(timeStep); + + ///CallbackTriggers(); ///integrate transforms integrateTransforms(timeStep); updateActivationState( timeStep ); - updateAabbs(); + } +void btDiscreteDynamicsWorld::updateVehicles(float timeStep) +{ + for (int i=0;iUpdateVehicle( timeStep); + } +} + void btDiscreteDynamicsWorld::updateActivationState(float timeStep) { for (int i=0;i::iterator vit = std::find(m_vehicles.begin(),m_vehicles.end(),vehicle); + if (!(vit==m_vehicles.end())) + { + m_vehicles.erase(vit); + } +} + + void btDiscreteDynamicsWorld::solveContactConstraints(ContactSolverInfo& solverInfo) { diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h index 7c4dd2485..e50a78f8c 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h @@ -24,6 +24,7 @@ class ConstraintSolver; class SimulationIslandManager; class TypedConstraint; struct ContactSolverInfo; +class RaycastVehicle; #include @@ -39,6 +40,8 @@ protected: std::vector m_constraints; + std::vector m_vehicles; + void predictUnconstraintMotion(float timeStep); void integrateTransforms(float timeStep); @@ -53,6 +56,7 @@ protected: void updateActivationState(float timeStep); + void updateVehicles(float timeStep); public: @@ -69,6 +73,10 @@ public: void removeConstraint(TypedConstraint* constraint); + void addVehicle(RaycastVehicle* vehicle); + + void removeVehicle(RaycastVehicle* vehicle); + SimulationIslandManager* GetSimulationIslandManager() { return m_islandManager;