Initialize the constraint solver for a given island
| 113 | |
| 114 | // Initialize the constraint solver for a given island |
| 115 | void ContactSolverSystem::initializeForIsland(uint32 islandIndex) { |
| 116 | |
| 117 | RP3D_PROFILE("ContactSolver::initializeForIsland()", mProfiler); |
| 118 | |
| 119 | assert(mIslands.nbBodiesInIsland[islandIndex] > 0); |
| 120 | assert(mIslands.nbContactManifolds[islandIndex] > 0); |
| 121 | |
| 122 | // For each contact manifold of the island |
| 123 | const uint32 contactManifoldsIndex = mIslands.contactManifoldsIndices[islandIndex]; |
| 124 | const uint32 nbContactManifolds = mIslands.nbContactManifolds[islandIndex]; |
| 125 | for (uint32 m=contactManifoldsIndex; m < contactManifoldsIndex + nbContactManifolds; m++) { |
| 126 | |
| 127 | ContactManifold& externalManifold = (*mAllContactManifolds)[m]; |
| 128 | |
| 129 | assert(externalManifold.nbContactPoints > 0); |
| 130 | |
| 131 | const uint32 rigidBodyIndex1 = mRigidBodyComponents.getEntityIndex(externalManifold.bodyEntity1); |
| 132 | const uint32 rigidBodyIndex2 = mRigidBodyComponents.getEntityIndex(externalManifold.bodyEntity2); |
| 133 | |
| 134 | const uint32 collider1Index = mColliderComponents.getEntityIndex(externalManifold.colliderEntity1); |
| 135 | const uint32 collider2Index = mColliderComponents.getEntityIndex(externalManifold.colliderEntity2); |
| 136 | |
| 137 | // Get the position of the two bodies |
| 138 | const Vector3& x1 = mRigidBodyComponents.mCentersOfMassWorld[rigidBodyIndex1]; |
| 139 | const Vector3& x2 = mRigidBodyComponents.mCentersOfMassWorld[rigidBodyIndex2]; |
| 140 | |
| 141 | // Initialize the internal contact manifold structure using the external contact manifold |
| 142 | new (mContactConstraints + mNbContactManifolds) ContactManifoldSolver(); |
| 143 | mContactConstraints[mNbContactManifolds].rigidBodyComponentIndexBody1 = rigidBodyIndex1; |
| 144 | mContactConstraints[mNbContactManifolds].rigidBodyComponentIndexBody2 = rigidBodyIndex2; |
| 145 | mContactConstraints[mNbContactManifolds].inverseInertiaTensorBody1 = mRigidBodyComponents.mInverseInertiaTensorsWorld[rigidBodyIndex1]; |
| 146 | mContactConstraints[mNbContactManifolds].inverseInertiaTensorBody2 = mRigidBodyComponents.mInverseInertiaTensorsWorld[rigidBodyIndex2]; |
| 147 | mContactConstraints[mNbContactManifolds].massInverseBody1 = mRigidBodyComponents.mInverseMasses[rigidBodyIndex1]; |
| 148 | mContactConstraints[mNbContactManifolds].massInverseBody2 = mRigidBodyComponents.mInverseMasses[rigidBodyIndex2]; |
| 149 | mContactConstraints[mNbContactManifolds].linearLockAxisFactorBody1 = mRigidBodyComponents.mLinearLockAxisFactors[rigidBodyIndex1]; |
| 150 | mContactConstraints[mNbContactManifolds].linearLockAxisFactorBody2 = mRigidBodyComponents.mLinearLockAxisFactors[rigidBodyIndex2]; |
| 151 | mContactConstraints[mNbContactManifolds].angularLockAxisFactorBody1 = mRigidBodyComponents.mAngularLockAxisFactors[rigidBodyIndex1]; |
| 152 | mContactConstraints[mNbContactManifolds].angularLockAxisFactorBody2 = mRigidBodyComponents.mAngularLockAxisFactors[rigidBodyIndex2]; |
| 153 | mContactConstraints[mNbContactManifolds].nbContacts = externalManifold.nbContactPoints; |
| 154 | mContactConstraints[mNbContactManifolds].frictionCoefficient = computeMixedFrictionCoefficient(mColliderComponents.mMaterials[collider1Index], mColliderComponents.mMaterials[collider2Index]); |
| 155 | mContactConstraints[mNbContactManifolds].externalContactManifold = &externalManifold; |
| 156 | mContactConstraints[mNbContactManifolds].normal.setToZero(); |
| 157 | mContactConstraints[mNbContactManifolds].frictionPointBody1.setToZero(); |
| 158 | mContactConstraints[mNbContactManifolds].frictionPointBody2.setToZero(); |
| 159 | |
| 160 | // Get the velocities of the bodies |
| 161 | const Vector3& v1 = mRigidBodyComponents.mLinearVelocities[rigidBodyIndex1]; |
| 162 | const Vector3& w1 = mRigidBodyComponents.mAngularVelocities[rigidBodyIndex1]; |
| 163 | const Vector3& v2 = mRigidBodyComponents.mLinearVelocities[rigidBodyIndex2]; |
| 164 | const Vector3& w2 = mRigidBodyComponents.mAngularVelocities[rigidBodyIndex2]; |
| 165 | |
| 166 | const Transform& collider1LocalToWorldTransform = mColliderComponents.mLocalToWorldTransforms[collider1Index]; |
| 167 | const Transform& collider2LocalToWorldTransform = mColliderComponents.mLocalToWorldTransforms[collider2Index]; |
| 168 | |
| 169 | // For each contact point of the contact manifold |
| 170 | assert(externalManifold.nbContactPoints > 0); |
| 171 | const uint32 contactPointsStartIndex = externalManifold.contactPointsIndex; |
| 172 | const uint32 nbContactPoints = static_cast<uint>(externalManifold.nbContactPoints); |
nothing calls this directly
no test coverage detected