[7efc75c7092] blender2.8: Modifiers: Simple Deform & Build, DerivedMesh → Mesh

Sybren A. Stüvel noreply at git.blender.org
Tue May 1 18:06:08 CEST 2018


Commit: 7efc75c7092b085fe3f5ef2dcab3669d466dfadc
Author: Sybren A. Stüvel
Date:   Thu Apr 19 11:03:58 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB7efc75c7092b085fe3f5ef2dcab3669d466dfadc

Modifiers: Simple Deform & Build, DerivedMesh → Mesh

This commit introduces `EditMeshData`. The fields in this struct are
extracted from `EditDerivedBMesh` into their own struct `EditMeshData`,
which can then also be used by the `Mesh` struct. This allows passing
deformed vertices efficiently to the draw routines.

The modifier code constructs a 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/BKE_mesh.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/editderivedmesh.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
M	source/blender/makesdna/DNA_mesh_types.h
M	source/blender/modifiers/intern/MOD_build.c
M	source/blender/modifiers/intern/MOD_simpledeform.c
M	source/blender/modifiers/intern/MOD_util.c
M	source/blender/modifiers/intern/MOD_util.h

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 25ea73827c9..f0b6522f525 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -93,6 +93,14 @@ 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);
 
+struct Mesh * BKE_mesh_from_template(
+        struct Mesh *me_src,
+        int numVerts, int numEdges, int numTessFaces,
+        int numLoops, int numPolys);
+
+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 c2e92136632..2c69bc90acb 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1162,7 +1162,10 @@ DerivedMesh *mesh_create_derived_for_modifier(
 	
 	if (mti->type == eModifierTypeType_OnlyDeform) {
 		int numVerts;
-		float (*deformedVerts)[3] = BKE_mesh_vertexCos_get(me, &numVerts);
+		/* Always get the vertex coordinates from the original mesh. Otherwise
+		 * there is the risk of deforming already-deformed coordinates. */
+		Mesh *mesh_orig_id = (Mesh *)DEG_get_original_id(&me->id);
+		float (*deformedVerts)[3] = BKE_mesh_vertexCos_get(mesh_orig_id, &numVerts);
 
 		modwrap_deformVerts(md, depsgraph, ob, NULL, deformedVerts, numVerts, 0);
 		dm = mesh_create_derived(me, deformedVerts);
@@ -1748,6 +1751,9 @@ static void mesh_calc_modifiers(
         DerivedMesh **r_deform, DerivedMesh **r_final)
 {
 	Mesh *me = ob->data;
+	/* Always get the vertex coordinates from the original mesh. Otherwise
+	 * there is the risk of deforming already-deformed coordinates. */
+	Mesh *mesh_orig_id = (Mesh *)DEG_get_original_id(&me->id);
 	ModifierData *firstmd, *md, *previewmd = NULL;
 	CDMaskLink *datamasks, *curr;
 	/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
@@ -1837,7 +1843,7 @@ static void mesh_calc_modifiers(
 
 			if (mti->type == eModifierTypeType_OnlyDeform && !sculpt_dyntopo) {
 				if (!deformedVerts)
-					deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+					deformedVerts = BKE_mesh_vertexCos_get(mesh_orig_id, &numVerts);
 
 				modwrap_deformVerts(md, depsgraph, ob, NULL, deformedVerts, numVerts, deform_app_flags);
 			}
@@ -1870,7 +1876,7 @@ static void mesh_calc_modifiers(
 		if (inputVertexCos)
 			deformedVerts = inputVertexCos;
 		else
-			deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+			deformedVerts = BKE_mesh_vertexCos_get(mesh_orig_id, &numVerts);
 	}
 
 
@@ -1967,7 +1973,7 @@ static void mesh_calc_modifiers(
 					dm->getVertCos(dm, deformedVerts);
 				}
 				else {
-					deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+					deformedVerts = BKE_mesh_vertexCos_get(mesh_orig_id, &numVerts);
 				}
 			}
 
@@ -2467,6 +2473,11 @@ 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);
+					mesh->emd->vertexCos = MEM_dupallocN(deformedVerts);
+				}
 				*r_cage = getEditDerivedBMesh(
 				        em, ob, mask,
 				        deformedVerts ? MEM_dupallocN(deformedVerts) : NULL);
@@ -2504,6 +2515,13 @@ 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);
+			if (mesh->emd->vertexCos != NULL)
+				MEM_freeN((void *)mesh->emd->vertexCos);
+			mesh->emd->vertexCos = MEM_dupallocN(deformedVerts);
+		}
 		*r_final = getEditDerivedBMesh(em, ob, dataMask, deformedVerts);
 		deformedVerts = NULL;
 
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 1e211d1c4af..f5e5a37c7d7 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -56,6 +56,7 @@
 
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -64,14 +65,7 @@ typedef struct EditDerivedBMesh {
 
 	BMEditMesh *em;
 
-	/** when set, \a vertexNos, polyNos are lazy initialized */
-	const float (*vertexCos)[3];
-
-	/** lazy initialize (when \a vertexCos is set) */
-	float const (*vertexNos)[3];
-	float const (*polyNos)[3];
-	/** also lazy init but dont depend on \a vertexCos */
-	const float (*polyCos)[3];
+	EditMeshData emd;
 } EditDerivedBMesh;
 
 /* -------------------------------------------------------------------- */
