Bullet Collision Detection & Physics Library
btDiscreteDynamicsWorldMt.cpp
Go to the documentation of this file.
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 
18 
19 //collision detection
26 #include "LinearMath/btQuickprof.h"
27 
28 //rigidbody & constraints
40 
41 
44 
45 
47 #include "LinearMath/btQuickprof.h"
49 
51 
52 
54 {
59 
61  btConstraintSolver* solver,
62  btStackAlloc* stackAlloc,
63  btDispatcher* dispatcher)
64  :m_solverInfo(NULL),
65  m_solver(solver),
66  m_debugDrawer(NULL),
67  m_dispatcher(dispatcher)
68  {
69 
70  }
71 
73  {
74  btAssert(0);
75  (void)other;
76  return *this;
77  }
78 
79  SIMD_FORCE_INLINE void setup ( btContactSolverInfo* solverInfo, btIDebugDraw* debugDrawer)
80  {
81  btAssert(solverInfo);
82  m_solverInfo = solverInfo;
83  m_debugDrawer = debugDrawer;
84  }
85 
86 
87  virtual void processIsland( btCollisionObject** bodies,
88  int numBodies,
89  btPersistentManifold** manifolds,
90  int numManifolds,
91  btTypedConstraint** constraints,
92  int numConstraints,
93  int islandId
94  )
95  {
96  m_solver->solveGroup( bodies,
97  numBodies,
98  manifolds,
99  numManifolds,
100  constraints,
101  numConstraints,
102  *m_solverInfo,
105  );
106  }
107 
108 };
109 
110 
114 
116 {
117  int i = 0;
118 #if BT_THREADSAFE
119  i = btGetCurrentThreadIndex() % m_solvers.size();
120 #endif // #if BT_THREADSAFE
121  while ( true )
122  {
123  ThreadSolver& solver = m_solvers[ i ];
124  if ( solver.mutex.tryLock() )
125  {
126  return &solver;
127  }
128  // failed, try the next one
129  i = ( i + 1 ) % m_solvers.size();
130  }
131  return NULL;
132 }
133 
134 void btConstraintSolverPoolMt::init( btConstraintSolver** solvers, int numSolvers )
135 {
137  m_solvers.resize( numSolvers );
138  for ( int i = 0; i < numSolvers; ++i )
139  {
140  m_solvers[ i ].solver = solvers[ i ];
141  }
142  if ( numSolvers > 0 )
143  {
144  m_solverType = solvers[ 0 ]->getSolverType();
145  }
146 }
147 
148 // create the solvers for me
150 {
152  solvers.reserve( numSolvers );
153  for ( int i = 0; i < numSolvers; ++i )
154  {
156  solvers.push_back( solver );
157  }
158  init( &solvers[ 0 ], numSolvers );
159 }
160 
161 // pass in fully constructed solvers (destructor will delete them)
163 {
164  init( solvers, numSolvers );
165 }
166 
168 {
169  // delete all solvers
170  for ( int i = 0; i < m_solvers.size(); ++i )
171  {
172  ThreadSolver& solver = m_solvers[ i ];
173  delete solver.solver;
174  solver.solver = NULL;
175  }
176 }
177 
180  int numBodies,
181  btPersistentManifold** manifolds,
182  int numManifolds,
183  btTypedConstraint** constraints,
184  int numConstraints,
185  const btContactSolverInfo& info,
186  btIDebugDraw* debugDrawer,
187  btDispatcher* dispatcher
188 )
189 {
191  ts->solver->solveGroup( bodies, numBodies, manifolds, numManifolds, constraints, numConstraints, info, debugDrawer, dispatcher );
192  ts->mutex.unlock();
193  return 0.0f;
194 }
195 
197 {
198  for ( int i = 0; i < m_solvers.size(); ++i )
199  {
200  ThreadSolver& solver = m_solvers[ i ];
201  solver.mutex.lock();
202  solver.solver->reset();
203  solver.mutex.unlock();
204  }
205 }
206 
207 
211 
213 : btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration)
214 {
216  {
219  }
220  {
221  void* mem = btAlignedAlloc(sizeof(InplaceSolverIslandCallbackMt),16);
223  }
224  {
225  void* mem = btAlignedAlloc(sizeof(btSimulationIslandManagerMt),16);
228  m_islandManager = im;
229  }
230 }
231 
232 
234 {
236  {
237  m_solverIslandCallbackMt->~InplaceSolverIslandCallbackMt();
239  }
241  {
244  }
245 }
246 
247 
249 {
250  BT_PROFILE("solveConstraints");
251 
254 
258 
260 }
261 
262 
264 {
267 
268  void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
269  {
270  for ( int i = iBegin; i < iEnd; ++i )
271  {
272  btRigidBody* body = rigidBodies[ i ];
273  if ( !body->isStaticOrKinematicObject() )
274  {
275  //don't integrate/update velocities here, it happens in the constraint solver
276  body->applyDamping( timeStep );
278  }
279  }
280  }
281 };
282 
283 
285 {
286  BT_PROFILE( "predictUnconstraintMotion" );
287  if ( m_nonStaticRigidBodies.size() > 0 )
288  {
290  update.timeStep = timeStep;
291  update.rigidBodies = &m_nonStaticRigidBodies[ 0 ];
292  int grainSize = 50; // num of iterations per task for task scheduler
293  btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update );
294  }
295 }
296 
297 
299 {
300  BT_PROFILE( "createPredictiveContacts" );
302  if ( m_nonStaticRigidBodies.size() > 0 )
303  {
305  update.world = this;
306  update.timeStep = timeStep;
307  update.rigidBodies = &m_nonStaticRigidBodies[ 0 ];
308  int grainSize = 50; // num of iterations per task for task scheduler
309  btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update );
310  }
311 }
312 
313 
315 {
316  BT_PROFILE( "integrateTransforms" );
317  if ( m_nonStaticRigidBodies.size() > 0 )
318  {
320  update.world = this;
321  update.timeStep = timeStep;
322  update.rigidBodies = &m_nonStaticRigidBodies[ 0 ];
323  int grainSize = 50; // num of iterations per task for task scheduler
324  btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update );
325  }
326 }
327 
btCollisionWorld::m_debugDrawer
btIDebugDraw * m_debugDrawer
Definition: btCollisionWorld.h:102
btDiscreteDynamicsWorld::m_constraints
btAlignedObjectArray< btTypedConstraint * > m_constraints
Definition: btDiscreteDynamicsWorld.h:49
btTypedConstraint
TypedConstraint is the baseclass for Bullet constraints and vehicles.
Definition: btTypedConstraint.h:78
btDiscreteDynamicsWorldMt::solveConstraints
virtual void solveConstraints(btContactSolverInfo &solverInfo) BT_OVERRIDE
Definition: btDiscreteDynamicsWorldMt.cpp:248
btCollisionObject
btCollisionObject can be used to manage collision detection objects.
Definition: btCollisionObject.h:49
btSimulationIslandManagerMt::setMinimumSolverBatchSize
void setMinimumSolverBatchSize(int sz)
Definition: btSimulationIslandManagerMt.h:94
InplaceSolverIslandCallbackMt
Definition: btDiscreteDynamicsWorldMt.cpp:53
btSimulationIslandManagerMt.h
btRigidBody
The btRigidBody is the main class for rigid body objects.
Definition: btRigidBody.h:62
btConstraintSolver::reset
virtual void reset()=0
clear internal cached data and reset random seed
btAlignedFree
#define btAlignedFree(ptr)
Definition: btAlignedAllocator.h:48
btCollisionShape.h
btRigidBody::predictIntegratedTransform
void predictIntegratedTransform(btScalar step, btTransform &predictedTransform)
continuous collision detection needs prediction
Definition: btRigidBody.cpp:106
btDiscreteDynamicsWorld::m_nonStaticRigidBodies
btAlignedObjectArray< btRigidBody * > m_nonStaticRigidBodies
Definition: btDiscreteDynamicsWorld.h:51
btDiscreteDynamicsWorldMt::UpdaterIntegrateTransforms::timeStep
btScalar timeStep
Definition: btDiscreteDynamicsWorldMt.h:112
btCollisionWorld::getDebugDrawer
virtual btIDebugDraw * getDebugDrawer()
Definition: btCollisionWorld.h:162
btContactSolverInfo
Definition: btContactSolverInfo.h:69
btScalar
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:292
btMotionState.h
btDispatcher
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
Definition: btDispatcher.h:75
btDiscreteDynamicsWorldMt::integrateTransforms
virtual void integrateTransforms(btScalar timeStep) BT_OVERRIDE
Definition: btDiscreteDynamicsWorldMt.cpp:314
btDiscreteDynamicsWorld::m_islandManager
btSimulationIslandManager * m_islandManager
Definition: btDiscreteDynamicsWorld.h:47
BT_OVERRIDE
#define BT_OVERRIDE
Definition: btThreads.h:28
btDiscreteDynamicsWorldMt::predictUnconstraintMotion
virtual void predictUnconstraintMotion(btScalar timeStep) BT_OVERRIDE
Definition: btDiscreteDynamicsWorldMt.cpp:284
btDiscreteDynamicsWorldMt::createPredictiveContacts
virtual void createPredictiveContacts(btScalar timeStep) BT_OVERRIDE
Definition: btDiscreteDynamicsWorldMt.cpp:298
BT_SEQUENTIAL_IMPULSE_SOLVER
@ BT_SEQUENTIAL_IMPULSE_SOLVER
Definition: btConstraintSolver.h:35
btGeneric6DofSpring2Constraint.h
btSpinMutex::tryLock
bool tryLock()
Definition: btThreads.cpp:216
btRigidBody.h
btAlignedAlloc
#define btAlignedAlloc(size, alignment)
Definition: btAlignedAllocator.h:47
btDiscreteDynamicsWorld::releasePredictiveContacts
void releasePredictiveContacts()
Definition: btDiscreteDynamicsWorld.cpp:966
btDiscreteDynamicsWorldMt::UpdaterIntegrateTransforms::rigidBodies
btRigidBody ** rigidBodies
Definition: btDiscreteDynamicsWorldMt.h:113
btConstraintSolverPoolMt::m_solverType
btConstraintSolverType m_solverType
Definition: btDiscreteDynamicsWorldMt.h:70
btDiscreteDynamicsWorld::m_ownsConstraintSolver
bool m_ownsConstraintSolver
Definition: btDiscreteDynamicsWorld.h:61
btTransformUtil.h
InplaceSolverIslandCallbackMt::processIsland
virtual void processIsland(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifolds, int numManifolds, btTypedConstraint **constraints, int numConstraints, int islandId)
Definition: btDiscreteDynamicsWorldMt.cpp:87
btCollisionObject::isStaticOrKinematicObject
bool isStaticOrKinematicObject() const
Definition: btCollisionObject.h:207
btDiscreteDynamicsWorldMt::UpdaterIntegrateTransforms::world
btDiscreteDynamicsWorldMt * world
Definition: btDiscreteDynamicsWorldMt.h:114
btConstraintSolverPoolMt::getAndLockThreadSolver
ThreadSolver * getAndLockThreadSolver()
btConstraintSolverPoolMt
Definition: btDiscreteDynamicsWorldMt.cpp:115
btConstraintSolverPoolMt::init
void init(btConstraintSolver **solvers, int numSolvers)
Definition: btDiscreteDynamicsWorldMt.cpp:134
btActionInterface.h
btDiscreteDynamicsWorldMt::UpdaterCreatePredictiveContacts::timeStep
btScalar timeStep
Definition: btDiscreteDynamicsWorldMt.h:99
btConstraintSolver::getSolverType
virtual btConstraintSolverType getSolverType() const =0
btAssert
#define btAssert(x)
Definition: btScalar.h:131
btConstraintSolver::solveGroup
virtual btScalar solveGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, class btIDebugDraw *debugDrawer, btDispatcher *dispatcher)=0
solve a group of constraints
UpdaterUnconstrainedMotion::forLoop
void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
Definition: btDiscreteDynamicsWorldMt.cpp:268
btConstraintSolverPoolMt::m_solvers
btAlignedObjectArray< ThreadSolver > m_solvers
Definition: btDiscreteDynamicsWorldMt.h:69
btDiscreteDynamicsWorld::getCollisionWorld
btCollisionWorld * getCollisionWorld()
Definition: btDiscreteDynamicsWorld.h:138
btIDebugDraw
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
Definition: btIDebugDraw.h:29
btTypedConstraint.h
btConstraintSolverPoolMt::ThreadSolver::mutex
btSpinMutex mutex
Definition: btDiscreteDynamicsWorldMt.h:66
btSliderConstraint.h
UpdaterUnconstrainedMotion::timeStep
btScalar timeStep
Definition: btDiscreteDynamicsWorldMt.cpp:265
btDiscreteDynamicsWorldMt::UpdaterCreatePredictiveContacts::world
btDiscreteDynamicsWorldMt * world
Definition: btDiscreteDynamicsWorldMt.h:101
btStackAlloc
The StackAlloc class provides some fast stack-based memory allocator (LIFO last-in first-out)
Definition: btStackAlloc.h:34
InplaceSolverIslandCallbackMt::m_debugDrawer
btIDebugDraw * m_debugDrawer
Definition: btDiscreteDynamicsWorldMt.cpp:57
btCollisionObject::getInterpolationWorldTransform
const btTransform & getInterpolationWorldTransform() const
Definition: btCollisionObject.h:405
btConstraintSolver::allSolved
virtual void allSolved(const btContactSolverInfo &, class btIDebugDraw *)
Definition: btConstraintSolver.h:52
btSpinMutex::lock
void lock()
Definition: btThreads.cpp:206
btCollisionWorld::getNumCollisionObjects
int getNumCollisionObjects() const
Definition: btCollisionWorld.h:440
btSerializer.h
btSimulationIslandManagerMt::IslandCallback
Definition: btSimulationIslandManagerMt.h:48
UpdaterUnconstrainedMotion
Definition: btDiscreteDynamicsWorldMt.cpp:263
btSpinMutex::unlock
void unlock()
Definition: btThreads.cpp:211
btSphereShape.h
btPersistentManifold
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
Definition: btPersistentManifold.h:63
btRigidBody::applyDamping
void applyDamping(btScalar timeStep)
applyDamping damps the velocity, using the given m_linearDamping and m_angularDamping
Definition: btRigidBody.cpp:161
InplaceSolverIslandCallbackMt::operator=
InplaceSolverIslandCallbackMt & operator=(InplaceSolverIslandCallbackMt &other)
Definition: btDiscreteDynamicsWorldMt.cpp:72
btSimpleBroadphase.h
btDynamicsWorld::m_solverInfo
btContactSolverInfo m_solverInfo
Definition: btDynamicsWorld.h:50
btAlignedObjectArray
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
Definition: btAlignedObjectArray.h:53
InplaceSolverIslandCallbackMt::m_solver
btConstraintSolver * m_solver
Definition: btDiscreteDynamicsWorldMt.cpp:56
SIMD_FORCE_INLINE
#define SIMD_FORCE_INLINE
Definition: btScalar.h:81
btSequentialImpulseConstraintSolver.h
btContactSolverInfo.h
btSimulationIslandManager::~btSimulationIslandManager
virtual ~btSimulationIslandManager()
Definition: btSimulationIslandManager.cpp:33
btParallelFor
void btParallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody &body)
Definition: btThreads.cpp:429
btHingeConstraint.h
btBroadphaseInterface
The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs.
Definition: btBroadphaseInterface.h:55
InplaceSolverIslandCallbackMt::InplaceSolverIslandCallbackMt
InplaceSolverIslandCallbackMt(btConstraintSolver *solver, btStackAlloc *stackAlloc, btDispatcher *dispatcher)
Definition: btDiscreteDynamicsWorldMt.cpp:60
btIDebugDraw.h
btSequentialImpulseConstraintSolver
The btSequentialImpulseConstraintSolver is a fast SIMD implementation of the Projected Gauss Seidel (...
Definition: btSequentialImpulseConstraintSolver.h:33
btAlignedObjectArray::reserve
void reserve(int _Count)
Definition: btAlignedObjectArray.h:298
btQuickprof.h
btDiscreteDynamicsWorld::m_constraintSolver
btConstraintSolver * m_constraintSolver
Definition: btDiscreteDynamicsWorld.h:45
btGeneric6DofConstraint.h
btGetCurrentThreadIndex
unsigned int btGetCurrentThreadIndex()
Definition: btThreads.cpp:304
InplaceSolverIslandCallbackMt::m_dispatcher
btDispatcher * m_dispatcher
Definition: btDiscreteDynamicsWorldMt.cpp:58
btSimulationIslandManagerMt
SimulationIslandManagerMt – Multithread capable version of SimulationIslandManager Splits the world...
Definition: btSimulationIslandManagerMt.h:33
btConstraintSolverPoolMt::ThreadSolver
Definition: btDiscreteDynamicsWorldMt.h:63
btConstraintSolverPoolMt::~btConstraintSolverPoolMt
virtual ~btConstraintSolverPoolMt()
Definition: btDiscreteDynamicsWorldMt.cpp:167
InplaceSolverIslandCallbackMt::setup
void setup(btContactSolverInfo *solverInfo, btIDebugDraw *debugDrawer)
Definition: btDiscreteDynamicsWorldMt.cpp:79
btDiscreteDynamicsWorldMt::m_solverIslandCallbackMt
InplaceSolverIslandCallbackMt * m_solverIslandCallbackMt
Definition: btDiscreteDynamicsWorldMt.h:91
btDiscreteDynamicsWorld::m_ownsIslandManager
bool m_ownsIslandManager
Definition: btDiscreteDynamicsWorld.h:60
btConstraintSolver::~btConstraintSolver
virtual ~btConstraintSolver()
Definition: btConstraintSolver.h:45
btCollisionWorld::getDispatcher
btDispatcher * getDispatcher()
Definition: btCollisionWorld.h:138
btDiscreteDynamicsWorldMt::UpdaterCreatePredictiveContacts::rigidBodies
btRigidBody ** rigidBodies
Definition: btDiscreteDynamicsWorldMt.h:100
btDiscreteDynamicsWorldMt::UpdaterCreatePredictiveContacts
Definition: btDiscreteDynamicsWorldMt.h:97
btIParallelForBody
Definition: btThreads.h:98
btConstraintSolverPoolMt
btConstraintSolverPoolMt - masquerades as a constraint solver, but really it is a threadsafe pool of ...
Definition: btDiscreteDynamicsWorldMt.h:35
btDiscreteDynamicsWorld
btDiscreteDynamicsWorld provides discrete rigid body simulation those classes replace the obsolete Cc...
Definition: btDiscreteDynamicsWorld.h:38
btContactSolverInfoData::m_minimumSolverBatchSize
int m_minimumSolverBatchSize
Definition: btContactSolverInfo.h:61
btAlignedObjectArray::push_back
void push_back(const T &_Val)
Definition: btAlignedObjectArray.h:274
btConstraintSolver::prepareSolve
virtual void prepareSolve(int, int)
Definition: btConstraintSolver.h:47
btCollisionConfiguration
btCollisionConfiguration allows to configure Bullet collision detection stack allocator size,...
Definition: btCollisionConfiguration.h:26
btConstraintSolverPoolMt::solveGroup
virtual btScalar solveGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifolds, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, btIDebugDraw *debugDrawer, btDispatcher *dispatcher) BT_OVERRIDE
solve a group of constraints
Definition: btDiscreteDynamicsWorldMt.cpp:179
btDiscreteDynamicsWorldMt::~btDiscreteDynamicsWorldMt
virtual ~btDiscreteDynamicsWorldMt()
Definition: btDiscreteDynamicsWorldMt.cpp:233
UpdaterUnconstrainedMotion::rigidBodies
btRigidBody ** rigidBodies
Definition: btDiscreteDynamicsWorldMt.cpp:266
btContactConstraint.h
btConstraintSolverPoolMt::reset
virtual void reset() BT_OVERRIDE
clear internal cached data and reset random seed
Definition: btDiscreteDynamicsWorldMt.cpp:196
InplaceSolverIslandCallbackMt::m_solverInfo
btContactSolverInfo * m_solverInfo
Definition: btDiscreteDynamicsWorldMt.cpp:55
BT_PROFILE
#define BT_PROFILE(name)
Definition: btQuickprof.h:215
btCollisionDispatcher.h
btCollisionAlgorithm.h
btConstraintSolverPoolMt::btConstraintSolverPoolMt
btConstraintSolverPoolMt(int numSolvers)
Definition: btDiscreteDynamicsWorldMt.cpp:149
btDiscreteDynamicsWorldMt::btDiscreteDynamicsWorldMt
btDiscreteDynamicsWorldMt(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btConstraintSolverPoolMt *constraintSolver, btCollisionConfiguration *collisionConfiguration)
btDiscreteDynamicsWorldMt
Definition: btDiscreteDynamicsWorldMt.cpp:212
btConstraintSolver
Definition: btConstraintSolver.h:40
btAlignedObjectArray::size
int size() const
return the number of elements in the array
Definition: btAlignedObjectArray.h:155
btDiscreteDynamicsWorldMt::UpdaterIntegrateTransforms
Definition: btDiscreteDynamicsWorldMt.h:110
btConeTwistConstraint.h
btPoint2PointConstraint.h
btConstraintSolverPoolMt::ThreadSolver::solver
btConstraintSolver * solver
Definition: btDiscreteDynamicsWorldMt.h:65
btSimulationIslandManagerMt::buildAndProcessIslands
virtual void buildAndProcessIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, btAlignedObjectArray< btTypedConstraint * > &constraints, IslandCallback *callback)
Definition: btSimulationIslandManagerMt.cpp:606
btDiscreteDynamicsWorldMt.h