[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