From cf952b34e44e902b07677a0e176ff1836551af96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lancelot=20de=20Ferri=C3=A8re?= Date: Sat, 10 May 2025 17:34:29 +0200 Subject: [PATCH] Fix silhouette calculation after 8a40673 Fixes #7804 --- source/renderer/SilhouetteRenderer.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/source/renderer/SilhouetteRenderer.cpp b/source/renderer/SilhouetteRenderer.cpp index aaba339f29..df55470204 100644 --- a/source/renderer/SilhouetteRenderer.cpp +++ b/source/renderer/SilhouetteRenderer.cpp @@ -181,8 +181,8 @@ static void ComputeScreenBounds(Occluder& occluder, const CBoundingBoxAligned& b { CVector4D svec = proj.Transform(CVector4D(bounds[ix].X, bounds[iy].Y, bounds[iz].Z, 1.0f)); // Avoid overflows - u16 svx = g_HalfMaxCoord + static_cast(Clamp(g_HalfMaxCoord * svec.X / svec.W, 0.f, static_cast(g_MaxCoord - 1))); - u16 svy = g_HalfMaxCoord + static_cast(Clamp(g_HalfMaxCoord * svec.Y / svec.W, 0.f, static_cast(g_MaxCoord - 1))); + u16 svx = static_cast(Clamp(g_HalfMaxCoord + g_HalfMaxCoord * (svec.X / svec.W), 0.f, static_cast(g_MaxCoord - 1))); + u16 svy = static_cast(Clamp(g_HalfMaxCoord + g_HalfMaxCoord * (svec.Y / svec.W), 0.f, static_cast(g_MaxCoord - 1))); x0 = std::min(x0, svx); y0 = std::min(y0, svy); x1 = std::max(x1, svx); @@ -204,10 +204,8 @@ static void ComputeScreenBounds(Occluder& occluder, const CBoundingBoxAligned& b static void ComputeScreenPos(Caster& caster, const CVector3D& pos, CMatrix3D& proj) { CVector4D svec = proj.Transform(CVector4D(pos.X, pos.Y, pos.Z, 1.0f)); - u16 x = g_HalfMaxCoord + static_cast(g_HalfMaxCoord * svec.X / svec.W); - u16 y = g_HalfMaxCoord + static_cast(g_HalfMaxCoord * svec.Y / svec.W); - caster.x = Clamp(x, std::numeric_limits::min(), static_cast(g_MaxCoord - 1)); - caster.y = Clamp(y, std::numeric_limits::min(), static_cast(g_MaxCoord - 1)); + caster.x = static_cast(Clamp(g_HalfMaxCoord + g_HalfMaxCoord * (svec.X / svec.W), 0.f, static_cast(g_MaxCoord - 1))); + caster.y = static_cast(Clamp(g_HalfMaxCoord + g_HalfMaxCoord * (svec.Y / svec.W), 0.f, static_cast(g_MaxCoord - 1))); caster.z = svec.Z / svec.W; }