diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-09-06 15:07:07 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-09-14 11:26:18 +0300 |
commit | b281df01c787d535f55a590f35ea51deeec0c4ba (patch) | |
tree | f5ca0bd5920241e82a09cf6f9d256ad8dc8fdf21 /source | |
parent | 8e7d6561f57a74e53c764db5acd98e0b388a32e7 (diff) |
Fix T41883: Strip keyframes not respected for scenes rendered by other scenes
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/sound/sound_ops.c | 69 |
1 files changed, 49 insertions, 20 deletions
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index ac3fc769ea1..52c39e5c7a1 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -217,32 +217,56 @@ static void SOUND_OT_open_mono(wmOperatorType *ot) /* ******************************************************* */ -static int sound_update_animation_flags_exec(bContext *C, wmOperator *UNUSED(op)) +static void sound_update_animation_flags(Scene *scene); + +static int sound_update_animation_flags_cb(Sequence *seq, void *user_data) { - Sequence *seq; - Scene *scene = CTX_data_scene(C); struct FCurve *fcu; + Scene *scene = (Scene *)user_data; bool driven; - SEQ_BEGIN(scene->ed, seq) - { - fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "volume", 0, &driven); - if (fcu || driven) - seq->flag |= SEQ_AUDIO_VOLUME_ANIMATED; - else - seq->flag &= ~SEQ_AUDIO_VOLUME_ANIMATED; + fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "volume", 0, &driven); + if (fcu || driven) + seq->flag |= SEQ_AUDIO_VOLUME_ANIMATED; + else + seq->flag &= ~SEQ_AUDIO_VOLUME_ANIMATED; - fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "pitch", 0, &driven); - if (fcu || driven) - seq->flag |= SEQ_AUDIO_PITCH_ANIMATED; - else - seq->flag &= ~SEQ_AUDIO_PITCH_ANIMATED; + fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "pitch", 0, &driven); + if (fcu || driven) + seq->flag |= SEQ_AUDIO_PITCH_ANIMATED; + else + seq->flag &= ~SEQ_AUDIO_PITCH_ANIMATED; - fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "pan", 0, &driven); - if (fcu || driven) - seq->flag |= SEQ_AUDIO_PAN_ANIMATED; - else - seq->flag &= ~SEQ_AUDIO_PAN_ANIMATED; + fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "pan", 0, &driven); + if (fcu || driven) + seq->flag |= SEQ_AUDIO_PAN_ANIMATED; + else + seq->flag &= ~SEQ_AUDIO_PAN_ANIMATED; + + if (seq->type == SEQ_TYPE_SCENE) { + /* TODO(sergey): For now we do manual recursion into the scene strips, + * but perhaps it should be covered by recursive_apply? + */ + sound_update_animation_flags(seq->scene); + } + + return 0; +} + +static void sound_update_animation_flags(Scene *scene) +{ + struct FCurve *fcu; + bool driven; + Sequence *seq; + + if (scene->id.tag & LIB_TAG_DOIT) { + return; + } + scene->id.tag |= LIB_TAG_DOIT; + + SEQ_BEGIN(scene->ed, seq) + { + BKE_sequencer_recursive_apply(seq, sound_update_animation_flags_cb, scene); } SEQ_END @@ -251,7 +275,12 @@ static int sound_update_animation_flags_exec(bContext *C, wmOperator *UNUSED(op) scene->audio.flag |= AUDIO_VOLUME_ANIMATED; else scene->audio.flag &= ~AUDIO_VOLUME_ANIMATED; +} +static int sound_update_animation_flags_exec(bContext *C, wmOperator *UNUSED(op)) +{ + BKE_main_id_tag_idcode(CTX_data_main(C), ID_SCE, LIB_TAG_DOIT, false); + sound_update_animation_flags(CTX_data_scene(C)); return OPERATOR_FINISHED; } |