Fix issues with btSortedOverlappingPairCache, both for btAxisSweep3 and btDbvtBroadphase.
This commit is contained in:
@@ -54,6 +54,6 @@ int main(int argc,char** argv)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
return glutmain(argc, argv,640,480,"Bullet Quake BSP Physics Viewer http://bullet.sourceforge.net",bspDemo);
|
return glutmain(argc, argv,640,480,"Bullet Quake BSP Physics Viewer http://bulletphysics.org",bspDemo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ int main(int argc,char** argv)
|
|||||||
|
|
||||||
colladaDemo->setCameraDistance(26.f);
|
colladaDemo->setCameraDistance(26.f);
|
||||||
|
|
||||||
return glutmain(argc, argv,640,480,"Bullet COLLADA Physics Viewer http://bullet.sourceforge.net",colladaDemo);
|
return glutmain(argc, argv,640,480,"Bullet COLLADA Physics Viewer http://bulletphysics.org",colladaDemo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColladaDemo::initPhysics(const char* filename)
|
void ColladaDemo::initPhysics(const char* filename)
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y)
|
|||||||
m_lastKey = 0;
|
m_lastKey = 0;
|
||||||
|
|
||||||
#ifndef BT_NO_PROFILE
|
#ifndef BT_NO_PROFILE
|
||||||
if (key >= 0x31 && key < 0x37)
|
if (key >= 0x31 && key <= 0x39)
|
||||||
{
|
{
|
||||||
int child = key-0x31;
|
int child = key-0x31;
|
||||||
m_profileIterator->Enter_Child(child);
|
m_profileIterator->Enter_Child(child);
|
||||||
@@ -1248,6 +1248,7 @@ void DemoApplication::renderme()
|
|||||||
updateCamera();
|
updateCamera();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#include "BulletCollision/BroadphaseCollision/btAxisSweep3.h"
|
||||||
|
|
||||||
void DemoApplication::clientResetScene()
|
void DemoApplication::clientResetScene()
|
||||||
{
|
{
|
||||||
@@ -1290,6 +1291,8 @@ void DemoApplication::clientResetScene()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
btAxisSweep3* sap = (btAxisSweep3*)m_dynamicsWorld->getBroadphase();
|
||||||
|
sap->resetPool();
|
||||||
/*
|
/*
|
||||||
//quickly search some issue at a certain simulation frame, pressing space to reset
|
//quickly search some issue at a certain simulation frame, pressing space to reset
|
||||||
int fixed=18;
|
int fixed=18;
|
||||||
|
|||||||
@@ -229,8 +229,13 @@ class btBroadphasePairSortPredicate
|
|||||||
|
|
||||||
bool operator() ( const btBroadphasePair& a, const btBroadphasePair& b )
|
bool operator() ( const btBroadphasePair& a, const btBroadphasePair& b )
|
||||||
{
|
{
|
||||||
return a.m_pProxy0->m_uniqueId > b.m_pProxy0->m_uniqueId ||
|
const int uidA0 = a.m_pProxy0 ? a.m_pProxy0->m_uniqueId : -1;
|
||||||
(a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1->m_uniqueId > b.m_pProxy1->m_uniqueId) ||
|
const int uidB0 = b.m_pProxy0 ? b.m_pProxy0->m_uniqueId : -1;
|
||||||
|
const int uidA1 = a.m_pProxy1 ? a.m_pProxy1->m_uniqueId : -1;
|
||||||
|
const int uidB1 = b.m_pProxy1 ? b.m_pProxy1->m_uniqueId : -1;
|
||||||
|
|
||||||
|
return uidA0 > uidB0 ||
|
||||||
|
(a.m_pProxy0 == b.m_pProxy0 && uidA1 > uidB1) ||
|
||||||
(a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 == b.m_pProxy1 && a.m_algorithm > b.m_algorithm);
|
(a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 == b.m_pProxy1 && a.m_algorithm > b.m_algorithm);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -341,6 +341,73 @@ void btDbvtBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
|
|||||||
m_clock.reset();
|
m_clock.reset();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (m_paircache->hasDeferredRemoval())
|
||||||
|
{
|
||||||
|
|
||||||
|
btBroadphasePairArray& overlappingPairArray = m_paircache->getOverlappingPairArray();
|
||||||
|
|
||||||
|
//perform a sort, to find duplicates and to sort 'invalid' pairs to the end
|
||||||
|
overlappingPairArray.quickSort(btBroadphasePairSortPredicate());
|
||||||
|
|
||||||
|
int invalidPair = 0;
|
||||||
|
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
btBroadphasePair previousPair;
|
||||||
|
previousPair.m_pProxy0 = 0;
|
||||||
|
previousPair.m_pProxy1 = 0;
|
||||||
|
previousPair.m_algorithm = 0;
|
||||||
|
|
||||||
|
|
||||||
|
for (i=0;i<overlappingPairArray.size();i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
btBroadphasePair& pair = overlappingPairArray[i];
|
||||||
|
|
||||||
|
bool isDuplicate = (pair == previousPair);
|
||||||
|
|
||||||
|
previousPair = pair;
|
||||||
|
|
||||||
|
bool needsRemoval = false;
|
||||||
|
|
||||||
|
if (!isDuplicate)
|
||||||
|
{
|
||||||
|
btDbvtProxy* pa=(btDbvtProxy*)pair.m_pProxy0;
|
||||||
|
btDbvtProxy* pb=(btDbvtProxy*)pair.m_pProxy1;
|
||||||
|
bool hasOverlap = Intersect(pa->leaf->volume,pb->leaf->volume);
|
||||||
|
|
||||||
|
if (hasOverlap)
|
||||||
|
{
|
||||||
|
needsRemoval = false;//callback->processOverlap(pair);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
needsRemoval = true;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
//remove duplicate
|
||||||
|
needsRemoval = true;
|
||||||
|
//should have no algorithm
|
||||||
|
btAssert(!pair.m_algorithm);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needsRemoval)
|
||||||
|
{
|
||||||
|
m_paircache->cleanOverlappingPair(pair,dispatcher);
|
||||||
|
|
||||||
|
pair.m_pProxy0 = 0;
|
||||||
|
pair.m_pProxy1 = 0;
|
||||||
|
invalidPair++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//perform a sort, to sort 'invalid' pairs to the end
|
||||||
|
overlappingPairArray.quickSort(btBroadphasePairSortPredicate());
|
||||||
|
overlappingPairArray.resize(overlappingPairArray.size() - invalidPair);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user