Merge branch 'master' into blender2.8
authorPhilipp Oeser <info@graphics-engineer.com>
Fri, 4 May 2018 08:31:16 +0000 (10:31 +0200)
committerPhilipp Oeser <info@graphics-engineer.com>
Fri, 4 May 2018 08:32:35 +0000 (10:32 +0200)
source/blender/modifiers/intern/MOD_particleinstance.c

index 56f6fa57b5119e33acf78b2811f07b34292f6883..b93e567fe56c25bb76cf96acb543f1af50938a25 100644 (file)
@@ -213,8 +213,8 @@ static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *c
        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 = ctx->object->trackflag % 3, trackneg, axis = pimd->axis;
        float max_co = 0.0, min_co = 0.0, temp_co[3];
@@ -294,12 +294,13 @@ static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *c
        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))
@@ -308,6 +309,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *c
                maxvert += totvert;
                maxpoly += totpoly;
                maxloop += totloop;
+               maxedge += totedge;
        }
 
        psys->lattice_deform_data = psys_create_lattice_deform_data(&sim);
@@ -320,11 +322,10 @@ static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *c
                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);
@@ -471,8 +472,17 @@ static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *c
                        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;
 
@@ -488,6 +498,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *c
                                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];
@@ -500,12 +511,9 @@ static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *c
                                }
                        }
                }
-
                p_skip++;
        }
 
-       CDDM_calc_edges(result);
-
        if (psys->lattice_deform_data) {
                end_latt_deform(psys->lattice_deform_data);
                psys->lattice_deform_data = NULL;