implemented patch by Vroonsh to optimize island management with many static objects.
It can be disabled by commenting out the #define STATIC_SIMULATION_ISLAND_OPTIMIZATION in Bullet/src/BulletCollision/CollisionDispatch/btUnionFind.h See also Issue 406
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Bullet Continuous Collision Detection and Physics Library
|
Bullet Continuous Collision Detection and Physics Library
|
||||||
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
|
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
|
||||||
@@ -65,15 +66,69 @@ void btSimulationIslandManager::findUnions(btDispatcher* /* dispatcher */,btColl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef STATIC_SIMULATION_ISLAND_OPTIMIZATION
|
||||||
|
void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld,btDispatcher* dispatcher)
|
||||||
|
{
|
||||||
|
|
||||||
|
// put the index into m_controllers into m_tag
|
||||||
|
int index = 0;
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i=0;i<colWorld->getCollisionObjectArray().size(); i++)
|
||||||
|
{
|
||||||
|
btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
|
||||||
|
//Adding filtering here
|
||||||
|
if (!collisionObject->isStaticOrKinematicObject())
|
||||||
|
{
|
||||||
|
collisionObject->setIslandTag(index++);
|
||||||
|
}
|
||||||
|
collisionObject->setCompanionId(-1);
|
||||||
|
collisionObject->setHitFraction(btScalar(1.));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// do the union find
|
||||||
|
|
||||||
|
initUnionFind( index );
|
||||||
|
|
||||||
|
findUnions(dispatcher,colWorld);
|
||||||
|
}
|
||||||
|
|
||||||
|
void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
|
||||||
|
{
|
||||||
|
// put the islandId ('find' value) into m_tag
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
int i;
|
||||||
|
for (i=0;i<colWorld->getCollisionObjectArray().size();i++)
|
||||||
|
{
|
||||||
|
btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
|
||||||
|
if (!collisionObject->isStaticOrKinematicObject())
|
||||||
|
{
|
||||||
|
collisionObject->setIslandTag( m_unionFind.find(index) );
|
||||||
|
//Set the correct object offset in Collision Object Array
|
||||||
|
m_unionFind.getElement(index).m_sz = i;
|
||||||
|
collisionObject->setCompanionId(-1);
|
||||||
|
index++;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
collisionObject->setIslandTag(-1);
|
||||||
|
collisionObject->setCompanionId(-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#else //STATIC_SIMULATION_ISLAND_OPTIMIZATION
|
||||||
void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld,btDispatcher* dispatcher)
|
void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld,btDispatcher* dispatcher)
|
||||||
{
|
{
|
||||||
|
|
||||||
initUnionFind( int (colWorld->getCollisionObjectArray().size()));
|
initUnionFind( int (colWorld->getCollisionObjectArray().size()));
|
||||||
|
|
||||||
// put the index into m_controllers into m_tag
|
// put the index into m_controllers into m_tag
|
||||||
{
|
{
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<colWorld->getCollisionObjectArray().size(); i++)
|
for (i=0;i<colWorld->getCollisionObjectArray().size(); i++)
|
||||||
@@ -83,26 +138,20 @@ void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld
|
|||||||
collisionObject->setCompanionId(-1);
|
collisionObject->setCompanionId(-1);
|
||||||
collisionObject->setHitFraction(btScalar(1.));
|
collisionObject->setHitFraction(btScalar(1.));
|
||||||
index++;
|
index++;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// do the union find
|
// do the union find
|
||||||
|
|
||||||
findUnions(dispatcher,colWorld);
|
findUnions(dispatcher,colWorld);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
|
void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
|
||||||
{
|
{
|
||||||
// put the islandId ('find' value) into m_tag
|
// put the islandId ('find' value) into m_tag
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<colWorld->getCollisionObjectArray().size();i++)
|
for (i=0;i<colWorld->getCollisionObjectArray().size();i++)
|
||||||
@@ -122,6 +171,8 @@ void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* col
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
|
||||||
|
|
||||||
inline int getIslandId(const btPersistentManifold* lhs)
|
inline int getIslandId(const btPersistentManifold* lhs)
|
||||||
{
|
{
|
||||||
int islandId;
|
int islandId;
|
||||||
|
|||||||
@@ -70,7 +70,9 @@ void btUnionFind::sortIslands()
|
|||||||
for (int i=0;i<numElements;i++)
|
for (int i=0;i<numElements;i++)
|
||||||
{
|
{
|
||||||
m_elements[i].m_id = find(i);
|
m_elements[i].m_id = find(i);
|
||||||
|
#ifndef STATIC_SIMULATION_ISLAND_OPTIMIZATION
|
||||||
m_elements[i].m_sz = i;
|
m_elements[i].m_sz = i;
|
||||||
|
#endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort the vector using predicate and std::sort
|
// Sort the vector using predicate and std::sort
|
||||||
@@ -78,4 +80,3 @@ void btUnionFind::sortIslands()
|
|||||||
m_elements.quickSort(btUnionFindElementSortPredicate());
|
m_elements.quickSort(btUnionFindElementSortPredicate());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,10 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
#include "LinearMath/btAlignedObjectArray.h"
|
#include "LinearMath/btAlignedObjectArray.h"
|
||||||
|
|
||||||
#define USE_PATH_COMPRESSION 1
|
#define USE_PATH_COMPRESSION 1
|
||||||
|
|
||||||
|
///see for discussion of static island optimizations by Vroonsh here: http://code.google.com/p/bullet/issues/detail?id=406
|
||||||
|
#define STATIC_SIMULATION_ISLAND_OPTIMIZATION 1
|
||||||
|
|
||||||
struct btElement
|
struct btElement
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user