Courtesy of Shaul Kedem:
authorAlexander Ewering <blender@instinctive.de>
Wed, 21 Sep 2005 20:28:44 +0000 (20:28 +0000)
committerAlexander Ewering <blender@instinctive.de>
Wed, 21 Sep 2005 20:28:44 +0000 (20:28 +0000)
Option to play sequence strips (Movie, Image, Scene) in reverse.
New toggle in the NKEY buttons for sequence strips.

Thanks Shaul!

source/blender/makesdna/DNA_sequence_types.h
source/blender/src/drawseq.c
source/blender/src/sequence.c

index ff3c76dc1255aad3608f24e3940737b3948abf12..d5731c0bd866b6a63ac21bfeb90e055e2847ef0b 100644 (file)
@@ -82,7 +82,7 @@ typedef struct PluginSeq {
        void (*callback)(void);
 } PluginSeq;
 
-
+/* The sequence structure is the basic struct used by any strip. each of the strips uses a different sequence structure.*/
 /* WATCH IT: first part identical to ID (for use in ipo's) */
 
 typedef struct Sequence {
@@ -91,14 +91,14 @@ typedef struct Sequence {
        void *lib;
        char name[24];
 
-       short flag, type;
+       short flag, type;                       /*flags bitmap (see below) and the type of sequence*/
        int len;
        int start, startofs, endofs;
        int startstill, endstill;
        int machine, depth;
-       int startdisp, enddisp;
+       int startdisp, enddisp;         /*starting and ending points in the sequence*/
        float mul, handsize;
-       int sfra;
+       int sfra;                               /* starting frame according to the timeline of the scene */
 
        Strip *strip;
        StripElem *curelem;
@@ -164,8 +164,9 @@ typedef struct GlowVars {
 #define SEQ_FILTERY            16
 #define SEQ_MUTE               32
 #define SEQ_MAKE_PREMUL        64
+#define SEQ_REVERSE_FRAMES     128
 
-/* seq->type WATCH IT: BIT 3!!! */
+/* seq->type WATCH IT: SEQ_EFFECT BIT is used to determine if this is an effect strip!!! */
 #define SEQ_IMAGE              0
 #define SEQ_META               1
 #define SEQ_SCENE              2
index 6b5c3ea026d74f89eb9eb8ac2e054b7b1aa39c9f..721507e607f2ddd7414ac686a8318770be501f68 100644 (file)
@@ -670,6 +670,7 @@ static void seq_panel_properties(short cntrl)       // SEQ_HANDLER_PROPERTIES
                uiDefButBitS(block, TOG, SEQ_MAKE_PREMUL, SEQ_BUT_RELOAD, "Convert to Premul", 10,90,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Converts RGB values to become premultiplied with Alpha");
                uiDefButBitS(block, TOG, SEQ_FILTERY, SEQ_BUT_RELOAD, "FilterY",        10,70,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "For video movies to remove fields");
                uiDefButF(block, NUM, SEQ_BUT_RELOAD, "Mul:",                   10,50,150,19, &last_seq->mul, 0.001, 5.0, 100, 0, "Multiply colors");
+               uiDefButS(block, TOG|BIT|7, SEQ_BUT_RELOAD, "Reverse Frames", 10,30,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Reverse frame order");
        }
        else if(last_seq->type==SEQ_META) {
 
@@ -681,7 +682,7 @@ static void seq_panel_properties(short cntrl)       // SEQ_HANDLER_PROPERTIES
 
                uiDefBut(block, LABEL, 0, "Type: Scene", 10,140,150,20, 0, 0, 0, 0, 0, "");
                uiDefBut(block, TEX, B_NOP, "Name: ", 10,120,150,19, last_seq->name+2, 0.0, 21.0, 100, 0, "");
-
+               uiDefButS(block, TOG|BIT|7, SEQ_BUT_RELOAD, "Reverse Frames", 10,90,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Reverse frame order");
        }
        else if(last_seq->type==SEQ_MOVIE) {
 
@@ -693,6 +694,9 @@ static void seq_panel_properties(short cntrl)       // SEQ_HANDLER_PROPERTIES
                uiDefButBitS(block, TOG, SEQ_MAKE_PREMUL, SEQ_BUT_RELOAD, "Make Premul Alpha ", 10,90,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Converts RGB values to become premultiplied with Alpha");
                uiDefButBitS(block, TOG, SEQ_FILTERY, SEQ_BUT_RELOAD, "FilterY ",       10,70,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "For video movies to remove fields");
                uiDefButF(block, NUM, SEQ_BUT_RELOAD, "Mul:",                   10,50,150,19, &last_seq->mul, 0.001, 5.0, 100, 0, "Multiply colors");
+               
+               uiDefButS(block, TOG|BIT|7, SEQ_BUT_RELOAD, "Reverse Frames", 10,30,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Reverse frame order");
+
 
        }
        else if(last_seq->type==SEQ_SOUND) {
index a63d26d8bbdda5665ca19b48511557d010774ee7..da6c119795168d726407630200b4d39342cd51e2 100644 (file)
@@ -1710,16 +1710,25 @@ StripElem *give_stripelem(Sequence *seq, int cfra)
        if(se==0) return 0;
        if(seq->startdisp >cfra || seq->enddisp <= cfra) return 0;
 
+       if(seq->flag&SEQ_REVERSE_FRAMES)        {       
+               /*reverse frame in this sequence */
+               if(cfra <= seq->start) nr= seq->len-1;
+               else if(cfra >= seq->start+seq->len-1) nr= 0;
+               else nr= (seq->start + seq->len) - cfra;
+       } else {
        if(cfra <= seq->start) nr= 0;
        else if(cfra >= seq->start+seq->len-1) nr= seq->len-1;
        else nr= cfra-seq->start;
+       }
+
 
-       se+= nr;
+       se+= nr; /* don't get confused by the increment, this is the same as strip->stripdata[nr], which works on some compilers...*/
        se->nr= nr;
 
        return se;
 }
 
 void set_meta_stripdata(Sequence *seqm)
 {
        Sequence *seq, *seqim, *seqeff;
@@ -1951,8 +1960,11 @@ void do_build_seqar_cfra(ListBase *seqbase, Sequence ***seqar, int cfra)
                                                doseq= G.scene->r.scemode & R_DOSEQ;
                                                G.scene->r.scemode &= ~R_DOSEQ;
 
-                                               /* store stuffies */
-                                               oldcfra= CFRA; CFRA= seq->sfra + se->nr;
+                                               /* store Current FRAme */
+                                               oldcfra= CFRA;
+
+                                               CFRA= ( seq->sfra + se->nr );
+
                                                waitcursor(1);
 
                                                rectot= R.rectot; R.rectot= NULL;