[Bf-blender-cvs] [23509c6ca5b] temp-modifier-rm-cddm: Mesh deformation seems to be working

Sybren A. Stüvel noreply at git.blender.org
Thu Apr 19 17:23:57 CEST 2018


Commit: 23509c6ca5b77164c1b466f8841d85c954a20f92
Author: Sybren A. Stüvel
Date:   Thu Apr 19 17:20:25 2018 +0200
Branches: temp-modifier-rm-cddm
https://developer.blender.org/rB23509c6ca5b77164c1b466f8841d85c954a20f92

Mesh deformation seems to be working

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/modifier.c
M	source/blender/draw/intern/draw_cache_impl_mesh.c

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index e2265ae855e..9f92248ec16 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -93,6 +93,9 @@ struct Mesh *BKE_mesh_copy(struct Main *bmain, const struct Mesh *me);
 void BKE_mesh_update_customdata_pointers(struct Mesh *me, const bool do_ensure_tess_cd);
 void BKE_mesh_ensure_skin_customdata(struct Mesh *me);
 
+bool BKE_mesh_ensure_edit_data(struct Mesh *me);
+bool BKE_mesh_clear_edit_data(struct Mesh *me);
+
 bool BKE_mesh_ensure_facemap_customdata(struct Mesh *me);
 bool BKE_mesh_clear_facemap_customdata(struct Mesh *me);
 
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index a9def663940..c86950d82cb 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -2470,6 +2470,12 @@ static void editbmesh_calc_modifiers(
 				*r_cage = dm;
 			}
 			else {
+				struct Mesh *mesh = ob->data;
+				if (mesh->id.tag & LIB_TAG_COPY_ON_WRITE) {
+					BKE_mesh_ensure_edit_data(mesh);
+					printf("Saving cage deformed verts in CoW mesh %p\n", mesh);
+					mesh->emd->vertexCos = MEM_dupallocN(deformedVerts);
+				}
 				*r_cage = getEditDerivedBMesh(
 				        em, ob, mask,
 				        deformedVerts ? MEM_dupallocN(deformedVerts) : NULL);
@@ -2507,6 +2513,12 @@ static void editbmesh_calc_modifiers(
 	}
 	else {
 		/* this is just a copy of the editmesh, no need to calc normals */
+		struct Mesh *mesh = ob->data;
+		if (mesh->id.tag & LIB_TAG_COPY_ON_WRITE) {
+			BKE_mesh_ensure_edit_data(mesh);
+			mesh->emd->vertexCos = MEM_dupallocN(deformedVerts);
+			printf("Saving final deformed verts in CoW mesh %p\n", mesh);
+		}
 		*r_final = getEditDerivedBMesh(em, ob, dataMask, deformedVerts);
 
 		deformedVerts = NULL;
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index bb3720341dc..5e58d69703c 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -388,6 +388,32 @@ void BKE_mesh_ensure_skin_customdata(Mesh *me)
 	}
 }
 
+bool BKE_mesh_ensure_edit_data(struct Mesh *me)
+{
+	if (me->emd != NULL) {
+		return false;
+	}
+
+	me->emd = MEM_callocN(sizeof(EditMeshData), "EditMeshData");
+	return true;
+}
+
+bool BKE_mesh_clear_edit_data(struct Mesh *me)
+{
+	if (me->emd == NULL) {
+		return false;
+	}
+
+	MEM_SAFE_FREE(me->emd->polyCos);
+	MEM_SAFE_FREE(me->emd->polyNos);
+	MEM_SAFE_FREE(me->emd->vertexCos);
+	MEM_SAFE_FREE(me->emd->vertexNos);
+	MEM_SAFE_FREE(me->emd);
+	BLI_assert(me->emd == NULL);
+	return true;
+}
+
+
 bool BKE_mesh_ensure_facemap_customdata(struct Mesh *me)
 {
 	BMesh *bm = me->edit_btmesh ? me->edit_btmesh->bm : NULL;
@@ -481,6 +507,7 @@ void BKE_mesh_free(Mesh *me)
 	BKE_animdata_free(&me->id, false);
 
 	BKE_mesh_batch_cache_free(me);
+	BKE_mesh_clear_edit_data(me);
 
 	CustomData_free(&me->vdata, me->totvert);
 	CustomData_free(&me->edata, me->totedge);
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 02a0c27da3c..bab9a6d5e70 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -986,15 +986,18 @@ void modifier_deformVerts_DM_deprecated(struct ModifierData *md, struct Depsgrap
 	}
 	else {
 		struct Mesh *mesh = ob->data;
-		BLI_assert(BLI_findindex(&G.main->mesh, mesh) == -1); /* This should be a CoW mesh */
-
+		BLI_assert(DEG_depsgraph_use_copy_on_write());
+//		BLI_assert(mesh->id.tag & LIB_TAG_COPY_ON_WRITE); /* This should be a CoW mesh */
+		printf("modifier_deformVerts_DM_deprecated(%s)\n", md->name);
+		if ((mesh->id.tag & LIB_TAG_COPY_ON_WRITE) == 0) {
+			printf("   WARNING, operating on real Mesh %s = %p\n", mesh->id.name, mesh);
+		}
 		if (dm != NULL) {
+			BKE_mesh_free(mesh);
 			DM_to_mesh(dm, mesh, ob, CD_MASK_EVERYTHING, false);
 		}
 
-		BLI_assert(mesh->emd == NULL);
 		mti->deformVerts(md, depsgraph, ob, mesh, vertexCos, numVerts, flag);
-//		BLI_assert(mesh->emd == NULL);
 	}
 }
 
