forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			384 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			384 lines
		
	
	
		
			14 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.
 | |
| */
 | |
| 
 | |
| #include "btDefaultCollisionConfiguration.h"
 | |
| 
 | |
| #include "BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h"
 | |
| #include "BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h"
 | |
| #include "BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h"
 | |
| #include "BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h"
 | |
| #include "BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h"
 | |
| 
 | |
| #include "BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h"
 | |
| #include "BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h"
 | |
| #include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h"
 | |
| #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| #include "BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h"
 | |
| #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| #include "BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h"
 | |
| #include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
 | |
| #include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h"
 | |
| #include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
 | |
| 
 | |
| 
 | |
| 
 | |
| #include "LinearMath/btPoolAllocator.h"
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo)
 | |
| //btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(btStackAlloc*	stackAlloc,btPoolAllocator*	persistentManifoldPool,btPoolAllocator*	collisionAlgorithmPool)
 | |
| {
 | |
| 
 | |
|     void* mem = NULL;
 | |
| 	if (constructionInfo.m_useEpaPenetrationAlgorithm)
 | |
| 	{
 | |
| 		mem = btAlignedAlloc(sizeof(btGjkEpaPenetrationDepthSolver),16);
 | |
| 		m_pdSolver = new (mem)btGjkEpaPenetrationDepthSolver;
 | |
| 	}else
 | |
| 	{
 | |
| 		mem = btAlignedAlloc(sizeof(btMinkowskiPenetrationDepthSolver),16);
 | |
| 		m_pdSolver = new (mem)btMinkowskiPenetrationDepthSolver;
 | |
| 	}
 | |
| 	
 | |
| 	//default CreationFunctions, filling the m_doubleDispatch table
 | |
| 	mem = btAlignedAlloc(sizeof(btConvexConvexAlgorithm::CreateFunc),16);
 | |
| 	m_convexConvexCreateFunc = new(mem) btConvexConvexAlgorithm::CreateFunc(m_pdSolver);
 | |
| 	mem = btAlignedAlloc(sizeof(btConvexConcaveCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_convexConcaveCreateFunc = new (mem)btConvexConcaveCollisionAlgorithm::CreateFunc;
 | |
| 	mem = btAlignedAlloc(sizeof(btConvexConcaveCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_swappedConvexConcaveCreateFunc = new (mem)btConvexConcaveCollisionAlgorithm::SwappedCreateFunc;
 | |
| 	mem = btAlignedAlloc(sizeof(btCompoundCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_compoundCreateFunc = new (mem)btCompoundCollisionAlgorithm::CreateFunc;
 | |
| 
 | |
| 	mem = btAlignedAlloc(sizeof(btCompoundCompoundCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_compoundCompoundCreateFunc = new (mem)btCompoundCompoundCollisionAlgorithm::CreateFunc;
 | |
| 
 | |
| 	mem = btAlignedAlloc(sizeof(btCompoundCollisionAlgorithm::SwappedCreateFunc),16);
 | |
| 	m_swappedCompoundCreateFunc = new (mem)btCompoundCollisionAlgorithm::SwappedCreateFunc;
 | |
| 	mem = btAlignedAlloc(sizeof(btEmptyAlgorithm::CreateFunc),16);
 | |
| 	m_emptyCreateFunc = new(mem) btEmptyAlgorithm::CreateFunc;
 | |
| 	
 | |
| 	mem = btAlignedAlloc(sizeof(btSphereSphereCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_sphereSphereCF = new(mem) btSphereSphereCollisionAlgorithm::CreateFunc;
 | |
| #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| 	mem = btAlignedAlloc(sizeof(btSphereBoxCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_sphereBoxCF = new(mem) btSphereBoxCollisionAlgorithm::CreateFunc;
 | |
| 	mem = btAlignedAlloc(sizeof(btSphereBoxCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_boxSphereCF = new (mem)btSphereBoxCollisionAlgorithm::CreateFunc;
 | |
| 	m_boxSphereCF->m_swapped = true;
 | |
| #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| 
 | |
| 	mem = btAlignedAlloc(sizeof(btSphereTriangleCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_sphereTriangleCF = new (mem)btSphereTriangleCollisionAlgorithm::CreateFunc;
 | |
| 	mem = btAlignedAlloc(sizeof(btSphereTriangleCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_triangleSphereCF = new (mem)btSphereTriangleCollisionAlgorithm::CreateFunc;
 | |
| 	m_triangleSphereCF->m_swapped = true;
 | |
| 	
 | |
| 	mem = btAlignedAlloc(sizeof(btBoxBoxCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_boxBoxCF = new(mem)btBoxBoxCollisionAlgorithm::CreateFunc;
 | |
| 
 | |
| 	//convex versus plane
 | |
| 	mem = btAlignedAlloc (sizeof(btConvexPlaneCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_convexPlaneCF = new (mem) btConvexPlaneCollisionAlgorithm::CreateFunc;
 | |
| 	mem = btAlignedAlloc (sizeof(btConvexPlaneCollisionAlgorithm::CreateFunc),16);
 | |
| 	m_planeConvexCF = new (mem) btConvexPlaneCollisionAlgorithm::CreateFunc;
 | |
| 	m_planeConvexCF->m_swapped = true;
 | |
| 	
 | |
| 	///calculate maximum element size, big enough to fit any collision algorithm in the memory pool
 | |
| 	int maxSize = sizeof(btConvexConvexAlgorithm);
 | |
| 	int maxSize2 = sizeof(btConvexConcaveCollisionAlgorithm);
 | |
| 	int maxSize3 = sizeof(btCompoundCollisionAlgorithm);
 | |
| 	int maxSize4 = sizeof(btCompoundCompoundCollisionAlgorithm);
 | |
| 
 | |
| 	int	collisionAlgorithmMaxElementSize = btMax(maxSize,constructionInfo.m_customCollisionAlgorithmMaxElementSize);
 | |
| 	collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize2);
 | |
| 	collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize3);
 | |
| 	collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize4);
 | |
| 		
 | |
| 	if (constructionInfo.m_persistentManifoldPool)
 | |
| 	{
 | |
| 		m_ownsPersistentManifoldPool = false;
 | |
| 		m_persistentManifoldPool = constructionInfo.m_persistentManifoldPool;
 | |
| 	} else
 | |
| 	{
 | |
| 		m_ownsPersistentManifoldPool = true;
 | |
| 		void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16);
 | |
| 		m_persistentManifoldPool = new (mem) btPoolAllocator(sizeof(btPersistentManifold),constructionInfo.m_defaultMaxPersistentManifoldPoolSize);
 | |
| 	}
 | |
| 	
 | |
| 	collisionAlgorithmMaxElementSize = (collisionAlgorithmMaxElementSize+16)&0xffffffffffff0;
 | |
| 	if (constructionInfo.m_collisionAlgorithmPool)
 | |
| 	{
 | |
| 		m_ownsCollisionAlgorithmPool = false;
 | |
| 		m_collisionAlgorithmPool = constructionInfo.m_collisionAlgorithmPool;
 | |
| 	} else
 | |
| 	{
 | |
| 		m_ownsCollisionAlgorithmPool = true;
 | |
| 		void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16);
 | |
| 		m_collisionAlgorithmPool = new(mem) btPoolAllocator(collisionAlgorithmMaxElementSize,constructionInfo.m_defaultMaxCollisionAlgorithmPoolSize);
 | |
| 	}
 | |
| 
 | |
| 
 | |
| }
 | |
| 
 | |
| btDefaultCollisionConfiguration::~btDefaultCollisionConfiguration()
 | |
| {
 | |
| 	if (m_ownsCollisionAlgorithmPool)
 | |
| 	{
 | |
| 		m_collisionAlgorithmPool->~btPoolAllocator();
 | |
| 		btAlignedFree(m_collisionAlgorithmPool);
 | |
| 	}
 | |
| 	if (m_ownsPersistentManifoldPool)
 | |
| 	{
 | |
| 		m_persistentManifoldPool->~btPoolAllocator();
 | |
| 		btAlignedFree(m_persistentManifoldPool);
 | |
| 	}
 | |
| 
 | |
| 	m_convexConvexCreateFunc->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree(	m_convexConvexCreateFunc);
 | |
| 
 | |
| 	m_convexConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_convexConcaveCreateFunc);
 | |
| 	m_swappedConvexConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_swappedConvexConcaveCreateFunc);
 | |
| 
 | |
| 	m_compoundCreateFunc->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_compoundCreateFunc);
 | |
| 
 | |
| 	m_compoundCompoundCreateFunc->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree(m_compoundCompoundCreateFunc);
 | |
| 
 | |
| 	m_swappedCompoundCreateFunc->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_swappedCompoundCreateFunc);
 | |
| 
 | |
| 	m_emptyCreateFunc->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_emptyCreateFunc);
 | |
| 
 | |
| 	m_sphereSphereCF->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_sphereSphereCF);
 | |
| 
 | |
| #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| 	m_sphereBoxCF->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_sphereBoxCF);
 | |
| 	m_boxSphereCF->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_boxSphereCF);
 | |
| #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| 
 | |
| 	m_sphereTriangleCF->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_sphereTriangleCF);
 | |
| 	m_triangleSphereCF->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_triangleSphereCF);
 | |
| 	m_boxBoxCF->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_boxBoxCF);
 | |
| 
 | |
| 	m_convexPlaneCF->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_convexPlaneCF);
 | |
| 	m_planeConvexCF->~btCollisionAlgorithmCreateFunc();
 | |
| 	btAlignedFree( m_planeConvexCF);
 | |
| 
 | |
| 	m_pdSolver->~btConvexPenetrationDepthSolver();
 | |
| 	
 | |
| 	btAlignedFree(m_pdSolver);
 | |
| 
 | |
| 
 | |
| }
 | |
| 
 | |
| btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getClosestPointsAlgorithmCreateFunc(int proxyType0, int proxyType1)
 | |
| {
 | |
| 
 | |
| 
 | |
| 	if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_sphereSphereCF;
 | |
| 	}
 | |
| #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| 	if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_sphereBoxCF;
 | |
| 	}
 | |
| 
 | |
| 	if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_boxSphereCF;
 | |
| 	}
 | |
| #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| 
 | |
| 
 | |
| 	if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == TRIANGLE_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_sphereTriangleCF;
 | |
| 	}
 | |
| 
 | |
| 	if ((proxyType0 == TRIANGLE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_triangleSphereCF;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType0) && (proxyType1 == STATIC_PLANE_PROXYTYPE))
 | |
| 	{
 | |
| 		return m_convexPlaneCF;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType1) && (proxyType0 == STATIC_PLANE_PROXYTYPE))
 | |
