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.
This commit is contained in:
parent
91ecf47b2c
commit
91e85230f9
Notes:
blender-bot
2023-04-19 22:54:54 +02:00
Referenced by issue #101660, Blender crash for mesh with string attribute.
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; },
|
||||
|
|
Loading…
Reference in New Issue