2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans https://bulletphysics.org
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"
25 Make sure this dummy function never changes so that it
26 can be used by probes that are checking whether the
27 library is actually installed.
31 void btBulletDynamicsProbe();
32 void btBulletDynamicsProbe() {}
35 btSimpleDynamicsWorld::btSimpleDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration)
36 : btDynamicsWorld(dispatcher, pairCache, collisionConfiguration),
37 m_constraintSolver(constraintSolver),
38 m_ownsConstraintSolver(false),
43 btSimpleDynamicsWorld::~btSimpleDynamicsWorld()
45 if (m_ownsConstraintSolver)
46 btAlignedFree(m_constraintSolver);
49 int btSimpleDynamicsWorld::stepSimulation(btScalar timeStep, int maxSubSteps, btScalar fixedTimeStep)
54 ///apply gravity, predict motion
55 predictUnconstraintMotion(timeStep);
57 btDispatcherInfo& dispatchInfo = getDispatchInfo();
58 dispatchInfo.m_timeStep = timeStep;
59 dispatchInfo.m_stepCount = 0;
60 dispatchInfo.m_debugDraw = getDebugDrawer();
62 ///perform collision detection
63 performDiscreteCollisionDetection();
65 ///solve contact constraints
66 int numManifolds = m_dispatcher1->getNumManifolds();
69 btPersistentManifold** manifoldPtr = ((btCollisionDispatcher*)m_dispatcher1)->getInternalManifoldPointer();
71 btContactSolverInfo infoGlobal;
72 infoGlobal.m_timeStep = timeStep;
73 m_constraintSolver->prepareSolve(0, numManifolds);
74 m_constraintSolver->solveGroup(&getCollisionObjectArray()[0], getNumCollisionObjects(), manifoldPtr, numManifolds, 0, 0, infoGlobal, m_debugDrawer, m_dispatcher1);
75 m_constraintSolver->allSolved(infoGlobal, m_debugDrawer);
78 ///integrate transforms
79 integrateTransforms(timeStep);
83 synchronizeMotionStates();
90 void btSimpleDynamicsWorld::clearForces()
92 ///@todo: iterate over awake simulation islands!
93 for (int i = 0; i < m_collisionObjects.size(); i++)
95 btCollisionObject* colObj = m_collisionObjects[i];
97 btRigidBody* body = btRigidBody::upcast(colObj);
105 void btSimpleDynamicsWorld::setGravity(const btVector3& gravity)
108 for (int i = 0; i < m_collisionObjects.size(); i++)
110 btCollisionObject* colObj = m_collisionObjects[i];
111 btRigidBody* body = btRigidBody::upcast(colObj);
114 body->setGravity(gravity);
119 btVector3 btSimpleDynamicsWorld::getGravity() const
124 void btSimpleDynamicsWorld::removeRigidBody(btRigidBody* body)
126 btCollisionWorld::removeCollisionObject(body);
129 void btSimpleDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
131 btRigidBody* body = btRigidBody::upcast(collisionObject);
133 removeRigidBody(body);
135 btCollisionWorld::removeCollisionObject(collisionObject);
138 void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
140 body->setGravity(m_gravity);
142 if (body->getCollisionShape())
144 addCollisionObject(body);
148 void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body, int group, int mask)
150 body->setGravity(m_gravity);
152 if (body->getCollisionShape())
154 addCollisionObject(body, group, mask);
158 void btSimpleDynamicsWorld::debugDrawWorld()
162 void btSimpleDynamicsWorld::addAction(btActionInterface* action)
166 void btSimpleDynamicsWorld::removeAction(btActionInterface* action)
170 void btSimpleDynamicsWorld::updateAabbs()
172 btTransform predictedTrans;
173 for (int i = 0; i < m_collisionObjects.size(); i++)
175 btCollisionObject* colObj = m_collisionObjects[i];
176 btRigidBody* body = btRigidBody::upcast(colObj);
179 if (body->isActive() && (!body->isStaticObject()))
181 btVector3 minAabb, maxAabb;
182 colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb, maxAabb);
183 btBroadphaseInterface* bp = getBroadphase();
184 bp->setAabb(body->getBroadphaseHandle(), minAabb, maxAabb, m_dispatcher1);
190 void btSimpleDynamicsWorld::integrateTransforms(btScalar timeStep)
192 btTransform predictedTrans;
193 for (int i = 0; i < m_collisionObjects.size(); i++)
195 btCollisionObject* colObj = m_collisionObjects[i];
196 btRigidBody* body = btRigidBody::upcast(colObj);
199 if (body->isActive() && (!body->isStaticObject()))
201 body->predictIntegratedTransform(timeStep, predictedTrans);
202 body->proceedToTransform(predictedTrans);
208 void btSimpleDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
210 for (int i = 0; i < m_collisionObjects.size(); i++)
212 btCollisionObject* colObj = m_collisionObjects[i];
213 btRigidBody* body = btRigidBody::upcast(colObj);
216 if (!body->isStaticObject())
218 if (body->isActive())
220 body->applyGravity();
221 body->integrateVelocities(timeStep);
222 body->applyDamping(timeStep);
223 body->predictIntegratedTransform(timeStep, body->getInterpolationWorldTransform());
230 void btSimpleDynamicsWorld::synchronizeMotionStates()
232 ///@todo: iterate over awake simulation islands!
233 for (int i = 0; i < m_collisionObjects.size(); i++)
235 btCollisionObject* colObj = m_collisionObjects[i];
236 btRigidBody* body = btRigidBody::upcast(colObj);
237 if (body && body->getMotionState())
239 if (body->getActivationState() != ISLAND_SLEEPING)
241 body->getMotionState()->setWorldTransform(body->getWorldTransform());
247 void btSimpleDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
249 if (m_ownsConstraintSolver)
251 btAlignedFree(m_constraintSolver);
253 m_ownsConstraintSolver = false;
254 m_constraintSolver = solver;
257 btConstraintSolver* btSimpleDynamicsWorld::getConstraintSolver()
259 return m_constraintSolver;