forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			135 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| Bullet Continuous Collision Detection and Physics Library
 | |
| Copyright (c) 2003-2009 Erwin Coumans  http://bulletphysics.org
 | |
| 
 | |
| This software is provided 'as-is', without any express or implied warranty.
 | |
| In no event will the authors be held liable for any damages arising from the use of this software.
 | |
| Permission is granted to anyone to use this software for any purpose, 
 | |
| including commercial applications, and to alter it and redistribute it freely, 
 | |
| subject to the following restrictions:
 | |
| 
 | |
| 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.
 | |
| 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
 | |
| 3. This notice may not be removed or altered from any source distribution.
 | |
| */
 | |
| 
 | |
| 
 | |
| #ifndef BT_DISCRETE_DYNAMICS_WORLD_MT_H
 | |
| #define BT_DISCRETE_DYNAMICS_WORLD_MT_H
 | |
| 
 | |
| #include "btDiscreteDynamicsWorld.h"
 | |
| #include "btSimulationIslandManagerMt.h"
 | |
| #include "BulletDynamics/ConstraintSolver/btConstraintSolver.h"
 | |
| 
 | |
| struct InplaceSolverIslandCallbackMt;
 | |
| 
 | |
| ///
 | |
| /// btConstraintSolverPoolMt - masquerades as a constraint solver, but really it is a threadsafe pool of them.
 | |
| ///
 | |
| ///  Each solver in the pool is protected by a mutex.  When solveGroup is called from a thread,
 | |
| ///  the pool looks for a solver that isn't being used by another thread, locks it, and dispatches the
 | |
| ///  call to the solver.
 | |
| ///  So long as there are at least as many solvers as there are hardware threads, it should never need to
 | |
| ///  spin wait.
 | |
| ///
 | |
| class btConstraintSolverPoolMt : public btConstraintSolver
 | |
| {
 | |
| public:
 | |
|     // create the solvers for me
 | |
|     explicit btConstraintSolverPoolMt( int numSolvers );
 | |
| 
 | |
|     // pass in fully constructed solvers (destructor will delete them)
 | |
|     btConstraintSolverPoolMt( btConstraintSolver** solvers, int numSolvers );
 | |
| 
 | |
|     virtual ~btConstraintSolverPoolMt();
 | |
| 
 | |
|     ///solve a group of constraints
 | |
|     virtual btScalar solveGroup( btCollisionObject** bodies,
 | |
|         int numBodies,
 | |
|         btPersistentManifold** manifolds,
 | |
|         int numManifolds,
 | |
|         btTypedConstraint** constraints,
 | |
|         int numConstraints,
 | |
|         const btContactSolverInfo& info,
 | |
|         btIDebugDraw* debugDrawer,
 | |
|         btDispatcher* dispatcher
 | |
|     ) BT_OVERRIDE;
 | |
| 
 | |
|     virtual	void reset() BT_OVERRIDE;
 | |
|     virtual btConstraintSolverType getSolverType() const BT_OVERRIDE { return m_solverType; }
 | |
| 
 | |
| private:
 | |
|     const static size_t kCacheLineSize = 128;
 | |
|     struct ThreadSolver
 | |
|     {
 | |
|         btConstraintSolver* solver;
 | |
|         btSpinMutex mutex;
 | |
|         char _cachelinePadding[ kCacheLineSize - sizeof( btSpinMutex ) - sizeof( void* ) ];  // keep mutexes from sharing a cache line
 | |
|     };
 | |
|     btAlignedObjectArray<ThreadSolver> m_solvers;
 | |
|     btConstraintSolverType m_solverType;
 | |
| 
 | |
|     ThreadSolver* getAndLockThreadSolver();
 | |
|     void init( btConstraintSolver** solvers, int numSolvers );
 | |
| };
 | |
| 
 | |
| 
 | |
| 
 | |
| ///
 | |
| /// btDiscreteDynamicsWorldMt -- a version of DiscreteDynamicsWorld with some minor changes to support
 | |
| ///                              solving simulation islands on multiple threads.
 | |
| ///
 | |
| ///  Should function exactly like btDiscreteDynamicsWorld.
 | |
| ///  Also 3 methods that iterate over all of the rigidbodies can run in parallel:
 | |
| ///     - predictUnconstraintMotion
 | |
| ///     - integrateTransforms
 | |
| ///     - createPredictiveContacts
 | |
| ///
 | |
| ATTRIBUTE_ALIGNED16(class) btDiscreteDynamicsWorldMt : public btDiscreteDynamicsWorld
 | |
| {
 | |
| protected:
 | |
|     InplaceSolverIslandCallbackMt* m_solverIslandCallbackMt;
 | |
| 
 | |
|     virtual void solveConstraints(btContactSolverInfo& solverInfo) BT_OVERRIDE;
 | |
| 
 | |
|     virtual void predictUnconstraintMotion( btScalar timeStep ) BT_OVERRIDE;
 | |
| 
 | |
|     struct UpdaterCreatePredictiveContacts : public btIParallelForBody
 | |
|     {
 | |
|         btScalar timeStep;
 | |
|         btRigidBody** rigidBodies;
 | |
|         btDiscreteDynamicsWorldMt* world;
 | |
| 
 | |
|         void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
 | |
|         {
 | |
|             world->createPredictiveContactsInternal( &rigidBodies[ iBegin ], iEnd - iBegin, timeStep );
 | |
|         }
 | |
|     };
 | |
|     virtual void createPredictiveContacts( btScalar timeStep ) BT_OVERRIDE;
 | |
| 
 | |
|     struct UpdaterIntegrateTransforms : public btIParallelForBody
 | |
|     {
 | |
|         btScalar timeStep;
 | |
|         btRigidBody** rigidBodies;
 | |
|         btDiscreteDynamicsWorldMt* world;
 | |
| 
 | |
|         void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
 | |
|         {
 | |
|             world->integrateTransformsInternal( &rigidBodies[ iBegin ], iEnd - iBegin, timeStep );
 | |
|         }
 | |
|     };
 | |
|     virtual void integrateTransforms( btScalar timeStep ) BT_OVERRIDE;
 | |
| 
 | |
| public:
 | |
| 	BT_DECLARE_ALIGNED_ALLOCATOR();
 | |
| 
 | |
| 	btDiscreteDynamicsWorldMt(btDispatcher* dispatcher,
 | |
|         btBroadphaseInterface* pairCache,
 | |
|         btConstraintSolverPoolMt* constraintSolver,   // Note this should be a solver-pool for multi-threading
 | |
|         btCollisionConfiguration* collisionConfiguration
 | |
|     );
 | |
| 	virtual ~btDiscreteDynamicsWorldMt();
 | |
| };
 | |
| 
 | |
| #endif //BT_DISCRETE_DYNAMICS_WORLD_H
 |