172 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			5.2 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_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, int collisionFilterGroup, int collisionFilterMask)
 | |
| 	:btBroadphaseProxy(minpt,maxpt,userPtr,collisionFilterGroup,collisionFilterMask)
 | |
| 	{
 | |
| 		(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 , int collisionFilterGroup, int collisionFilterMask, btDispatcher* dispatcher);
 | |
| 
 | |
| 	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
 | |
| 
 |