diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index c10f8d39bb2..dca6f569e25 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -141,6 +141,7 @@ int BKE_scene_orientation_slot_get_index(const struct TransformOrientationSlot * /* ** Scene evaluation ** */ void BKE_scene_update_sound(struct Depsgraph *depsgraph, struct Main *bmain); +void BKE_scene_update_tag_audio_volume(struct Depsgraph *, struct Scene *scene); void BKE_scene_graph_update_tagged(struct Depsgraph *depsgraph, struct Main *bmain); void BKE_scene_graph_evaluated_ensure(struct Depsgraph *depsgraph, struct Main *bmain); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index c4b6f5dafe5..f7c018edbd8 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1278,6 +1278,14 @@ void BKE_scene_update_sound(Depsgraph *depsgraph, Main *bmain) BKE_sound_update_scene(depsgraph, scene); } +void BKE_scene_update_tag_audio_volume(Depsgraph *UNUSED(depsgraph), Scene *scene) +{ + BLI_assert(DEG_is_evaluated_id(&scene->id)); + /* The volume is actually updated in BKE_scene_update_sound(), from either + * scene_graph_update_tagged() or from BKE_scene_graph_update_for_newframe(). */ + scene->id.recalc |= ID_RECALC_AUDIO_VOLUME; +} + /* TODO(sergey): This actually should become view_layer_graph or so. * Same applies to update_for_newframe. * diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 04333dbd038..0adea027ecc 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -1736,7 +1736,14 @@ void DepsgraphNodeBuilder::build_scene_audio(Scene *scene) if (built_map_.checkIsBuiltAndTag(scene, BuilderMap::TAG_SCENE_AUDIO)) { return; } + add_operation_node(&scene->id, NodeType::AUDIO, OperationCode::SOUND_EVAL); + + Scene *scene_cow = get_cow_datablock(scene); + add_operation_node(&scene->id, + NodeType::AUDIO, + OperationCode::AUDIO_VOLUME, + function_bind(BKE_scene_update_tag_audio_volume, _1, scene_cow)); } void DepsgraphNodeBuilder::build_scene_speakers(Scene * /*scene*/, ViewLayer *view_layer) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 89def9e0bdc..e968ad1ea5d 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -2544,8 +2544,16 @@ void DepsgraphRelationBuilder::build_scene_sequencer(Scene *scene) } } -void DepsgraphRelationBuilder::build_scene_audio(Scene * /*scene*/) +void DepsgraphRelationBuilder::build_scene_audio(Scene *scene) { + OperationKey scene_audio_volume_key(&scene->id, NodeType::AUDIO, OperationCode::AUDIO_VOLUME); + OperationKey scene_sound_eval_key(&scene->id, NodeType::AUDIO, OperationCode::SOUND_EVAL); + add_relation(scene_audio_volume_key, scene_sound_eval_key, "Audio Volume -> Sound"); + + if (scene->audio.flag & AUDIO_VOLUME_ANIMATED) { + ComponentKey scene_anim_key(&scene->id, NodeType::ANIMATION); + add_relation(scene_anim_key, scene_audio_volume_key, "Animation -> Audio Volume"); + } } void DepsgraphRelationBuilder::build_scene_speakers(Scene * /*scene*/, ViewLayer *view_layer) diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.cc b/source/blender/depsgraph/intern/node/deg_node_operation.cc index 78399d5c953..1e03d51f557 100644 --- a/source/blender/depsgraph/intern/node/deg_node_operation.cc +++ b/source/blender/depsgraph/intern/node/deg_node_operation.cc @@ -61,6 +61,8 @@ const char *operationCodeAsString(OperationCode opcode) /* Scene related. */ case OperationCode::SCENE_EVAL: return "SCENE_EVAL"; + case OperationCode::AUDIO_VOLUME: + return "AUDIO_VOLUME"; /* Object related. */ case OperationCode::OBJECT_BASE_FLAGS: return "OBJECT_BASE_FLAGS"; diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h index bdc0df7f399..2faf139ec93 100644 --- a/source/blender/depsgraph/intern/node/deg_node_operation.h +++ b/source/blender/depsgraph/intern/node/deg_node_operation.h @@ -60,6 +60,7 @@ enum class OperationCode { /* Scene related. ------------------------------------------------------- */ SCENE_EVAL, + AUDIO_VOLUME, /* Object related. ------------------------------------------------------ */ OBJECT_BASE_FLAGS,