Revision: 21165
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21165
Author:   schlaile
Date:     2009-06-26 09:32:24 +0200 (Fri, 26 Jun 2009)

Log Message:
-----------
== Sequencer ==

This fixes several issues with the Speed Control Effect:
* IPO curve-deletion resulted in non-working effect
* easy retiming only allowed enlarging of strips,
  now shrinking is also possible (easy retiming:
  use the right display handle of input strip and
  shrink or enlarge, will make the speed of the
  strip exactly fit the effect strip's length)
* frames after end-of-display of input strips can
  now be accessed (which is necessary for fix #2)
  
=> just use easy retiming from now on, it's fun :)

Modified Paths:
--------------
    trunk/blender/source/blender/include/BSE_sequence.h
    trunk/blender/source/blender/src/buttons_scene.c
    trunk/blender/source/blender/src/editseq.c
    trunk/blender/source/blender/src/seqeffects.c
    trunk/blender/source/blender/src/sequence.c

Modified: trunk/blender/source/blender/include/BSE_sequence.h
===================================================================
--- trunk/blender/source/blender/include/BSE_sequence.h 2009-06-26 02:49:47 UTC 
(rev 21164)
+++ trunk/blender/source/blender/include/BSE_sequence.h 2009-06-26 07:32:24 UTC 
(rev 21165)
@@ -66,8 +66,10 @@
 char *give_seqname(struct Sequence *seq);
 
 int evaluate_seq_frame(int cfra);
-struct StripElem *give_stripelem(struct Sequence *seq, int cfra);
-struct TStripElem *give_tstripelem(struct Sequence *seq, int cfra);
+struct StripElem *give_stripelem(struct Sequence *seq, int cfra,
+                                int in_display_range);
+struct TStripElem *give_tstripelem(struct Sequence *seq, int cfra,
+                                  int in_display_range);
 struct ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chansel,
                            int render_size); 
 /* chansel: render this channel. Default=0 (renders end result)*/

Modified: trunk/blender/source/blender/src/buttons_scene.c
===================================================================
--- trunk/blender/source/blender/src/buttons_scene.c    2009-06-26 02:49:47 UTC 
(rev 21164)
+++ trunk/blender/source/blender/src/buttons_scene.c    2009-06-26 07:32:24 UTC 
(rev 21165)
@@ -767,7 +767,7 @@
        if(last_seq->type==SEQ_IMAGE) {
                if (last_seq->len > 1) {
                        /* CURRENT */
-                       StripElem * se= give_stripelem(last_seq, CFRA);
+                       StripElem * se= give_stripelem(last_seq, CFRA, TRUE);
                        StripElem * last;
 
                        /* FIRST AND LAST */
@@ -809,7 +809,8 @@
                }
        }
        else if(last_seq->type==SEQ_SCENE) {
-               TStripElem * se= give_tstripelem(last_seq,  (G.scene->r.cfra));
+               TStripElem * se= give_tstripelem(last_seq,  (G.scene->r.cfra),
+                                                TRUE);
                if(se && last_seq->scene) {
                        sprintf(str, "First: %d\nLast: %d\nCur: %d\n", 
last_seq->sfra+se->nr, last_seq->sfra, last_seq->sfra+last_seq->len-1); 
                }
@@ -882,7 +883,7 @@
                        cfra = last_seq->enddisp - 1;
                }
 
-               se = give_stripelem(last_seq, cfra);
+               se = give_stripelem(last_seq, cfra, TRUE);
 
                if (se) {
                        uiDefBut(block, TEX, 

Modified: trunk/blender/source/blender/src/editseq.c
===================================================================
--- trunk/blender/source/blender/src/editseq.c  2009-06-26 02:49:47 UTC (rev 
21164)
+++ trunk/blender/source/blender/src/editseq.c  2009-06-26 07:32:24 UTC (rev 
21165)
@@ -3720,7 +3720,7 @@
                        
                        while (cfra < frame_end) {
                                /* new seq */
-                               se = give_stripelem(seq, cfra);
+                               se = give_stripelem(seq, cfra, TRUE);
                                
                                seq_new= alloc_sequence(((Editing 
*)G.scene->ed)->seqbasep, start_ofs, seq->machine);
                                seq_new->type= SEQ_IMAGE;

Modified: trunk/blender/source/blender/src/seqeffects.c
===================================================================
--- trunk/blender/source/blender/src/seqeffects.c       2009-06-26 02:49:47 UTC 
(rev 21164)
+++ trunk/blender/source/blender/src/seqeffects.c       2009-06-26 07:32:24 UTC 
(rev 21165)
@@ -32,6 +32,7 @@
 #include "MEM_guardedalloc.h"
 #include "PIL_dynlib.h"
 
+#include "DNA_ipo_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_sequence_types.h"
 
@@ -2805,20 +2806,11 @@
        /* if there is no IPO, try to make retiming easy by stretching the
           strip */
 
-       if (!seq->ipo && seq->seq1 && seq->seq1->enddisp != seq->seq1->start
+       if ((!seq->ipo || !seq->ipo->curve.first) && 
+           seq->seq1 && seq->seq1->enddisp != seq->seq1->start
            && seq->seq1->len != 0) {
                fallback_fac = (float) seq->seq1->len / 
                        (float) (seq->seq1->enddisp - seq->seq1->start);
-               /* FIXME: this strip stretching gets screwed by stripdata
-                  handling one layer up.
-                  
-                  So it currently works by enlarging, never by shrinking!
-
-                  (IPOs still work, if used correctly)
-               */
-               if (fallback_fac > 1.0) {
-                       fallback_fac = 1.0;
-               }
        }
 
        if ((v->flags & SEQ_SPEED_INTEGRATE) != 0) {
@@ -2828,7 +2820,7 @@
                v->lastValidFrame = 0;
 
                for (cfra = 1; cfra < v->length; cfra++) {
-                       if(seq->ipo) {
+                       if(seq->ipo && seq->ipo->curve.first) {
                                if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
                                        ctime = frame_to_float(seq->startdisp
                                                               + cfra);
@@ -2848,7 +2840,7 @@
 
                        cursor += seq->facf0;
 
-                       if (cursor >= v->length) {
+                       if (cursor >= seq->seq1->len) {
                                v->frameMap[cfra] = v->length - 1;
                        } else {
                                v->frameMap[cfra] = cursor;
@@ -2858,7 +2850,7 @@
        } else {
                v->lastValidFrame = 0;
                for (cfra = 0; cfra < v->length; cfra++) {
-                       if(seq->ipo) {
+                       if(seq->ipo && seq->ipo->curve.first) {
                                if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
                                        ctime = frame_to_float(seq->startdisp
                                                               + cfra);
@@ -2876,11 +2868,11 @@
                        if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) {
                                seq->facf0 *= v->length;
                        }
-                       if (!seq->ipo) {
+                       if ((!seq->ipo || !seq->ipo->curve.first)) {
                                seq->facf0 = (float) cfra * fallback_fac;
                        }
                        seq->facf0 *= v->globalSpeed;
-                       if (seq->facf0 >= v->length) {
+                       if (seq->facf0 >= seq->seq1->len) {
                                seq->facf0 = v->length - 1;
                        } else {
                                v->lastValidFrame = cfra;

Modified: trunk/blender/source/blender/src/sequence.c
===================================================================
--- trunk/blender/source/blender/src/sequence.c 2009-06-26 02:49:47 UTC (rev 
21164)
+++ trunk/blender/source/blender/src/sequence.c 2009-06-26 07:32:24 UTC (rev 
21165)
@@ -838,11 +838,13 @@
                   se->ibuf);
 }
 
-static int give_stripelem_index(Sequence *seq, int cfra)
+static int give_stripelem_index(Sequence *seq, int cfra, int in_display_range)
 {
        int nr;
 
-       if(seq->startdisp >cfra || seq->enddisp <= cfra) return -1;
+       if (in_display_range) {
+               if(seq->startdisp >cfra || seq->enddisp <= cfra) return -1;
+       }
        if(seq->len == 0) return -1;
        if(seq->flag&SEQ_REVERSE_FRAMES) {      
                /*reverse frame in this sequence */
@@ -872,7 +874,7 @@
        return se;
 }
 
-TStripElem *give_tstripelem(Sequence *seq, int cfra)
+TStripElem *give_tstripelem(Sequence *seq, int cfra, int in_display_range)
 {
        TStripElem *se;
        int nr;
@@ -882,7 +884,7 @@
                se = seq->strip->tstripdata = alloc_tstripdata(seq->len,
                                                               "tstripelems");
        }
-       nr = give_stripelem_index(seq, cfra);
+       nr = give_stripelem_index(seq, cfra, in_display_range);
 
        if (nr == -1) return 0;
        if (se == 0) return 0;
@@ -943,13 +945,13 @@
        return se;
 }
 
-StripElem *give_stripelem(Sequence *seq, int cfra)
+StripElem *give_stripelem(Sequence *seq, int cfra, int in_display_range)
 {
        StripElem *se;
        int nr;
 
        se = seq->strip->stripdata;
-       nr = give_stripelem_index(seq, cfra);
+       nr = give_stripelem_index(seq, cfra, in_display_range);
 
        if (nr == -1) return 0;
        if (se == 0) return 0;
@@ -1051,7 +1053,7 @@
 #define PROXY_MAXFILE (2*FILE_MAXDIR+FILE_MAXFILE)
 
 static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name,
-                              int render_size)
+                              int render_size, int in_display_range)
 {
        int frameno;
        char dir[FILE_MAXDIR];
@@ -1060,7 +1062,8 @@
                return FALSE;
        }
 
-       if (seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) {
+       if ((seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) ||
+           (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) {
                strcpy(dir, seq->strip->proxy->dir);
        } else {
                if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) {
@@ -1082,12 +1085,12 @@
        /* generate a seperate proxy directory for each preview size */
 
        if (seq->type == SEQ_IMAGE) {
-               StripElem * se = give_stripelem(seq, cfra);
+               StripElem * se = give_stripelem(seq, cfra, in_display_range);
                snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy",
                         dir, render_size, se->name);
                frameno = 1;
        } else if (seq->type == SEQ_MOVIE) {
-               TStripElem * tse = give_tstripelem(seq, cfra);
+               TStripElem * tse = give_tstripelem(seq, cfra,in_display_range);
 
                frameno = tse->nr + seq->anim_startofs;
 
@@ -1095,7 +1098,7 @@
                         seq->strip->stripdata->name,
                         render_size);
        } else {
-               TStripElem * tse = give_tstripelem(seq, cfra);
+               TStripElem * tse = give_tstripelem(seq, cfra,in_display_range);
 
                frameno = tse->nr + seq->anim_startofs;
 
@@ -1113,7 +1116,7 @@
 }
 
 static struct ImBuf * seq_proxy_fetch(Sequence * seq, int cfra,
-                                     int render_size)
+                                     int render_size, int in_display_range)
 {
        char name[PROXY_MAXFILE];
 
@@ -1127,10 +1130,11 @@
        }
 
        if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
-               TStripElem * tse = give_tstripelem(seq, cfra);
+               TStripElem * tse = give_tstripelem(seq, cfra,in_display_range);
                int frameno = tse->nr + seq->anim_startofs;
                if (!seq->strip->proxy->anim) {
-                       if (!seq_proxy_get_fname(seq, cfra,name,render_size)) {
+                       if (!seq_proxy_get_fname(seq, cfra,name,render_size,
+                                                in_display_range)) {
                                return 0;
                        }
 
@@ -1143,7 +1147,8 @@
                return IMB_anim_absolute(seq->strip->proxy->anim, frameno);
        }
 
-       if (!seq_proxy_get_fname(seq, cfra, name, render_size)) {
+       if (!seq_proxy_get_fname(seq, cfra, name, render_size,
+                                in_display_range)) {
                return 0;
        }
 
@@ -1155,7 +1160,8 @@
 }
 
 static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
-                             int build_proxy_run, int render_size);
+                             int build_proxy_run, int render_size,
+                             int in_display_range);
 
 static void seq_proxy_build_frame(Sequence * seq, int cfra, int render_size)
 {
@@ -1180,11 +1186,11 @@
                return;
        }
 
-       if (!seq_proxy_get_fname(seq, cfra, name, render_size)) {
+       if (!seq_proxy_get_fname(seq, cfra, name, render_size, TRUE)) {
                return;
        }
 
-       se = give_tstripelem(seq, cfra);
+       se = give_tstripelem(seq, cfra, TRUE);
        if (!se) {
                return;
        }
@@ -1194,7 +1200,7 @@
                se->ibuf = 0;
        }
        
-       do_build_seq_ibuf(seq, se, cfra, TRUE, render_size);
+       do_build_seq_ibuf(seq, se, cfra, TRUE, render_size, TRUE);
 
        if (!se->ibuf) {
                return;
@@ -1244,7 +1250,7 @@
         */
 
        for (cfra = seq->startdisp; cfra < seq->enddisp; cfra++) {
-               TStripElem * tse = give_tstripelem(seq, cfra);
+               TStripElem * tse = give_tstripelem(seq, cfra, TRUE);
 
                tse->flag &= ~STRIPELEM_PREVIEW_DONE;
        }
@@ -1256,7 +1262,7 @@
        if (seq->flag & SEQ_REVERSE_FRAMES) {
                for (cfra = seq->enddisp-seq->endstill-1; 
                     cfra >= seq->startdisp + seq->startstill; cfra--) {
-                       TStripElem * tse = give_tstripelem(seq, cfra);
+                       TStripElem * tse = give_tstripelem(seq, cfra, TRUE);
 
                        if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) {
                                set_timecursor(cfra);
@@ -1270,7 +1276,7 @@
        } else {
                for (cfra = seq->startdisp + seq->startstill; 
                     cfra < seq->enddisp - seq->endstill; cfra++) {
-                       TStripElem * tse = give_tstripelem(seq, cfra);
+                       TStripElem * tse = give_tstripelem(seq, cfra, TRUE);
 
                        if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) {

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to