diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_particlesystem.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_particlesystem.c | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c index de1b11eddd9..6b2b999d596 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.c +++ b/source/blender/modifiers/intern/MOD_particlesystem.c @@ -51,17 +51,23 @@ static void initData(ModifierData *md) { ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md; psmd->psys = NULL; - psmd->dm = NULL; + psmd->dm_final = NULL; + psmd->dm_deformed = NULL; psmd->totdmvert = psmd->totdmedge = psmd->totdmface = 0; } static void freeData(ModifierData *md) { ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md; - if (psmd->dm) { - psmd->dm->needsFree = 1; - psmd->dm->release(psmd->dm); - psmd->dm = NULL; + if (psmd->dm_final) { + psmd->dm_final->needsFree = 1; + psmd->dm_final->release(psmd->dm_final); + psmd->dm_final = NULL; + if (psmd->dm_deformed) { + psmd->dm_deformed->needsFree = 1; + psmd->dm_deformed->release(psmd->dm_deformed); + psmd->dm_deformed = NULL; + } } /* ED_object_modifier_remove may have freed this first before calling @@ -78,7 +84,8 @@ static void copyData(ModifierData *md, ModifierData *target) modifier_copyData_generic(md, target); - tpsmd->dm = NULL; + tpsmd->dm_final = NULL; + tpsmd->dm_deformed = NULL; tpsmd->totdmvert = tpsmd->totdmedge = tpsmd->totdmface = 0; } @@ -119,9 +126,14 @@ static void deformVerts(ModifierData *md, Object *ob, } /* clear old dm */ - if (psmd->dm) { - psmd->dm->needsFree = 1; - psmd->dm->release(psmd->dm); + if (psmd->dm_final) { + psmd->dm_final->needsFree = 1; + psmd->dm_final->release(psmd->dm_final); + if (psmd->dm_deformed) { + psmd->dm_deformed->needsFree = 1; + psmd->dm_deformed->release(psmd->dm_deformed); + psmd->dm_deformed = NULL; + } } else if (psmd->flag & eParticleSystemFlag_file_loaded) { /* in file read dm just wasn't saved in file so no need to reset everything */ @@ -133,9 +145,9 @@ static void deformVerts(ModifierData *md, Object *ob, } /* make new dm */ - psmd->dm = CDDM_copy(dm); - CDDM_apply_vert_coords(psmd->dm, vertexCos); - CDDM_calc_normals(psmd->dm); + psmd->dm_final = CDDM_copy(dm); + CDDM_apply_vert_coords(psmd->dm_final, vertexCos); + CDDM_calc_normals(psmd->dm_final); if (needsFree) { dm->needsFree = 1; @@ -143,19 +155,27 @@ static void deformVerts(ModifierData *md, Object *ob, } /* protect dm */ - psmd->dm->needsFree = 0; + psmd->dm_final->needsFree = 0; + + DM_ensure_tessface(psmd->dm_final); + + if (!psmd->dm_final->deformedOnly) { + /* XXX Think we can assume here that if current DM is not only-deformed, ob->deformedOnly has been set. + * This is awfully weak though. :| */ + psmd->dm_deformed = CDDM_copy(ob->derivedDeform); + DM_ensure_tessface(psmd->dm_deformed); + } /* report change in mesh structure */ - DM_ensure_tessface(psmd->dm); - if (psmd->dm->getNumVerts(psmd->dm) != psmd->totdmvert || - psmd->dm->getNumEdges(psmd->dm) != psmd->totdmedge || - psmd->dm->getNumTessFaces(psmd->dm) != psmd->totdmface) + if (psmd->dm_final->getNumVerts(psmd->dm_final) != psmd->totdmvert || + psmd->dm_final->getNumEdges(psmd->dm_final) != psmd->totdmedge || + psmd->dm_final->getNumTessFaces(psmd->dm_final) != psmd->totdmface) { psys->recalc |= PSYS_RECALC_RESET; - psmd->totdmvert = psmd->dm->getNumVerts(psmd->dm); - psmd->totdmedge = psmd->dm->getNumEdges(psmd->dm); - psmd->totdmface = psmd->dm->getNumTessFaces(psmd->dm); + psmd->totdmvert = psmd->dm_final->getNumVerts(psmd->dm_final); + psmd->totdmedge = psmd->dm_final->getNumEdges(psmd->dm_final); + psmd->totdmface = psmd->dm_final->getNumTessFaces(psmd->dm_final); } if (!(ob->transflag & OB_NO_PSYS_UPDATE)) { |