forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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
 | 
						|
 |