Fix T41883: Strip keyframes not respected for scenes rendered by other scenes
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 6 Sep 2016 12:07:07 +0000 (14:07 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 6 Sep 2016 12:08:11 +0000 (14:08 +0200)
source/blender/editors/sound/sound_ops.c

index ac3fc769ea1cf83d31f0358c774e1525f581b1ff..52c39e5c7a1f33e2694e23dc09f39dcceaf276c4 100644 (file)
@@ -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;
 }