Commit: 76032b133cd2fb53ddac9675cbfef07a66eb8388
Author: Sergey Sharybin
Date:   Fri Nov 17 14:56:51 2017 +0100
Branches: blender-v2.79a-release
https://developer.blender.org/rB76032b133cd2fb53ddac9675cbfef07a66eb8388

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!

===================================================================

M       source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M       source/blender/makesrna/intern/rna_particle.c

===================================================================

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc 
b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index e2f298a0f35..87d8d8d45a4 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -177,6 +177,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) :
@@ -1494,13 +1519,15 @@ void DepsgraphRelationBuilder::build_obdata_geom(Main 
*bmain, Scene *scene, Obje
                         *
                         * 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 00104b8667d..58ef2eb8b69 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");

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to