@@ -81,7 +75,7 @@ static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm);
 
 static void emDM_ensureVertNormals(EditDerivedBMesh *bmdm)
 {
-	if (bmdm->vertexCos && (bmdm->vertexNos == NULL)) {
+	if (bmdm->emd.vertexCos && (bmdm->emd.vertexNos == NULL)) {
 
 		BMesh *bm = bmdm->em->bm;
 		const float (*vertexCos)[3], (*polyNos)[3];
@@ -92,19 +86,19 @@ static void emDM_ensureVertNormals(EditDerivedBMesh *bmdm)
 
 		BM_mesh_elem_index_ensure(bm, BM_FACE);
 
-		polyNos = bmdm->polyNos;
-		vertexCos = bmdm->vertexCos;
+		polyNos = bmdm->emd.polyNos;
+		vertexCos = bmdm->emd.vertexCos;
 		vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__);
 
 		BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos);
 
-		bmdm->vertexNos = (const float (*)[3])vertexNos;
+		bmdm->emd.vertexNos = (const float (*)[3])vertexNos;
 	}
 }
 
 static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm)
 {
-	if (bmdm->vertexCos && (bmdm->polyNos == NULL)) {
+	if (bmdm->emd.vertexCos && (bmdm->emd.polyNos == NULL)) {
 		BMesh *bm = bmdm->em->bm;
 		const float (*vertexCos)[3];
 		float (*polyNos)[3];
@@ -117,7 +111,7 @@ static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm)
 
 		polyNos = MEM_mallocN(sizeof(*polyNos) * bm->totface, __func__);
 
-		vertexCos = bmdm->vertexCos;
+		vertexCos = bmdm->emd.vertexCos;
 
 		BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
 			BM_elem_index_set(efa, i); /* set_inline */
@@ -125,13 +119,13 @@ static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm)
 		}
 		bm->elem_index_dirty &= ~BM_FACE;
 
