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