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 ++ .../intern/debug/deg_debug_relations_graphviz.cc | 1 + .../intern/eval/deg_eval_copy_on_write.cc | 4 +++- source/blender/depsgraph/intern/node/deg_node.cc | 5 ++--- source/blender/depsgraph/intern/node/deg_node.h | 2 ++ .../depsgraph/intern/node/deg_node_component.cc | 2 ++ .../depsgraph/intern/node/deg_node_component.h | 1 + .../depsgraph/intern/node/deg_node_operation.cc | 2 ++ .../depsgraph/intern/node/deg_node_operation.h | 1 + 12 files changed, 60 insertions(+), 9 deletions(-) (limited to 'source/blender/depsgraph') 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); diff --git a/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc b/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc index 068a04943e6..c4455a6e59f 100644 --- a/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc +++ b/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc @@ -434,6 +434,7 @@ static void deg_debug_graphviz_node(const DebugContext &ctx, const Node *node) case NodeType::BATCH_CACHE: case NodeType::DUPLI: case NodeType::SYNCHRONIZATION: + case NodeType::AUDIO: case NodeType::GENERIC_DATABLOCK: { ComponentNode *comp_node = (ComponentNode *)node; if (!comp_node->operations.empty()) { diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 2f153e585d3..2a76d5cd362 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -1278,7 +1278,9 @@ bool deg_copy_on_write_is_expanded(const ID *id_cow) bool deg_copy_on_write_is_needed(const ID *id_orig) { const ID_Type id_type = GS(id_orig->name); - return !ELEM(id_type, ID_IM); + /* TODO(sergey): Make Sound copyable. It is here only because the code for dependency graph is + * being work in progress. */ + return !ELEM(id_type, ID_IM, ID_SO); } } // namespace DEG diff --git a/source/blender/depsgraph/intern/node/deg_node.cc b/source/blender/depsgraph/intern/node/deg_node.cc index 5692983fbe2..7df96330ef0 100644 --- a/source/blender/depsgraph/intern/node/deg_node.cc +++ b/source/blender/depsgraph/intern/node/deg_node.cc @@ -101,13 +101,12 @@ const char *nodeTypeAsString(NodeType type) return "POINT_CACHE"; case NodeType::BATCH_CACHE: return "BATCH_CACHE"; - /* Duplication. */ case NodeType::DUPLI: return "DUPLI"; - /* Synchronization. */ case NodeType::SYNCHRONIZATION: return "SYNCHRONIZATION"; - /* Generic datablock. */ + case NodeType::AUDIO: + return "AUDIO"; case NodeType::GENERIC_DATABLOCK: return "GENERIC_DATABLOCK"; diff --git a/source/blender/depsgraph/intern/node/deg_node.h b/source/blender/depsgraph/intern/node/deg_node.h index ece43657b38..e350cc9a6f4 100644 --- a/source/blender/depsgraph/intern/node/deg_node.h +++ b/source/blender/depsgraph/intern/node/deg_node.h @@ -92,6 +92,8 @@ enum class NodeType { /* Used by all operations which are updating object when something is * changed in view layer. */ OBJECT_FROM_LAYER, + /* Audio-related evaluation. */ + AUDIO, /* Un-interestying datablock, which is a part of dependency graph, but does * not have very distinctive update procedure. */ GENERIC_DATABLOCK, diff --git a/source/blender/depsgraph/intern/node/deg_node_component.cc b/source/blender/depsgraph/intern/node/deg_node_component.cc index f6c5af8070f..f67a81f594f 100644 --- a/source/blender/depsgraph/intern/node/deg_node_component.cc +++ b/source/blender/depsgraph/intern/node/deg_node_component.cc @@ -364,6 +364,7 @@ DEG_COMPONENT_NODE_DEFINE(Transform, TRANSFORM, ID_RECALC_TRANSFORM); DEG_COMPONENT_NODE_DEFINE(ObjectFromLayer, OBJECT_FROM_LAYER, 0); DEG_COMPONENT_NODE_DEFINE(Dupli, DUPLI, 0); DEG_COMPONENT_NODE_DEFINE(Synchronization, SYNCHRONIZATION, 0); +DEG_COMPONENT_NODE_DEFINE(Audio, AUDIO, 0); DEG_COMPONENT_NODE_DEFINE(GenericDatablock, GENERIC_DATABLOCK, 0); /* Node Types Register =================================== */ @@ -390,6 +391,7 @@ void deg_register_component_depsnodes() register_node_typeinfo(&DNTI_OBJECT_FROM_LAYER); register_node_typeinfo(&DNTI_DUPLI); register_node_typeinfo(&DNTI_SYNCHRONIZATION); + register_node_typeinfo(&DNTI_AUDIO); register_node_typeinfo(&DNTI_GENERIC_DATABLOCK); } diff --git a/source/blender/depsgraph/intern/node/deg_node_component.h b/source/blender/depsgraph/intern/node/deg_node_component.h index 038b5917a86..733d32e9c2d 100644 --- a/source/blender/depsgraph/intern/node/deg_node_component.h +++ b/source/blender/depsgraph/intern/node/deg_node_component.h @@ -186,6 +186,7 @@ DEG_COMPONENT_NODE_DECLARE_GENERIC(Transform); DEG_COMPONENT_NODE_DECLARE_NO_COW_TAG_ON_UPDATE(ObjectFromLayer); DEG_COMPONENT_NODE_DECLARE_GENERIC(Dupli); DEG_COMPONENT_NODE_DECLARE_GENERIC(Synchronization); +DEG_COMPONENT_NODE_DECLARE_GENERIC(Audio); DEG_COMPONENT_NODE_DECLARE_GENERIC(GenericDatablock); /* Bone Component */ diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.cc b/source/blender/depsgraph/intern/node/deg_node_operation.cc index 154563303ad..62a61675bcc 100644 --- a/source/blender/depsgraph/intern/node/deg_node_operation.cc +++ b/source/blender/depsgraph/intern/node/deg_node_operation.cc @@ -100,6 +100,8 @@ const char *operationCodeAsString(OperationCode opcode) return "LIGHT_PROBE_EVAL"; case OperationCode::SPEAKER_EVAL: return "SPEAKER_EVAL"; + case OperationCode::SOUND_EVAL: + return "SOUND_EVAL"; case OperationCode::ARMATURE_EVAL: return "ARMATURE_EVAL"; /* Pose. */ diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h index c959f7f34e0..ab6242a6196 100644 --- a/source/blender/depsgraph/intern/node/deg_node_operation.h +++ b/source/blender/depsgraph/intern/node/deg_node_operation.h @@ -106,6 +106,7 @@ enum class OperationCode { /* Object data. --------------------------------------------------------- */ LIGHT_PROBE_EVAL, SPEAKER_EVAL, + SOUND_EVAL, ARMATURE_EVAL, /* Pose. ---------------------------------------------------------------- */ -- cgit v1.2.3