diff options
author | Sebastián Barschkis <sebbas@sebbas.org> | 2020-02-04 00:02:17 +0300 |
---|---|---|
committer | Sebastián Barschkis <sebbas@sebbas.org> | 2020-02-04 00:04:07 +0300 |
commit | e268fe6e64dd872534944e825c0fe7483e18010a (patch) | |
tree | 87625f64f2feccf5c896250a13a1324b90991482 | |
parent | 0cd0058e27025b97b1d187cf2299694c6696cb19 (diff) |
Fix T73537: Particle system Crash
Added sanity check in the flow / obstacle object loops that check if the modifier data is valid. Ideally this should not be needed. However, in remove_particle_systems_from_object() the fluid modifier can get freed. It is not yet clear whether the modifier free call is really needed or not.
-rw-r--r-- | source/blender/blenkernel/intern/fluid.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/fluid.c b/source/blender/blenkernel/intern/fluid.c index f19137bf796..91adbf2301d 100644 --- a/source/blender/blenkernel/intern/fluid.c +++ b/source/blender/blenkernel/intern/fluid.c @@ -872,6 +872,11 @@ static void update_obstacleflags(FluidDomainSettings *mds, FluidModifierData *mmd2 = (FluidModifierData *)modifiers_findByType(coll_ob, eModifierType_Fluid); + /* Sanity check. */ + if (!mmd2) { + continue; + } + if ((mmd2->type & MOD_FLUID_TYPE_EFFEC) && mmd2->effector) { FluidEffectorSettings *mes = mmd2->effector; if (!mes) { @@ -959,6 +964,11 @@ static void update_obstacles(Depsgraph *depsgraph, FluidModifierData *mmd2 = (FluidModifierData *)modifiers_findByType(coll_ob, eModifierType_Fluid); + /* Sanity check. */ + if (!mmd2) { + continue; + } + /* TODO (sebbas): check if modifier is active? */ if ((mmd2->type & MOD_FLUID_TYPE_EFFEC) && mmd2->effector) { FluidEffectorSettings *mes = mmd2->effector; @@ -2298,7 +2308,7 @@ static void update_flowsflags(FluidDomainSettings *mds, Object **flowobjs, int n FluidModifierData *mmd2 = (FluidModifierData *)modifiers_findByType(coll_ob, eModifierType_Fluid); - // Sanity check + /* Sanity check. */ if (!mmd2) { continue; } @@ -2411,6 +2421,11 @@ static void update_flowsfluids(struct Depsgraph *depsgraph, FluidModifierData *mmd2 = (FluidModifierData *)modifiers_findByType(flowobj, eModifierType_Fluid); + /* Sanity check. */ + if (!mmd2) { + continue; + } + /* Check for initialized smoke object. */ if ((mmd2->type & MOD_FLUID_TYPE_FLOW) && mmd2->flow) { FluidFlowSettings *mfs = mmd2->flow; @@ -2607,6 +2622,11 @@ static void update_flowsfluids(struct Depsgraph *depsgraph, FluidModifierData *mmd2 = (FluidModifierData *)modifiers_findByType(flowobj, eModifierType_Fluid); + /* Sanity check. */ + if (!mmd2) { + continue; + } + /* Check for initialized flow object. */ if ((mmd2->type & MOD_FLUID_TYPE_FLOW) && mmd2->flow) { FluidFlowSettings *mfs = mmd2->flow; @@ -3313,7 +3333,7 @@ static void BKE_fluid_modifier_processDomain(FluidModifierData *mmd, guide_parent = mds->guide_parent; if (guide_parent) { mmd_parent = (FluidModifierData *)modifiers_findByType(guide_parent, eModifierType_Fluid); - if (mmd_parent->domain) { + if (mmd_parent && mmd_parent->domain) { copy_v3_v3_int(mds->guide_res, mmd_parent->domain->res); } } |