From bc97901858458f15d2c17becb7d39c05b897edae Mon Sep 17 00:00:00 2001
From: Julius Nehring-Wirxel <julius.nehring-wirxel@rwth-aachen.de>
Date: Thu, 30 Nov 2023 16:30:54 +0100
Subject: [PATCH] Fix numerical bug in the glow-viewer

---
 viewer/glow-extras/viewer/ViewerRenderer.cc | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/viewer/glow-extras/viewer/ViewerRenderer.cc b/viewer/glow-extras/viewer/ViewerRenderer.cc
index c96b868e..d17f6a31 100644
--- a/viewer/glow-extras/viewer/ViewerRenderer.cc
+++ b/viewer/glow-extras/viewer/ViewerRenderer.cc
@@ -484,7 +484,12 @@ void glow::viewer::ViewerRenderer::renderSubview(
                         p.y += s.y * y;
                         p.z += s.z * z;
                         auto pd = normalize(p - sunPosJitter);
-                        sunFov = tg::max(tg::acos(dot(sunDir, pd)) * 2, sunFov);
+                        auto dot = tg::dot(sunDir, pd);
+                        // assure dot is in [-1, 1] so that acos is well defined.
+                        // even though the dot product of two normalized vectors should be in [-1, 1],
+                        // numerical errors can lead to values slightly outside this range.
+                        dot = tg::clamp(dot, -1.0f, 1.0f);
+                        sunFov = tg::max(tg::acos(dot) * 2, sunFov);
                     }
 
         auto sunView = tg::look_at_opengl(sunPosJitter, boundingInfo.center, tg::vec3::unit_x);
-- 
GitLab