From 79b78e64691775f4668754f4e9b27cc707dcab20 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Mon, 23 Jan 2012 22:04:46 +0000 Subject: [PATCH] Don't access pairCache->getOverlappingPairArrayPtr() if there are 0 pairs. Thanks to knox31085 Fixes Issue 579. --- .../SpuGatheringCollisionDispatcher.cpp | 87 ++++++++++--------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/src/BulletMultiThreaded/SpuGatheringCollisionDispatcher.cpp b/src/BulletMultiThreaded/SpuGatheringCollisionDispatcher.cpp index 420f15f15..1a76be082 100644 --- a/src/BulletMultiThreaded/SpuGatheringCollisionDispatcher.cpp +++ b/src/BulletMultiThreaded/SpuGatheringCollisionDispatcher.cpp @@ -205,55 +205,56 @@ void SpuGatheringCollisionDispatcher::dispatchAllCollisionPairs(btOverlappingPai //send one big batch int numTotalPairs = pairCache->getNumOverlappingPairs(); - - btBroadphasePair* pairPtr = pairCache->getOverlappingPairArrayPtr(); - int i; + if (numTotalPairs) { - int pairRange = SPU_BATCHSIZE_BROADPHASE_PAIRS; - if (numTotalPairs < (m_spuCollisionTaskProcess->getNumTasks()*SPU_BATCHSIZE_BROADPHASE_PAIRS)) + btBroadphasePair* pairPtr = pairCache->getOverlappingPairArrayPtr(); + int i; { - pairRange = (numTotalPairs/m_spuCollisionTaskProcess->getNumTasks())+1; - } - - BT_PROFILE("addWorkToTask"); - for (i=0;iaddWorkToTask(pairPtr,i,endIndex); - i = endIndex; - } - } - - { - BT_PROFILE("PPU fallback"); - //handle PPU fallback pairs - for (i=0;igetNumTasks()*SPU_BATCHSIZE_BROADPHASE_PAIRS)) { - if (collisionPair.m_algorithm) + pairRange = (numTotalPairs/m_spuCollisionTaskProcess->getNumTasks())+1; + } + + BT_PROFILE("addWorkToTask"); + for (i=0;iaddWorkToTask(pairPtr,i,endIndex); + i = endIndex; + } + } + { + BT_PROFILE("PPU fallback"); + //handle PPU fallback pairs + for (i=0;im_clientObject; - btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject; - - if (dispatcher->needsCollision(colObj0,colObj1)) + if (collisionPair.m_algorithm) { - btManifoldResult contactPointResult(colObj0,colObj1); - - if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE) + btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject; + btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject; + + if (dispatcher->needsCollision(colObj0,colObj1)) { - //discrete collision detection query - collisionPair.m_algorithm->processCollision(colObj0,colObj1,dispatchInfo,&contactPointResult); - } else - { - //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; - + btManifoldResult contactPointResult(colObj0,colObj1); + + if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE) + { + //discrete collision detection query + collisionPair.m_algorithm->processCollision(colObj0,colObj1,dispatchInfo,&contactPointResult); + } else + { + //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; + + } } } }