From f7ef7eff5e57a5e0cc5fa96ca048bd17e2ef7ef0 Mon Sep 17 00:00:00 2001 From: Miguel Pozo Date: Thu, 9 Oct 2025 16:58:58 +0200 Subject: [PATCH] Fix: Overlay: Broken outline detection for faces perpedicular to the view Apply the same fix used for Armatures. Partially fixes #139555. For correct flat object detection, #145227 is also needed. (4.5 backport candidate) Pull Request: https://projects.blender.org/blender/blender/pulls/147722 --- .../shaders/overlay_armature_shape_outline_vert.glsl | 2 +- .../shaders/overlay_outline_prepass_wire_vert.glsl | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/source/blender/draw/engines/overlay/shaders/overlay_armature_shape_outline_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_armature_shape_outline_vert.glsl index fa7118916dc..f60d3be0042 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_armature_shape_outline_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_armature_shape_outline_vert.glsl @@ -107,7 +107,7 @@ void geometry_main(VertOut geom_in[4], float fac3 = dot(view_vec, n3); /* If one of the face is perpendicular to the view, - * consider it and outline edge. */ + * consider it an outline edge. */ if (abs(fac0) > 1e-5f && abs(fac3) > 1e-5f) { /* If both adjacent verts are facing the camera the same way, * then it isn't an outline edge. */ diff --git a/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_wire_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_wire_vert.glsl index 7af0a3d6c4d..ecfb72cc9dd 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_wire_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_wire_vert.glsl @@ -91,10 +91,14 @@ void geometry_main(VertOut geom_in[4], float fac0 = dot(view_vec, n0); float fac3 = dot(view_vec, n3); - /* If both adjacent verts are facing the camera the same way, - * then it isn't an outline edge. */ - if (sign(fac0) == sign(fac3)) { - return; + /* If one of the face is perpendicular to the view, + * consider it an outline edge. */ + if (abs(fac0) > 1e-5f && abs(fac3) > 1e-5f) { + /* If both adjacent verts are facing the camera the same way, + * then it isn't an outline edge. */ + if (sign(fac0) == sign(fac3)) { + return; + } } VertOut export_vert = (out_vertex_id == 0) ? geom_in[1] : geom_in[2];