[Bf-blender-cvs] [91e85230f9c] master: Fix T101660: crash when trying to propagate string attributes in some nodes

Jacques Lucke noreply at git.blender.org
Tue Oct 18 17:17:19 CEST 2022


Commit: 91e85230f9c1b490f7424b9da7bbd65b7c0c4068
Author: Jacques Lucke
Date:   Tue Oct 18 17:16:51 2022 +0200
Branches: master
https://developer.blender.org/rB91e85230f9c1b490f7424b9da7bbd65b7c0c4068

Fix T101660: crash when trying to propagate string attributes in some nodes

String attributes are intentionally not fully supported in geometry nodes
yet because more design work is necessary to decide how they should behave.

For now just disable handling string attributes to avoid crashes.

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

M	source/blender/blenkernel/intern/curve_to_mesh_convert.cc
M	source/blender/blenkernel/intern/curves_geometry.cc
M	source/blender/blenkernel/intern/geometry_set.cc
M	source/blender/geometry/intern/resample_curves.cc
M	source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
M	source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc
M	source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc

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

diff --git a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
index b9fea2a27b8..ecf3be9bd81 100644
--- a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
+++ b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc
@@ -332,7 +332,8 @@ static eAttrDomain get_attribute_domain_for_mesh(const AttributeAccessor &mesh_a
 
 static bool should_add_attribute_to_mesh(const AttributeAccessor &curve_attributes,
                                          const AttributeAccessor &mesh_attributes,
-                                         const AttributeIDRef &id)
+                                         const AttributeIDRef &id,
+                                         const AttributeMetaData &meta_data)
 {
 
   /* The position attribute has special non-generic evaluation. */
@@ -346,6 +347,9 @@ static bool should_add_attribute_to_mesh(const AttributeAccessor &curve_attribut
   if (!id.should_be_kept()) {
     return false;
   }
+  if (meta_data.data_type == CD_PROP_STRING) {
+    return false;
+  }
   return true;
 }
 
@@ -714,7 +718,7 @@ Mesh *curve_to_mesh_sweep(const CurvesGeometry &main,
   MutableAttributeAccessor mesh_attributes = mesh->attributes_for_write();
 
   main_attributes.for_all([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
-    if (!should_add_attribute_to_mesh(main_attributes, mesh_attributes, id)) {
+    if (!should_add_attribute_to_mesh(main_attributes, mesh_attributes, id, meta_data)) {
       return true;
     }
     main_attributes_set.add_new(id);
@@ -751,7 +755,7 @@ Mesh *curve_to_mesh_sweep(const CurvesGeometry &main,
     if (main_attributes.contains(id)) {
       return true;
     }
-    if (!should_add_attribute_to_mesh(profile_attributes, mesh_attributes, id)) {
+    if (!should_add_attribute_to_mesh(profile_attributes, mesh_attributes, id, meta_data)) {
       return true;
     }
     const eAttrDomain src_domain = meta_data.domain;
diff --git a/source/blender/blenkernel/intern/curves_geometry.cc b/source/blender/blenkernel/intern/curves_geometry.cc
index f5c845443f1..29f8d62545f 100644
--- a/source/blender/blenkernel/intern/curves_geometry.cc
+++ b/source/blender/blenkernel/intern/curves_geometry.cc
@@ -1402,6 +1402,9 @@ void CurvesGeometry::reverse_curves(const IndexMask curves_to_reverse)
     if (meta_data.domain != ATTR_DOMAIN_POINT) {
       return true;
     }
+    if (meta_data.data_type == CD_PROP_STRING) {
+      return true;
+    }
     if (id.is_named() && bezier_handle_names.contains(id.name())) {
       return true;
     }
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index 90568a8a080..ee4c398c3d6 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -607,7 +607,10 @@ void GeometrySet::gather_attributes_for_propagation(
             return;
           }
         }
-
+        if (meta_data.data_type == CD_PROP_STRING) {
+          /* Propagating string attributes is not supported yet. */
+          return;
+        }
         if (!attribute_id.should_be_kept()) {
           return;
         }
diff --git a/source/blender/geometry/intern/resample_curves.cc b/source/blender/geometry/intern/resample_curves.cc
index a7f6ac16f8d..3be850ec097 100644
--- a/source/blender/geometry/intern/resample_curves.cc
+++ b/source/blender/geometry/intern/resample_curves.cc
@@ -139,6 +139,9 @@ static void gather_point_attributes_to_interpolate(
         if (meta_data.domain != ATTR_DOMAIN_POINT) {
           return true;
         }
+        if (meta_data.data_type == CD_PROP_STRING) {
+          return true;
+        }
         if (!interpolate_attribute_to_curves(id, dst_curves.curve_type_counts())) {
           return true;
         }
diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
index 1d8c9d6312c..d348d886ad6 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -260,6 +260,9 @@ static void extrude_mesh_vertices(Mesh &mesh,
     if (!ELEM(meta_data.domain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_EDGE)) {
       return true;
     }
+    if (meta_data.data_type == CD_PROP_STRING) {
+      return true;
+    }
     GSpanAttributeWriter attribute = attributes.lookup_or_add_for_write_span(
         id, meta_data.domain, meta_data.data_type);
     attribute_math::convert_to_static_type(meta_data.data_type, [&](auto dummy) {
@@ -506,6 +509,9 @@ static void extrude_mesh_edges(Mesh &mesh,
   MutableAttributeAccessor attributes = mesh.attributes_for_write();
 
   attributes.for_all([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
+    if (meta_data.data_type == CD_PROP_STRING) {
+      return true;
+    }
     GSpanAttributeWriter attribute = attributes.lookup_or_add_for_write_span(
         id, meta_data.domain, meta_data.data_type);
     if (!attribute) {
@@ -889,6 +895,9 @@ static void extrude_mesh_face_regions(Mesh &mesh,
   MutableAttributeAccessor attributes = mesh.attributes_for_write();
 
   attributes.for_all([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
+    if (meta_data.data_type == CD_PROP_STRING) {
+      return true;
+    }
     GSpanAttributeWriter attribute = attributes.lookup_or_add_for_write_span(
         id, meta_data.domain, meta_data.data_type);
     if (!attribute) {
@@ -1143,6 +1152,9 @@ static void extrude_individual_mesh_faces(Mesh &mesh,
   MutableAttributeAccessor attributes = mesh.attributes_for_write();
 
   attributes.for_all([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
+    if (meta_data.data_type == CD_PROP_STRING) {
+      return true;
+    }
     GSpanAttributeWriter attribute = attributes.lookup_or_add_for_write_span(
         id, meta_data.domain, meta_data.data_type);
     if (!attribute) {
diff --git a/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc b/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc
index 613425716d4..95a0013a9e1 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc
@@ -47,6 +47,9 @@ static void mesh_flip_faces(Mesh &mesh, const Field<bool> &selection_field)
   MutableAttributeAccessor attributes = mesh.attributes_for_write();
   attributes.for_all(
       [&](const bke::AttributeIDRef &attribute_id, const AttributeMetaData &meta_data) {
+        if (meta_data.data_type == CD_PROP_STRING) {
+          return true;
+        }
         if (meta_data.domain == ATTR_DOMAIN_CORNER) {
           GSpanAttributeWriter attribute = attributes.lookup_or_add_for_write_span(
               attribute_id, ATTR_DOMAIN_CORNER, meta_data.data_type);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc
index ec9b9faf4ec..ea2646a9786 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc
@@ -31,6 +31,9 @@ static Map<AttributeIDRef, AttributeMetaData> get_final_attribute_info(
           if (attribute_id.is_named() && ignored_attributes.contains(attribute_id.name())) {
             return true;
           }
+          if (meta_data.data_type == CD_PROP_STRING) {
+            return true;
+          }
           info.add_or_modify(
               attribute_id,
               [&](AttributeMetaData *meta_data_final) { *meta_data_final = meta_data; },



More information about the Bf-blender-cvs mailing list