From 747534af0058ff7a719b99af68333753527ed747 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Jun 2018 17:55:19 +0200 Subject: Particle System: move data creation into RNA update Relying on evaluation to initialize data causes issues w/ 2.8. --- source/blender/blenkernel/BKE_particle.h | 1 + source/blender/blenkernel/intern/particle_system.c | 24 +++++-------------- source/blender/makesrna/intern/rna_particle.c | 27 ++++++++++++++++++++-- 3 files changed, 32 insertions(+), 20 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index f09aa17ea92..8eee749ef70 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -304,6 +304,7 @@ bool psys_check_edited(struct ParticleSystem *psys); void psys_check_group_weights(struct ParticleSettings *part); int psys_uses_gravity(struct ParticleSimulationData *sim); +void BKE_particlesettings_fluid_default_settings(struct ParticleSettings *part); /* free */ void BKE_particlesettings_free(struct ParticleSettings *part); diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 47e0994bb83..9eaebc2c55c 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -4140,7 +4140,7 @@ void psys_check_boid_data(ParticleSystem *psys) } } -static void fluid_default_settings(ParticleSettings *part) +void BKE_particlesettings_fluid_default_settings(ParticleSettings *part) { SPHFluidSettings *fluid = part->fluid; @@ -4172,24 +4172,12 @@ static void psys_prepare_physics(ParticleSimulationData *sim) sim->psys->flag &= ~PSYS_KEYED; } - if (part->phystype == PART_PHYS_BOIDS && part->boids == NULL) { - BoidState *state; - - part->boids = MEM_callocN(sizeof(BoidSettings), "Boid Settings"); - boid_default_settings(part->boids); - - state = boid_new_state(part->boids); - BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Separate)); - BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Flock)); - - ((BoidRule*)state->rules.first)->flag |= BOIDRULE_CURRENT; - - state->flag |= BOIDSTATE_CURRENT; - BLI_addtail(&part->boids->states, state); + /* RNA Update must ensure this is true. */ + if (part->phystype == PART_PHYS_BOIDS) { + BLI_assert(part->boids != NULL); } - else if (part->phystype == PART_PHYS_FLUID && part->fluid == NULL) { - part->fluid = MEM_callocN(sizeof(SPHFluidSettings), "SPH Fluid Settings"); - fluid_default_settings(part); + else if (part->phystype == PART_PHYS_FLUID) { + BLI_assert(part->fluid != NULL); } psys_check_boid_data(sim->psys); diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index f3828d8ddf2..5b0b718fc28 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -131,6 +131,7 @@ static const EnumPropertyItem part_hair_ren_as_items[] = { #include "BLI_math.h" +#include "BKE_boids.h" #include "BKE_context.h" #include "BKE_cloth.h" #include "BKE_colortools.h" @@ -679,9 +680,31 @@ static void rna_Particle_change_type(Main *bmain, Scene *scene, PointerRNA *ptr) DAG_relations_tag_update(bmain); } -static void rna_Particle_change_physics(Main *bmain, Scene *scene, PointerRNA *ptr) +static void rna_Particle_change_physics_type(Main *bmain, Scene *scene, PointerRNA *ptr) { particle_recalc(bmain, scene, ptr, PSYS_RECALC_RESET | PSYS_RECALC_PHYS); + + ParticleSettings *part = (ParticleSettings *)ptr->data; + + if (part->phystype == PART_PHYS_BOIDS && part->boids == NULL) { + BoidState *state; + + part->boids = MEM_callocN(sizeof(BoidSettings), "Boid Settings"); + boid_default_settings(part->boids); + + state = boid_new_state(part->boids); + BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Separate)); + BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Flock)); + + ((BoidRule*)state->rules.first)->flag |= BOIDRULE_CURRENT; + + state->flag |= BOIDSTATE_CURRENT; + BLI_addtail(&part->boids->states, state); + } + else if (part->phystype == PART_PHYS_FLUID && part->fluid == NULL) { + part->fluid = MEM_callocN(sizeof(SPHFluidSettings), "SPH Fluid Settings"); + BKE_particlesettings_fluid_default_settings(part); + } } static void rna_Particle_redo_child(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -2265,7 +2288,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, phys_type_items); RNA_def_property_ui_text(prop, "Physics Type", "Particle physics type"); - RNA_def_property_update(prop, 0, "rna_Particle_change_physics"); + RNA_def_property_update(prop, 0, "rna_Particle_change_physics_type"); prop = RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "rotmode"); -- cgit v1.2.3