Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2020-09-18 13:45:59 +0300
committerSergey Sharybin <sergey@blender.org>2020-09-21 13:23:30 +0300
commit3791dbea1e796f96440437333e4318066f26bde2 (patch)
tree9ef1f73ece710f8305bb050936c85763c02072a9 /source/blender/blenkernel/intern/mesh.c
parentabc90d6b036dce1b5003d487a266b8d48126fa1c (diff)
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
Diffstat (limited to 'source/blender/blenkernel/intern/mesh.c')
-rw-r--r--source/blender/blenkernel/intern/mesh.c7
1 files changed, 5 insertions, 2 deletions
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);