Commit: 18c9f7ef72a41210208e5fa914e22bdb848e465f
Author: Campbell Barton
Date:   Tue Aug 11 21:46:06 2020 +1000
Branches: blender-v2.90-release
https://developer.blender.org/rB18c9f7ef72a41210208e5fa914e22bdb848e465f

Fix T79517: Data Transfer modifier fails in edit-mode

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

M       source/blender/blenkernel/intern/mesh.c
M       source/blender/makesdna/DNA_mesh_types.h
M       source/blender/modifiers/intern/MOD_datatransfer.c
M       source/blender/modifiers/intern/MOD_normal_edit.c
M       source/blender/modifiers/intern/MOD_uvproject.c
M       source/blender/modifiers/intern/MOD_uvwarp.c
M       source/blender/modifiers/intern/MOD_weighted_normal.c
M       source/blender/modifiers/intern/MOD_weightvgedit.c
M       source/blender/modifiers/intern/MOD_weightvgmix.c
M       source/blender/modifiers/intern/MOD_weightvgproximity.c

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

diff --git a/source/blender/blenkernel/intern/mesh.c 
b/source/blender/blenkernel/intern/mesh.c
index 048af022adb..4822df3f063 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -95,7 +95,15 @@ static void mesh_copy_data(Main *bmain, ID *id_dst, const ID 
*id_src, const int
     /* This is a direct copy of a main mesh, so for now it has the same 
topology. */
     mesh_dst->runtime.deformed_only = true;
   }
-  /* XXX WHAT? Why? Comment, please! And pretty sure this is not valid for 
regular Mesh copying? */
+  /* This option is set for run-time meshes that have been copied from the 
current objects mode.
+   * Currently this is used for edit-mesh although it could be used for sculpt 
or other
+   * kinds of data specific to an objects mode.
+   *
+   * The flag signals that the mesh hasn't been modified from the data that 
generated it,
+   * allowing us to use the object-mode data for drawing.
+   *
+   * While this could be the callers responsibility, keep here since it's
+   * highly unlikely we want to create a duplicate and not use it for drawing. 
*/
   mesh_dst->runtime.is_original = false;
 
   /* Only do tessface if we have no polys. */
