From 288d7794d4c6836e1322d5ed943c4fbd4b0b0e54 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Fri, 4 May 2018 09:20:57 +0200 Subject: Fix T54341: Particle Instance Modifier doesn't preserve edge data --- .../modifiers/intern/MOD_particleinstance.c | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'source/blender') 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; -- cgit v1.2.3