Fix T100470: Crash when changing the domain type

This commit is contained in:
Sergey Sharybin 2022-08-18 14:29:11 +02:00
parent 756308f9e4
commit a7652bf2f7
Notes: blender-bot 2023-02-14 10:54:29 +01:00
Referenced by issue #100470, Regression: Changing the domain type from gas to liquid crashes Blender
1 changed files with 38 additions and 32 deletions

View File

@ -218,16 +218,22 @@ static void rna_Fluid_parts_create(Main *bmain,
# else
Object *ob = (Object *)ptr->owner_id;
BKE_fluid_particle_system_create(bmain, ob, pset_name, parts_name, psys_name, psys_type);
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
DEG_relations_tag_update(bmain);
# endif
}
static void rna_Fluid_parts_delete(PointerRNA *ptr, int ptype)
static void rna_Fluid_parts_delete(Main *bmain, PointerRNA *ptr, int ptype)
{
# ifndef WITH_FLUID
UNUSED_VARS(ptr, ptype);
# else
Object *ob = (Object *)ptr->owner_id;
BKE_fluid_particle_system_destroy(ob, ptype);
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
DEG_relations_tag_update(bmain);
# endif
}
@ -254,7 +260,7 @@ static void rna_Fluid_flip_parts_update(Main *bmain, Scene *scene, PointerRNA *p
/* Only create a particle system in liquid domain mode.
* Remove any remaining data from a liquid sim when switching to gas. */
if (fmd->domain->type != FLUID_DOMAIN_TYPE_LIQUID) {
rna_Fluid_parts_delete(ptr, PART_FLUID_FLIP);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FLIP);
fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_FLIP;
rna_Fluid_domain_data_reset(bmain, scene, ptr);
return;
@ -266,7 +272,7 @@ static void rna_Fluid_flip_parts_update(Main *bmain, Scene *scene, PointerRNA *p
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_FLIP;
}
else {
rna_Fluid_parts_delete(ptr, PART_FLUID_FLIP);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FLIP);
fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_FLIP;
}
rna_Fluid_update(bmain, scene, ptr);
@ -285,7 +291,7 @@ static void rna_Fluid_spray_parts_update(Main *bmain, Scene *UNUSED(scene), Poin
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_SPRAY;
}
else {
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAY);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAY);
fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_SPRAY;
}
}
@ -307,7 +313,7 @@ static void rna_Fluid_bubble_parts_update(Main *bmain, Scene *UNUSED(scene), Poi
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_BUBBLE;
}
else {
rna_Fluid_parts_delete(ptr, PART_FLUID_BUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_BUBBLE);
fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_BUBBLE;
}
}
@ -325,7 +331,7 @@ static void rna_Fluid_foam_parts_update(Main *bmain, Scene *UNUSED(scene), Point
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_FOAM;
}
else {
rna_Fluid_parts_delete(ptr, PART_FLUID_FOAM);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAM);
fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_FOAM;
}
}
@ -347,7 +353,7 @@ static void rna_Fluid_tracer_parts_update(Main *bmain, Scene *UNUSED(scene), Poi
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_TRACER;
}
else {
rna_Fluid_parts_delete(ptr, PART_FLUID_TRACER);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_TRACER);
fmd->domain->particle_type &= ~FLUID_DOMAIN_PARTICLE_TRACER;
}
}
@ -359,10 +365,10 @@ static void rna_Fluid_combined_export_update(Main *bmain, Scene *scene, PointerR
fmd = (FluidModifierData *)BKE_modifiers_findby_type(ob, eModifierType_Fluid);
if (fmd->domain->sndparticle_combined_export == SNDPARTICLE_COMBINED_EXPORT_OFF) {
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYFOAM);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYBUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_FOAMBUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYFOAMBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAM);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAMBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAMBUBBLE);
bool exists_spray = rna_Fluid_parts_exists(ptr, PART_FLUID_SPRAY);
bool exists_foam = rna_Fluid_parts_exists(ptr, PART_FLUID_FOAM);
@ -392,11 +398,11 @@ static void rna_Fluid_combined_export_update(Main *bmain, Scene *scene, PointerR
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_SPRAY;
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_FOAM;
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAY);
rna_Fluid_parts_delete(ptr, PART_FLUID_FOAM);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYBUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_FOAMBUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYFOAMBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAY);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAM);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAMBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAMBUBBLE);
/* Re-add spray if enabled and no particle system exists for it anymore. */
bool exists_bubble = rna_Fluid_parts_exists(ptr, PART_FLUID_BUBBLE);
@ -418,11 +424,11 @@ static void rna_Fluid_combined_export_update(Main *bmain, Scene *scene, PointerR
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_SPRAY;
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_BUBBLE;
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAY);
rna_Fluid_parts_delete(ptr, PART_FLUID_BUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYFOAM);
rna_Fluid_parts_delete(ptr, PART_FLUID_FOAMBUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYFOAMBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAY);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_BUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAM);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAMBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAMBUBBLE);
/* Re-add foam if enabled and no particle system exists for it anymore. */
bool exists_foam = rna_Fluid_parts_exists(ptr, PART_FLUID_FOAM);
@ -444,11 +450,11 @@ static void rna_Fluid_combined_export_update(Main *bmain, Scene *scene, PointerR
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_FOAM;
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_BUBBLE;
rna_Fluid_parts_delete(ptr, PART_FLUID_FOAM);
rna_Fluid_parts_delete(ptr, PART_FLUID_BUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYFOAM);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYBUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYFOAMBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAM);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_BUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAM);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAMBUBBLE);
/* Re-add foam if enabled and no particle system exists for it anymore. */
bool exists_spray = rna_Fluid_parts_exists(ptr, PART_FLUID_SPRAY);
@ -472,12 +478,12 @@ static void rna_Fluid_combined_export_update(Main *bmain, Scene *scene, PointerR
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_FOAM;
fmd->domain->particle_type |= FLUID_DOMAIN_PARTICLE_BUBBLE;
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAY);
rna_Fluid_parts_delete(ptr, PART_FLUID_FOAM);
rna_Fluid_parts_delete(ptr, PART_FLUID_BUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYFOAM);
rna_Fluid_parts_delete(ptr, PART_FLUID_SPRAYBUBBLE);
rna_Fluid_parts_delete(ptr, PART_FLUID_FOAMBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAY);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAM);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_BUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYFOAM);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_SPRAYBUBBLE);
rna_Fluid_parts_delete(bmain, ptr, PART_FLUID_FOAMBUBBLE);
}
}
else {