2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
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:
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.
16 #include "btSimpleDynamicsWorld.h"
17 #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
18 #include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h"
19 #include "BulletCollision/CollisionShapes/btCollisionShape.h"
20 #include "BulletDynamics/Dynamics/btRigidBody.h"
21 #include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h"
22 #include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
26 Make sure this dummy function never changes so that it
27 can be used by probes that are checking whether the
28 library is actually installed.
32 void btBulletDynamicsProbe ();
33 void btBulletDynamicsProbe () {}
39 btSimpleDynamicsWorld::btSimpleDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration)
40 :btDynamicsWorld(dispatcher,pairCache,collisionConfiguration),
41 m_constraintSolver(constraintSolver),
42 m_ownsConstraintSolver(false),
49 btSimpleDynamicsWorld::~btSimpleDynamicsWorld()
51 if (m_ownsConstraintSolver)
52 btAlignedFree( m_constraintSolver);
55 int btSimpleDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, btScalar fixedTimeStep)
61 ///apply gravity, predict motion
62 predictUnconstraintMotion(timeStep);
64 btDispatcherInfo& dispatchInfo = getDispatchInfo();
65 dispatchInfo.m_timeStep = timeStep;
66 dispatchInfo.m_stepCount = 0;
67 dispatchInfo.m_debugDraw = getDebugDrawer();
69 ///perform collision detection
70 performDiscreteCollisionDetection();
72 ///solve contact constraints
73 int numManifolds = m_dispatcher1->getNumManifolds();
76 btPersistentManifold** manifoldPtr = ((btCollisionDispatcher*)m_dispatcher1)->getInternalManifoldPointer();
78 btContactSolverInfo infoGlobal;
79 infoGlobal.m_timeStep = timeStep;
80 m_constraintSolver->prepareSolve(0,numManifolds);
81 m_constraintSolver->solveGroup(&getCollisionObjectArray()[0],getNumCollisionObjects(),manifoldPtr, numManifolds,0,0,infoGlobal,m_debugDrawer, m_stackAlloc,m_dispatcher1);
82 m_constraintSolver->allSolved(infoGlobal,m_debugDrawer, m_stackAlloc);
85 ///integrate transforms
86 integrateTransforms(timeStep);
90 synchronizeMotionStates();
98 void btSimpleDynamicsWorld::clearForces()
100 ///@todo: iterate over awake simulation islands!
101 for ( int i=0;i<m_collisionObjects.size();i++)
103 btCollisionObject* colObj = m_collisionObjects[i];
105 btRigidBody* body = btRigidBody::upcast(colObj);
114 void btSimpleDynamicsWorld::setGravity(const btVector3& gravity)
117 for ( int i=0;i<m_collisionObjects.size();i++)
119 btCollisionObject* colObj = m_collisionObjects[i];
120 btRigidBody* body = btRigidBody::upcast(colObj);
123 body->setGravity(gravity);
128 btVector3 btSimpleDynamicsWorld::getGravity () const
133 void btSimpleDynamicsWorld::removeRigidBody(btRigidBody* body)
135 btCollisionWorld::removeCollisionObject(body);
138 void btSimpleDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
140 btRigidBody* body = btRigidBody::upcast(collisionObject);
142 removeRigidBody(body);
144 btCollisionWorld::removeCollisionObject(collisionObject);
148 void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
150 body->setGravity(m_gravity);
152 if (body->getCollisionShape())
154 addCollisionObject(body);
158 void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body, short group, short mask)
160 body->setGravity(m_gravity);
162 if (body->getCollisionShape())
164 addCollisionObject(body,group,mask);
169 void btSimpleDynamicsWorld::debugDrawWorld()
174 void btSimpleDynamicsWorld::addAction(btActionInterface* action)
179 void btSimpleDynamicsWorld::removeAction(btActionInterface* action)
185 void btSimpleDynamicsWorld::updateAabbs()
187 btTransform predictedTrans;
188 for ( int i=0;i<m_collisionObjects.size();i++)
190 btCollisionObject* colObj = m_collisionObjects[i];
191 btRigidBody* body = btRigidBody::upcast(colObj);
194 if (body->isActive() && (!body->isStaticObject()))
196 btVector3 minAabb,maxAabb;
197 colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
198 btBroadphaseInterface* bp = getBroadphase();
199 bp->setAabb(body->getBroadphaseHandle(),minAabb,maxAabb, m_dispatcher1);
205 void btSimpleDynamicsWorld::integrateTransforms(btScalar timeStep)
207 btTransform predictedTrans;
208 for ( int i=0;i<m_collisionObjects.size();i++)
210 btCollisionObject* colObj = m_collisionObjects[i];
211 btRigidBody* body = btRigidBody::upcast(colObj);
214 if (body->isActive() && (!body->isStaticObject()))
216 body->predictIntegratedTransform(timeStep, predictedTrans);
217 body->proceedToTransform( predictedTrans);
225 void btSimpleDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
227 for ( int i=0;i<m_collisionObjects.size();i++)
229 btCollisionObject* colObj = m_collisionObjects[i];
230 btRigidBody* body = btRigidBody::upcast(colObj);
233 if (!body->isStaticObject())
235 if (body->isActive())
237 body->applyGravity();
238 body->integrateVelocities( timeStep);
239 body->applyDamping(timeStep);
240 body->predictIntegratedTransform(timeStep,body->getInterpolationWorldTransform());
248 void btSimpleDynamicsWorld::synchronizeMotionStates()
250 ///@todo: iterate over awake simulation islands!
251 for ( int i=0;i<m_collisionObjects.size();i++)
253 btCollisionObject* colObj = m_collisionObjects[i];
254 btRigidBody* body = btRigidBody::upcast(colObj);
255 if (body && body->getMotionState())
257 if (body->getActivationState() != ISLAND_SLEEPING)
259 body->getMotionState()->setWorldTransform(body->getWorldTransform());
267 void btSimpleDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
269 if (m_ownsConstraintSolver)
271 btAlignedFree(m_constraintSolver);
273 m_ownsConstraintSolver = false;
274 m_constraintSolver = solver;
277 btConstraintSolver* btSimpleDynamicsWorld::getConstraintSolver()
279 return m_constraintSolver;