From 64927349ec1ba59fcdc3dba3c6b7fb18e8478e7d Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Tue, 17 Oct 2023 11:55:14 +0200 Subject: [PATCH 1/2] GPv3: Replace Material node Note: At the moment the node only supports non-Grease Pencil materials. But if the material socket is connected to the modifier a Grease Pencil material can be used. Part of #113602. --- .../nodes/geometry/nodes/node_geo_material_replace.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc b/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc index 03f6cbed68f..eafabc5b15c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc @@ -10,13 +10,15 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "BKE_grease_pencil.hh" #include "BKE_material.h" namespace blender::nodes::node_geo_material_replace_cc { static void node_declare(NodeDeclarationBuilder &b) { - b.add_input("Geometry").supported_type(GeometryComponent::Type::Mesh); + b.add_input("Geometry") + .supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::GreasePencil}); b.add_input("Old"); b.add_input("New").translation_context(BLT_I18NCONTEXT_ID_MATERIAL); b.add_output("Geometry").propagate_all(); @@ -37,6 +39,13 @@ static void node_geo_exec(GeoNodeExecParams params) } } } + if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { + for (const int i : IndexRange(grease_pencil->material_array_num)) { + if (grease_pencil->material_array[i] == old_material) { + grease_pencil->material_array[i] = new_material; + } + } + } }); params.set_output("Geometry", std::move(geometry_set)); -- 2.30.2 From 379c28c6afdf5b8fe3b349f25ead3b2f4a365bbc Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 17 Oct 2023 18:49:07 +0200 Subject: [PATCH 2/2] From review: deduplicate code --- .../nodes/node_geo_material_replace.cc | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc b/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc index eafabc5b15c..ad238c4110e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc @@ -24,6 +24,17 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_output("Geometry").propagate_all(); } +static void replace_materials(MutableSpan materials, + Material *src_material, + Material *dst_material) +{ + for (const int i : materials.index_range()) { + if (materials[i] == src_material) { + materials[i] = dst_material; + } + } +} + static void node_geo_exec(GeoNodeExecParams params) { Material *old_material = params.extract_input("Old"); @@ -33,18 +44,12 @@ static void node_geo_exec(GeoNodeExecParams params) geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { if (Mesh *mesh = geometry_set.get_mesh_for_write()) { - for (const int i : IndexRange(mesh->totcol)) { - if (mesh->mat[i] == old_material) { - mesh->mat[i] = new_material; - } - } + replace_materials({mesh->mat, mesh->totcol}, old_material, new_material); } if (GreasePencil *grease_pencil = geometry_set.get_grease_pencil_for_write()) { - for (const int i : IndexRange(grease_pencil->material_array_num)) { - if (grease_pencil->material_array[i] == old_material) { - grease_pencil->material_array[i] = new_material; - } - } + replace_materials({grease_pencil->material_array, grease_pencil->material_array_num}, + old_material, + new_material); } }); -- 2.30.2