From be28706bacfb95e7c3c1b58b183acda0e35977f8 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 6 Jan 2016 21:22:01 +0100 Subject: Proper fix for memleaks when rendering partsys from edit mode... --- source/blender/blenkernel/intern/particle.c | 7 +++++- .../blender/modifiers/intern/MOD_particlesystem.c | 25 +++++++++++----------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 39f0e7cbb84..1fedf38ff47 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -702,7 +702,12 @@ void psys_render_restore(Scene *scene, Object *ob, ParticleSystem *psys) if (psmd->dm_final) { if (!psmd->dm_final->deformedOnly) { - psmd->dm_deformed = CDDM_copy(mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH | CD_MASK_MFACE)); + if (ob->derivedDeform) { + psmd->dm_deformed = CDDM_copy(ob->derivedDeform); + } + else { + psmd->dm_deformed = CDDM_from_mesh((Mesh *)ob->data); + } DM_ensure_tessface(psmd->dm_deformed); } psys_calc_dmcache(ob, psmd->dm_final, psmd->dm_deformed, psys); diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c index 6af783b8b11..4791e41d433 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.c +++ b/source/blender/modifiers/intern/MOD_particlesystem.c @@ -36,6 +36,7 @@ #include #include "DNA_material_types.h" +#include "DNA_mesh_types.h" #include "BLI_utildefines.h" @@ -60,11 +61,11 @@ static void freeData(ModifierData *md) ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md; if (psmd->dm_final) { - psmd->dm_final->needsFree = 1; + psmd->dm_final->needsFree = true; psmd->dm_final->release(psmd->dm_final); psmd->dm_final = NULL; if (psmd->dm_deformed) { - psmd->dm_deformed->needsFree = 1; + psmd->dm_deformed->needsFree = true; psmd->dm_deformed->release(psmd->dm_deformed); psmd->dm_deformed = NULL; } @@ -105,7 +106,7 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *dm = derivedData; ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md; ParticleSystem *psys = NULL; - int needsFree = 0; + bool needsFree = false; /* float cfra = BKE_scene_frame_get(md->scene); */ /* UNUSED */ if (ob->particlesystem.first) @@ -122,12 +123,12 @@ static void deformVerts(ModifierData *md, Object *ob, if (!dm) return; - needsFree = 1; + needsFree = true; } /* clear old dm */ if (psmd->dm_final) { - psmd->dm_final->needsFree = 1; + psmd->dm_final->needsFree = true; psmd->dm_final->release(psmd->dm_final); if (psmd->dm_deformed) { psmd->dm_deformed->needsFree = 1; @@ -150,25 +151,23 @@ static void deformVerts(ModifierData *md, Object *ob, CDDM_calc_normals(psmd->dm_final); if (needsFree) { - dm->needsFree = 1; + dm->needsFree = true; dm->release(dm); } /* protect dm */ - psmd->dm_final->needsFree = 0; + psmd->dm_final->needsFree = false; 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. :| */ - dm = ob->derivedDeform; - if (!dm) { - /* Can happen, e.g. when rendering from Edit mode... */ - psmd->dm_deformed = get_dm(ob, NULL, NULL, vertexCos, false, true); + if (ob->derivedDeform) { + psmd->dm_deformed = CDDM_copy(ob->derivedDeform); } - else { - psmd->dm_deformed = CDDM_copy(dm); + else { /* Can happen in some cases, e.g. when rendering from Edit mode... */ + psmd->dm_deformed = CDDM_from_mesh((Mesh *)ob->data); } DM_ensure_tessface(psmd->dm_deformed); } -- cgit v1.2.3