From c0492e5448ed7bb3265af2f0e5385faaeab85ba5 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 17 Oct 2017 20:02:29 +0300
Subject: [PATCH] MAINT-989 Velocity and acceleration should take time into
 account

---
 indra/newview/llphysicsmotion.cpp | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index ea10d03264f..15d39c231fe 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -171,8 +171,8 @@ class LLPhysicsMotion
                                                    F32 behavior_maxeffect);
 
         F32 toLocal(const LLVector3 &world);
-        F32 calculateVelocity_local();
-        F32 calculateAcceleration_local(F32 velocity_local);
+        F32 calculateVelocity_local(const F32 time_delta);
+        F32 calculateAcceleration_local(F32 velocity_local, const F32 time_delta);
 private:
         const std::string mParamDriverName;
         const std::string mParamControllerName;
@@ -425,23 +425,22 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world)
         return world * dir_world;
 }
 
-F32 LLPhysicsMotion::calculateVelocity_local()
+F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta)
 {
 	const F32 world_to_model_scale = 100.0f;
         LLJoint *joint = mJointState->getJoint();
         const LLVector3 position_world = joint->getWorldPosition();
         const LLVector3 last_position_world = mPosition_world;
 	const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale;
-        const LLVector3 velocity_world = positionchange_world;
-        const F32 velocity_local = toLocal(velocity_world);
+        const F32 velocity_local = toLocal(positionchange_world) / time_delta;
         return velocity_local;
 }
 
-F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local)
+F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, const F32 time_delta)
 {
 //        const F32 smoothing = getParamValue("Smoothing");
         static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary
-        const F32 acceleration_local = velocity_local - mVelocityJoint_local;
+        const F32 acceleration_local = (velocity_local - mVelocityJoint_local) / time_delta;
         
         const F32 smoothed_acceleration_local = 
                 acceleration_local * 1.0/smoothing + 
@@ -544,9 +543,9 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 	// Calculate velocity and acceleration in parameter space.
 	//
         
-	//const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step);
-	const F32 velocity_joint_local = calculateVelocity_local();
-	const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local);
+    const F32 joint_local_factor = 30.0;
+    const F32 velocity_joint_local = calculateVelocity_local(time_delta * joint_local_factor);
+    const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_delta * joint_local_factor);
 	
 	//
 	// End velocity and acceleration
-- 
GitLab