btSimpleDynamicsWorld.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "btSimpleDynamicsWorld.h"
00017 #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
00018 #include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h"
00019 #include "BulletCollision/CollisionShapes/btCollisionShape.h"
00020 #include "BulletDynamics/Dynamics/btRigidBody.h"
00021 #include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h"
00022 #include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
00023
00024
00025
00026
00027
00028
00029
00030 extern "C"
00031 {
00032 void btBulletDynamicsProbe ();
00033 void btBulletDynamicsProbe () {}
00034 }
00035
00036
00037
00038
00039 btSimpleDynamicsWorld::btSimpleDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration)
00040 :btDynamicsWorld(dispatcher,pairCache,collisionConfiguration),
00041 m_constraintSolver(constraintSolver),
00042 m_ownsConstraintSolver(false),
00043 m_gravity(0,0,-10)
00044 {
00045
00046 }
00047
00048
00049 btSimpleDynamicsWorld::~btSimpleDynamicsWorld()
00050 {
00051 if (m_ownsConstraintSolver)
00052 btAlignedFree( m_constraintSolver);
00053 }
00054
00055 int btSimpleDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, btScalar fixedTimeStep)
00056 {
00057 (void)fixedTimeStep;
00058 (void)maxSubSteps;
00059
00060
00062 predictUnconstraintMotion(timeStep);
00063
00064 btDispatcherInfo& dispatchInfo = getDispatchInfo();
00065 dispatchInfo.m_timeStep = timeStep;
00066 dispatchInfo.m_stepCount = 0;
00067 dispatchInfo.m_debugDraw = getDebugDrawer();
00068
00070 performDiscreteCollisionDetection();
00071
00073 int numManifolds = m_dispatcher1->getNumManifolds();
00074 if (numManifolds)
00075 {
00076 btPersistentManifold** manifoldPtr = ((btCollisionDispatcher*)m_dispatcher1)->getInternalManifoldPointer();
00077
00078 btContactSolverInfo infoGlobal;
00079 infoGlobal.m_timeStep = timeStep;
00080 m_constraintSolver->prepareSolve(0,numManifolds);
00081 m_constraintSolver->solveGroup(0,0,manifoldPtr, numManifolds,0,0,infoGlobal,m_debugDrawer, m_stackAlloc,m_dispatcher1);
00082 m_constraintSolver->allSolved(infoGlobal,m_debugDrawer, m_stackAlloc);
00083 }
00084
00086 integrateTransforms(timeStep);
00087
00088 updateAabbs();
00089
00090 synchronizeMotionStates();
00091
00092 clearForces();
00093
00094 return 1;
00095
00096 }
00097
00098 void btSimpleDynamicsWorld::clearForces()
00099 {
00101 for ( int i=0;i<m_collisionObjects.size();i++)
00102 {
00103 btCollisionObject* colObj = m_collisionObjects[i];
00104
00105 btRigidBody* body = btRigidBody::upcast(colObj);
00106 if (body)
00107 {
00108 body->clearForces();
00109 }
00110 }
00111 }
00112
00113
00114 void btSimpleDynamicsWorld::setGravity(const btVector3& gravity)
00115 {
00116 m_gravity = gravity;
00117 for ( int i=0;i<m_collisionObjects.size();i++)
00118 {
00119 btCollisionObject* colObj = m_collisionObjects[i];
00120 btRigidBody* body = btRigidBody::upcast(colObj);
00121 if (body)
00122 {
00123 body->setGravity(gravity);
00124 }
00125 }
00126 }
00127
00128 btVector3 btSimpleDynamicsWorld::getGravity () const
00129 {
00130 return m_gravity;
00131 }
00132
00133 void btSimpleDynamicsWorld::removeRigidBody(btRigidBody* body)
00134 {
00135 btCollisionWorld::removeCollisionObject(body);
00136 }
00137
00138 void btSimpleDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
00139 {
00140 btRigidBody* body = btRigidBody::upcast(collisionObject);
00141 if (body)
00142 removeRigidBody(body);
00143 else
00144 btCollisionWorld::removeCollisionObject(collisionObject);
00145 }
00146
00147
00148 void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
00149 {
00150 body->setGravity(m_gravity);
00151
00152 if (body->getCollisionShape())
00153 {
00154 addCollisionObject(body);
00155 }
00156 }
00157
00158 void btSimpleDynamicsWorld::updateAabbs()
00159 {
00160 btTransform predictedTrans;
00161 for ( int i=0;i<m_collisionObjects.size();i++)
00162 {
00163 btCollisionObject* colObj = m_collisionObjects[i];
00164 btRigidBody* body = btRigidBody::upcast(colObj);
00165 if (body)
00166 {
00167 if (body->isActive() && (!body->isStaticObject()))
00168 {
00169 btVector3 minAabb,maxAabb;
00170 colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
00171 btBroadphaseInterface* bp = getBroadphase();
00172 bp->setAabb(body->getBroadphaseHandle(),minAabb,maxAabb, m_dispatcher1);
00173 }
00174 }
00175 }
00176 }
00177
00178 void btSimpleDynamicsWorld::integrateTransforms(btScalar timeStep)
00179 {
00180 btTransform predictedTrans;
00181 for ( int i=0;i<m_collisionObjects.size();i++)
00182 {
00183 btCollisionObject* colObj = m_collisionObjects[i];
00184 btRigidBody* body = btRigidBody::upcast(colObj);
00185 if (body)
00186 {
00187 if (body->isActive() && (!body->isStaticObject()))
00188 {
00189 body->predictIntegratedTransform(timeStep, predictedTrans);
00190 body->proceedToTransform( predictedTrans);
00191 }
00192 }
00193 }
00194 }
00195
00196
00197
00198 void btSimpleDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
00199 {
00200 for ( int i=0;i<m_collisionObjects.size();i++)
00201 {
00202 btCollisionObject* colObj = m_collisionObjects[i];
00203 btRigidBody* body = btRigidBody::upcast(colObj);
00204 if (body)
00205 {
00206 if (!body->isStaticObject())
00207 {
00208 if (body->isActive())
00209 {
00210 body->applyGravity();
00211 body->integrateVelocities( timeStep);
00212 body->applyDamping(timeStep);
00213 body->predictIntegratedTransform(timeStep,body->getInterpolationWorldTransform());
00214 }
00215 }
00216 }
00217 }
00218 }
00219
00220
00221 void btSimpleDynamicsWorld::synchronizeMotionStates()
00222 {
00224 for ( int i=0;i<m_collisionObjects.size();i++)
00225 {
00226 btCollisionObject* colObj = m_collisionObjects[i];
00227 btRigidBody* body = btRigidBody::upcast(colObj);
00228 if (body && body->getMotionState())
00229 {
00230 if (body->getActivationState() != ISLAND_SLEEPING)
00231 {
00232 body->getMotionState()->setWorldTransform(body->getWorldTransform());
00233 }
00234 }
00235 }
00236
00237 }
00238
00239
00240 void btSimpleDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
00241 {
00242 if (m_ownsConstraintSolver)
00243 {
00244 btAlignedFree(m_constraintSolver);
00245 }
00246 m_ownsConstraintSolver = false;
00247 m_constraintSolver = solver;
00248 }
00249
00250 btConstraintSolver* btSimpleDynamicsWorld::getConstraintSolver()
00251 {
00252 return m_constraintSolver;
00253 }