From c45afcfa81e67c7b560a5ee0a3e599902e3dfee9 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 17 Nov 2017 14:56:51 +0100 Subject: Depsgraph: Don't make non-dynamic hair dependent on time This way hair system used for static forest does not make playblack slow. A bit dangerous, but let's see how far we can go! --- .../intern/builder/deg_builder_relations.cc | 33 ++++++++++++++++++++-- source/blender/makesrna/intern/rna_particle.c | 9 ++++-- 2 files changed, 36 insertions(+), 6 deletions(-) (limited to 'source/blender') diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 3ec42fd956f..f03cf679833 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -175,6 +175,31 @@ static bool python_driver_depends_on_time(ChannelDriver *driver) return false; } +static bool particle_system_depends_on_time(ParticleSystem *psys) +{ + ParticleSettings *part = psys->part; + /* Non-hair particles we always consider dependent on time. */ + if (part->type != PART_HAIR) { + return true; + } + /* Dynamics always depends on time. */ + if (psys->flag & PSYS_HAIR_DYNAMICS) { + return true; + } + /* TODO(sergey): Check what else makes hair dependent on time. */ + return false; +} + +static bool object_particles_depends_oin_time(Object *object) +{ + LINKLIST_FOREACH (ParticleSystem *, psys, &object->particlesystem) { + if (particle_system_depends_on_time(psys)) { + return true; + } + } + return false; +} + /* **** General purpose functions **** */ RNAPathKey::RNAPathKey(ID *id, const char *path) : @@ -1558,13 +1583,15 @@ void DepsgraphRelationBuilder::build_obdata_geom(Object *ob) * * for viewport being properly rendered in final render mode. * This relation is similar to what dag_object_time_update_flags() - * was doing for mesh objects with particle system/ + * was doing for mesh objects with particle system. * * Ideally we need to get rid of this relation. */ - if (ob->particlesystem.first != NULL) { + if (object_particles_depends_oin_time(ob)) { TimeSourceKey time_key; - OperationKey obdata_ubereval_key(&ob->id, DEG_NODE_TYPE_GEOMETRY, DEG_OPCODE_GEOMETRY_UBEREVAL); + OperationKey obdata_ubereval_key(&ob->id, + DEG_NODE_TYPE_GEOMETRY, + DEG_OPCODE_GEOMETRY_UBEREVAL); add_relation(time_key, obdata_ubereval_key, "Legacy particle time"); } break; diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index 7fc0ffeb747..53fe84707d1 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -675,6 +675,7 @@ static void rna_Particle_reset_dependency(Main *bmain, Scene *scene, PointerRNA static void rna_Particle_change_type(Main *bmain, Scene *scene, PointerRNA *ptr) { particle_recalc(bmain, scene, ptr, PSYS_RECALC_RESET | PSYS_RECALC_TYPE); + DAG_relations_tag_update(bmain); } static void rna_Particle_change_physics(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -757,7 +758,7 @@ static void rna_Particle_target_redo(Main *UNUSED(bmain), Scene *UNUSED(scene), } } -static void rna_Particle_hair_dynamics(Main *bmain, Scene *scene, PointerRNA *ptr) +static void rna_Particle_hair_dynamics_update(Main *bmain, Scene *scene, PointerRNA *ptr) { Object *ob = (Object *)ptr->id.data; ParticleSystem *psys = (ParticleSystem *)ptr->data; @@ -769,10 +770,12 @@ static void rna_Particle_hair_dynamics(Main *bmain, Scene *scene, PointerRNA *pt psys->clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_SELF; rna_Particle_redo(bmain, scene, ptr); } - else + else { WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, NULL); + } DAG_id_tag_update(&ob->id, OB_RECALC_DATA); + DAG_relations_tag_update(bmain); } static PointerRNA rna_particle_settings_get(PointerRNA *ptr) { @@ -3292,7 +3295,7 @@ static void rna_def_particle_system(BlenderRNA *brna) prop = RNA_def_property(srna, "use_hair_dynamics", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_HAIR_DYNAMICS); RNA_def_property_ui_text(prop, "Hair Dynamics", "Enable hair dynamics using cloth simulation"); - RNA_def_property_update(prop, 0, "rna_Particle_hair_dynamics"); + RNA_def_property_update(prop, 0, "rna_Particle_hair_dynamics_update"); prop = RNA_def_property(srna, "cloth", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "clmd"); -- cgit v1.2.3