Commit: b8e88c1821478fd93c5f625812da85b0c23d6dce
Author: Campbell Barton
Date:   Wed Dec 10 15:26:41 2014 +0100
Branches: gooseberry
https://developer.blender.org/rBb8e88c1821478fd93c5f625812da85b0c23d6dce

Sequencer: optionally use scenes nested strips (like meta strips)

This commit makes it possible to use scenes as a kind of
multi-user metastrip (with their own time).

Currently this supports rendering & drawing nested strips,
but no convenient way to tab-enter into a scene strip.

===================================================================

M       release/scripts/startup/bl_ui/space_sequencer.py
M       source/blender/blenkernel/BKE_sequencer.h
M       source/blender/blenkernel/intern/sequencer.c
M       source/blender/editors/space_sequencer/sequencer_draw.c
M       source/blender/makesdna/DNA_sequence_types.h
M       source/blender/makesrna/intern/rna_sequencer.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_sequencer.py 
b/release/scripts/startup/bl_ui/space_sequencer.py
index 7eaf300..be434d6 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -790,11 +790,13 @@ class SEQUENCER_PT_scene(SequencerButtonsPanel, Panel):
         layout.template_ID(strip, "scene")
 
         scene = strip.scene
+        layout.prop(strip, "use_sequence")
 
-        layout.label(text="Camera Override")
-        layout.template_ID(strip, "scene_camera")
+        if not strip.use_sequence:
+            layout.label(text="Camera Override")
+            layout.template_ID(strip, "scene_camera")
 
-        layout.prop(strip, "use_grease_pencil", text="Show Grease Pencil")
+            layout.prop(strip, "use_grease_pencil", text="Show Grease Pencil")
 
         if scene:
             layout.prop(scene, "audio_volume", text="Audio Volume")
diff --git a/source/blender/blenkernel/BKE_sequencer.h 
b/source/blender/blenkernel/BKE_sequencer.h
index 5a0c7ac..56ebe97 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -223,6 +223,7 @@ void BKE_sequencer_base_clipboard_pointers_restore(struct 
ListBase *seqbase, str
 
 void BKE_sequence_free(struct Scene *scene, struct Sequence *seq);
 const char *BKE_sequence_give_name(struct Sequence *seq);
+ListBase *BKE_sequence_seqbase_get(struct Sequence *seq, int *r_offset);
 void BKE_sequence_calc(struct Scene *scene, struct Sequence *seq);
 void BKE_sequence_calc_disp(struct Scene *scene, struct Sequence *seq);
 void BKE_sequence_reload_new_file(struct Scene *scene, struct Sequence *seq, 
const bool lock_range);
diff --git a/source/blender/blenkernel/intern/sequencer.c 
b/source/blender/blenkernel/intern/sequencer.c
index ddc0d58..c001401 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -1052,6 +1052,33 @@ const char *BKE_sequence_give_name(Sequence *seq)
        return name;
 }
 
+ListBase *BKE_sequence_seqbase_get(Sequence *seq, int *r_offset)
+{
+       ListBase *seqbase = NULL;
+
+       switch (seq->type) {
+               case SEQ_TYPE_META:
+               {
+                       seqbase = &seq->seqbase;
+                       *r_offset = seq->start;
+                       break;
+               }
+               case SEQ_TYPE_SCENE:
+               {
+                       if (seq->flag & SEQ_SCENE_STRIPS) {
+                               Editing *ed = 
BKE_sequencer_editing_get(seq->scene, false);
+                               if (ed) {
+                                       seqbase = &ed->seqbase;
+                                       *r_offset = seq->scene->r.sfra;
+                               }
+                       }
+                       break;
+               }
+       }
+
+       return seqbase;
+}
+
 /*********************** DO THE SEQUENCE *************************/
 
 static void make_black_ibuf(ImBuf *ibuf)
@@ -2659,6 +2686,40 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData 
*context, Sequence *seq
        return ibuf;
 }
 
