diff --git a/src/LunarWM_wayland.c b/src/LunarWM_wayland.c index 5650647..717649a 100644 --- a/src/LunarWM_wayland.c +++ b/src/LunarWM_wayland.c @@ -1594,6 +1594,18 @@ static void handle_output_frame(struct wl_listener *listener, void *data) if (!wm->xr.available && !wm->renderer.first_frame) { wm->renderer.camera.target = SphericalToVector3(wm->wm.pointer); + + Vector3 forward = Vector3Normalize(Vector3Subtract( + wm->renderer.camera.target, wm->renderer.camera.position)); + Vector3 worldUp = (Vector3) { 0, 1, 0 }; + + if (fabsf(Vector3DotProduct(forward, worldUp)) > 0.999f) { + worldUp = (Vector3) { 0, 0, 1 }; + } + + Vector3 right = Vector3Normalize(Vector3CrossProduct(forward, worldUp)); + wm->renderer.camera.up + = Vector3Normalize(Vector3CrossProduct(right, forward)); } int const hud_size = wm->cman->cfg.displays.hud.size;