From e5ba4cc7b0077aa449685ecff9eb7b4181b559df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 23 Aug 2024 17:10:34 +0200 Subject: [PATCH] Fix: Overlay: Missing backface culling in facing overlay Same fix as for legacy overlay. Fix #126351 --- .../draw/engines/overlay/overlay_next_facing.hh | 11 ++++++++--- .../draw/engines/overlay/overlay_next_prepass.hh | 8 +++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_next_facing.hh b/source/blender/draw/engines/overlay/overlay_next_facing.hh index 829490f44db..20d53b597e9 100644 --- a/source/blender/draw/engines/overlay/overlay_next_facing.hh +++ b/source/blender/draw/engines/overlay/overlay_next_facing.hh @@ -28,16 +28,21 @@ class Facing { void begin_sync(Resources &res, const State &state) { - enabled = state.overlay.flag & V3D_OVERLAY_FACE_ORIENTATION && !state.xray_enabled && - selection_type_ == SelectionType::DISABLED; + enabled = state.v3d && (state.overlay.flag & V3D_OVERLAY_FACE_ORIENTATION) && + !state.xray_enabled && (selection_type_ == SelectionType::DISABLED); if (!enabled) { /* Not used. But release the data. */ ps_.init(); return; } + + const View3DShading &shading = state.v3d->shading; + bool use_cull = ((shading.type == OB_SOLID) && (shading.flag & V3D_SHADING_BACKFACE_CULLING)); + DRWState backface_cull_state = use_cull ? DRW_STATE_CULL_BACK : DRWState(0); + ps_.init(); ps_.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH | - state.clipping_state); + state.clipping_state | backface_cull_state); ps_.shader_set(res.shaders.facing.get()); ps_.bind_ubo("globalsBlock", &res.globals_buf); } diff --git a/source/blender/draw/engines/overlay/overlay_next_prepass.hh b/source/blender/draw/engines/overlay/overlay_next_prepass.hh index d32aacf94ba..7e54dc64e2e 100644 --- a/source/blender/draw/engines/overlay/overlay_next_prepass.hh +++ b/source/blender/draw/engines/overlay/overlay_next_prepass.hh @@ -34,8 +34,14 @@ class Prepass { ps_.init(); return; } + + const View3DShading &shading = state.v3d->shading; + bool use_cull = ((shading.type == OB_SOLID) && (shading.flag & V3D_SHADING_BACKFACE_CULLING)); + DRWState backface_cull_state = use_cull ? DRW_STATE_CULL_BACK : DRWState(0); + ps_.init(); - ps_.state_set(DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | state.clipping_state); + ps_.state_set(DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | state.clipping_state | + backface_cull_state); ps_.shader_set(res.shaders.depth_mesh.get()); res.select_bind(ps_); }