+/**
+ * Used for meta-strips & scenes with #SEQ_SCENE_STRIPS flag set.
+ */
+static ImBuf *do_render_strip_seqbase(
+        const SeqRenderData *context, Sequence *seq, float nr,
+        bool use_preprocess)
+{
+       ImBuf *meta_ibuf = NULL, *ibuf = NULL;
+       ListBase *seqbase = NULL;
+       int offset;
+
+       seqbase = BKE_sequence_seqbase_get(seq, &offset);
+
+       if (seqbase && !BLI_listbase_is_empty(seqbase)) {
+               meta_ibuf = seq_render_strip_stack(
+                       context, seqbase,
+                       /* scene strips don't have their start taken into 
account */
+                       nr + offset, 0);
+       }
+
+       if (meta_ibuf) {
+               ibuf = meta_ibuf;
+               if (ibuf && use_preprocess) {
+                       ImBuf *i = IMB_dupImBuf(ibuf);
+
+                       IMB_freeImBuf(ibuf);
+
+                       ibuf = i;
+               }
+       }
+
+       return ibuf;
+}
+
 static ImBuf *do_render_strip_uncached(const SeqRenderData *context, Sequence 
*seq, float cfra)
 {
        ImBuf *ibuf = NULL;
@@ -2670,22 +2731,27 @@ static ImBuf *do_render_strip_uncached(const 
SeqRenderData *context, Sequence *s
        switch (type) {
                case SEQ_TYPE_META:
                {
-                       ImBuf *meta_ibuf = NULL;
-
-                       if (seq->seqbase.first)
-                               meta_ibuf = seq_render_strip_stack(context, 
&seq->seqbase, seq->start + nr, 0);
-
-                       if (meta_ibuf) {
-                               ibuf = meta_ibuf;
-                               if (ibuf && use_preprocess) {
-                                       ImBuf *i = IMB_dupImBuf(ibuf);
-
-                                       IMB_freeImBuf(ibuf);
+                       ibuf = do_render_strip_seqbase(context, seq, nr, 
use_preprocess);
+                       break;
+               }
 
-                                       ibuf = i;
+               case SEQ_TYPE_SCENE:
+               {
+                       if (seq->flag & SEQ_SCENE_STRIPS) {
+                               /* TODO, full recursive check */
+                               if (context->scene != seq->scene) {
+                                       ibuf = do_render_strip_seqbase(context, 
seq, nr, use_preprocess);
                                }
                        }
+                       else {
+                               /* scene can be NULL after deletions */
+                               ibuf = seq_render_scene_strip(context, seq, nr);
+
+                               /* Scene strips update all animation, so we 
need to restore original state.*/
+                               
BKE_animsys_evaluate_all_animation(context->bmain, context->scene, cfra);
 
+                               copy_to_ibuf_still(context, seq, nr, ibuf);
+                       }
                        break;
                }
 
@@ -2779,18 +2845,6 @@ static ImBuf *do_render_strip_uncached(const 
SeqRenderData *context, Sequence *s
                        break;
                }
 
-               case SEQ_TYPE_SCENE:
-               {
-                       /* scene can be NULL after deletions */
-                       ibuf = seq_render_scene_strip(context, seq, nr);
-
-                       /* Scene strips update all animation, so we need to 
restore original state.*/
-                       BKE_animsys_evaluate_all_animation(context->bmain, 
context->scene, cfra);
-
-                       copy_to_ibuf_still(context, seq, nr, ibuf);
-                       break;
-               }
-
                case SEQ_TYPE_MOVIECLIP:
                {
                        ibuf = seq_render_movieclip_strip(context, seq, nr);
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c 
b/source/blender/editors/space_sequencer/sequencer_draw.c
index 144f787..57a5286 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -286,6 +286,20 @@ static void drawmeta_contents(Scene *scene, Sequence 
*seqm, float x1, float y1,
        int chan_range = 0;
        float draw_range = y2 - y1;
        float draw_height;
+       ListBase *seqbase;
+       int offset;
+
+       seqbase = BKE_sequence_seqbase_get(seqm, &offset);
+       if (!seqbase || BLI_listbase_is_empty(seqbase)) {
+               return;
+       }
+
+       if (seqm->type == SEQ_TYPE_SCENE) {
+               offset  = seqm->start - offset;
+       }
+       else {
+               offset = 0;
+       }
 
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -293,7 +307,7 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, 
float x1, float y1,
        if (seqm->flag & SEQ_MUTE)
                drawmeta_stipple(1);
 
-       for (seq = seqm->seqbase.first; seq; seq = seq->next) {
+       for (seq = seqbase->first; seq; seq = seq->next) {
                chan_min = min_ii(chan_min, seq->machine);
                chan_max = max_ii(chan_max, seq->machine);
        }
@@ -303,11 +317,14 @@ static void drawmeta_contents(Scene *scene, Sequence 
*seqm, float x1, float y1,
 
        col[3] = 196; /* alpha, used for all meta children */
 
-       for (seq = seqm->seqbase.first; seq; seq = seq->next) {
-               if ((seq->startdisp > x2 || seq->enddisp < x1) == 0) {
+       for (seq = seqbase->first; seq; seq = seq->next) {
+               const int startdisp = seq->startdisp + offset;
+               const int enddisp   = seq->enddisp   + offset;
+
+               if ((startdisp > x2 || enddisp < x1) == 0) {
                        float y_chan = (seq->machine - chan_min) / 
(float)(chan_range) * draw_range;
-                       float x1_chan = seq->startdisp;
-                       float x2_chan = seq->enddisp;
+                       float x1_chan = startdisp;
+                       float x2_chan = enddisp;
                        float y1_chan, y2_chan;
 
                        if ((seqm->flag & SEQ_MUTE) == 0 && (seq->flag & 
SEQ_MUTE))
@@ -808,7 +825,9 @@ static void draw_seq_strip(const bContext *C, SpaceSeq 
*sseq, Scene *scene, AReg
                glDisable(GL_LINE_STIPPLE);
        }
        
-       if (seq->type == SEQ_TYPE_META) {
+       if ((seq->type == SEQ_TYPE_META) ||
+           ((seq->type == SEQ_TYPE_SCENE) && (seq->flag & SEQ_SCENE_STRIPS)))
+       {
                drawmeta_contents(scene, seq, x1, y1, x2, y2);
        }
        
diff --git a/source/blender/makesdna/DNA_sequence_types.h 
b/source/blender/makesdna/DNA_sequence_types.h
index b1ae5c0..7d1ae49 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -372,6 +372,8 @@ enum {
        
        /* don't include Grease Pencil in OpenGL previews of Scene strips */
        SEQ_SCENE_NO_GPENCIL        = (1 << 28),
+       /* access scene strips directly (like a metastrip) */
+       SEQ_SCENE_STRIPS            = (1 << 29),
 
        SEQ_INVALID_EFFECT          = (1 << 31),
 };
diff --git a/source/blender/makesrna/intern/rna_sequencer.c 
b/source/blender/makesrna/intern/rna_sequencer.c
index dda0e84..262a1d1 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -1846,7 +1846,12 @@ static void rna_def_scene(BlenderRNA *brna)
        RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, 
"rna_Camera_object_poll");
        RNA_def_property_ui_text(prop, "Camera Override", "Override the scenes 
active camera");
        RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, 
"rna_Sequence_update");
-       
+
+       prop = RNA_def_property(srna, "use_sequence", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_SCENE_STRIPS);
+       RNA_def_property_ui_text(prop, "Use Sequence", "Use scenes sequence 
strips directly, instead of rendering");
+       RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, 
"rna_Sequence_update");
+
        prop = RNA_def_property(srna, "use_grease_pencil", PROP_BOOLEAN, 
PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", 
SEQ_SCENE_NO_GPENCIL);
        RNA_def_property_ui_text(prop, "Use Grease Pencil", "Show Grease Pencil 
strokes in OpenGL previews");

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to