123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #ifndef BTGPU3DGRIDBROADPHASE_H
- #define BTGPU3DGRIDBROADPHASE_H
- #include "bullet/BulletCollision//BroadphaseCollision/btSimpleBroadphase.h"
- #include "btGpu3DGridBroadphaseSharedTypes.h"
- class btGpu3DGridBroadphase : public btSimpleBroadphase
- {
- protected:
- bool m_bInitialized;
- unsigned int m_numBodies;
- unsigned int m_numCells;
- unsigned int m_maxPairsPerBody;
- btScalar m_cellFactorAABB;
- unsigned int m_maxBodiesPerCell;
- bt3DGridBroadphaseParams m_params;
- btScalar m_maxRadius;
-
- unsigned int* m_hBodiesHash;
- unsigned int* m_hCellStart;
- unsigned int* m_hPairBuffStartCurr;
- bt3DGrid3F1U* m_hAABB;
- unsigned int* m_hPairBuff;
- unsigned int* m_hPairScan;
- unsigned int* m_hPairOut;
- int m_numLargeHandles;
- int m_maxLargeHandles;
- int m_LastLargeHandleIndex;
- btSimpleBroadphaseProxy* m_pLargeHandles;
- void* m_pLargeHandlesRawPtr;
- int m_firstFreeLargeHandle;
- int allocLargeHandle()
- {
- btAssert(m_numLargeHandles < m_maxLargeHandles);
- int freeLargeHandle = m_firstFreeLargeHandle;
- m_firstFreeLargeHandle = m_pLargeHandles[freeLargeHandle].GetNextFree();
- m_numLargeHandles++;
- if(freeLargeHandle > m_LastLargeHandleIndex)
- {
- m_LastLargeHandleIndex = freeLargeHandle;
- }
- return freeLargeHandle;
- }
- void freeLargeHandle(btSimpleBroadphaseProxy* proxy)
- {
- int handle = int(proxy - m_pLargeHandles);
- btAssert((handle >= 0) && (handle < m_maxHandles));
- if(handle == m_LastLargeHandleIndex)
- {
- m_LastLargeHandleIndex--;
- }
- proxy->SetNextFree(m_firstFreeLargeHandle);
- m_firstFreeLargeHandle = handle;
- proxy->m_clientObject = 0;
- m_numLargeHandles--;
- }
- bool isLargeProxy(const btVector3& aabbMin, const btVector3& aabbMax);
- bool isLargeProxy(btBroadphaseProxy* proxy);
- unsigned int m_numPairsAdded;
- unsigned int m_numPairsRemoved;
- unsigned int m_numOverflows;
- public:
- btGpu3DGridBroadphase(const btVector3& worldAabbMin,const btVector3& worldAabbMax,
- int gridSizeX, int gridSizeY, int gridSizeZ,
- int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody,
- int maxBodiesPerCell = 8,
- btScalar cellFactorAABB = btScalar(1.0f));
- btGpu3DGridBroadphase( btOverlappingPairCache* overlappingPairCache,
- const btVector3& worldAabbMin,const btVector3& worldAabbMax,
- int gridSizeX, int gridSizeY, int gridSizeZ,
- int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody,
- int maxBodiesPerCell = 8,
- btScalar cellFactorAABB = btScalar(1.0f));
- virtual ~btGpu3DGridBroadphase();
- virtual void calculateOverlappingPairs(btDispatcher* dispatcher);
- virtual btBroadphaseProxy* createProxy(const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask, btDispatcher* dispatcher,void* multiSapProxy);
- virtual void destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher);
- virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin=btVector3(0,0,0),const btVector3& aabbMax=btVector3(0,0,0));
-
- virtual void resetPool(btDispatcher* dispatcher);
- protected:
- void _initialize( const btVector3& worldAabbMin,const btVector3& worldAabbMax,
- int gridSizeX, int gridSizeY, int gridSizeZ,
- int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody,
- int maxBodiesPerCell = 8,
- btScalar cellFactorAABB = btScalar(1.0f));
- void _finalize();
- void addPairsToCache(btDispatcher* dispatcher);
- void addLarge2LargePairsToCache(btDispatcher* dispatcher);
- virtual void setParameters(bt3DGridBroadphaseParams* hostParams);
- virtual void prepareAABB();
- virtual void calcHashAABB();
- virtual void sortHash();
- virtual void findCellStart();
- virtual void findOverlappingPairs();
- virtual void findPairsLarge();
- virtual void computePairCacheChanges();
- virtual void scanOverlappingPairBuff();
- virtual void squeezeOverlappingPairBuff();
- };
- #endif
|