MCPcopy Create free account
hub / github.com/DanielChappuis/reactphysics3d / initializeForIsland

Method initializeForIsland

src/systems/ContactSolverSystem.cpp:115–320  ·  view source on GitHub ↗

Initialize the constraint solver for a given island

Source from the content-addressed store, hash-verified

113
114// Initialize the constraint solver for a given island
115void 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);

Callers

nothing calls this directly

Calls 9

getEntityIndexMethod · 0.80
getIsRestingContactMethod · 0.80
setIsRestingContactMethod · 0.80
getPenetrationImpulseMethod · 0.80
setToZeroMethod · 0.45
getPenetrationDepthMethod · 0.45
dotMethod · 0.45
crossMethod · 0.45
normalizeMethod · 0.45

Tested by

no test coverage detected