[Bf-blender-cvs] [d9c48d94e41] blender-v3.3-release: Fix: Potential name clash when adding rest position attribute

Hans Goudey noreply at git.blender.org
Tue Aug 30 22:39:05 CEST 2022


Commit: d9c48d94e41ba9f8d6b91043142af17a76b7345c
Author: Hans Goudey
Date:   Tue Aug 30 15:38:38 2022 -0500
Branches: blender-v3.3-release
https://developer.blender.org/rBd9c48d94e41ba9f8d6b91043142af17a76b7345c

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.

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

M	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<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. */



More information about the Bf-blender-cvs mailing list