From 17447ac5a6b56255dc3ee3ba5161a4aa640dca26 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 1 May 2019 11:23:20 +0200 Subject: Depsgraph: Make sound ID part of the graph Currently those IDs are not covered by copy-on-write mechanism since that ruins the current design of BKE_sound, But this change allows to move towards system where sound handlers are only valid for an evaluated ID datablocks. --- .../depsgraph/intern/builder/deg_builder_nodes.cc | 22 +++++++++++++++++-- .../depsgraph/intern/builder/deg_builder_nodes.h | 2 ++ .../intern/builder/deg_builder_relations.cc | 25 +++++++++++++++++++--- .../intern/builder/deg_builder_relations.h | 2 ++ 4 files changed, 46 insertions(+), 5 deletions(-) (limited to 'source/blender/depsgraph/intern/builder') diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index b6822a89093..d46eb8d04cb 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -58,6 +58,7 @@ extern "C" { #include "DNA_lightprobe_types.h" #include "DNA_rigidbody_types.h" #include "DNA_scene_types.h" +#include "DNA_sound_types.h" #include "DNA_speaker_types.h" #include "DNA_texture_types.h" #include "DNA_world_types.h" @@ -443,6 +444,9 @@ void DepsgraphNodeBuilder::build_id(ID *id) case ID_SPK: build_speaker((Speaker *)id); break; + case ID_SO: + build_sound((bSound *)id); + break; case ID_TXT: /* Not a part of dependency graph. */ break; @@ -708,7 +712,7 @@ void DepsgraphNodeBuilder::build_object_data_speaker(Object *object) { Speaker *speaker = (Speaker *)object->data; build_speaker(speaker); - add_operation_node(&object->id, NodeType::PARAMETERS, OperationCode::SPEAKER_EVAL); + add_operation_node(&object->id, NodeType::AUDIO, OperationCode::SPEAKER_EVAL); } void DepsgraphNodeBuilder::build_object_transform(Object *object) @@ -1543,9 +1547,23 @@ void DepsgraphNodeBuilder::build_speaker(Speaker *speaker) return; } /* Placeholder so we can add relations and tag ID node for update. */ - add_operation_node(&speaker->id, NodeType::PARAMETERS, OperationCode::SPEAKER_EVAL); + add_operation_node(&speaker->id, NodeType::AUDIO, OperationCode::SPEAKER_EVAL); build_animdata(&speaker->id); build_parameters(&speaker->id); + if (speaker->sound != NULL) { + build_sound(speaker->sound); + } +} + +void DepsgraphNodeBuilder::build_sound(bSound *sound) +{ + if (built_map_.checkIsBuiltAndTag(sound)) { + return; + } + /* Placeholder so we can add relations and tag ID node for update. */ + add_operation_node(&sound->id, NodeType::AUDIO, OperationCode::SOUND_EVAL); + build_animdata(&sound->id); + build_parameters(&sound->id); } /* **** ID traversal callbacks functions **** */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index cf7cf1a62d8..68fb9ab6cc2 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -32,6 +32,7 @@ #include "DEG_depsgraph.h" struct Base; +struct bSound; struct CacheFile; struct Camera; struct Collection; @@ -206,6 +207,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { void build_movieclip(MovieClip *clip); void build_lightprobe(LightProbe *probe); void build_speaker(Speaker *speaker); + void build_sound(bSound *sound); /* Per-ID information about what was already in the dependency graph. * Allows to re-use certain values, to speed up following evaluation. */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index d3fd16d889f..242b78f1b8f 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -58,6 +58,7 @@ extern "C" { #include "DNA_object_types.h" #include "DNA_rigidbody_types.h" #include "DNA_scene_types.h" +#include "DNA_sound_types.h" #include "DNA_speaker_types.h" #include "DNA_texture_types.h" #include "DNA_world_types.h" @@ -487,6 +488,9 @@ void DepsgraphRelationBuilder::build_id(ID *id) case ID_SPK: build_speaker((Speaker *)id); break; + case ID_SO: + build_sound((bSound *)id); + break; case ID_TXT: /* Not a part of dependency graph. */ break; @@ -766,9 +770,9 @@ void DepsgraphRelationBuilder::build_object_data_speaker(Object *object) { Speaker *speaker = (Speaker *)object->data; build_speaker(speaker); - OperationKey probe_key(&speaker->id, NodeType::PARAMETERS, OperationCode::SPEAKER_EVAL); - OperationKey object_key(&object->id, NodeType::PARAMETERS, OperationCode::SPEAKER_EVAL); - add_relation(probe_key, object_key, "Speaker Update"); + ComponentKey speaker_key(&speaker->id, NodeType::AUDIO); + ComponentKey object_key(&object->id, NodeType::AUDIO); + add_relation(speaker_key, object_key, "Speaker Update"); } void DepsgraphRelationBuilder::build_object_parent(Object *object) @@ -2276,6 +2280,21 @@ void DepsgraphRelationBuilder::build_speaker(Speaker *speaker) } build_animdata(&speaker->id); build_parameters(&speaker->id); + if (speaker->sound != NULL) { + build_sound(speaker->sound); + ComponentKey speaker_key(&speaker->id, NodeType::AUDIO); + ComponentKey sound_key(&speaker->sound->id, NodeType::AUDIO); + add_relation(sound_key, speaker_key, "Sound -> Speaker"); + } +} + +void DepsgraphRelationBuilder::build_sound(bSound *sound) +{ + if (built_map_.checkIsBuiltAndTag(sound)) { + return; + } + build_animdata(&sound->id); + build_parameters(&sound->id); } void DepsgraphRelationBuilder::build_copy_on_write_relations() diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 90bdb9bae65..e84bd857090 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -45,6 +45,7 @@ #include "intern/node/deg_node_operation.h" struct Base; +struct bSound; struct CacheFile; struct Camera; struct Collection; @@ -264,6 +265,7 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder { void build_movieclip(MovieClip *clip); void build_lightprobe(LightProbe *probe); void build_speaker(Speaker *speaker); + void build_sound(bSound *sound); void build_nested_datablock(ID *owner, ID *id); void build_nested_nodetree(ID *owner, bNodeTree *ntree); -- cgit v1.2.3