From ed5b077f929a14528df0b5fb1c5a8407fe4eebe7 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 17 Feb 2025 14:14:12 +0100 Subject: [PATCH] Fix #134634: Overlay: Mask not drawing on top of render result/viewer Logical error in the overlay engine. Moved mask drawing before the early exit for viewer/render results. Pull Request: https://projects.blender.org/blender/blender/pulls/134660 --- .../draw/engines/overlay/overlay_next_mesh.hh | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_next_mesh.hh b/source/blender/draw/engines/overlay/overlay_next_mesh.hh index d31edc27730..56b63483d52 100644 --- a/source/blender/draw/engines/overlay/overlay_next_mesh.hh +++ b/source/blender/draw/engines/overlay/overlay_next_mesh.hh @@ -528,16 +528,6 @@ class MeshUVs : Overlay { const ToolSettings *tool_setting = state.scene->toolsettings; const SpaceImage *space_image = reinterpret_cast(state.space_data); ::Image *image = space_image->image; - const bool is_tiled_image = image && (image->source == IMA_SRC_TILED); - const bool is_viewer = image && ELEM(image->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE); - /* Only disable UV drawing on top of render results. - * Otherwise, show UVs even in the absence of active image. */ - enabled_ = !is_viewer; - - if (!enabled_) { - return; - } - const bool space_mode_is_paint = space_image->mode == SI_MODE_PAINT; const bool space_mode_is_view = space_image->mode == SI_MODE_VIEW; const bool space_mode_is_mask = space_image->mode == SI_MODE_MASK; @@ -546,6 +536,31 @@ class MeshUVs : Overlay { const bool object_mode_is_edit = state.object_mode & OB_MODE_EDIT; const bool object_mode_is_paint = state.object_mode & OB_MODE_TEXTURE_PAINT; + const bool is_viewer = image && ELEM(image->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE); + const bool is_tiled_image = image && (image->source == IMA_SRC_TILED); + + /* The mask overlay is always drawn when enabled, even on top of viewers. */ + { + /* Mask Overlay. */ + show_mask_ = space_mode_is_mask && space_image->mask_info.mask && + space_image->mask_info.draw_flag & MASK_DRAWFLAG_OVERLAY; + if (show_mask_) { + mask_mode_ = eMaskOverlayMode(space_image->mask_info.overlay_mode); + mask_id_ = (Mask *)DEG_get_evaluated_id(state.depsgraph, &space_image->mask_info.mask->id); + } + else { + mask_id_ = nullptr; + } + } + + /* Only disable UV drawing on top of render results. + * Otherwise, show UVs even in the absence of active image. */ + enabled_ = !is_viewer || show_mask_; + + if (!enabled_) { + return; + } + { /* Edit UV Overlay. */ show_uv_edit = space_mode_is_uv && object_mode_is_edit; @@ -605,18 +620,6 @@ class MeshUVs : Overlay { (brush->image_brush_type == IMAGE_PAINT_BRUSH_TYPE_CLONE) && brush->clone.image; } - { - /* Mask Overlay. */ - show_mask_ = space_mode_is_mask && space_image->mask_info.mask && - space_image->mask_info.draw_flag & MASK_DRAWFLAG_OVERLAY; - if (show_mask_) { - mask_mode_ = eMaskOverlayMode(space_image->mask_info.overlay_mode); - mask_id_ = (Mask *)DEG_get_evaluated_id(state.depsgraph, &space_image->mask_info.mask->id); - } - else { - mask_id_ = nullptr; - } - } { /* UDIM Overlay. */ /* TODO: Always enable this overlay even if overlays are disabled. */