Don't access pairCache->getOverlappingPairArrayPtr() if there are 0 pairs.
Thanks to knox31085 Fixes Issue 579.
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user