-		bmdm->polyNos = (const float (*)[3])polyNos;
+		bmdm->emd.polyNos = (const float (*)[3])polyNos;
 	}
 }
 
 static void emDM_ensurePolyCenters(EditDerivedBMesh *bmdm)
 {
-	if (bmdm->polyCos == NULL) {
+	if (bmdm->emd.polyCos == NULL) {
 		BMesh *bm = bmdm->em->bm;
 		float (*polyCos)[3];
 
@@ -141,9 +135,9 @@ static void emDM_ensurePolyCenters(EditDerivedBMesh *bmdm)
 
 		polyCos = MEM_mallocN(sizeof(*polyCos) * bm->totface, __func__);
 
-		if (bmdm->vertexCos) {
+		if (bmdm->emd.vertexCos) {
 			const float (*vertexCos)[3];
-			vertexCos = bmdm->vertexCos;
+			vertexCos = bmdm->emd.vertexCos;
 
 			BM_mesh_elem_index_ensure(bm, BM_VERT);
 
@@ -157,7 +151,7 @@ static void emDM_ensurePolyCenters(EditDerivedBMesh *bmdm)
 			}
 		}
 
-		bmdm->polyCos = (const float (*)[3])polyCos;
+		bmdm->emd.polyCos = (const float (*)[3])polyCos;
 	}
 }
 
@@ -193,9 +187,9 @@ static void emDM_calcLoopNormalsSpaceArray(
 	emDM_ensurePolyNormals(bmdm);
 	dm->dirty &= ~DM_DIRTY_NORMALS;
 
-	vertexCos = bmdm->vertexCos;
-	vertexNos = bmdm->vertexNos;
-	polyNos = bmdm->polyNos;
+	vertexCos = bmdm->emd.vertexCos;
+	vertexNos = bmdm->emd.vertexNos;
+	polyNos = bmdm->emd.polyNos;
 
 	loopNos = dm->getLoopDataArray(dm, CD_NORMAL);
 	if (!loopNos) {
@@ -247,7 +241,7 @@ static void emDM_calc_loop_tangents(
 		return;
 	}
 
-	const float (*poly_normals)[3] = bmdm->polyNos;
+	const float (*poly_normals)[3] = bmdm->emd.polyNos;
 	const float (*loop_normals)[3] = CustomData_get_layer(&dm->loopData, CD_NORMAL);
 	const float (*vert_orco)[3] = dm->getVertDataArray(dm, CD_ORCO);  /* can be NULL */
 	BKE_editmesh_loop_tangent_calc(
@@ -311,13 +305,13 @@ static void emDM_foreachMappedVert(
 	BMIter iter;
 	int i;
 
-	if (bmdm->vertexCos) {
-		const float (*vertexCos)[3] = bmdm->vertexCos;
+	if (bmdm->emd.vertexCos) {
+		const float (*vertexCos)[3] = bmdm->emd.vertexCos;
 		const float (*vertexNos)[3];
 
 		if (flag & DM_FOREACH_USE_NORMAL) {
 			emDM_ensureVertNormals(bmdm);
-			vertexNos = bmdm->vertexNos;
+			vertexNos = bmdm->emd.vertexNos;
 		}
 		else {
 			vertexNos = NULL;
@@ -346,14 +340,14 @@ static void emDM_foreachMappedEdge(
 	BMIter iter;
 	int i;
 
-	if (bmdm->vertexCos) {
+	if (bmdm->emd.vertexCos) {
 
 		BM_mesh_elem_index_ensure(bm, BM_VERT);
 
 		BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
 			func(userData, i,
-			     bmdm->vertexCos[BM_elem_index_get(eed->v1)],
-			     bmdm->vertexCos[BM_elem_index_get(eed->v2)]);
+			     bmdm->emd.vertexCos[BM_elem_index_get(eed->v1)],
+			     bmdm->emd.vertexCos[BM_elem_index_get(eed->v2)]);
 		}
 	}
 	else {
@@ -378,7 +372,7 @@ static void emDM_foreachMappedLoop(
 	BMFace *efa;
 	BMIter iter;
 
-	const float (*vertexCos)[3] = bmdm->vertexCos;
+	const float (*vertexCos)[3] = bmdm->emd.vertexCos;
 	int f_idx;
 
 	BM_mesh_elem_index_ensure(bm, BM_VERT);
@@ -411,11 +405,11 @@ static void emDM_foreachMappedFaceCenter(
 	int i;
 
 	emDM_ensurePolyCenters(bmdm);
-	polyCos = bmdm->polyCos;  /* always set */
+	polyCos = bmdm->emd.polyCos;  /* always set */
 
 	if (flag & DM_FOREACH_USE_NORMAL) {
 		emDM_ensurePolyNormals(bmdm);
-		polyNos = bmdm->polyNos;  /* maybe NULL */
+		polyNos = bmdm->emd.polyNos;  /* maybe NULL */
 	}
 	else {
 		polyNos = NULL;
@@ -444,9 +438,9 @@ static void emDM_getMinMax(DerivedMesh *dm, float r_min[3], float r_max[3])
 	int i;
 
 	if (bm->totvert) {
-		if (bmdm->vertexCos) {
+		if (bmdm->emd.vertexCos) {
 			BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
-				minmax_v3v3_v3(r_min, r_max, bmdm->vertexCos[i]);
+				minmax_v3v3_v3(r_min, r_max, bmdm->emd.vertexCos[i]);
 			}
 		}
 		else {
@@ -526,8 +520,8 @@ static void emDM_getVert(DerivedMesh *dm, int index, MVert *r_vert)
 	// ev = BM_vert_at_ind

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list