[Bf-blender-cvs] [c45afcfa81e] master: Depsgraph: Don't make non-dynamic hair dependent on time

Sergey Sharybin noreply at git.blender.org
Fri Nov 17 14:58:15 CET 2017


Commit: c45afcfa81e67c7b560a5ee0a3e599902e3dfee9
Author: Sergey Sharybin
Date:   Fri Nov 17 14:56:51 2017 +0100
Branches: master
https://developer.blender.org/rBc45afcfa81e67c7b560a5ee0a3e599902e3dfee9

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 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");



More information about the Bf-blender-cvs mailing list