111 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  | Bullet Continuous Collision Detection and Physics Library | ||
|  | Copyright (c) 2003-2006 Erwin Coumans  http://continuousphysics.com/Bullet/
 | ||
|  | 
 | ||
|  | 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_SIMULATION_ISLAND_MANAGER_MT_H
 | ||
|  | #define BT_SIMULATION_ISLAND_MANAGER_MT_H
 | ||
|  | 
 | ||
|  | #include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h"
 | ||
|  | 
 | ||
|  | class btTypedConstraint; | ||
|  | 
 | ||
|  | 
 | ||
|  | ///
 | ||
|  | /// SimulationIslandManagerMt -- Multithread capable version of SimulationIslandManager
 | ||
|  | ///                       Splits the world up into islands which can be solved in parallel.
 | ||
|  | ///                       In order to solve islands in parallel, an IslandDispatch function
 | ||
|  | ///                       must be provided which will dispatch calls to multiple threads.
 | ||
|  | ///                       The amount of parallelism that can be achieved depends on the number
 | ||
|  | ///                       of islands. If only a single island exists, then no parallelism is
 | ||
|  | ///                       possible.
 | ||
|  | ///
 | ||
|  | class btSimulationIslandManagerMt : public btSimulationIslandManager | ||
|  | { | ||
|  | public: | ||
|  |     struct Island | ||
|  |     { | ||
|  |         // a simulation island consisting of bodies, manifolds and constraints,
 | ||
|  |         // to be passed into a constraint solver.
 | ||
|  |         btAlignedObjectArray<btCollisionObject*> bodyArray; | ||
|  |         btAlignedObjectArray<btPersistentManifold*> manifoldArray; | ||
|  |         btAlignedObjectArray<btTypedConstraint*> constraintArray; | ||
|  |         int id;  // island id
 | ||
|  |         bool isSleeping; | ||
|  | 
 | ||
|  |         void append( const Island& other );  // add bodies, manifolds, constraints to my own
 | ||
|  |     }; | ||
|  |     struct	IslandCallback | ||
|  |     { | ||
|  |         virtual ~IslandCallback() {}; | ||
|  | 
 | ||
|  |         virtual	void processIsland( btCollisionObject** bodies, | ||
|  |                                     int numBodies, | ||
|  |                                     btPersistentManifold** manifolds, | ||
|  |                                     int numManifolds, | ||
|  |                                     btTypedConstraint** constraints, | ||
|  |                                     int numConstraints, | ||
|  |                                     int islandId | ||
|  |                                     ) = 0; | ||
|  |     }; | ||
|  |     typedef void( *IslandDispatchFunc ) ( btAlignedObjectArray<Island*>* islands, IslandCallback* callback ); | ||
|  |     static void serialIslandDispatch( btAlignedObjectArray<Island*>* islandsPtr, IslandCallback* callback ); | ||
|  |     static void parallelIslandDispatch( btAlignedObjectArray<Island*>* islandsPtr, IslandCallback* callback ); | ||
|  | protected: | ||
|  |     btAlignedObjectArray<Island*> m_allocatedIslands;  // owner of all Islands
 | ||
|  |     btAlignedObjectArray<Island*> m_activeIslands;  // islands actively in use
 | ||
|  |     btAlignedObjectArray<Island*> m_freeIslands;  // islands ready to be reused
 | ||
|  |     btAlignedObjectArray<Island*> m_lookupIslandFromId;  // big lookup table to map islandId to Island pointer
 | ||
|  |     Island* m_batchIsland; | ||
|  |     int m_minimumSolverBatchSize; | ||
|  |     int m_batchIslandMinBodyCount; | ||
|  |     IslandDispatchFunc m_islandDispatch; | ||
|  | 
 | ||
|  |     Island* getIsland( int id ); | ||
|  |     virtual Island* allocateIsland( int id, int numBodies ); | ||
|  |     virtual void initIslandPools(); | ||
|  |     virtual void addBodiesToIslands( btCollisionWorld* collisionWorld ); | ||
|  |     virtual void addManifoldsToIslands( btDispatcher* dispatcher ); | ||
|  |     virtual void addConstraintsToIslands( btAlignedObjectArray<btTypedConstraint*>& constraints ); | ||
|  |     virtual void mergeIslands(); | ||
|  | 	 | ||
|  | public: | ||
|  | 	btSimulationIslandManagerMt(); | ||
|  | 	virtual ~btSimulationIslandManagerMt(); | ||
|  | 
 | ||
|  |     virtual void buildAndProcessIslands( btDispatcher* dispatcher, btCollisionWorld* collisionWorld, btAlignedObjectArray<btTypedConstraint*>& constraints, IslandCallback* callback ); | ||
|  | 
 | ||
|  | 	virtual void buildIslands(btDispatcher* dispatcher,btCollisionWorld* colWorld); | ||
|  | 
 | ||
|  |     int getMinimumSolverBatchSize() const | ||
|  |     { | ||
|  |         return m_minimumSolverBatchSize; | ||
|  |     } | ||
|  |     void setMinimumSolverBatchSize( int sz ) | ||
|  |     { | ||
|  |         m_minimumSolverBatchSize = sz; | ||
|  |     } | ||
|  |     IslandDispatchFunc getIslandDispatchFunction() const | ||
|  |     { | ||
|  |         return m_islandDispatch; | ||
|  |     } | ||
|  |     // allow users to set their own dispatch function for multithreaded dispatch
 | ||
|  |     void setIslandDispatchFunction( IslandDispatchFunc func ) | ||
|  |     { | ||
|  |         m_islandDispatch = func; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | #endif //BT_SIMULATION_ISLAND_MANAGER_H
 | ||
|  | 
 |