From 05acda68ae7a3b7d1bcf252fff00780b9c798f64 Mon Sep 17 00:00:00 2001 From: Brian Jensen Date: Sat, 16 Nov 2019 09:35:29 +0100 Subject: [PATCH] cache contact contraint and keylookup, improves performance usage of solve call from approx. 20% to 15% for a specific scene --- src/engine/ContactSolver.cpp | 245 ++++++++++++++++++----------------- 1 file changed, 125 insertions(+), 120 deletions(-) diff --git a/src/engine/ContactSolver.cpp b/src/engine/ContactSolver.cpp index b7783b1c..d114725f 100644 --- a/src/engine/ContactSolver.cpp +++ b/src/engine/ContactSolver.cpp @@ -496,13 +496,18 @@ void ContactSolver::solve() { decimal sumPenetrationImpulse = 0.0; - // Get the constrained velocities - const Vector3& v1 = mLinearVelocities[mContactConstraints[c].indexBody1]; - const Vector3& w1 = mAngularVelocities[mContactConstraints[c].indexBody1]; - const Vector3& v2 = mLinearVelocities[mContactConstraints[c].indexBody2]; - const Vector3& w2 = mAngularVelocities[mContactConstraints[c].indexBody2]; + ContactManifoldSolver& contactConstrait( mContactConstraints[c] ); - for (short int i=0; i 0) { + if (contactConstrait.rollingResistanceFactor > 0) { // Compute J*v const Vector3 JvRolling = w2 - w1; // Compute the Lagrange multiplier lambda - Vector3 deltaLambdaRolling = mContactConstraints[c].inverseRollingResistance * (-JvRolling); - decimal rollingLimit = mContactConstraints[c].rollingResistanceFactor * sumPenetrationImpulse; - Vector3 lambdaTempRolling = mContactConstraints[c].rollingResistanceImpulse; - mContactConstraints[c].rollingResistanceImpulse = clamp(mContactConstraints[c].rollingResistanceImpulse + + Vector3 deltaLambdaRolling = contactConstrait.inverseRollingResistance * (-JvRolling); + decimal rollingLimit = contactConstrait.rollingResistanceFactor * sumPenetrationImpulse; + Vector3 lambdaTempRolling = contactConstrait.rollingResistanceImpulse; + contactConstrait.rollingResistanceImpulse = clamp(contactConstrait.rollingResistanceImpulse + deltaLambdaRolling, rollingLimit); - deltaLambdaRolling = mContactConstraints[c].rollingResistanceImpulse - lambdaTempRolling; + deltaLambdaRolling = contactConstrait.rollingResistanceImpulse - lambdaTempRolling; // Update the velocities of the body 1 by applying the impulse P - mAngularVelocities[mContactConstraints[c].indexBody1] -= mContactConstraints[c].inverseInertiaTensorBody1 * deltaLambdaRolling; + mAngularVelocities[contactConstraintIndexBody1] -= contactConstrait.inverseInertiaTensorBody1 * deltaLambdaRolling; // Update the velocities of the body 2 by applying the impulse P - mAngularVelocities[mContactConstraints[c].indexBody2] += mContactConstraints[c].inverseInertiaTensorBody2 * deltaLambdaRolling; + mAngularVelocities[contactConstraintIndexBody2] += contactConstrait.inverseInertiaTensorBody2 * deltaLambdaRolling; } } }