| 	{
 | |
| 		return m_planeConvexCF;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConvex(proxyType1))
 | |
| 	{
 | |
| 		return m_convexConvexCreateFunc;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConcave(proxyType1))
 | |
| 	{
 | |
| 		return m_convexConcaveCreateFunc;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType1) && btBroadphaseProxy::isConcave(proxyType0))
 | |
| 	{
 | |
| 		return m_swappedConvexConcaveCreateFunc;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	if (btBroadphaseProxy::isCompound(proxyType0) && btBroadphaseProxy::isCompound(proxyType1))
 | |
| 	{
 | |
| 		return m_compoundCompoundCreateFunc;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isCompound(proxyType0))
 | |
| 	{
 | |
| 		return m_compoundCreateFunc;
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		if (btBroadphaseProxy::isCompound(proxyType1))
 | |
| 		{
 | |
| 			return m_swappedCompoundCreateFunc;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	//failed to find an algorithm
 | |
| 	return m_emptyCreateFunc;
 | |
| 
 | |
| }
 | |
| 
 | |
| btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1)
 | |
| {
 | |
| 
 | |
| 
 | |
| 
 | |
| 	if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1==SPHERE_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_sphereSphereCF;
 | |
| 	}
 | |
| #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| 	if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1==BOX_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_sphereBoxCF;
 | |
| 	}
 | |
