[Bf-blender-cvs] [400f022989c] master: Geometry Nodes: Add warning to set material node with no faces

Hans Goudey noreply at git.blender.org
Tue Jan 17 17:31:15 CET 2023


Commit: 400f022989c318a7f3cf392164713bf12e93251e
Author: Hans Goudey
Date:   Tue Jan 17 10:31:07 2023 -0600
Branches: master
https://developer.blender.org/rB400f022989c318a7f3cf392164713bf12e93251e

Geometry Nodes: Add warning to set material node with no faces

The node can't do anything in this case, which isn't always obvious.

Resolves T103133

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

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

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_material.cc b/source/blender/nodes/geometry/nodes/node_geo_set_material.cc
index e6e3eadff03..aa2930cfed9 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_set_material.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_set_material.cc
@@ -65,22 +65,27 @@ static void node_geo_exec(GeoNodeExecParams params)
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
 
   /* Only add the warnings once, even if there are many unique instances. */
+  bool no_faces_warning = false;
   bool point_selection_warning = false;
   bool volume_selection_warning = false;
   bool curves_selection_warning = false;
 
   geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
-    if (geometry_set.has_mesh()) {
-      MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
-      Mesh &mesh = *mesh_component.get_for_write();
-
-      bke::MeshFieldContext field_context{mesh, ATTR_DOMAIN_FACE};
-      fn::FieldEvaluator selection_evaluator{field_context, mesh.totpoly};
-      selection_evaluator.add(selection_field);
-      selection_evaluator.evaluate();
-      const IndexMask selection = selection_evaluator.get_evaluated_as_mask(0);
-
-      assign_material_to_faces(mesh, selection, material);
+    if (Mesh *mesh = geometry_set.get_mesh_for_write()) {
+      if (mesh->totpoly == 0) {
+        if (mesh->totvert > 0) {
+          no_faces_warning = true;
+        }
+      }
+      else {
+        bke::MeshFieldContext field_context{*mesh, ATTR_DOMAIN_FACE};
+        fn::FieldEvaluator selection_evaluator{field_context, mesh->totpoly};
+        selection_evaluator.add(selection_field);
+        selection_evaluator.evaluate();
+        const IndexMask selection = selection_evaluator.get_evaluated_as_mask(0);
+
+        assign_material_to_faces(*mesh, selection, material);
+      }
     }
     if (Volume *volume = geometry_set.get_volume_for_write()) {
       BKE_id_material_eval_assign(&volume->id, 1, material);
@@ -102,6 +107,10 @@ static void node_geo_exec(GeoNodeExecParams params)
     }
   });
 
+  if (no_faces_warning) {
+    params.error_message_add(NodeWarningType::Info,
+                             TIP_("Mesh has no faces for material assignment"));
+  }
   if (volume_selection_warning) {
     params.error_message_add(
         NodeWarningType::Info,



More information about the Bf-blender-cvs mailing list