32 int batchCost = bodies + 8 * manifolds + 4 *
constraints;
64 int islandId = rcolObj0->getIslandTag() >= 0 ? rcolObj0->getIslandTag() : rcolObj1->getIslandTag();
72 int islandId = rcolObj0.getIslandTag() >= 0 ? rcolObj0.getIslandTag() : rcolObj1.getIslandTag();
140 int lastCapacity = 0;
141 bool isSorted =
true;
146 if (cap > lastCapacity)
220 if (freeIslands.
size() > 0)
223 int iFound = freeIslands.
size();
225 for (
int i = freeIslands.
size() - 1; i >= 0; --i)
227 if (freeIslands[i]->bodyArray.
capacity() >= allocSize)
230 island = freeIslands[i];
239 int iSrc = iDest + 1;
240 while (iSrc < freeIslands.
size())
242 freeIslands[iDest++] = freeIslands[iSrc++];
276 int endIslandIndex = 1;
277 int startIslandIndex;
280 for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex)
283 for (endIslandIndex = startIslandIndex + 1; (endIslandIndex < numElem) && (
getUnionFind().getElement(endIslandIndex).m_id == islandId); endIslandIndex++)
289 bool allSleeping =
true;
292 for (idx = startIslandIndex; idx < endIslandIndex; idx++)
297 if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
302 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
303 if (colObj0->getIslandTag() == islandId)
305 if (colObj0->getActivationState() ==
ACTIVE_TAG ||
317 for (idx = startIslandIndex; idx < endIslandIndex; idx++)
321 if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
326 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
328 if (colObj0->getIslandTag() == islandId)
337 for (idx = startIslandIndex; idx < endIslandIndex; idx++)
342 if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
347 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
349 if (colObj0->getIslandTag() == islandId)
354 colObj0->setDeactivationTime(0.f);
365 int endIslandIndex = 1;
366 int startIslandIndex;
370 for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex)
375 for (endIslandIndex = startIslandIndex; (endIslandIndex < numElem) && (
getUnionFind().getElement(endIslandIndex).m_id == islandId); endIslandIndex++)
379 bool islandSleeping =
true;
380 for (
int iElem = startIslandIndex; iElem < endIslandIndex; iElem++)
384 if (colObj->isActive())
386 islandSleeping =
false;
392 int numBodies = endIslandIndex - startIslandIndex;
397 for (
int iElem = startIslandIndex; iElem < endIslandIndex; iElem++)
411 for (
int i = 0; i < maxNumManifolds; i++)
423 if (colObj0->isKinematicObject() && colObj0->getActivationState() !=
ISLAND_SLEEPING)
425 if (colObj0->hasContactResponse())
428 if (colObj1->isKinematicObject() && colObj1->getActivationState() !=
ISLAND_SLEEPING)
430 if (colObj1->hasContactResponse())
441 island->manifoldArray.push_back(manifold);
455 if (constraint->isEnabled())
461 island->constraintArray.push_back(constraint);
486 while (destIslandIndex < lastIndex)
493 int firstIndex = lastIndex;
506 if (firstIndex - 1 == destIslandIndex)
517 for (
int i = firstIndex; i <= lastIndex; ++i)
523 lastIndex = firstIndex - 1;
549 for (
int i = 0; i < islands.
size(); ++i)
561 : m_islandsPtr(islandsPtr), m_solverParams(solverParams)
568 for (
int i = iBegin; i < iEnd; ++i)
607 while (iBegin < islandsPtr->
size())
640 for (
int i = 0; i < maxNumManifolds; i++)
652 if (colObj0->isKinematicObject() && colObj0->getActivationState() !=
ISLAND_SLEEPING)
654 if (colObj0->hasContactResponse())
657 if (colObj1->isKinematicObject() && colObj1->getActivationState() !=
ISLAND_SLEEPING)
659 if (colObj1->hasContactResponse())
667 collisionObjects.
size(),
#define DISABLE_DEACTIVATION
#define WANTS_DEACTIVATION
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
#define SIMD_FORCE_INLINE
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint ** constraints
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint int const btContactSolverInfo btIDebugDraw *debugDrawer BT_OVERRIDE
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint int numConstraints
btSequentialImpulseConstraintSolverMt int numBodies
btSequentialImpulseConstraintSolverMt int btPersistentManifold int numManifolds
static int s_minimumContactManifoldsForBatching
SIMD_FORCE_INLINE int calcBatchCost(int bodies, int manifolds, int constraints)
SIMD_FORCE_INLINE int btGetConstraintIslandId1(const btTypedConstraint *lhs)
bool btIsBodyInIsland(const btSimulationIslandManagerMt::Island &island, const btCollisionObject *obj)
int getIslandId(const btPersistentManifold *lhs)
void btParallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody &body)
btTypedConstraint(btTypedConstraintType type, btRigidBody &rbA)
function object that routes calls to operator<
bool operator()(const btSimulationIslandManagerMt::Island *lhs, const btSimulationIslandManagerMt::Island *rhs) const
bool operator()(const btSimulationIslandManagerMt::Island *lhs, const btSimulationIslandManagerMt::Island *rhs) const
SIMD_FORCE_INLINE void reserve(int _Count)
SIMD_FORCE_INLINE int capacity() const
return the pre-allocated (reserved) elements, this is at least as large as the total number of elemen...
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void pop_back()
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()
virtual btScalar solveGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, class btIDebugDraw *debugDrawer, btDispatcher *dispatcher)=0
solve a group of constraints
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
btAlignedObjectArray< Island * > m_allocatedIslands
virtual void addBodiesToIslands(btCollisionWorld *collisionWorld)
virtual void buildAndProcessIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, btAlignedObjectArray< btTypedConstraint * > &constraints, const SolverParams &solverParams)
virtual void initIslandPools()
Island * getIsland(int id)
int m_batchIslandMinBodyCount
virtual Island * allocateIsland(int id, int numBodies)
btAlignedObjectArray< Island * > m_freeIslands
virtual ~btSimulationIslandManagerMt()
btAlignedObjectArray< Island * > m_lookupIslandFromId
virtual void addManifoldsToIslands(btDispatcher *dispatcher)
int m_minimumSolverBatchSize
virtual void addConstraintsToIslands(btAlignedObjectArray< btTypedConstraint * > &constraints)
IslandDispatchFunc m_islandDispatch
btAlignedObjectArray< Island * > m_activeIslands
static void parallelIslandDispatch(btAlignedObjectArray< Island * > *islandsPtr, const SolverParams &solverParams)
static void solveIsland(btConstraintSolver *solver, Island &island, const SolverParams &solverParams)
static void serialIslandDispatch(btAlignedObjectArray< Island * > *islandsPtr, const SolverParams &solverParams)
btSimulationIslandManagerMt()
virtual void mergeIslands()
virtual void buildIslands(btDispatcher *dispatcher, btCollisionWorld *colWorld)
btUnionFind & getUnionFind()
SIMD_FORCE_INLINE int getNumElements() const
btElement & getElement(int index)
SyclQueue void void * src
UpdateIslandDispatcher(btAlignedObjectArray< btSimulationIslandManagerMt::Island * > &islandsPtr, const btSimulationIslandManagerMt::SolverParams &solverParams)
void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
btAlignedObjectArray< btSimulationIslandManagerMt::Island * > & m_islandsPtr
const btSimulationIslandManagerMt::SolverParams & m_solverParams
btAlignedObjectArray< btTypedConstraint * > constraintArray
void append(const Island &other)
btAlignedObjectArray< btCollisionObject * > bodyArray
btAlignedObjectArray< btPersistentManifold * > manifoldArray
btContactSolverInfo * m_solverInfo
btDispatcher * m_dispatcher
btConstraintSolver * m_solverPool
btConstraintSolver * m_solverMt
btIDebugDraw * m_debugDrawer