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