Skip to content

Commit 129c680

Browse files
committed
change the default turntable pan behavior to shift the view center
1 parent 420d2aa commit 129c680

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

src/view.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)