45 if (numOverlappingPairs)
49 for (
int i = 0; i < numOverlappingPairs; i++)
56 ((colObj1) && ((colObj1)->mergesSimulationIslands())))
58 m_unionFind.
unite((colObj0)->getIslandTag(),
66 #ifdef STATIC_SIMULATION_ISLAND_OPTIMIZATION
77 if (!collisionObject->isStaticOrKinematicObject())
79 collisionObject->setIslandTag(index++);
81 collisionObject->setCompanionId(-1);
82 collisionObject->setHitFraction(
btScalar(1.));
101 if (!collisionObject->isStaticOrKinematicObject())
103 collisionObject->setIslandTag(m_unionFind.
find(index));
106 collisionObject->setCompanionId(-1);
111 collisionObject->setIslandTag(-1);
112 collisionObject->setCompanionId(-2);
130 collisionObject->setIslandTag(index);
131 collisionObject->setCompanionId(-1);
132 collisionObject->setHitFraction(
btScalar(1.));
150 if (!collisionObject->isStaticOrKinematicObject())
152 collisionObject->setIslandTag(m_unionFind.
find(index));
153 collisionObject->setCompanionId(-1);
157 collisionObject->setIslandTag(-1);
158 collisionObject->setCompanionId(-2);
172 islandId = rcolObj0->getIslandTag() >= 0 ? rcolObj0->getIslandTag() : rcolObj1->getIslandTag();
192 (
getIslandId(lhs) <
getIslandId(rhs)) || ((
getIslandId(lhs) ==
getIslandId(rhs)) && lhs->getBody0()->getBroadphaseHandle()->m_uniqueId < rhs->getBody0()->getBroadphaseHandle()->m_uniqueId) || ((
getIslandId(lhs) ==
getIslandId(rhs)) && (lhs->getBody0()->getBroadphaseHandle()->m_uniqueId == rhs->getBody0()->getBroadphaseHandle()->m_uniqueId) && (lhs->getBody1()->getBroadphaseHandle()->m_uniqueId < rhs->getBody1()->getBroadphaseHandle()->m_uniqueId)));
202 m_islandmanifold.
resize(0);
210 int endIslandIndex = 1;
211 int startIslandIndex;
214 for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex)
217 for (endIslandIndex = startIslandIndex + 1; (endIslandIndex < numElem) && (
getUnionFind().getElement(endIslandIndex).m_id == islandId); endIslandIndex++)
223 bool allSleeping =
true;
226 for (idx = startIslandIndex; idx < endIslandIndex; idx++)
231 if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
236 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
237 if (colObj0->getIslandTag() == islandId)
239 if (colObj0->getActivationState() ==
ACTIVE_TAG ||
251 for (idx = startIslandIndex; idx < endIslandIndex; idx++)
255 if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
260 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
262 if (colObj0->getIslandTag() == islandId)
271 for (idx = startIslandIndex; idx < endIslandIndex; idx++)
276 if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
281 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
284 if (colObj0->getIslandTag() == islandId)
289 colObj0->setDeactivationTime(0.f);
304 for (i = 0; i < maxNumManifolds; i++)
309 if (manifold->getNumContacts() == 0)
321 if (colObj0->isKinematicObject() && colObj0->getActivationState() !=
ISLAND_SLEEPING)
323 if (colObj0->hasContactResponse())
326 if (colObj1->isKinematicObject() && colObj1->getActivationState() !=
ISLAND_SLEEPING)
328 if (colObj1->hasContactResponse())
352 int endIslandIndex = 1;
353 int startIslandIndex;
362 callback->processIsland(&collisionObjects[0], collisionObjects.
size(), manifold, maxNumManifolds, -1);
389 int startManifoldIndex = 0;
390 int endManifoldIndex = 1;
397 for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex)
401 bool islandSleeping =
true;
403 for (endIslandIndex = startIslandIndex; (endIslandIndex < numElem) && (
getUnionFind().getElement(endIslandIndex).m_id == islandId); endIslandIndex++)
408 if (colObj0->isActive())
409 islandSleeping =
false;
413 int numIslandManifolds = 0;
418 int curIslandId =
getIslandId(m_islandmanifold[startManifoldIndex]);
419 if (curIslandId == islandId)
421 startManifold = &m_islandmanifold[startManifoldIndex];
423 for (endManifoldIndex = startManifoldIndex + 1; (endManifoldIndex <
numManifolds) && (islandId ==
getIslandId(m_islandmanifold[endManifoldIndex])); endManifoldIndex++)
427 numIslandManifolds = endManifoldIndex - startManifoldIndex;
433 callback->processIsland(&m_islandBodies[0], m_islandBodies.
size(), startManifold, numIslandManifolds, islandId);
437 if (numIslandManifolds)
439 startManifoldIndex = endManifoldIndex;
#define DISABLE_DEACTIVATION
#define WANTS_DEACTIVATION
SIMD_FORCE_INLINE bool mergesSimulationIslands() const
SIMD_FORCE_INLINE int getIslandTag() const
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define SIMD_FORCE_INLINE
btSequentialImpulseConstraintSolverMt int btPersistentManifold int numManifolds
int getIslandId(const btPersistentManifold *lhs)
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void resize(int newsize, const T &fillData=T())
void quickSort(const L &CompareFunc)
SIMD_FORCE_INLINE void push_back(const T &_Val)
CollisionWorld is interface and container for the collision detection.
btCollisionObjectArray & getCollisionObjectArray()
btOverlappingPairCache * getPairCache()
btDispatcherInfo & getDispatchInfo()
virtual int getNumManifolds() const =0
virtual btPersistentManifold * getManifoldByIndexInternal(int index)=0
virtual btPersistentManifold ** getInternalManifoldPointer()=0
virtual bool needsResponse(const btCollisionObject *body0, const btCollisionObject *body1)=0
virtual int getNumOverlappingPairs() const =0
virtual btBroadphasePair * getOverlappingPairArrayPtr()=0
SIMD_FORCE_INLINE bool operator()(const btPersistentManifold *lhs, const btPersistentManifold *rhs) const
function object that routes calls to operator<
SIMD_FORCE_INLINE bool operator()(const btPersistentManifold *lhs, const btPersistentManifold *rhs) const
virtual void storeIslandActivationState(btCollisionWorld *world)
void findUnions(btDispatcher *dispatcher, btCollisionWorld *colWorld)
void processIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, IslandCallback *callback)
btUnionFind & getUnionFind()
virtual void updateActivationState(btCollisionWorld *colWorld, btDispatcher *dispatcher)
void buildAndProcessIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, IslandCallback *callback)
void initUnionFind(int n)
btSimulationIslandManager()
void buildIslands(btDispatcher *dispatcher, btCollisionWorld *colWorld)
virtual ~btSimulationIslandManager()
SIMD_FORCE_INLINE int getNumElements() const
btElement & getElement(int index)
DEGForeachIDComponentCallback callback
bool m_deterministicOverlappingPairs