From d9c48d94e41ba9f8d6b91043142af17a76b7345c Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 30 Aug 2022 15:38:38 -0500 Subject: Fix: Potential name clash when adding rest position attribute If a "rest_position" attribute already existed, potentiall with another type, the next name "rest_position.001" would be used, which might even conflict with a name on another domain. Use the C++ attribute API instead, which has more standard/predictable behavior. --- source/blender/blenkernel/intern/DerivedMesh.cc | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'source/blender/blenkernel/intern/DerivedMesh.cc') diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index a29d8726f21..7ef676b3b71 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -741,6 +741,7 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, Mesh **r_final, GeometrySet **r_geometry_set) { + using namespace blender::bke; /* Input and final mesh. Final mesh is only created the moment the first * constructive modifier is executed, or a deform modifier needs normals * or certain data layers. */ @@ -824,18 +825,13 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, mesh_final = BKE_mesh_copy_for_eval(mesh_input, true); ASSERT_IS_VALID_MESH(mesh_final); } - float3 *rest_positions = static_cast(CustomData_add_layer_named(&mesh_final->vdata, - CD_PROP_FLOAT3, - CD_DEFAULT, - nullptr, - mesh_final->totvert, - "rest_position")); - blender::threading::parallel_for( - IndexRange(mesh_final->totvert), 1024, [&](const IndexRange range) { - for (const int i : range) { - rest_positions[i] = mesh_final->mvert[i].co; - } - }); + MutableAttributeAccessor attributes = mesh_attributes_for_write(*mesh_final); + SpanAttributeWriter rest_positions = + attributes.lookup_or_add_for_write_only_span("rest_position", ATTR_DOMAIN_POINT); + if (rest_positions) { + attributes.lookup("position").materialize(rest_positions.span); + rest_positions.finish(); + } } /* Apply all leading deform modifiers. */ -- cgit v1.2.3