Don't access pairCache->getOverlappingPairArrayPtr() if there are 0 pairs.

Thanks to knox31085
Fixes Issue 579.
This commit is contained in:
erwin.coumans
2012-01-23 22:04:46 +00:00
parent 58d1d14880
commit 79b78e6469

View File

@@ -205,55 +205,56 @@ void SpuGatheringCollisionDispatcher::dispatchAllCollisionPairs(btOverlappingPai
//send one big batch //send one big batch
int numTotalPairs = pairCache->getNumOverlappingPairs(); int numTotalPairs = pairCache->getNumOverlappingPairs();
if (numTotalPairs)
btBroadphasePair* pairPtr = pairCache->getOverlappingPairArrayPtr();
int i;
{ {
int pairRange = SPU_BATCHSIZE_BROADPHASE_PAIRS; btBroadphasePair* pairPtr = pairCache->getOverlappingPairArrayPtr();
if (numTotalPairs < (m_spuCollisionTaskProcess->getNumTasks()*SPU_BATCHSIZE_BROADPHASE_PAIRS)) int i;
{ {
pairRange = (numTotalPairs/m_spuCollisionTaskProcess->getNumTasks())+1; int pairRange = SPU_BATCHSIZE_BROADPHASE_PAIRS;
} if (numTotalPairs < (m_spuCollisionTaskProcess->getNumTasks()*SPU_BATCHSIZE_BROADPHASE_PAIRS))
BT_PROFILE("addWorkToTask");
for (i=0;i<numTotalPairs;)
{
//Performance Hint: tweak this number during benchmarking
int endIndex = (i+pairRange) < numTotalPairs ? i+pairRange : numTotalPairs;
m_spuCollisionTaskProcess->addWorkToTask(pairPtr,i,endIndex);
i = endIndex;
}
}
{
BT_PROFILE("PPU fallback");
//handle PPU fallback pairs
for (i=0;i<numTotalPairs;i++)
{
btBroadphasePair& collisionPair = pairPtr[i];
if (collisionPair.m_internalTmpValue == 3)
{ {
if (collisionPair.m_algorithm) pairRange = (numTotalPairs/m_spuCollisionTaskProcess->getNumTasks())+1;
}
BT_PROFILE("addWorkToTask");
for (i=0;i<numTotalPairs;)
{
//Performance Hint: tweak this number during benchmarking
int endIndex = (i+pairRange) < numTotalPairs ? i+pairRange : numTotalPairs;
m_spuCollisionTaskProcess->addWorkToTask(pairPtr,i,endIndex);
i = endIndex;
}
}
{
BT_PROFILE("PPU fallback");
//handle PPU fallback pairs
for (i=0;i<numTotalPairs;i++)
{
btBroadphasePair& collisionPair = pairPtr[i];
if (collisionPair.m_internalTmpValue == 3)
{ {
btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject; if (collisionPair.m_algorithm)
btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
if (dispatcher->needsCollision(colObj0,colObj1))
{ {
btManifoldResult contactPointResult(colObj0,colObj1); btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE)
if (dispatcher->needsCollision(colObj0,colObj1))
{ {
//discrete collision detection query btManifoldResult contactPointResult(colObj0,colObj1);
collisionPair.m_algorithm->processCollision(colObj0,colObj1,dispatchInfo,&contactPointResult);
} else if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE)
{ {
//continuous collision detection query, time of impact (toi) //discrete collision detection query
btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult); collisionPair.m_algorithm->processCollision(colObj0,colObj1,dispatchInfo,&contactPointResult);
if (dispatchInfo.m_timeOfImpact > toi) } else
dispatchInfo.m_timeOfImpact = toi; {
//continuous collision detection query, time of impact (toi)
btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
}
} }
} }
} }