| 
 | |
| 	if ((proxyType0 == BOX_SHAPE_PROXYTYPE ) && (proxyType1==SPHERE_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_boxSphereCF;
 | |
| 	}
 | |
| #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
 | |
| 
 | |
| 
 | |
| 	if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE ) && (proxyType1==TRIANGLE_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_sphereTriangleCF;
 | |
| 	}
 | |
| 
 | |
| 	if ((proxyType0 == TRIANGLE_SHAPE_PROXYTYPE  ) && (proxyType1==SPHERE_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return	m_triangleSphereCF;
 | |
| 	} 
 | |
| 
 | |
| 	if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
 | |
| 	{
 | |
| 		return m_boxBoxCF;
 | |
| 	}
 | |
| 	
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType0) && (proxyType1 == STATIC_PLANE_PROXYTYPE))
 | |
| 	{
 | |
| 		return m_convexPlaneCF;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType1) && (proxyType0 == STATIC_PLANE_PROXYTYPE))
 | |
| 	{
 | |
| 		return m_planeConvexCF;
 | |
| 	}
 | |
| 	
 | |
| 
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConvex(proxyType1))
 | |
| 	{
 | |
| 		return m_convexConvexCreateFunc;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConcave(proxyType1))
 | |
| 	{
 | |
| 		return m_convexConcaveCreateFunc;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isConvex(proxyType1) && btBroadphaseProxy::isConcave(proxyType0))
 | |
