public bool Compare(TypedConstraint lhs, TypedConstraint rhs) { int rIslandId0 = DiscreteDynamicsWorld.GetConstraintIslandId(rhs); int lIslandId0 = DiscreteDynamicsWorld.GetConstraintIslandId(lhs); return(lIslandId0 < rIslandId0); }
public virtual void ProcessIsland(ObjectArray <CollisionObject> bodies, int numBodies, PersistentManifoldArray manifolds, int startManifold, int numManifolds, int islandId) { if (islandId < 0) { if (numManifolds + m_numConstraints > 0) { ///we don't split islands, so all constraints/contact manifolds/bodies are passed into the solver regardless the island id m_solver.SolveGroup(bodies, numBodies, manifolds, startManifold, numManifolds, m_sortedConstraints, 0, m_numConstraints, m_solverInfo, m_debugDrawer, m_dispatcher); } } else { //also add all non-contact constraints/joints for this island int startConstraint = 0; int numCurConstraints = 0; int i = 0; //find the first constraint for this island for (i = 0; i < m_numConstraints; i++) { if (DiscreteDynamicsWorld.GetConstraintIslandId(m_sortedConstraints[i]) == islandId) { startConstraint = i; break; } } //count the number of constraints in this island for (; i < m_numConstraints; i++) { if (DiscreteDynamicsWorld.GetConstraintIslandId(m_sortedConstraints[i]) == islandId) { numCurConstraints++; } } if (m_solverInfo.m_minimumSolverBatchSize <= 1) { ///only call solveGroup if there is some work: avoid virtual function call, its overhead can be excessive if (numManifolds + numCurConstraints > 0) { m_solver.SolveGroup(bodies, numBodies, manifolds, startManifold, numManifolds, m_sortedConstraints, startConstraint, numCurConstraints, m_solverInfo, m_debugDrawer, m_dispatcher); } } else { for (i = 0; i < numBodies; i++) { m_bodies.Add(bodies[i]); } int lastManifold = startManifold + numManifolds; for (i = startManifold; i < lastManifold; i++) { m_manifolds.Add(manifolds[i]); } int lastConstraint = startConstraint + numCurConstraints; for (i = startConstraint; i < lastConstraint; i++) { m_constraints.Add(m_sortedConstraints[i]); } if ((m_constraints.Count + m_manifolds.Count) > m_solverInfo.m_minimumSolverBatchSize) { ProcessConstraints(); } else { //printf("deferred\n"); } } } }