From e9638b4a0a32bf6970fd60999737639c569a514e Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Mon, 15 Sep 2025 13:45:34 +0200 Subject: [PATCH] Compositor: Turn Double Edge Mask node menus into inputs This patch turns the double edge mask node menus into two boolean inputs. Pull Request: https://projects.blender.org/blender/blender/pulls/146304 --- .../blender/blenkernel/BKE_blender_version.h | 2 +- source/blender/blenkernel/intern/node.cc | 10 +++++ .../blenloader/intern/versioning_500.cc | 29 ++++++++++++++ .../blender/makesrna/intern/rna_nodetree.cc | 36 +---------------- .../nodes/node_composite_double_edge_mask.cc | 39 ++++++------------- 5 files changed, 53 insertions(+), 63 deletions(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 20af5ef0869..c6f1c2ad189 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -27,7 +27,7 @@ /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 82 +#define BLENDER_FILE_SUBVERSION 83 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and cancel loading the file, showing a warning to diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index c7157beae38..7cf9fd17734 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -940,6 +940,16 @@ static void write_legacy_properties(bNodeTree &ntree) storage.limchan = limit_channel_socket->default_value_typed()->value; } + else if (node->type_legacy == CMP_NODE_DOUBLEEDGEMASK) { + bNodeSocket *image_edges_socket = node_find_socket(*node, SOCK_IN, "Image Edges"); + node->custom2 = bool( + image_edges_socket->default_value_typed()->value); + + bNodeSocket *only_inside_outer_socket = node_find_socket( + *node, SOCK_IN, "Only Inside Outer"); + node->custom1 = bool( + only_inside_outer_socket->default_value_typed()->value); + } } } default: diff --git a/source/blender/blenloader/intern/versioning_500.cc b/source/blender/blenloader/intern/versioning_500.cc index 3c04f127d69..71b9a378cca 100644 --- a/source/blender/blenloader/intern/versioning_500.cc +++ b/source/blender/blenloader/intern/versioning_500.cc @@ -2238,6 +2238,21 @@ static void do_version_color_spill_menus_to_inputs(bNodeTree &ntree, bNode &node limit_channel_socket.default_value_typed()->value = storage.limchan; } +static void do_version_double_edge_mask_options_to_inputs(bNodeTree &ntree, bNode &node) +{ + if (blender::bke::node_find_socket(node, SOCK_IN, "Image Edges")) { + return; + } + + bNodeSocket &image_edges_socket = version_node_add_socket( + ntree, node, SOCK_IN, "NodeSocketBool", "Image Edges"); + image_edges_socket.default_value_typed()->value = bool(node.custom2); + bNodeSocket &only_inside_outer_socket = version_node_add_socket( + ntree, node, SOCK_IN, "NodeSocketBool", "Only Inside Outer"); + only_inside_outer_socket.default_value_typed()->value = bool( + node.custom1); +} + void do_versions_after_linking_500(FileData *fd, Main *bmain) { if (!MAIN_VERSION_FILE_ATLEAST(bmain, 500, 9)) { @@ -3310,6 +3325,20 @@ void blo_do_versions_500(FileData *fd, Library * /*lib*/, Main *bmain) FOREACH_NODETREE_END; } + if (!MAIN_VERSION_FILE_ATLEAST(bmain, 500, 83)) { + FOREACH_NODETREE_BEGIN (bmain, node_tree, id) { + if (node_tree->type != NTREE_COMPOSIT) { + continue; + } + LISTBASE_FOREACH (bNode *, node, &node_tree->nodes) { + if (node->type_legacy == CMP_NODE_DOUBLEEDGEMASK) { + do_version_double_edge_mask_options_to_inputs(*node_tree, *node); + } + } + } + FOREACH_NODETREE_END; + } + /** * Always bump subversion in BKE_blender_version.h when adding versioning * code here, and wrap it inside a MAIN_VERSION_FILE_ATLEAST check. diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index f04e54c4d83..d6e4fb851d0 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -6437,40 +6437,6 @@ static void def_cmp_convert_to_display(BlenderRNA * /*brna*/, StructRNA *srna) RNA_def_property_ui_text(prop, "Display Settings", "Color management display device settings"); } -static void def_cmp_double_edge_mask(BlenderRNA * /*brna*/, StructRNA *srna) -{ - PropertyRNA *prop; - - static const EnumPropertyItem BufEdgeMode_items[] = { - {0, "BLEED_OUT", 0, "Bleed Out", "Allow mask pixels to bleed along edges"}, - {1, "KEEP_IN", 0, "Keep In", "Restrict mask pixels from touching edges"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - static const EnumPropertyItem InnerEdgeMode_items[] = { - {0, "ALL", 0, "All", "All pixels on inner mask edge are considered during mask calculation"}, - {1, - "ADJACENT_ONLY", - 0, - "Adjacent Only", - "Only inner mask pixels adjacent to outer mask pixels are considered during mask " - "calculation"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - prop = RNA_def_property(srna, "inner_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "custom1"); - RNA_def_property_enum_items(prop, InnerEdgeMode_items); - RNA_def_property_ui_text(prop, "Inner Edge Mode", ""); - RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); - - prop = RNA_def_property(srna, "edge_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "custom2"); - RNA_def_property_enum_items(prop, BufEdgeMode_items); - RNA_def_property_ui_text(prop, "Buffer Edge Mode", ""); - RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); -} - static void def_cmp_defocus(BlenderRNA * /*brna*/, StructRNA *srna) { PropertyRNA *prop; @@ -9686,7 +9652,7 @@ static void rna_def_nodes(BlenderRNA *brna) define("CompositorNode", "CompositorNodeDilateErode"); define("CompositorNode", "CompositorNodeDisplace"); define("CompositorNode", "CompositorNodeDistanceMatte"); - define("CompositorNode", "CompositorNodeDoubleEdgeMask", def_cmp_double_edge_mask); + define("CompositorNode", "CompositorNodeDoubleEdgeMask"); define("CompositorNode", "CompositorNodeEllipseMask"); define("CompositorNode", "CompositorNodeExposure"); define("CompositorNode", "CompositorNodeFilter"); diff --git a/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc b/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc index 97a13d02c7a..63fedb7eb8a 100644 --- a/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc +++ b/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc @@ -2,10 +2,6 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -/** \file - * \ingroup cmpnodes - */ - #include "UI_interface_layout.hh" #include "UI_resources.hh" @@ -15,8 +11,6 @@ #include "node_composite_util.hh" -/* **************** Double Edge Mask ******************** */ - namespace blender::nodes::node_composite_double_edge_mask_cc { static void cmp_node_double_edge_mask_declare(NodeDeclarationBuilder &b) @@ -33,24 +27,20 @@ static void cmp_node_double_edge_mask_declare(NodeDeclarationBuilder &b) .max(1.0f) .compositor_domain_priority(0) .structure_type(StructureType::Dynamic); + b.add_input("Image Edges") + .default_value(false) + .description( + "The edges of the image that intersects the outer mask will be considered edges of the " + "outer mask. Otherwise, the outer mask will be considered open-ended"); + b.add_input("Only Inside Outer") + .default_value(false) + .description( + "Only edges of the inner mask that lie inside the outer mask will be considered. " + "Otherwise, all edges of the inner mask will be considered"); b.add_output("Mask").structure_type(StructureType::Dynamic); } -static void node_composit_buts_double_edge_mask(uiLayout *layout, - bContext * /*C*/, - PointerRNA *ptr) -{ - uiLayout *col; - - col = &layout->column(false); - - col->label(IFACE_("Inner Edge:"), ICON_NONE); - col->prop(ptr, "inner_mode", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE); - col->label(IFACE_("Buffer Edge:"), ICON_NONE); - col->prop(ptr, "edge_mode", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE); -} - using namespace blender::compositor; class DoubleEdgeMaskOperation : public NodeOperation { @@ -295,18 +285,14 @@ class DoubleEdgeMaskOperation : public NodeOperation { }); } - /* If false, only edges of the inner mask that lie inside the outer mask will be considered. If - * true, all edges of the inner mask will be considered. */ bool include_all_inner_edges() { - return !bool(bnode().custom1); + return !this->get_input("Only Inside Outer").get_single_value_default(false); } - /* If true, the edges of the image that intersects the outer mask will be considered edges o the - * outer mask. If false, the outer mask will be considered open-ended. */ bool include_edges_of_image() { - return bool(bnode().custom2); + return this->get_input("Image Edges").get_single_value_default(false); } }; @@ -329,7 +315,6 @@ static void register_node_type_cmp_doubleedgemask() ntype.enum_name_legacy = "DOUBLEEDGEMASK"; ntype.nclass = NODE_CLASS_MATTE; ntype.declare = file_ns::cmp_node_double_edge_mask_declare; - ntype.draw_buttons = file_ns::node_composit_buts_double_edge_mask; ntype.get_compositor_operation = file_ns::get_compositor_operation; blender::bke::node_type_size(ntype, 145, 140, NODE_DEFAULT_MAX_WIDTH);