| 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
 
 
  |