[Bf-blender-cvs] [288d7794d4c] master: Fix T54341: Particle Instance Modifier doesn't preserve edge data

Philipp Oeser noreply at git.blender.org
Fri May 4 09:24:30 CEST 2018


Commit: 288d7794d4c6836e1322d5ed943c4fbd4b0b0e54
Author: Philipp Oeser
Date:   Fri May 4 09:20:57 2018 +0200
Branches: master
https://developer.blender.org/rB288d7794d4c6836e1322d5ed943c4fbd4b0b0e54

Fix T54341: Particle Instance Modifier doesn't preserve edge data

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

M	source/blender/modifiers/intern/MOD_particleinstance.c

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

diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c
index f0b80cda447..97f01ac8ab1 100644
--- a/source/blender/modifiers/intern/MOD_particleinstance.c
+++ b/source/blender/modifiers/intern/MOD_particleinstance.c
@@ -229,8 +229,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	MPoly *mpoly, *orig_mpoly;
 	MLoop *mloop, *orig_mloop;
 	MVert *mvert, *orig_mvert;
-	int totvert, totpoly, totloop /* , totedge */;
-	int maxvert, maxpoly, maxloop, part_end = 0, part_start;
+	int totvert, totpoly, totloop , totedge;
+	int maxvert, maxpoly, maxloop, maxedge, part_end = 0, part_start;
 	int k, p, p_skip;
 	short track = ob->trackflag % 3, trackneg, axis = pimd->axis;
 	float max_co = 0.0, min_co = 0.0, temp_co[3];
@@ -309,12 +309,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	totvert = dm->getNumVerts(dm);
 	totpoly = dm->getNumPolys(dm);
 	totloop = dm->getNumLoops(dm);
-	/* totedge = dm->getNumEdges(dm); */ /* UNUSED */
+	totedge = dm->getNumEdges(dm);
 
 	/* count particles */
 	maxvert = 0;
 	maxpoly = 0;
 	maxloop = 0;
+	maxedge = 0;
 
 	for (p = part_start; p < part_end; p++) {
 		if (particle_skip(pimd, psys, p))
@@ -323,6 +324,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 		maxvert += totvert;
 		maxpoly += totpoly;
 		maxloop += totloop;
+		maxedge += totedge;
 	}
 
 	psys->lattice_deform_data = psys_create_lattice_deform_data(&sim);
@@ -335,11 +337,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 		max_co = max[track];
 	}
 
-	result = CDDM_from_template(dm, maxvert, 0, 0, maxloop, maxpoly);
+	result = CDDM_from_template(dm, maxvert, maxedge, 0, maxloop, maxpoly);
 
 	mvert = result->getVertArray(result);
 	orig_mvert = dm->getVertArray(dm);
-
 	mpoly = result->getPolyArray(result);
 	orig_mpoly = dm->getPolyArray(dm);
 	mloop = result->getLoopArray(result);
@@ -486,8 +487,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 			mul_m4_v3(spacemat, mv->co);
 		}
 
+		/* create edges and adjust edge vertex indices*/
+		DM_copy_edge_data(dm, result, 0, p_skip * totedge, totedge);
+		MEdge *me = CDDM_get_edges(result) + p_skip * totedge;
+		for (k = 0; k < totedge; k++, me++) {
+			me->v1 += p_skip * totvert;
+			me->v2 += p_skip * totvert;
+		}
+
 		/* create polys and loops */
 		for (k = 0; k < totpoly; k++) {
+
 			MPoly *inMP = orig_mpoly + k;
 			MPoly *mp = mpoly + p_skip * totpoly + k;
 
@@ -503,6 +513,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 				DM_copy_loop_data(dm, result, inMP->loopstart, mp->loopstart, j);
 				for (; j; j--, ml++, inML++) {
 					ml->v = inML->v + (p_skip * totvert);
+					ml->e = inML->e + (p_skip * totedge);
 					const int ml_index = (ml - mloop);
 					if (mloopcols_index != NULL) {
 						const int part_index = vert_part_index[ml->v];
@@ -515,12 +526,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 				}
 			}
 		}
-
 		p_skip++;
 	}
 
-	CDDM_calc_edges(result);
-
 	if (psys->lattice_deform_data) {
 		end_latt_deform(psys->lattice_deform_data);
 		psys->lattice_deform_data = NULL;



More information about the Bf-blender-cvs mailing list