[Bf-blender-cvs] [d1916764008] blender2.8: Modifiers: use Mesh instead of DerivedMesh for explode.

Sebastian Parborg noreply at git.blender.org
Tue Sep 25 14:50:27 CEST 2018


Commit: d1916764008de69aa6fcf4348223c7001497b64d
Author: Sebastian Parborg
Date:   Tue Sep 25 12:35:43 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd1916764008de69aa6fcf4348223c7001497b64d

Modifiers: use Mesh instead of DerivedMesh for explode.

Differential Revision: https://developer.blender.org/D3718

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/mesh_validate.c
M	source/blender/modifiers/intern/MOD_explode.c

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index a2ac413764c..e937dd992cd 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -499,6 +499,7 @@ void BKE_mesh_strip_loose_edges(struct Mesh *me);
 
 void BKE_mesh_calc_edges_legacy(struct Mesh *me, const bool use_old);
 void BKE_mesh_calc_edges(struct Mesh *mesh, bool update, const bool select);
+void BKE_mesh_calc_edges_tessface(struct Mesh *mesh);
 
 /* **** Depsgraph evaluation **** */
 
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index c38196bcfb9..d59fa3ece60 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -650,7 +650,9 @@ static Mesh *mesh_new_nomain_from_template_ex(
         int loops_len, int polys_len,
         CustomDataMask mask)
 {
-	const bool do_tessface = ((me_src->totface != 0) && (me_src->totpoly == 0)); /* only do tessface if we have no polys */
+	/* Only do tessface if we are creating tessfaces or copying from mesh with only tessfaces. */
+	const bool do_tessface = (tessface_len ||
+	                          ((me_src->totface != 0) && (me_src->totpoly == 0)));
 
 	Mesh *me_dst = BKE_id_new_nomain(ID_ME, NULL);
 
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
index d5a19d19764..bfb3b107084 100644
--- a/source/blender/blenkernel/intern/mesh_validate.c
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -1501,4 +1501,66 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool update, const bool select)
 
 	BLI_edgehash_free(eh, NULL);
 }
+
+/**
+ * Calculate/create edges from tessface data
+ *
+ * \param mesh  The mesh to add edges into
+ */
+
+void BKE_mesh_calc_edges_tessface(Mesh *mesh)
+{
+	CustomData edgeData;
+	EdgeSetIterator *ehi;
+	MFace *mf = mesh->mface;
+	MEdge *med;
+	EdgeSet *eh;
+	int i, *index, numEdges, numFaces = mesh->totface;
+
+	eh = BLI_edgeset_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(numFaces));
+
+	for (i = 0; i < numFaces; i++, mf++) {
+		BLI_edgeset_add(eh, mf->v1, mf->v2);
+		BLI_edgeset_add(eh, mf->v2, mf->v3);
+
+		if (mf->v4) {
+			BLI_edgeset_add(eh, mf->v3, mf->v4);
+			BLI_edgeset_add(eh, mf->v4, mf->v1);
+		}
+		else {
+			BLI_edgeset_add(eh, mf->v3, mf->v1);
+		}
+	}
+
+	numEdges = BLI_edgeset_len(eh);
+
+	/* write new edges into a temporary CustomData */
+	CustomData_reset(&edgeData);
+	CustomData_add_layer(&edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
+	CustomData_add_layer(&edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
+
+	med = CustomData_get_layer(&edgeData, CD_MEDGE);
+	index = CustomData_get_layer(&edgeData, CD_ORIGINDEX);
+
+	for (ehi = BLI_edgesetIterator_new(eh), i = 0;
+	     BLI_edgesetIterator_isDone(ehi) == false;
+	     BLI_edgesetIterator_step(ehi), i++, med++, index++)
+	{
+		BLI_edgesetIterator_getKey(ehi, &med->v1, &med->v2);
+
+		med->flag = ME_EDGEDRAW | ME_EDGERENDER;
+		*index = ORIGINDEX_NONE;
+	}
+	BLI_edgesetIterator_free(ehi);
+
+	/* free old CustomData and assign new one */
+	CustomData_free(&mesh->edata, mesh->totedge);
+	mesh->edata = edgeData;
+	mesh->totedge = numEdges;
+
+	mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE);
+
+	BLI_edgeset_free(eh);
+}
+
 /** \} */
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c
index df454eb9008..2a8f3f44ea8 100644
--- a/source/blender/modifiers/intern/MOD_explode.c
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -44,9 +44,9 @@
 #include "BLI_math.h"
 #include "BLI_edgehash.h"
 
