1 /* 2 Bullet Continuous Collision Detection and Physics Library 3 Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org 4 5 This software is provided 'as-is', without any express or implied warranty. 6 In no event will the authors be held liable for any damages arising from the use of this software. 7 Permission is granted to anyone to use this software for any purpose, 8 including commercial applications, and to alter it and redistribute it freely, 9 subject to the following restrictions: 10 11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 13 3. This notice may not be removed or altered from any source distribution. 14 */ 15 16 17 #ifndef BT_DISCRETE_DYNAMICS_WORLD_H 18 #define BT_DISCRETE_DYNAMICS_WORLD_H 19 20 #include "btDynamicsWorld.h" 21 22 class btDispatcher; 23 class btOverlappingPairCache; 24 class btConstraintSolver; 25 class btSimulationIslandManager; 26 class btTypedConstraint; 27 class btActionInterface; 28 29 class btIDebugDraw; 30 #include "LinearMath/btAlignedObjectArray.h" 31 32 33 ///btDiscreteDynamicsWorld provides discrete rigid body simulation 34 ///those classes replace the obsolete CcdPhysicsEnvironment/CcdPhysicsController 35 class btDiscreteDynamicsWorld : public btDynamicsWorld 36 { 37 protected: 38 39 btConstraintSolver* m_constraintSolver; 40 41 btSimulationIslandManager* m_islandManager; 42 43 btAlignedObjectArray<btTypedConstraint*> m_constraints; 44 45 btAlignedObjectArray<btRigidBody*> m_nonStaticRigidBodies; 46 47 btVector3 m_gravity; 48 49 //for variable timesteps 50 btScalar m_localTime; 51 //for variable timesteps 52 53 bool m_ownsIslandManager; 54 bool m_ownsConstraintSolver; 55 bool m_synchronizeAllMotionStates; 56 57 btAlignedObjectArray<btActionInterface*> m_actions; 58 59 int m_profileTimings; 60 61 virtual void predictUnconstraintMotion(btScalar timeStep); 62 63 virtual void integrateTransforms(btScalar timeStep); 64 65 virtual void calculateSimulationIslands(); 66 67 virtual void solveConstraints(btContactSolverInfo& solverInfo); 68 69 void updateActivationState(btScalar timeStep); 70 71 void updateActions(btScalar timeStep); 72 73 void startProfiling(btScalar timeStep); 74 75 virtual void internalSingleStepSimulation( btScalar timeStep); 76 77 78 virtual void saveKinematicState(btScalar timeStep); 79 80 void serializeRigidBodies(btSerializer* serializer); 81 82 public: 83 84 85 ///this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete those 86 btDiscreteDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration); 87 88 virtual ~btDiscreteDynamicsWorld(); 89 90 ///if maxSubSteps > 0, it will interpolate motion between fixedTimeStep's 91 virtual int stepSimulation( btScalar timeStep,int maxSubSteps=1, btScalar fixedTimeStep=btScalar(1.)/btScalar(60.)); 92 93 94 virtual void synchronizeMotionStates(); 95 96 ///this can be useful to synchronize a single rigid body -> graphics object 97 void synchronizeSingleMotionState(btRigidBody* body); 98 99 virtual void addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies=false); 100 101 virtual void removeConstraint(btTypedConstraint* constraint); 102 103 virtual void addAction(btActionInterface*); 104 105 virtual void removeAction(btActionInterface*); 106 getSimulationIslandManager()107 btSimulationIslandManager* getSimulationIslandManager() 108 { 109 return m_islandManager; 110 } 111 getSimulationIslandManager()112 const btSimulationIslandManager* getSimulationIslandManager() const 113 { 114 return m_islandManager; 115 } 116 getCollisionWorld()117 btCollisionWorld* getCollisionWorld() 118 { 119 return this; 120 } 121 122 virtual void setGravity(const btVector3& gravity); 123 124 virtual btVector3 getGravity () const; 125 126 virtual void addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup=btBroadphaseProxy::StaticFilter,short int collisionFilterMask=btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter); 127 128 virtual void addRigidBody(btRigidBody* body); 129 130 virtual void addRigidBody(btRigidBody* body, short group, short mask); 131 132 virtual void removeRigidBody(btRigidBody* body); 133 134 ///removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise call btCollisionWorld::removeCollisionObject 135 virtual void removeCollisionObject(btCollisionObject* collisionObject); 136 137 138 void debugDrawConstraint(btTypedConstraint* constraint); 139 140 virtual void debugDrawWorld(); 141 142 virtual void setConstraintSolver(btConstraintSolver* solver); 143 144 virtual btConstraintSolver* getConstraintSolver(); 145 146 virtual int getNumConstraints() const; 147 148 virtual btTypedConstraint* getConstraint(int index) ; 149 150 virtual const btTypedConstraint* getConstraint(int index) const; 151 152 getWorldType()153 virtual btDynamicsWorldType getWorldType() const 154 { 155 return BT_DISCRETE_DYNAMICS_WORLD; 156 } 157 158 ///the forces on each rigidbody is accumulating together with gravity. clear this after each timestep. 159 virtual void clearForces(); 160 161 ///apply gravity, call this once per timestep 162 virtual void applyGravity(); 163 setNumTasks(int numTasks)164 virtual void setNumTasks(int numTasks) 165 { 166 (void) numTasks; 167 } 168 169 ///obsolete, use updateActions instead updateVehicles(btScalar timeStep)170 virtual void updateVehicles(btScalar timeStep) 171 { 172 updateActions(timeStep); 173 } 174 175 ///obsolete, use addAction instead 176 virtual void addVehicle(btActionInterface* vehicle); 177 ///obsolete, use removeAction instead 178 virtual void removeVehicle(btActionInterface* vehicle); 179 ///obsolete, use addAction instead 180 virtual void addCharacter(btActionInterface* character); 181 ///obsolete, use removeAction instead 182 virtual void removeCharacter(btActionInterface* character); 183 setSynchronizeAllMotionStates(bool synchronizeAll)184 void setSynchronizeAllMotionStates(bool synchronizeAll) 185 { 186 m_synchronizeAllMotionStates = synchronizeAll; 187 } getSynchronizeAllMotionStates()188 bool getSynchronizeAllMotionStates() const 189 { 190 return m_synchronizeAllMotionStates; 191 } 192 193 ///Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (see Bullet/Demos/SerializeDemo) 194 virtual void serialize(btSerializer* serializer); 195 196 }; 197 198 #endif //BT_DISCRETE_DYNAMICS_WORLD_H 199