[Bf-blender-cvs] [6131506689d] temp-geometry-nodes-fields-prototype: Support anonymous attributse in the select by material node

Hans Goudey noreply at git.blender.org
Tue Aug 3 05:42:10 CEST 2021


Commit: 6131506689d2da2ca38f1abdd29216846e44132a
Author: Hans Goudey
Date:   Mon Aug 2 23:42:01 2021 -0400
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB6131506689d2da2ca38f1abdd29216846e44132a

Support anonymous attributse in the select by material node

===================================================================

M	source/blender/nodes/geometry/nodes/node_geo_select_by_material.cc

===================================================================

diff --git a/source/blender/nodes/geometry/nodes/node_geo_select_by_material.cc b/source/blender/nodes/geometry/nodes/node_geo_select_by_material.cc
index ee114741a77..9f9bc85b8f6 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_select_by_material.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_select_by_material.cc
@@ -38,12 +38,12 @@ static bNodeSocketTemplate geo_node_select_by_material_in[] = {
      0.0f,
      PROP_NONE,
      SOCK_HIDE_LABEL},
-    {SOCK_STRING, N_("Selection")},
     {-1, ""},
 };
 
 static bNodeSocketTemplate geo_node_select_by_material_out[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
+    {SOCK_BOOLEAN, N_("Selection")},
     {-1, ""},
 };
 
@@ -60,6 +60,7 @@ static void select_mesh_by_material(const Mesh &mesh,
       material_indices.append(i);
     }
   }
+
   threading::parallel_for(r_selection.index_range(), 1024, [&](IndexRange range) {
     for (const int i : range) {
       r_selection[i] = material_indices.contains(mesh.mpoly[i].mat_nr);
@@ -70,25 +71,35 @@ static void select_mesh_by_material(const Mesh &mesh,
 static void geo_node_select_by_material_exec(GeoNodeExecParams params)
 {
   Material *material = params.extract_input<Material *>("Material");
-  const std::string selection_name = params.extract_input<std::string>("Selection");
 
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
   geometry_set = geometry_set_realize_instances(geometry_set);
 
+  AnonymousCustomDataLayerID *id = params.output_is_required("Selection") ?
+                                       CustomData_anonymous_id_new("Selection") :
+                                       nullptr;
+  if (id == nullptr) {
+    params.set_output("Geometry", std::move(geometry_set));
+    return;
+  }
+
   if (geometry_set.has<MeshComponent>()) {
     MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
     const Mesh *mesh = mesh_component.get_for_read();
     if (mesh != nullptr) {
-      OutputAttribute_Typed<bool> selection =
-          mesh_component.attribute_try_get_for_output_only<bool>(selection_name, ATTR_DOMAIN_FACE);
-      if (selection) {
-        select_mesh_by_material(*mesh, material, selection.as_span());
-        selection.save();
-      }
+      mesh_component.attribute_try_create_anonymous(
+          *id, ATTR_DOMAIN_FACE, CD_PROP_BOOL, AttributeInitDefault());
+      WriteAttributeLookup attribute = mesh_component.attribute_try_get_anonymous_for_write(*id);
+      MutableSpan<bool> selection = attribute.varray->get_internal_span().typed<bool>();
+
+      select_mesh_by_material(*mesh, material, selection);
     }
   }
 
   params.set_output("Geometry", std::move(geometry_set));
+  params.set_output(
+      "Selection",
+      bke::FieldRef<bool>(new bke::AnonymousAttributeField(*id, CPPType::get<bool>())));
 }
 
 }  // namespace blender::nodes



More information about the Bf-blender-cvs mailing list