@@ -173,6 +173,12 @@ void processRotate(glm::vec2 startP, glm::vec2 endP) {
173173
174174 // Undo centering
175175 viewMat = glm::translate (viewMat, -view::viewCenter);
176+
177+ // Enforce that the view indeed looks towards the center, as it always should with Turntable mode.
178+ // Mostly this will have no effect, but it can prevent gradual numerical drift where the center shifts relvative to
179+ // the view matrix.
180+ lookAt (view::getCameraWorldPosition (), view::viewCenter, view::getUpVec (), false );
181+
176182 break ;
177183 }
178184 case NavigateStyle::Free: {
@@ -266,11 +272,21 @@ void processTranslate(glm::vec2 delta) {
266272 if (glm::length (delta) == 0 ) {
267273 return ;
268274 }
275+
269276 // Process a translation
270277 float movementScale = state::lengthScale * 0.6 * moveScale;
271278 glm::mat4x4 camSpaceT = glm::translate (glm::mat4x4 (1.0 ), movementScale * glm::vec3 (delta.x , delta.y , 0.0 ));
272279 viewMat = camSpaceT * viewMat;
273280
281+ if (getNavigateStyle () == NavigateStyle::Turntable) {
282+ // also translate the turntable center according to the same motion
283+ glm::vec3 oldCenter = view::viewCenter;
284+ glm::vec3 worldspaceT =
285+ glm::transpose (glm::mat3 (viewMat)) * glm::vec3 (-movementScale * delta.x , -movementScale * delta.y , 0.0 );
286+ glm::vec3 newCenter = oldCenter + worldspaceT;
287+ setViewCenter (newCenter, false );
288+ }
289+
274290 requestRedraw ();
275291 immediatelyEndFlight ();
276292}
0 commit comments