123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /*
- 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_SIMPLE_BROADPHASE_H
- #define BT_SIMPLE_BROADPHASE_H
- #include "btOverlappingPairCache.h"
- struct btSimpleBroadphaseProxy : public btBroadphaseProxy
- {
- int m_nextFree;
-
- // int m_handleId;
-
- btSimpleBroadphaseProxy() {};
- btSimpleBroadphaseProxy(const btVector3& minpt,const btVector3& maxpt,int shapeType,void* userPtr,short int collisionFilterGroup,short int collisionFilterMask,void* multiSapProxy)
- :btBroadphaseProxy(minpt,maxpt,userPtr,collisionFilterGroup,collisionFilterMask,multiSapProxy)
- {
- (void)shapeType;
- }
-
-
- SIMD_FORCE_INLINE void SetNextFree(int next) {m_nextFree = next;}
- SIMD_FORCE_INLINE int GetNextFree() const {return m_nextFree;}
-
- };
- ///The SimpleBroadphase is just a unit-test for btAxisSweep3, bt32BitAxisSweep3, or btDbvtBroadphase, so use those classes instead.
- ///It is a brute force aabb culling broadphase based on O(n^2) aabb checks
- class btSimpleBroadphase : public btBroadphaseInterface
- {
- protected:
- int m_numHandles; // number of active handles
- int m_maxHandles; // max number of handles
- int m_LastHandleIndex;
-
- btSimpleBroadphaseProxy* m_pHandles; // handles pool
- void* m_pHandlesRawPtr;
- int m_firstFreeHandle; // free handles list
-
- int allocHandle()
- {
- btAssert(m_numHandles < m_maxHandles);
- int freeHandle = m_firstFreeHandle;
- m_firstFreeHandle = m_pHandles[freeHandle].GetNextFree();
- m_numHandles++;
- if(freeHandle > m_LastHandleIndex)
- {
- m_LastHandleIndex = freeHandle;
- }
- return freeHandle;
- }
- void freeHandle(btSimpleBroadphaseProxy* proxy)
- {
- int handle = int(proxy-m_pHandles);
- btAssert(handle >= 0 && handle < m_maxHandles);
- if(handle == m_LastHandleIndex)
- {
- m_LastHandleIndex--;
- }
- proxy->SetNextFree(m_firstFreeHandle);
- m_firstFreeHandle = handle;
- proxy->m_clientObject = 0;
- m_numHandles--;
- }
- btOverlappingPairCache* m_pairCache;
- bool m_ownsPairCache;
- int m_invalidPair;
-
-
- inline btSimpleBroadphaseProxy* getSimpleProxyFromProxy(btBroadphaseProxy* proxy)
- {
- btSimpleBroadphaseProxy* proxy0 = static_cast<btSimpleBroadphaseProxy*>(proxy);
- return proxy0;
- }
- inline const btSimpleBroadphaseProxy* getSimpleProxyFromProxy(btBroadphaseProxy* proxy) const
- {
- const btSimpleBroadphaseProxy* proxy0 = static_cast<const btSimpleBroadphaseProxy*>(proxy);
- return proxy0;
- }
- ///reset broadphase internal structures, to ensure determinism/reproducability
- virtual void resetPool(btDispatcher* dispatcher);
- void validate();
- protected:
-
- public:
- btSimpleBroadphase(int maxProxies=16384,btOverlappingPairCache* overlappingPairCache=0);
- virtual ~btSimpleBroadphase();
- static bool aabbOverlap(btSimpleBroadphaseProxy* proxy0,btSimpleBroadphaseProxy* proxy1);
- 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 calculateOverlappingPairs(btDispatcher* dispatcher);
- virtual void destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher);
- virtual void setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax, btDispatcher* dispatcher);
- virtual void getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const;
- 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 aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback);
-
- btOverlappingPairCache* getOverlappingPairCache()
- {
- return m_pairCache;
- }
- const btOverlappingPairCache* getOverlappingPairCache() const
- {
- return m_pairCache;
- }
- bool testAabbOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
- ///getAabb returns the axis aligned bounding box in the 'global' coordinate frame
- ///will add some transform later
- virtual void getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const
- {
- aabbMin.setValue(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT);
- aabbMax.setValue(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT);
- }
- virtual void printStats()
- {
- // printf("btSimpleBroadphase.h\n");
- // printf("numHandles = %d, maxHandles = %d\n",m_numHandles,m_maxHandles);
- }
- };
- #endif //BT_SIMPLE_BROADPHASE_H
|