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.
This commit is contained in:
		@@ -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);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user