457 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			457 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
Bullet Continuous Collision Detection and Physics Library
 | 
						|
Copyright (c) 2003-2013 Erwin Coumans  http://bulletphysics.org
 | 
						|
 | 
						|
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 "btCompoundCompoundCollisionAlgorithm.h"
 | 
						|
#include "LinearMath/btQuickprof.h"
 | 
						|
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
 | 
						|
#include "BulletCollision/CollisionShapes/btCompoundShape.h"
 | 
						|
#include "BulletCollision/BroadphaseCollision/btDbvt.h"
 | 
						|
#include "LinearMath/btIDebugDraw.h"
 | 
						|
#include "LinearMath/btAabbUtil2.h"
 | 
						|
#include "BulletCollision/CollisionDispatch/btManifoldResult.h"
 | 
						|
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
 | 
						|
 | 
						|
//USE_LOCAL_STACK will avoid most (often all) dynamic memory allocations due to resizing in processCollision and MycollideTT
 | 
						|
#define USE_LOCAL_STACK 1
 | 
						|
 | 
						|
btShapePairCallback gCompoundCompoundChildShapePairCallback = 0;
 | 
						|
 | 
						|
btCompoundCompoundCollisionAlgorithm::btCompoundCompoundCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped)
 | 
						|
:btCompoundCollisionAlgorithm(ci,body0Wrap,body1Wrap,isSwapped)
 | 
						|
{
 | 
						|
 | 
						|
	void* ptr = btAlignedAlloc(sizeof(btHashedSimplePairCache),16);
 | 
						|
	m_childCollisionAlgorithmCache= new(ptr) btHashedSimplePairCache();
 | 
						|
 | 
						|
	const btCollisionObjectWrapper* col0ObjWrap = body0Wrap;
 | 
						|
	btAssert (col0ObjWrap->getCollisionShape()->isCompound());
 | 
						|
 | 
						|
	const btCollisionObjectWrapper* col1ObjWrap = body1Wrap;
 | 
						|
	btAssert (col1ObjWrap->getCollisionShape()->isCompound());
 | 
						|
	
 | 
						|
	const btCompoundShape* compoundShape0 = static_cast<const btCompoundShape*>(col0ObjWrap->getCollisionShape());
 | 
						|
	m_compoundShapeRevision0 = compoundShape0->getUpdateRevision();
 | 
						|
 | 
						|
	const btCompoundShape* compoundShape1 = static_cast<const btCompoundShape*>(col1ObjWrap->getCollisionShape());
 | 
						|
	m_compoundShapeRevision1 = compoundShape1->getUpdateRevision();
 | 
						|
	
 | 
						|
	
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
btCompoundCompoundCollisionAlgorithm::~btCompoundCompoundCollisionAlgorithm()
 | 
						|
{
 | 
						|
	removeChildAlgorithms();
 | 
						|
	m_childCollisionAlgorithmCache->~btHashedSimplePairCache();
 | 
						|
	btAlignedFree(m_childCollisionAlgorithmCache);
 | 
						|
}
 | 
						|
 | 
						|
void	btCompoundCompoundCollisionAlgorithm::getAllContactManifolds(btManifoldArray&	manifoldArray)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
	btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
 | 
						|
	for (i=0;i<pairs.size();i++)
 | 
						|
	{
 | 
						|
		if (pairs[i].m_userPointer)
 | 
						|
		{
 | 
						|
			
 | 
						|
			((btCollisionAlgorithm*)pairs[i].m_userPointer)->getAllContactManifolds(manifoldArray);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void	btCompoundCompoundCollisionAlgorithm::removeChildAlgorithms()
 | 
						|
{
 | 
						|
	btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
 | 
						|
 | 
						|
	int numChildren = pairs.size();
 | 
						|
	int i;
 | 
						|
	for (i=0;i<numChildren;i++)
 | 
						|
	{
 | 
						|
		if (pairs[i].m_userPointer)
 | 
						|
		{
 | 
						|
			btCollisionAlgorithm* algo = (btCollisionAlgorithm*) pairs[i].m_userPointer;
 | 
						|
			algo->~btCollisionAlgorithm();
 | 
						|
			m_dispatcher->freeCollisionAlgorithm(algo);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	m_childCollisionAlgorithmCache->removeAllPairs();
 | 
						|
}
 | 
						|
 | 
						|
struct	btCompoundCompoundLeafCallback : btDbvt::ICollide
 | 
						|
{
 | 
						|
	int m_numOverlapPairs;
 | 
						|
 | 
						|
 | 
						|
	const btCollisionObjectWrapper* m_compound0ColObjWrap;
 | 
						|
	const btCollisionObjectWrapper* m_compound1ColObjWrap;
 | 
						|
	btDispatcher* m_dispatcher;
 | 
						|
	const btDispatcherInfo& m_dispatchInfo;
 | 
						|
	btManifoldResult*	m_resultOut;
 | 
						|
	
 | 
						|
	
 | 
						|
	class btHashedSimplePairCache*	m_childCollisionAlgorithmCache;
 | 
						|
	
 | 
						|
	btPersistentManifold*	m_sharedManifold;
 | 
						|
	
 | 
						|
	btCompoundCompoundLeafCallback (const btCollisionObjectWrapper* compound1ObjWrap,
 | 
						|
									const btCollisionObjectWrapper* compound0ObjWrap,
 | 
						|
									btDispatcher* dispatcher,
 | 
						|
									const btDispatcherInfo& dispatchInfo,
 | 
						|
									btManifoldResult*	resultOut,
 | 
						|
									btHashedSimplePairCache* childAlgorithmsCache,
 | 
						|
									btPersistentManifold*	sharedManifold)
 | 
						|
		:m_numOverlapPairs(0),m_compound0ColObjWrap(compound1ObjWrap),m_compound1ColObjWrap(compound0ObjWrap),m_dispatcher(dispatcher),m_dispatchInfo(dispatchInfo),m_resultOut(resultOut),
 | 
						|
		m_childCollisionAlgorithmCache(childAlgorithmsCache),
 | 
						|
		m_sharedManifold(sharedManifold)
 | 
						|
	{
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	
 | 
						|
	void		Process(const btDbvtNode* leaf0,const btDbvtNode* leaf1)
 | 
						|
	{
 | 
						|
		BT_PROFILE("btCompoundCompoundLeafCallback::Process");
 | 
						|
		m_numOverlapPairs++;
 | 
						|
 | 
						|
 | 
						|
		int childIndex0 = leaf0->dataAsInt;
 | 
						|
		int childIndex1 = leaf1->dataAsInt;
 | 
						|
		
 | 
						|
 | 
						|
		btAssert(childIndex0>=0);
 | 
						|
		btAssert(childIndex1>=0);
 | 
						|
 | 
						|
 | 
						|
		const btCompoundShape* compoundShape0 = static_cast<const btCompoundShape*>(m_compound0ColObjWrap->getCollisionShape());
 | 
						|
		btAssert(childIndex0<compoundShape0->getNumChildShapes());
 | 
						|
 | 
						|
		const btCompoundShape* compoundShape1 = static_cast<const btCompoundShape*>(m_compound1ColObjWrap->getCollisionShape());
 | 
						|
		btAssert(childIndex1<compoundShape1->getNumChildShapes());
 | 
						|
 | 
						|
		const btCollisionShape* childShape0 = compoundShape0->getChildShape(childIndex0);
 | 
						|
		const btCollisionShape* childShape1 = compoundShape1->getChildShape(childIndex1);
 | 
						|
 | 
						|
		//backup
 | 
						|
		btTransform	orgTrans0 = m_compound0ColObjWrap->getWorldTransform();
 | 
						|
		const btTransform& childTrans0 = compoundShape0->getChildTransform(childIndex0);
 | 
						|
		btTransform	newChildWorldTrans0 = orgTrans0*childTrans0 ;
 | 
						|
		
 | 
						|
		btTransform	orgTrans1 = m_compound1ColObjWrap->getWorldTransform();
 | 
						|
		const btTransform& childTrans1 = compoundShape1->getChildTransform(childIndex1);
 | 
						|
		btTransform	newChildWorldTrans1 = orgTrans1*childTrans1 ;
 | 
						|
		
 | 
						|
 | 
						|
		//perform an AABB check first
 | 
						|
		btVector3 aabbMin0,aabbMax0,aabbMin1,aabbMax1;
 | 
						|
		childShape0->getAabb(newChildWorldTrans0,aabbMin0,aabbMax0);
 | 
						|
		childShape1->getAabb(newChildWorldTrans1,aabbMin1,aabbMax1);
 | 
						|
		
 | 
						|
		btVector3 thresholdVec(m_resultOut->m_closestPointDistanceThreshold, m_resultOut->m_closestPointDistanceThreshold, m_resultOut->m_closestPointDistanceThreshold);
 | 
						|
 | 
						|
		aabbMin0 -= thresholdVec;
 | 
						|
		aabbMax0 += thresholdVec;
 | 
						|
 | 
						|
		if (gCompoundCompoundChildShapePairCallback)
 | 
						|
		{
 | 
						|
			if (!gCompoundCompoundChildShapePairCallback(childShape0,childShape1))
 | 
						|
				return;
 | 
						|
		}
 | 
						|
 | 
						|
		if (TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1))
 | 
						|
		{
 | 
						|
			btCollisionObjectWrapper compoundWrap0(this->m_compound0ColObjWrap,childShape0, m_compound0ColObjWrap->getCollisionObject(),newChildWorldTrans0,-1,childIndex0);
 | 
						|
			btCollisionObjectWrapper compoundWrap1(this->m_compound1ColObjWrap,childShape1,m_compound1ColObjWrap->getCollisionObject(),newChildWorldTrans1,-1,childIndex1);
 | 
						|
			
 | 
						|
 | 
						|
			btSimplePair* pair = m_childCollisionAlgorithmCache->findPair(childIndex0,childIndex1);
 | 
						|
 | 
						|
			btCollisionAlgorithm* colAlgo = 0;
 | 
						|
			if (m_resultOut->m_closestPointDistanceThreshold > 0)
 | 
						|
			{
 | 
						|
				colAlgo = m_dispatcher->findAlgorithm(&compoundWrap0, &compoundWrap1, 0, BT_CLOSEST_POINT_ALGORITHMS);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if (pair)
 | 
						|
				{
 | 
						|
					colAlgo = (btCollisionAlgorithm*)pair->m_userPointer;
 | 
						|
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					colAlgo = m_dispatcher->findAlgorithm(&compoundWrap0, &compoundWrap1, m_sharedManifold, BT_CONTACT_POINT_ALGORITHMS);
 | 
						|
					pair = m_childCollisionAlgorithmCache->addOverlappingPair(childIndex0, childIndex1);
 | 
						|
					btAssert(pair);
 | 
						|
					pair->m_userPointer = colAlgo;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			btAssert(colAlgo);
 | 
						|
						
 | 
						|
			const btCollisionObjectWrapper* tmpWrap0 = 0;
 | 
						|
			const btCollisionObjectWrapper* tmpWrap1 = 0;
 | 
						|
 | 
						|
			tmpWrap0 = m_resultOut->getBody0Wrap();
 | 
						|
			tmpWrap1 = m_resultOut->getBody1Wrap();
 | 
						|
 | 
						|
			m_resultOut->setBody0Wrap(&compoundWrap0);
 | 
						|
			m_resultOut->setBody1Wrap(&compoundWrap1);
 | 
						|
 | 
						|
			m_resultOut->setShapeIdentifiersA(-1,childIndex0);
 | 
						|
			m_resultOut->setShapeIdentifiersB(-1,childIndex1);
 | 
						|
 | 
						|
 | 
						|
			colAlgo->processCollision(&compoundWrap0,&compoundWrap1,m_dispatchInfo,m_resultOut);
 | 
						|
			
 | 
						|
			m_resultOut->setBody0Wrap(tmpWrap0);
 | 
						|
			m_resultOut->setBody1Wrap(tmpWrap1);
 | 
						|
			
 | 
						|
 | 
						|
 | 
						|
		}
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
static DBVT_INLINE bool		MyIntersect(	const btDbvtAabbMm& a,
 | 
						|
								  const btDbvtAabbMm& b, const btTransform& xform, btScalar distanceThreshold)
 | 
						|
{
 | 
						|
	btVector3 newmin,newmax;
 | 
						|
	btTransformAabb(b.Mins(),b.Maxs(),0.f,xform,newmin,newmax);
 | 
						|
	newmin -= btVector3(distanceThreshold, distanceThreshold, distanceThreshold);
 | 
						|
	newmax += btVector3(distanceThreshold, distanceThreshold, distanceThreshold);
 | 
						|
	btDbvtAabbMm newb = btDbvtAabbMm::FromMM(newmin,newmax);
 | 
						|
	return Intersect(a,newb);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static inline void		MycollideTT(	const btDbvtNode* root0,
 | 
						|
								  const btDbvtNode* root1,
 | 
						|
								  const btTransform& xform,
 | 
						|
								  btCompoundCompoundLeafCallback* callback, btScalar distanceThreshold)
 | 
						|
{
 | 
						|
 | 
						|
		if(root0&&root1)
 | 
						|
		{
 | 
						|
			int								depth=1;
 | 
						|
			int								treshold=btDbvt::DOUBLE_STACKSIZE-4;
 | 
						|
			btAlignedObjectArray<btDbvt::sStkNN>	stkStack;
 | 
						|
#ifdef USE_LOCAL_STACK
 | 
						|
			ATTRIBUTE_ALIGNED16(btDbvt::sStkNN localStack[btDbvt::DOUBLE_STACKSIZE]);
 | 
						|
			stkStack.initializeFromBuffer(&localStack,btDbvt::DOUBLE_STACKSIZE,btDbvt::DOUBLE_STACKSIZE);
 | 
						|
#else
 | 
						|
			stkStack.resize(btDbvt::DOUBLE_STACKSIZE);
 | 
						|
#endif
 | 
						|
			stkStack[0]=btDbvt::sStkNN(root0,root1);
 | 
						|
			do	{
 | 
						|
				btDbvt::sStkNN	p=stkStack[--depth];
 | 
						|
				if(MyIntersect(p.a->volume,p.b->volume,xform, distanceThreshold))
 | 
						|
				{
 | 
						|
					if(depth>treshold)
 | 
						|
					{
 | 
						|
						stkStack.resize(stkStack.size()*2);
 | 
						|
						treshold=stkStack.size()-4;
 | 
						|
					}
 | 
						|
					if(p.a->isinternal())
 | 
						|
					{
 | 
						|
						if(p.b->isinternal())
 | 
						|
						{					
 | 
						|
							stkStack[depth++]=btDbvt::sStkNN(p.a->childs[0],p.b->childs[0]);
 | 
						|
							stkStack[depth++]=btDbvt::sStkNN(p.a->childs[1],p.b->childs[0]);
 | 
						|
							stkStack[depth++]=btDbvt::sStkNN(p.a->childs[0],p.b->childs[1]);
 | 
						|
							stkStack[depth++]=btDbvt::sStkNN(p.a->childs[1],p.b->childs[1]);
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							stkStack[depth++]=btDbvt::sStkNN(p.a->childs[0],p.b);
 | 
						|
							stkStack[depth++]=btDbvt::sStkNN(p.a->childs[1],p.b);
 | 
						|
						}
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						if(p.b->isinternal())
 | 
						|
						{
 | 
						|
							stkStack[depth++]=btDbvt::sStkNN(p.a,p.b->childs[0]);
 | 
						|
							stkStack[depth++]=btDbvt::sStkNN(p.a,p.b->childs[1]);
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							callback->Process(p.a,p.b);
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			} while(depth);
 | 
						|
		}
 | 
						|
}
 | 
						|
 | 
						|
void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
 | 
						|
{
 | 
						|
 | 
						|
	const btCollisionObjectWrapper* col0ObjWrap = body0Wrap;
 | 
						|
	const btCollisionObjectWrapper* col1ObjWrap= body1Wrap;
 | 
						|
 | 
						|
	btAssert (col0ObjWrap->getCollisionShape()->isCompound());
 | 
						|
	btAssert (col1ObjWrap->getCollisionShape()->isCompound());
 | 
						|
	const btCompoundShape* compoundShape0 = static_cast<const btCompoundShape*>(col0ObjWrap->getCollisionShape());
 | 
						|
	const btCompoundShape* compoundShape1 = static_cast<const btCompoundShape*>(col1ObjWrap->getCollisionShape());
 | 
						|
 | 
						|
	const btDbvt* tree0 = compoundShape0->getDynamicAabbTree();
 | 
						|
	const btDbvt* tree1 = compoundShape1->getDynamicAabbTree();
 | 
						|
	if (!tree0 || !tree1)
 | 
						|
	{
 | 
						|
		return btCompoundCollisionAlgorithm::processCollision(body0Wrap,body1Wrap,dispatchInfo,resultOut);
 | 
						|
	}
 | 
						|
	///btCompoundShape might have changed:
 | 
						|
	////make sure the internal child collision algorithm caches are still valid
 | 
						|
	if ((compoundShape0->getUpdateRevision() != m_compoundShapeRevision0) || (compoundShape1->getUpdateRevision() != m_compoundShapeRevision1))
 | 
						|
	{
 | 
						|
		///clear all
 | 
						|
		removeChildAlgorithms();
 | 
						|
		m_compoundShapeRevision0 = compoundShape0->getUpdateRevision();
 | 
						|
		m_compoundShapeRevision1 = compoundShape1->getUpdateRevision();
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	///we need to refresh all contact manifolds
 | 
						|
	///note that we should actually recursively traverse all children, btCompoundShape can nested more then 1 level deep
 | 
						|
	///so we should add a 'refreshManifolds' in the btCollisionAlgorithm
 | 
						|
	{
 | 
						|
		int i;
 | 
						|
		btManifoldArray manifoldArray;
 | 
						|
#ifdef USE_LOCAL_STACK 
 | 
						|
		btPersistentManifold localManifolds[4];
 | 
						|
		manifoldArray.initializeFromBuffer(&localManifolds,0,4);
 | 
						|
#endif
 | 
						|
		btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
 | 
						|
		for (i=0;i<pairs.size();i++)
 | 
						|
		{
 | 
						|
			if (pairs[i].m_userPointer)
 | 
						|
			{
 | 
						|
				btCollisionAlgorithm* algo = (btCollisionAlgorithm*) pairs[i].m_userPointer;
 | 
						|
				algo->getAllContactManifolds(manifoldArray);
 | 
						|
				for (int m=0;m<manifoldArray.size();m++)
 | 
						|
				{
 | 
						|
					if (manifoldArray[m]->getNumContacts())
 | 
						|
					{
 | 
						|
						resultOut->setPersistentManifold(manifoldArray[m]);
 | 
						|
						resultOut->refreshContactPoints();
 | 
						|
						resultOut->setPersistentManifold(0);
 | 
						|
					}
 | 
						|
				}
 | 
						|
				manifoldArray.resize(0);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	
 | 
						|
 | 
						|
	btCompoundCompoundLeafCallback callback(col0ObjWrap,col1ObjWrap,this->m_dispatcher,dispatchInfo,resultOut,this->m_childCollisionAlgorithmCache,m_sharedManifold);
 | 
						|
 | 
						|
 | 
						|
	const btTransform	xform=col0ObjWrap->getWorldTransform().inverse()*col1ObjWrap->getWorldTransform();
 | 
						|
	MycollideTT(tree0->m_root,tree1->m_root,xform,&callback, resultOut->m_closestPointDistanceThreshold);
 | 
						|
 | 
						|
	//printf("#compound-compound child/leaf overlap =%d                      \r",callback.m_numOverlapPairs);
 | 
						|
 | 
						|
	//remove non-overlapping child pairs
 | 
						|
 | 
						|
	{
 | 
						|
		btAssert(m_removePairs.size()==0);
 | 
						|
 | 
						|
		//iterate over all children, perform an AABB check inside ProcessChildShape
 | 
						|
		btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
 | 
						|
		
 | 
						|
		int i;
 | 
						|
		btManifoldArray	manifoldArray;
 | 
						|
        
 | 
						|
		
 | 
						|
 | 
						|
        
 | 
						|
        
 | 
						|
        btVector3 aabbMin0,aabbMax0,aabbMin1,aabbMax1;        
 | 
						|
        
 | 
						|
		for (i=0;i<pairs.size();i++)
 | 
						|
		{
 | 
						|
			if (pairs[i].m_userPointer)
 | 
						|
			{
 | 
						|
				btCollisionAlgorithm* algo = (btCollisionAlgorithm*)pairs[i].m_userPointer;
 | 
						|
 | 
						|
				{
 | 
						|
					btTransform	orgTrans0;
 | 
						|
					const btCollisionShape* childShape0 = 0;
 | 
						|
					
 | 
						|
					btTransform	newChildWorldTrans0;
 | 
						|
					btTransform	orgInterpolationTrans0;
 | 
						|
					childShape0 = compoundShape0->getChildShape(pairs[i].m_indexA);
 | 
						|
					orgTrans0 = col0ObjWrap->getWorldTransform();
 | 
						|
					orgInterpolationTrans0 = col0ObjWrap->getWorldTransform();
 | 
						|
					const btTransform& childTrans0 = compoundShape0->getChildTransform(pairs[i].m_indexA);
 | 
						|
					newChildWorldTrans0 = orgTrans0*childTrans0 ;
 | 
						|
					childShape0->getAabb(newChildWorldTrans0,aabbMin0,aabbMax0);
 | 
						|
				}
 | 
						|
				btVector3 thresholdVec(resultOut->m_closestPointDistanceThreshold, resultOut->m_closestPointDistanceThreshold, resultOut->m_closestPointDistanceThreshold);
 | 
						|
				aabbMin0 -= thresholdVec;
 | 
						|
				aabbMax0 += thresholdVec;
 | 
						|
				{
 | 
						|
					btTransform	orgInterpolationTrans1;
 | 
						|
					const btCollisionShape* childShape1 = 0;
 | 
						|
					btTransform	orgTrans1;
 | 
						|
					btTransform	newChildWorldTrans1;
 | 
						|
 | 
						|
					childShape1 = compoundShape1->getChildShape(pairs[i].m_indexB);
 | 
						|
					orgTrans1 = col1ObjWrap->getWorldTransform();
 | 
						|
					orgInterpolationTrans1 = col1ObjWrap->getWorldTransform();
 | 
						|
					const btTransform& childTrans1 = compoundShape1->getChildTransform(pairs[i].m_indexB);
 | 
						|
					newChildWorldTrans1 = orgTrans1*childTrans1 ;
 | 
						|
					childShape1->getAabb(newChildWorldTrans1,aabbMin1,aabbMax1);
 | 
						|
				}
 | 
						|
				
 | 
						|
				aabbMin1 -= thresholdVec;
 | 
						|
				aabbMax1 += thresholdVec;
 | 
						|
 | 
						|
				if (!TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1))
 | 
						|
				{
 | 
						|
					algo->~btCollisionAlgorithm();
 | 
						|
					m_dispatcher->freeCollisionAlgorithm(algo);
 | 
						|
					m_removePairs.push_back(btSimplePair(pairs[i].m_indexA,pairs[i].m_indexB));
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		for (int i=0;i<m_removePairs.size();i++)
 | 
						|
		{
 | 
						|
			m_childCollisionAlgorithmCache->removeOverlappingPair(m_removePairs[i].m_indexA,m_removePairs[i].m_indexB);
 | 
						|
		}
 | 
						|
		m_removePairs.clear();
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
btScalar	btCompoundCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
 | 
						|
{
 | 
						|
	btAssert(0);
 | 
						|
	return 0.f;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 |