Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2017-11-17 16:56:51 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2017-11-17 16:57:57 +0300
commitc45afcfa81e67c7b560a5ee0a3e599902e3dfee9 (patch)
tree3afd81aacd06355181aea0545af79bceae8976fa /source/blender
parent759b50b20b96556f182e6d14ce23a89e2a673921 (diff)
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!
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc33
-rw-r--r--source/blender/makesrna/intern/rna_particle.c9
2 files changed, 36 insertions, 6 deletions
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");