diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-05-01 13:46:47 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-05-03 16:50:40 +0300 |
commit | 3369b8289167ddf3dbca0e3895d598bf73534124 (patch) | |
tree | 81a5025da18727686a03644d0fa45eb3999c0695 | |
parent | e8f10d6475765685acee21ca5e8d48f568ee2031 (diff) |
Depsgraph: Add scene audio component
The idea is to make that responsible for dealing with
things like audio update on frame jump and such.
8 files changed, 28 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 563edafcb0e..a9cafd933d9 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -1585,6 +1585,11 @@ void DepsgraphNodeBuilder::build_sequencer(Scene *scene) SEQ_END; } +void DepsgraphNodeBuilder::build_scene_audio(Scene *scene) +{ + add_operation_node(&scene->id, NodeType::AUDIO, OperationCode::SOUND_EVAL); +} + /* **** ID traversal callbacks functions **** */ void DepsgraphNodeBuilder::modifier_walk(void *user_data, diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 9805bd97b08..9074efefe50 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -209,6 +209,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { void build_speaker(Speaker *speaker); void build_sound(bSound *sound); void build_sequencer(Scene *scene); + void build_scene_audio(Scene *scene); /* 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_nodes_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc index c03416e956e..1b9524e5832 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc @@ -154,6 +154,7 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, } /* Sequencer. */ if (linked_state == DEG_ID_LINKED_DIRECTLY) { + build_scene_audio(scene); build_sequencer(scene); } /* Collections. */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 46d565ad190..8fef35570fe 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -2307,15 +2307,25 @@ void DepsgraphRelationBuilder::build_sequencer(Scene *scene) /* Make sure dependnecies from sequences data goes to the sequencer evaluation. */ ComponentKey sequencer_key(&scene->id, NodeType::SEQUENCER); Sequence *seq; + bool has_audio_strips = false; SEQ_BEGIN (scene->ed, seq) { if (seq->sound != NULL) { build_sound(seq->sound); ComponentKey sound_key(&seq->sound->id, NodeType::AUDIO); add_relation(sound_key, sequencer_key, "Sound -> Sequencer"); + has_audio_strips = true; } /* TODO(sergey): Movie clip, scene, camera, mask. */ } SEQ_END; + if (has_audio_strips) { + ComponentKey scene_audio_key(&scene->id, NodeType::AUDIO); + add_relation(sequencer_key, scene_audio_key, "Sequencer -> Audio"); + } +} + +void DepsgraphRelationBuilder::build_scene_audio(Scene * /*scene*/) +{ } 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 190b4064481..30fbe5bcf6b 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -270,6 +270,7 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder { void build_speaker(Speaker *speaker); void build_sound(bSound *sound); void build_sequencer(Scene *scene); + void build_scene_audio(Scene *scene); void build_nested_datablock(ID *owner, ID *id); void build_nested_nodetree(ID *owner, bNodeTree *ntree); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc index 8a23e4b9b6e..cadb4ab3611 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc @@ -132,6 +132,7 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, } /* Sequencer. */ if (linked_state == DEG_ID_LINKED_DIRECTLY) { + build_scene_audio(scene); build_sequencer(scene); } /* Build all set scenes. */ diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc index f7d7b76cb69..d8e895364ca 100644 --- a/source/blender/depsgraph/intern/depsgraph_tag.cc +++ b/source/blender/depsgraph/intern/depsgraph_tag.cc @@ -218,6 +218,9 @@ void depsgraph_tag_to_component_opcode(const ID *id, case ID_RECALC_SEQUENCER: *component_type = NodeType::SEQUENCER; break; + case ID_RECALC_AUDIO_JUMP: + *component_type = NodeType::AUDIO; + break; case ID_RECALC_ALL: case ID_RECALC_PSYS_ALL: BLI_assert(!"Should not happen"); @@ -620,6 +623,8 @@ const char *DEG_update_tag_as_string(IDRecalcFlag flag) return "EDITORS"; case ID_RECALC_SEQUENCER: return "SEQUENCER"; + case ID_RECALC_AUDIO_JUMP: + return "AUDIO_JUMP"; case ID_RECALC_ALL: return "ALL"; } diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 12f59cf8e78..42ee4e9a6c8 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -608,6 +608,10 @@ typedef enum IDRecalcFlag { * Use this tag with a scene ID which owns the sequences. */ ID_RECALC_SEQUENCER = (1 << 14), + /* Frame changed in a way that caused audio jump. + * Use this on a scene ID. */ + ID_RECALC_AUDIO_JUMP = (1 << 15), + /*************************************************************************** * Pseudonyms, to have more semantic meaning in the actual code without * using too much low-level and implementation specific tags. */ |