From 1bc1f0621e06c658dea855cfbf4b804f5389ebaf Mon Sep 17 00:00:00 2001 From: Daniel Chappuis Date: Thu, 15 Oct 2020 22:23:32 +0200 Subject: [PATCH] Optimizations --- src/systems/DynamicsSystem.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/systems/DynamicsSystem.cpp b/src/systems/DynamicsSystem.cpp index b30506d6..409c9dac 100644 --- a/src/systems/DynamicsSystem.cpp +++ b/src/systems/DynamicsSystem.cpp @@ -47,7 +47,8 @@ void DynamicsSystem::integrateRigidBodiesPositions(decimal timeStep, bool isSpli const decimal isSplitImpulseFactor = isSplitImpulseActive ? decimal(1.0) : decimal(0.0); - for (uint32 i=0; i < mRigidBodyComponents.getNbEnabledComponents(); i++) { + const uint32 nbRigidBodyComponents = mRigidBodyComponents.getNbEnabledComponents(); + for (uint32 i=0; i < nbRigidBodyComponents; i++) { // Get the constrained velocity Vector3 newLinVelocity = mRigidBodyComponents.mConstrainedLinearVelocities[i]; @@ -74,7 +75,8 @@ void DynamicsSystem::updateBodiesState() { RP3D_PROFILE("DynamicsSystem::updateBodiesState()", mProfiler); - for (uint32 i=0; i < mRigidBodyComponents.getNbEnabledComponents(); i++) { + const uint32 nbRigidBodyComponents = mRigidBodyComponents.getNbEnabledComponents(); + for (uint32 i=0; i < nbRigidBodyComponents; i++) { // Update the linear and angular velocity of the body mRigidBodyComponents.mLinearVelocities[i] = mRigidBodyComponents.mConstrainedLinearVelocities[i]; @@ -89,7 +91,7 @@ void DynamicsSystem::updateBodiesState() { } // Update the position of the body (using the new center of mass and new orientation) - for (uint32 i=0; i < mRigidBodyComponents.getNbEnabledComponents(); i++) { + for (uint32 i=0; i < nbRigidBodyComponents; i++) { Transform& transform = mTransformComponents.getTransform(mRigidBodyComponents.mBodiesEntities[i]); const Vector3& centerOfMassWorld = mRigidBodyComponents.mCentersOfMassWorld[i]; @@ -98,7 +100,8 @@ void DynamicsSystem::updateBodiesState() { } // Update the local-to-world transform of the colliders - for (uint32 i=0; i < mColliderComponents.getNbEnabledComponents(); i++) { + const uint32 nbColliderComponents = mColliderComponents.getNbEnabledComponents(); + for (uint32 i=0; i < nbColliderComponents; i++) { // Update the local-to-world transform of the collider mColliderComponents.mLocalToWorldTransforms[i] = mTransformComponents.getTransform(mColliderComponents.mBodiesEntities[i]) * @@ -119,7 +122,8 @@ void DynamicsSystem::integrateRigidBodiesVelocities(decimal timeStep) { resetSplitVelocities(); // Integration component velocities using force/torque - for (uint32 i=0; i < mRigidBodyComponents.getNbEnabledComponents(); i++) { + const uint32 nbEnabledRigidBodyComponents = mRigidBodyComponents.getNbEnabledComponents(); + for (uint32 i=0; i < nbEnabledRigidBodyComponents; i++) { assert(mRigidBodyComponents.mSplitLinearVelocities[i] == Vector3(0, 0, 0)); assert(mRigidBodyComponents.mSplitAngularVelocities[i] == Vector3(0, 0, 0)); @@ -137,7 +141,8 @@ void DynamicsSystem::integrateRigidBodiesVelocities(decimal timeStep) { // Apply gravity force if (mIsGravityEnabled) { - for (uint32 i=0; i < mRigidBodyComponents.getNbEnabledComponents(); i++) { + const uint32 nbRigidBodyComponents = mRigidBodyComponents.getNbEnabledComponents(); + for (uint32 i=0; i < nbRigidBodyComponents; i++) { // If the gravity has to be applied to this rigid body if (mRigidBodyComponents.mIsGravityEnabled[i]) { @@ -162,7 +167,8 @@ void DynamicsSystem::integrateRigidBodiesVelocities(decimal timeStep) { // Using Taylor Serie for e^(-x) : e^x ~ 1 + x + x^2/2! + ... // => e^(-x) ~ 1 - x // => v2 = v1 * (1 - c * dt) - for (uint32 i=0; i < mRigidBodyComponents.getNbEnabledComponents(); i++) { + const uint32 nbRigidBodyComponents = mRigidBodyComponents.getNbEnabledComponents(); + for (uint32 i=0; i < nbRigidBodyComponents; i++) { const decimal linDampingFactor = mRigidBodyComponents.mLinearDampings[i]; const decimal angDampingFactor = mRigidBodyComponents.mAngularDampings[i]; @@ -177,7 +183,8 @@ void DynamicsSystem::integrateRigidBodiesVelocities(decimal timeStep) { void DynamicsSystem::resetBodiesForceAndTorque() { // For each body of the world - for (uint32 i=0; i < mRigidBodyComponents.getNbComponents(); i++) { + const uint32 nbRigidBodyComponents = mRigidBodyComponents.getNbComponents(); + for (uint32 i=0; i < nbRigidBodyComponents; i++) { mRigidBodyComponents.mExternalForces[i].setToZero(); mRigidBodyComponents.mExternalTorques[i].setToZero(); } @@ -186,7 +193,8 @@ void DynamicsSystem::resetBodiesForceAndTorque() { // Reset the split velocities of the bodies void DynamicsSystem::resetSplitVelocities() { - for(uint32 i=0; i < mRigidBodyComponents.getNbEnabledComponents(); i++) { + const uint32 nbRigidBodyComponents = mRigidBodyComponents.getNbEnabledComponents(); + for(uint32 i=0; i < nbRigidBodyComponents; i++) { mRigidBodyComponents.mSplitLinearVelocities[i].setToZero(); mRigidBodyComponents.mSplitAngularVelocities[i].setToZero(); }