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.
This commit is contained in:
Hans Goudey 2022-08-30 15:38:38 -05:00
parent f20d0de3b7
commit d9c48d94e4
1 changed files with 8 additions and 12 deletions

View File

@ -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<float3 *>(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<float3> rest_positions =
attributes.lookup_or_add_for_write_only_span<float3>("rest_position", ATTR_DOMAIN_POINT);
if (rest_positions) {
attributes.lookup<float3>("position").materialize(rest_positions.span);
rest_positions.finish();
}
}
/* Apply all leading deform modifiers. */