Proper fix for memleaks when rendering partsys from edit mode...
This commit is contained in:
@@ -702,7 +702,12 @@ void psys_render_restore(Scene *scene, Object *ob, ParticleSystem *psys)
|
|||||||
|
|
||||||
if (psmd->dm_final) {
|
if (psmd->dm_final) {
|
||||||
if (!psmd->dm_final->deformedOnly) {
|
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);
|
DM_ensure_tessface(psmd->dm_deformed);
|
||||||
}
|
}
|
||||||
psys_calc_dmcache(ob, psmd->dm_final, psmd->dm_deformed, psys);
|
psys_calc_dmcache(ob, psmd->dm_final, psmd->dm_deformed, psys);
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#include "DNA_material_types.h"
|
#include "DNA_material_types.h"
|
||||||
|
#include "DNA_mesh_types.h"
|
||||||
|
|
||||||
#include "BLI_utildefines.h"
|
#include "BLI_utildefines.h"
|
||||||
|
|
||||||
@@ -60,11 +61,11 @@ static void freeData(ModifierData *md)
|
|||||||
ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md;
|
ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md;
|
||||||
|
|
||||||
if (psmd->dm_final) {
|
if (psmd->dm_final) {
|
||||||
psmd->dm_final->needsFree = 1;
|
psmd->dm_final->needsFree = true;
|
||||||
psmd->dm_final->release(psmd->dm_final);
|
psmd->dm_final->release(psmd->dm_final);
|
||||||
psmd->dm_final = NULL;
|
psmd->dm_final = NULL;
|
||||||
if (psmd->dm_deformed) {
|
if (psmd->dm_deformed) {
|
||||||
psmd->dm_deformed->needsFree = 1;
|
psmd->dm_deformed->needsFree = true;
|
||||||
psmd->dm_deformed->release(psmd->dm_deformed);
|
psmd->dm_deformed->release(psmd->dm_deformed);
|
||||||
psmd->dm_deformed = NULL;
|
psmd->dm_deformed = NULL;
|
||||||
}
|
}
|
||||||
@@ -105,7 +106,7 @@ static void deformVerts(ModifierData *md, Object *ob,
|
|||||||
DerivedMesh *dm = derivedData;
|
DerivedMesh *dm = derivedData;
|
||||||
ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md;
|
ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md;
|
||||||
ParticleSystem *psys = NULL;
|
ParticleSystem *psys = NULL;
|
||||||
int needsFree = 0;
|
bool needsFree = false;
|
||||||
/* float cfra = BKE_scene_frame_get(md->scene); */ /* UNUSED */
|
/* float cfra = BKE_scene_frame_get(md->scene); */ /* UNUSED */
|
||||||
|
|
||||||
if (ob->particlesystem.first)
|
if (ob->particlesystem.first)
|
||||||
@@ -122,12 +123,12 @@ static void deformVerts(ModifierData *md, Object *ob,
|
|||||||
if (!dm)
|
if (!dm)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
needsFree = 1;
|
needsFree = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clear old dm */
|
/* clear old dm */
|
||||||
if (psmd->dm_final) {
|
if (psmd->dm_final) {
|
||||||
psmd->dm_final->needsFree = 1;
|
psmd->dm_final->needsFree = true;
|
||||||
psmd->dm_final->release(psmd->dm_final);
|
psmd->dm_final->release(psmd->dm_final);
|
||||||
if (psmd->dm_deformed) {
|
if (psmd->dm_deformed) {
|
||||||
psmd->dm_deformed->needsFree = 1;
|
psmd->dm_deformed->needsFree = 1;
|
||||||
@@ -150,25 +151,23 @@ static void deformVerts(ModifierData *md, Object *ob,
|
|||||||
CDDM_calc_normals(psmd->dm_final);
|
CDDM_calc_normals(psmd->dm_final);
|
||||||
|
|
||||||
if (needsFree) {
|
if (needsFree) {
|
||||||
dm->needsFree = 1;
|
dm->needsFree = true;
|
||||||
dm->release(dm);
|
dm->release(dm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* protect dm */
|
/* protect dm */
|
||||||
psmd->dm_final->needsFree = 0;
|
psmd->dm_final->needsFree = false;
|
||||||
|
|
||||||
DM_ensure_tessface(psmd->dm_final);
|
DM_ensure_tessface(psmd->dm_final);
|
||||||
|
|
||||||
if (!psmd->dm_final->deformedOnly) {
|
if (!psmd->dm_final->deformedOnly) {
|
||||||
/* XXX Think we can assume here that if current DM is not only-deformed, ob->deformedOnly has been set.
|
/* XXX Think we can assume here that if current DM is not only-deformed, ob->deformedOnly has been set.
|
||||||
* This is awfully weak though. :| */
|
* This is awfully weak though. :| */
|
||||||
dm = ob->derivedDeform;
|
if (ob->derivedDeform) {
|
||||||
if (!dm) {
|
psmd->dm_deformed = CDDM_copy(ob->derivedDeform);
|
||||||
/* Can happen, e.g. when rendering from Edit mode... */
|
|
||||||
psmd->dm_deformed = get_dm(ob, NULL, NULL, vertexCos, false, true);
|
|
||||||
}
|
}
|
||||||
else {
|
else { /* Can happen in some cases, e.g. when rendering from Edit mode... */
|
||||||
psmd->dm_deformed = CDDM_copy(dm);
|
psmd->dm_deformed = CDDM_from_mesh((Mesh *)ob->data);
|
||||||
}
|
}
|
||||||
DM_ensure_tessface(psmd->dm_deformed);
|
DM_ensure_tessface(psmd->dm_deformed);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user