| 	{
 | |
| 		return m_swappedConvexConcaveCreateFunc;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	if (btBroadphaseProxy::isCompound(proxyType0) && btBroadphaseProxy::isCompound(proxyType1))
 | |
| 	{
 | |
| 		return m_compoundCompoundCreateFunc;
 | |
| 	}
 | |
| 
 | |
| 	if (btBroadphaseProxy::isCompound(proxyType0))
 | |
| 	{
 | |
| 		return m_compoundCreateFunc;
 | |
| 	} else
 | |
| 	{
 | |
| 		if (btBroadphaseProxy::isCompound(proxyType1))
 | |
| 		{
 | |
| 			return m_swappedCompoundCreateFunc;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	//failed to find an algorithm
 | |
| 	return m_emptyCreateFunc;
 | |
| }
 | |
| 
 | |
| void btDefaultCollisionConfiguration::setConvexConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)
 | |
| {
 | |
| 	btConvexConvexAlgorithm::CreateFunc* convexConvex = (btConvexConvexAlgorithm::CreateFunc*) m_convexConvexCreateFunc;
 | |
| 	convexConvex->m_numPerturbationIterations = numPerturbationIterations;
 | |
| 	convexConvex->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
 | |
| }
 | |
| 
 | |
| void	btDefaultCollisionConfiguration::setPlaneConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)
 | |
| {
 | |
| 	btConvexPlaneCollisionAlgorithm::CreateFunc* cpCF = (btConvexPlaneCollisionAlgorithm::CreateFunc*)m_convexPlaneCF;
 | |
| 	cpCF->m_numPerturbationIterations = numPerturbationIterations;
 | |
| 	cpCF->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
 | |
| 	
 | |
| 	btConvexPlaneCollisionAlgorithm::CreateFunc* pcCF = (btConvexPlaneCollisionAlgorithm::CreateFunc*)m_planeConvexCF;
 | |
| 	pcCF->m_numPerturbationIterations = numPerturbationIterations;
 | |
| 	pcCF->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
 | |
| }
 |