[Bf-blender-cvs] [3791dbea1e7] master: Fix T79965: mesh.transform() modifies referenced layers

Sergey Sharybin noreply at git.blender.org
Mon Sep 21 12:25:24 CEST 2020


Commit: 3791dbea1e796f96440437333e4318066f26bde2
Author: Sergey Sharybin
Date:   Fri Sep 18 12:45:59 2020 +0200
Branches: master
https://developer.blender.org/rB3791dbea1e796f96440437333e4318066f26bde2

Fix T79965: mesh.transform() modifies referenced layers

Originally was noticed when transforming mesh created by
object.to_mesh() from an object without modifier, in which case the
result references CustomData layers used by the object itself.

The issue goes a bit deeper: mesh.transform() should never modify
referenced layers, hence it should duplicate referenced layers.

This fix changes one specific aspect of the reported behavior. The
case where vertices coordinates are modified manually will still have
affect on the source mesh (as no referenced CustomData layers are being
duplicated). Proper fix for this case is not yet clear to me.

Differential Revision: https://developer.blender.org/D8939

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

M	source/blender/blenkernel/intern/mesh.c

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

diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index a42522a2da3..71209739238 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -1512,8 +1512,11 @@ bool BKE_mesh_minmax(const Mesh *me, float r_min[3], float r_max[3])
 void BKE_mesh_transform(Mesh *me, const float mat[4][4], bool do_keys)
 {
   int i;
-  MVert *mvert = me->mvert;
-  float(*lnors)[3] = CustomData_get_layer(&me->ldata, CD_NORMAL);
+  MVert *mvert = CustomData_duplicate_referenced_layer(&me->vdata, CD_MVERT, me->totvert);
+  float(*lnors)[3] = CustomData_duplicate_referenced_layer(&me->ldata, CD_NORMAL, me->totloop);
+
+  /* If the referenced l;ayer has been re-allocated need to update pointers stored in the mesh. */
+  BKE_mesh_update_customdata_pointers(me, false);
 
   for (i = 0; i < me->totvert; i++, mvert++) {
     mul_m4_v3(mat, mvert->co);



More information about the Bf-blender-cvs mailing list