@@ -1031,13 +1034,18 @@ void modifier_deformVertsEM_DM_deprecated(struct ModifierData *md, struct Depsgr
 	}
 	else {
 		struct Mesh *mesh = ob->data;
-		BLI_assert(BLI_findindex(&G.main->mesh, mesh) == -1); /* This should be a CoW mesh */
+		printf("modifier_deformVertsEM_DM_deprecated(%s)\n", md->name);
+		BLI_assert(DEG_depsgraph_use_copy_on_write());
+//		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("   WARNING, operating on real Mesh %s = %p\n", mesh->id.name, mesh);
+		}
 
 		if (dm != NULL) {
+			BKE_mesh_free(mesh);
 			DM_to_mesh(dm, mesh, ob, CD_MASK_EVERYTHING, false);
 		}
 
-		BLI_assert(mesh->emd == NULL);
 		mti->deformVertsEM(md, depsgraph, ob, editData, mesh, vertexCos, numVerts);
 	}
 }
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index bad860967ef..6f44e7afc83 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -128,6 +128,8 @@ typedef struct MeshRenderData {
 	int loose_edge_len;
 
 	BMEditMesh *edit_bmesh;
+	struct EditMeshData *edit_data;
+
 	MVert *mvert;
 	MEdge *medge;
 	MLoop *mloop;
@@ -389,6 +391,7 @@ static MeshRenderData *mesh_render_data_create_ex(
 		BMesh *bm = embm->bm;
 
 		rdata->edit_bmesh = embm;
+		rdata->edit_data = me->emd;
 
 		int bm_ensure_types = 0;
 		if (types & (MR_DATATYPE_VERT)) {
@@ -426,6 +429,9 @@ static MeshRenderData *mesh_render_data_create_ex(
 		if (types & (MR_DATATYPE_DVERT)) {
 			bm_ensure_types |= BM_VERT;
 		}
+		if (rdata->edit_data != NULL) {
+			bm_ensure_types |= BM_VERT;
+		}
 
 		BM_mesh_elem_index_ensure(bm, bm_ensure_types);
 		BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
@@ -1359,9 +1365,19 @@ static void add_overlay_tri(
 	unsigned char vflag;
 
 	if (vbo_pos) {
-		for (uint i = 0; i < 3; i++) {
-			const float *pos = bm_looptri[i]->v->co;
-			GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+		/* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+		if (rdata->edit_data && rdata->edit_data->vertexCos) {
+			for (uint i = 0; i < 3; i++) {
+				int vidx = BM_elem_index_get(bm_looptri[i]->v);
+				const float *pos = rdata->edit_data->vertexCos[vidx];
+				GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+			}
+		}
+		else {
+			for (uint i = 0; i < 3; i++) {
+				const float *pos = bm_looptri[i]->v->co;
+				GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+			}
 		}
 	}
 
@@ -1399,9 +1415,19 @@ static void add_overlay_loose_edge(
         const BMEdge *eed, const int base_vert_idx)
 {
 	if (vbo_pos) {
-		for (int i = 0; i < 2; ++i) {
-			const float *pos = (&eed->v1)[i]->co;
-			GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+		/* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+		if (rdata->edit_data && rdata->edit_data->vertexCos) {
+			for (uint i = 0; i < 2; i++) {
+				int vidx = BM_elem_index_get((&eed->v1)[i]);
+				const float *pos = rdata->edit_data->vertexCos[vidx];
+				GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+			}
+		}
+		else {
+			for (int i = 0; i < 2; ++i) {
+				const float *pos = (&eed->v1)[i]->co;
+				GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+			}
 		}
 	}
 
@@ -1428,8 +1454,16 @@ static void add_overlay_loose_vert(
         const BMVert *eve, const int base_vert_idx)
 {
 	if (vbo_pos) {
-		const float *pos = eve->co;
-		GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos);
+		/* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+		if (rdata->edit_data && rdata->edit_data->vertexCos) {
+			int vidx = BM_elem_index_get(eve);
+			const float *pos = rdata->edit_data->vertexCos[vidx];
+			GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos);
+		}
+		else {
+			const float *pos = eve->co;
+			GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos);
+		}
 	}
 
 	if (vbo_nor) {
@@ -2095,8 +2129,18 @@ static Gwn_VertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
 					}
 				}
 
-				for (uint t = 0; t < 3; t++) {
-					copy_v3_v3(GWN_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+				/* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+				if (rdata->edit_data && rdata->edit_data->vertexCos) {
+					for (uint t = 0; t < 3; t++) {
+						int vidx = BM_elem_index_get(bm_looptri[t]->v);
+						const float *pos = rdata->edit_data->vertexCos[vidx];
+						copy_v3_v3(GWN_vertbuf_raw_step(&pos_step), pos);
+					}
+				}
+				else {
+					for (uint t = 0; t < 3; t++) {
+						copy_v3_v3(GWN_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+					}
 				}
 			}
 		}



More information about the Bf-blender-cvs mailing list