-#include "BKE_cdderivedmesh.h"
 #include "BKE_deform.h"
 #include "BKE_lattice.h"
+#include "BKE_library.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_particle.h"
@@ -100,7 +100,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
 static void createFacepa(
         ExplodeModifierData *emd,
         ParticleSystemModifierData *psmd,
-        DerivedMesh *dm)
+        Mesh *mesh)
 {
 	ParticleSystem *psys = psmd->psys;
 	MFace *fa = NULL, *mface = NULL;
@@ -112,31 +112,32 @@ static void createFacepa(
 	int *facepa = NULL, *vertpa = NULL, totvert = 0, totface = 0, totpart = 0;
 	int i, p, v1, v2, v3, v4 = 0;
 
-	mvert = dm->getVertArray(dm);
-	mface = dm->getTessFaceArray(dm);
-	totface = dm->getNumTessFaces(dm);
-	totvert = dm->getNumVerts(dm);
+	mvert = mesh->mvert;
+	mface = mesh->mface;
+	totvert = mesh->totvert;
+	totface = mesh->totface;
 	totpart = psmd->psys->totpart;
 
 	rng = BLI_rng_new_srandom(psys->seed);
 
-	if (emd->facepa)
+	if (emd->facepa) {
 		MEM_freeN(emd->facepa);
-
+	}
 	facepa = emd->facepa = MEM_calloc_arrayN(totface, sizeof(int), "explode_facepa");
 
 	vertpa = MEM_calloc_arrayN(totvert, sizeof(int), "explode_vertpa");
 
 	/* initialize all faces & verts to no particle */
-	for (i = 0; i < totface; i++)
+	for (i = 0; i < totface; i++) {
 		facepa[i] = totpart;
-
-	for (i = 0; i < totvert; i++)
+	}
+	for (i = 0; i < totvert; i++) {
 		vertpa[i] = totpart;
+	}
 
 	/* set protected verts */
 	if (emd->vgroup) {
-		MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+		MDeformVert *dvert = CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT);
 		if (dvert) {
 			const int defgrp_index = emd->vgroup - 1;
 			for (i = 0; i < totvert; i++, dvert++) {
@@ -164,27 +165,40 @@ static void createFacepa(
 			add_v3_v3(center, mvert[fa->v4].co);
 			mul_v3_fl(center, 0.25);
 		}
-		else
+		else {
 			mul_v3_fl(center, 1.0f / 3.0f);
+		}
 
 		p = BLI_kdtree_find_nearest(tree, center, NULL);
 
 		v1 = vertpa[fa->v1];
 		v2 = vertpa[fa->v2];
 		v3 = vertpa[fa->v3];
-		if (fa->v4)
+		if (fa->v4) {
 			v4 = vertpa[fa->v4];
+		}
 
-		if (v1 >= 0 && v2 >= 0 && v3 >= 0 && (fa->v4 == 0 || v4 >= 0))
+		if (v1 >= 0 && v2 >= 0 && v3 >= 0 && (fa->v4 == 0 || v4 >= 0)) {
 			facepa[i] = p;
+		}
 
-		if (v1 >= 0) vertpa[fa->v1] = p;
-		if (v2 >= 0) vertpa[fa->v2] = p;
-		if (v3 >= 0) vertpa[fa->v3] = p;
-		if (fa->v4 && v4 >= 0) vertpa[fa->v4] = p;
+		if (v1 >= 0) {
+			vertpa[fa->v1] = p;
+		}
+		if (v2 >= 0) {
+			vertpa[fa->v2] = p;
+		}
+		if (v3 >= 0) {
+			vertpa[fa->v3] = p;
+		}
+		if (fa->v4 && v4 >= 0) {
+			vertpa[fa->v4] = p;
+		}
 	}
 
-	if (vertpa) MEM_freeN(vertpa);
+	if (vertpa) {
+		MEM_freeN(vertpa);
+	}
 	BLI_kdtree_free(tree);
 
 	BLI_rng_free(rng);
@@ -203,10 +217,10 @@ static const short add_faces[24] = {
 	1, 1, 2
 };
 
-static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFace *mf)
+static MFace *get_dface(Mesh *mesh, Mesh *split, int cur, int i, MFace *mf)
 {
-	MFace *df = CDDM_get_tessface(split, cur);
-	DM_copy_tessface_data(dm, split, i, cur, 1);
+	MFace *df = &split->mface[cur];
+	CustomData_copy_data(&mesh->fdata, &split->fdata, i, cur, 1);
 	*df = *mf;
 	return df;
 }
@@ -222,11 +236,11 @@ static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFa
 #define GET_ES(v1, v2) edgecut_get(eh, v1, v2)
 #define INT_UV(uvf, c0, c1) mid_v2_v2v2(uvf, mf->uv[c0], mf->uv[c1])
 
-static void remap_faces_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+static void remap_faces_3_6_9_12(Mesh *mesh, Mesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
 {
-	MFace *df1 = get_dface(dm, split, cur, i, mf);
-	MFace *df2 = get_dface(dm, split, cur + 1, i, mf);
-	MFace *df3 = get_dface(dm, split, cur + 2, i, mf);
+	MFace *df1 = get_dface(mesh, split, cur, i, mf);
+	MFace *df2 = get_dface(mesh, split, cur + 1, i, mf);
+	MFace *df3 = get_dface(mesh, split, cur + 2, i, mf);
 
 	facepa[cur] = vertpa[v1];
 	df1->v1 = v1;
@@ -250,17 +264,17 @@ static void remap_faces_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, MFace *mf,
 	df3->flag &= ~ME_FACE_SEL;
 }
 
-static void remap_uvs_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+static void remap_uvs_3_6_9_12(Mesh *mesh, Mesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
 {
 	MTFace *mf, *df1, *df2, *df3;
 	int l;
 
 	for (l = 0; l < numlayer; l++) {
-		mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+		mf = CustomData_get_layer_n(&split->fdata, CD_MTFACE, l);
 		df1 = mf + cur;
 		df2 = df1 + 1;
 		df3 = df1 + 2;
-		mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+		mf = CustomData_get_layer_n(&mesh->fdata, CD_MTFACE, l);
 		mf += i;
 
 		copy_v2_v2(df1->uv[0], mf->uv[c0]);
@@ -278,10 +292,10 @@ static void remap_uvs_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, int numlayer
 	}
 }
 
-static void remap_faces_5_10(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+static void remap_faces_5_10(Mesh *mesh, Mesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
 {
-	MFace *df1 = get_dface(dm, split, cur, i, mf);
-	MFace *df2 = get_dface(dm, split, cur + 1, i, mf);
+	MFace *df1 = get_dface(mesh, split, cur, i, mf);
+	MFace *df2 = get_dface(mesh, split, cur + 1, i, mf);
 
 	facepa[cur] = vertpa[v1];
 	df1->v1 = v1;
@@ -298,16 +312,16 @@ static void remap_faces_5_10(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int
 	df2->flag |= ME_FACE_SEL;
 }
 
-static void remap_uvs_5_10(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+static void remap_uvs_5_10(Mesh *mesh, Mesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
 {
 	MTFace *mf, *df1, *df2;
 	int l;
 
 	for (l = 0; l < numlayer; l++) {
-		mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+		mf = CustomData_get_layer_n(&split->fdata, CD_MTFACE, l);
 		df1 = mf + cur;
 		df2 = df1 + 1;
-		mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+		mf = CustomData_get_layer_n(&mesh->fdata, CD_MTFACE, l);
 		mf += i;
 
 		copy_v2_v2(df1->uv[0], mf->uv[c0]);
@@ -323,12 +337,12 @@ static void remap_uvs_5_10(DerivedMesh *dm, DerivedMesh *split, int numlayer, in
 	}
 }
 
-static void remap_face

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list