[Bf-blender-cvs] [cdea65ff962] temp-modifier-rm-cddm: Construct new Mesh instead of writing to ob->data

Sybren A. Stüvel noreply at git.blender.org
Wed Apr 25 09:48:25 CEST 2018


Commit: cdea65ff962b5789560a84bc5c893fccbae36e0e
Author: Sybren A. Stüvel
Date:   Wed Apr 25 09:47:34 2018 +0200
Branches: temp-modifier-rm-cddm
https://developer.blender.org/rBcdea65ff962b5789560a84bc5c893fccbae36e0e

Construct new Mesh instead of writing to ob->data

Even when ob->data is a CoW copy, it can still be used by different objects
and thus shouldn't be modified by a modifier.

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

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

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

diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index e795f0ba565..8f4f5b79618 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -1006,14 +1006,16 @@ void modifier_deformVerts_DM_deprecated(struct ModifierData *md, struct Depsgrap
 	}
 	else {
 		/* TODO(sybren): deduplicate all the copies of this code in this file. */
-		struct Mesh *mesh = ob->data;
-		BLI_assert(DEG_depsgraph_use_copy_on_write());
-		BLI_assert(mesh->id.tag & LIB_TAG_COPY_ON_WRITE); /* This should be a CoW mesh */
+		Mesh *new_mesh = BKE_libblock_alloc_notest(ID_ME);
+		BKE_mesh_init(new_mesh);
 		if (dm != NULL) {
-			DM_to_mesh(dm, mesh, ob, CD_MASK_EVERYTHING, false);
+			DM_to_mesh(dm, new_mesh, ob, CD_MASK_EVERYTHING, false);
 		}
 
-		mti->deformVerts(md, depsgraph, ob, mesh, vertexCos, numVerts, flag);
+		mti->deformVerts(md, depsgraph, ob, new_mesh, vertexCos, numVerts, flag);
+
+		BKE_mesh_free(new_mesh);
+		MEM_freeN(new_mesh);
 	}
 }
 
@@ -1049,17 +1051,9 @@ void modifier_deformVertsEM_DM_deprecated(struct ModifierData *md, struct Depsgr
 		mti->deformVertsEM_DM(md, depsgraph, ob, editData, dm, vertexCos, numVerts);
 	}
 	else {
-		struct Mesh *mesh = ob->data;
-		BLI_assert(DEG_depsgraph_use_copy_on_write());
-		/* TODO(sybren): the first vertex select in edit mode will result in this function being called
-		 * with a non-CoW mesh. */
-		/* BLI_assert(mesh->id.tag & LIB_TAG_COPY_ON_WRITE); */ /* This should be a CoW mesh */
-		if ((mesh->id.tag & LIB_TAG_COPY_ON_WRITE) == 0) {
-			printf("   \033[31mWARNING, operating on real Mesh %s = %p\033[30m\n", mesh->id.name, mesh);
-		}
-
+		Mesh *mesh = BKE_libblock_alloc_notest(ID_ME);
+		BKE_mesh_init(mesh);
 		if (dm != NULL) {
-			BKE_mesh_free(mesh);
 			DM_to_mesh(dm, mesh, ob, CD_MASK_EVERYTHING, false);
 		}



More information about the Bf-blender-cvs mailing list