diff --git a/source/blender/makesdna/DNA_mesh_types.h 
b/source/blender/makesdna/DNA_mesh_types.h
index 3816cee0cf8..a6aef5b08ad 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -109,9 +109,12 @@ typedef struct Mesh_Runtime {
   /** Set by modifier stack if only deformed from original. */
   char deformed_only;
   /**
-   * Copied from edit-mesh (hint, draw with editmesh data).
-   * In the future we may leave the mesh-data empty
-   * since its not needed if we can use edit-mesh data. */
+   * Copied from edit-mesh (hint, draw with edit-mesh data when true).
+   *
+   * Modifiers that edit the mesh data in-place must set this to false
+   * (most #eModifierTypeType_NonGeometrical modifiers). Otherwise the 
edit-mesh
+   * data will be used for drawing, missing changes from modifiers. See T79517.
+   */
   char is_original;
 
   /** #eMeshWrapperType and others. */
diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c 
b/source/blender/modifiers/intern/MOD_datatransfer.c
index 031b82fa89e..c8f49694a2f 100644
--- a/source/blender/modifiers/intern/MOD_datatransfer.c
+++ b/source/blender/modifiers/intern/MOD_datatransfer.c
@@ -204,29 +204,31 @@ static Mesh *modifyMesh(ModifierData *md, const 
ModifierEvalContext *ctx, Mesh *
   BKE_reports_init(&reports, RPT_STORE);
 
   /* Note: no islands precision for now here. */
-  BKE_object_data_transfer_ex(ctx->depsgraph,
-                              scene,
-                              ob_source,
-                              ctx->object,
-                              result,
-                              dtmd->data_types,
-                              false,
-                              dtmd->vmap_mode,
-                              dtmd->emap_mode,
-                              dtmd->lmap_mode,
-                              dtmd->pmap_mode,
-                              space_transform,
-                              false,
-                              max_dist,
-                              dtmd->map_ray_radius,
-                              0.0f,
-                              dtmd->layers_select_src,
-                              dtmd->layers_select_dst,
-                              dtmd->mix_mode,
-                              dtmd->mix_factor,
-                              dtmd->defgrp_name,
-                              invert_vgroup,
-                              &reports);
+  if (BKE_object_data_transfer_ex(ctx->depsgraph,
+                                  scene,
+                                  ob_source,
+                                  ctx->object,
+                                  result,
+                                  dtmd->data_types,
+                                  false,
+                                  dtmd->vmap_mode,
+                                  dtmd->emap_mode,
+                                  dtmd->lmap_mode,
+                                  dtmd->pmap_mode,
+                                  space_transform,
+                                  false,
+                                  max_dist,
+                                  dtmd->map_ray_radius,
+                                  0.0f,
+                                  dtmd->layers_select_src,
+                                  dtmd->layers_select_dst,
+                                  dtmd->mix_mode,
+                                  dtmd->mix_factor,
+                                  dtmd->defgrp_name,
+                                  invert_vgroup,
+                                  &reports)) {
+    result->runtime.is_original = false;
+  }
 
   if (BKE_reports_contain(&reports, RPT_ERROR)) {
     const char *report_str = BKE_reports_string(&reports, RPT_ERROR);
diff --git a/source/blender/modifiers/intern/MOD_normal_edit.c 
b/source/blender/modifiers/intern/MOD_normal_edit.c
index 7039b24cfc6..ded7ec132cc 100644
--- a/source/blender/modifiers/intern/MOD_normal_edit.c
+++ b/source/blender/modifiers/intern/MOD_normal_edit.c
@@ -637,6 +637,8 @@ static Mesh *normalEditModifier_do(NormalEditModifierData 
*enmd,
   CustomData_free_layers(pdata, CD_NORMAL, num_polys);
   MEM_SAFE_FREE(loopnors);
 
+  result->runtime.is_original = false;
+
   return result;
 }
 
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c 
b/source/blender/modifiers/intern/MOD_uvproject.c
index 6f261f9f67a..361c778bb95 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -308,6 +308,8 @@ static Mesh *uvprojectModifier_do(UVProjectModifierData 
*umd,
     }
   }
 
+  mesh->runtime.is_original = false;
+
   /* Mark tessellated CD layers as dirty. */
   mesh->runtime.cd_dirty_vert |= CD_MASK_TESSLOOPNORMAL;
 
diff --git a/source/blender/modifiers/intern/MOD_uvwarp.c 
b/source/blender/modifiers/intern/MOD_uvwarp.c
index 4aca3c28ed8..1c7c3f6baf1 100644
--- a/source/blender/modifiers/intern/MOD_uvwarp.c
+++ b/source/blender/modifiers/intern/MOD_uvwarp.c
@@ -233,6 +233,8 @@ static Mesh *modifyMesh(ModifierData *md, const 
ModifierEvalContext *ctx, Mesh *
   /* XXX TODO is this still needed? */
   //  me_eval->dirty |= DM_DIRTY_TESS_CDLAYERS;
 
+  mesh->runtime.is_original = false;
+
   return mesh;
 }
 
diff --git a/source/blender/modifiers/intern/MOD_weighted_normal.c 
b/source/blender/modifiers/intern/MOD_weighted_normal.c
index f174b6d5aa4..744bab02c56 100644
--- a/source/blender/modifiers/intern/MOD_weighted_normal.c
+++ b/source/blender/modifiers/intern/MOD_weighted_normal.c
@@ -677,6 +677,9 @@ static Mesh *modifyMesh(ModifierData *md, const 
ModifierEvalContext *ctx, Mesh *
 
   /* Currently Modifier stack assumes there is no poly normal data passed 
around... */
   CustomData_free_layers(pdata, CD_NORMAL, numPolys);
+
+  result->runtime.is_original = false;
+
   return result;
 }
 
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c 
b/source/blender/modifiers/intern/MOD_weightvgedit.c
index 8039856172a..e15320afc28 100644
--- a/source/blender/modifiers/intern/MOD_weightvgedit.c
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -312,6 +312,8 @@ static Mesh *modifyMesh(ModifierData *md, const 
ModifierEvalContext *ctx, Mesh *
   MEM_freeN(new_w);
   MEM_freeN(dw);
 
+  mesh->runtime.is_original = false;
+
   /* Return the vgroup-modified mesh. */
   return mesh;
 }
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c 
b/source/blender/modifiers/intern/MOD_weightvgmix.c
index d1c618df68b..cdd0e2c00de 100644
--- a/source/blender/modifiers/intern/MOD_weightvgmix.c
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -456,6 +456,8 @@ static Mesh *modifyMesh(ModifierData *md, const 
ModifierEvalContext *ctx, Mesh *
   MEM_freeN(dw2);
   MEM_SAFE_FREE(indices);
 
+  mesh->runtime.is_original = false;
+
   /* Return the vgroup-modified mesh. */
   return mesh;
 }
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c 
b/source/blender/modifiers/intern/MOD_weightvgproximity.c
index 0668a7a086f..b23eb997f61 100644
--- a/source/blender/modifiers/intern/MOD_weightvgproximity.c
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -637,6 +637,8 @@ static Mesh *modifyMesh(ModifierData *md, const 
ModifierEvalContext *ctx, Mesh *
   TIMEIT_END(perf);
 #endif
 
+  mesh->runtime.is_original = false;
+
   /* Return the vgroup-modified mesh. */
   return mesh;
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to