add btActivationCollisionAlgoritm to fix deactivation problems, reported here:

http://bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=2616

provide access to active objects, requested here:
http://code.google.com/p/bullet/issues/detail?id=128
This commit is contained in:
erwin.coumans
2008-11-07 03:37:14 +00:00
parent f46d65d337
commit 86353f0ad8
25 changed files with 317 additions and 188 deletions

View File

@@ -143,11 +143,13 @@ class btPersistentManifoldSortPredicate
};
void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisionObjectArray& collisionObjects)
void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisionWorld* collisionWorld)
{
BT_PROFILE("islandUnionFindAndQuickSort");
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
m_islandmanifold.resize(0);
//we are going to sort the unionfind array, and store the element id in the size
@@ -238,6 +240,7 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisio
if ( colObj0->getActivationState() == ISLAND_SLEEPING)
{
colObj0->setActivationState( WANTS_DEACTIVATION);
colObj0->setDeactivationTime(0.f);
}
}
}
@@ -270,10 +273,18 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisio
//kinematic objects don't merge islands, but wake up all connected objects
if (colObj0->isKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING)
{
if (!colObj1->isActive())
{
collisionWorld->getActiveObjects().push_back(colObj1);
}
colObj1->activate();
}
if (colObj1->isKinematicObject() && colObj1->getActivationState() != ISLAND_SLEEPING)
{
if (!colObj0->isActive())
{
collisionWorld->getActiveObjects().push_back(colObj0);
}
colObj0->activate();
}
#ifdef SPLIT_ISLANDS
@@ -288,10 +299,11 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisio
///@todo: this is random access, it can be walked 'cache friendly'!
void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,btCollisionObjectArray& collisionObjects, IslandCallback* callback)
void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,btCollisionWorld* collisionWorld, IslandCallback* callback)
{
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
buildIslands(dispatcher,collisionObjects);
buildIslands(dispatcher,collisionWorld);
int endIslandIndex=1;
int startIslandIndex;