45 if (numOverlappingPairs)
49 for (
int i = 0;
i < numOverlappingPairs;
i++)
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));
105 m_unionFind.getElement(index).m_sz =
i;
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())
335 m_islandmanifold.push_back(manifold);
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;
442 m_islandBodies.resize(0);
#define DISABLE_DEACTIVATION
btAlignedObjectArray< class btCollisionObject * > btCollisionObjectArray
#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())
SIMD_FORCE_INLINE void push_back(const T &_Val)
CollisionWorld is interface and container for the collision detection.
btDispatcherInfo & getDispatchInfo()
btOverlappingPairCache * getPairCache()
btCollisionObjectArray & getCollisionObjectArray()
virtual int getNumManifolds() const =0
virtual btPersistentManifold * getManifoldByIndexInternal(int index)=0
virtual bool needsResponse(const btCollisionObject *body0, const btCollisionObject *body1)=0
virtual btPersistentManifold ** getInternalManifoldPointer()=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)
virtual void updateActivationState(btCollisionWorld *colWorld, btDispatcher *dispatcher)
void buildAndProcessIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, IslandCallback *callback)
btUnionFind & getUnionFind()
void initUnionFind(int n)
btSimulationIslandManager()
void buildIslands(btDispatcher *dispatcher, btCollisionWorld *colWorld)
virtual ~btSimulationIslandManager()
btElement & getElement(int index)
SIMD_FORCE_INLINE int getNumElements() const
bool m_deterministicOverlappingPairs
virtual void processIsland(btCollisionObject **bodies, int numBodies, class btPersistentManifold **manifolds, int numManifolds, int islandId)=0