From 099438f087b20a3ead6f018e208e8a5e84ac99f9 Mon Sep 17 00:00:00 2001 From: Daniel Genrich Date: Thu, 29 Oct 2009 19:26:13 +0000 Subject: [PATCH] Smoke: * Bugfix for crash when deleting particle system used by Smoke Flow modifier (reported by nudelZ). --- source/blender/blenkernel/intern/particle.c | 25 +++++++++++++++------ source/blender/blenkernel/intern/smoke.c | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index feec4866a18..43a624b3013 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -35,20 +35,21 @@ #include "MEM_guardedalloc.h" -#include "DNA_scene_types.h" #include "DNA_boid_types.h" +#include "DNA_curve_types.h" #include "DNA_group_types.h" -#include "DNA_particle_types.h" +#include "DNA_ipo_types.h" // XXX old animation system stuff to remove! +#include "DNA_key_types.h" +#include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_force.h" -#include "DNA_texture_types.h" -#include "DNA_material_types.h" #include "DNA_object_types.h" -#include "DNA_curve_types.h" -#include "DNA_key_types.h" -#include "DNA_ipo_types.h" // XXX old animation system stuff to remove! +#include "DNA_particle_types.h" +#include "DNA_scene_types.h" +#include "DNA_smoke_types.h" +#include "DNA_texture_types.h" #include "BLI_arithb.h" #include "BLI_blenlib.h" @@ -3308,10 +3309,20 @@ void object_remove_particle_system(Scene *scene, Object *ob) { ParticleSystem *psys = psys_get_current(ob); ParticleSystemModifierData *psmd; + ModifierData *md; if(!psys) return; + /* clear all other appearances of this pointer (like on smoke flow modifier) */ + if((md = modifiers_findByType(ob, eModifierType_Smoke))) + { + SmokeModifierData *smd = (SmokeModifierData *)md; + if((smd->type == MOD_SMOKE_TYPE_FLOW) && smd->flow && smd->flow->psys) + if(smd->flow->psys == psys) + smd->flow->psys = NULL; + } + /* clear modifier */ psmd= psys_get_modifier(ob, psys); BLI_remlink(&ob->modifiers, psmd); diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index ab56623ed5e..b7fe0bdfc98 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -823,7 +823,7 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd) // we got nice flow object SmokeFlowSettings *sfs = smd2->flow; - if(sfs->psys && sfs->psys->part && sfs->psys->part->type==PART_EMITTER) // is particle system selected + if(sfs && sfs->psys && sfs->psys->part && sfs->psys->part->type==PART_EMITTER) // is particle system selected { ParticleSystem *psys = sfs->psys; ParticleSettings *part=psys->part;