From 7da46bca8bf17357ef3d2b530dfcb42f4024bad7 Mon Sep 17 00:00:00 2001
From: dsehnal <david.sehnal@gmail.com>
Date: Fri, 24 Mar 2023 19:52:11 +0100
Subject: [PATCH] scale move speed by frametime

---
 src/mol-canvas3d/controls/trackball.ts | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/mol-canvas3d/controls/trackball.ts b/src/mol-canvas3d/controls/trackball.ts
index cb122268d..fc9b7fce0 100644
--- a/src/mol-canvas3d/controls/trackball.ts
+++ b/src/mol-canvas3d/controls/trackball.ts
@@ -371,11 +371,11 @@ namespace TrackballControls {
         const moveDir = Vec3();
         const moveEye = Vec3();
 
-        function moveCamera() {
+        function moveCamera(deltaT: number) {
             Vec3.sub(moveEye, camera.position, camera.target);
             Vec3.setMagnitude(moveEye, moveEye, camera.state.minNear);
 
-            const moveSpeed = p.moveSpeed * (keyState.boostMove === 1 ? p.boostMoveFactor : 1);
+            const moveSpeed = deltaT * (60 / 1000) * p.moveSpeed * (keyState.boostMove === 1 ? p.boostMoveFactor : 1);
 
             if (keyState.moveForward === 1) {
                 Vec3.normalize(moveDir, moveEye);
@@ -483,9 +483,11 @@ namespace TrackballControls {
         /** Update the object's position, direction and up vectors */
         function update(t: number) {
             if (lastUpdated === t) return;
+
+            const deltaT = t - lastUpdated;
             if (lastUpdated > 0) {
-                if (p.animate.name === 'spin') spin(t - lastUpdated);
-                else if (p.animate.name === 'rock') rock(t - lastUpdated);
+                if (p.animate.name === 'spin') spin(deltaT);
+                else if (p.animate.name === 'rock') rock(deltaT);
             }
 
             Vec3.sub(_eye, camera.position, camera.target);
@@ -501,7 +503,9 @@ namespace TrackballControls {
             Vec3.add(camera.position, camera.target, _eye);
             checkDistances();
 
-            moveCamera();
+            if (lastUpdated > 0 && deltaT < 1000) {
+                moveCamera(deltaT);
+            }
 
             Vec3.sub(_eye, camera.position, camera.target);
             checkDistances();
-- 
GitLab