Revision: 20423
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20423
Author:   schlaile
Date:     2009-05-26 14:57:16 +0200 (Tue, 26 May 2009)

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

This adds a per preview option to set render sizes (which proxy size is used).
That makes it possible to have 
* several small preview screens which update really fast using the proxy files
* one large output screen that operates in full resolution

Since most of the time not all input strips are considered when calculating
an output screen, this is a big win.

Also: one can disable a preview screen completely using this option.

Other use cases: vector + chromaviews don't always need full resolution 
pictures and work equally well on proxy files!

This option finally makes my working setup _completely_ realtime :)

Modified Paths:
--------------
    trunk/blender/source/blender/include/BSE_sequence.h
    trunk/blender/source/blender/makesdna/DNA_space_types.h
    trunk/blender/source/blender/src/drawseq.c
    trunk/blender/source/blender/src/header_seq.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-05-26 10:44:14 UTC 
(rev 20422)
+++ trunk/blender/source/blender/include/BSE_sequence.h 2009-05-26 12:57:16 UTC 
(rev 20423)
@@ -68,18 +68,20 @@
 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 ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chansel); 
+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)*/
 struct ImBuf *give_ibuf_seq_direct(int rectx, int recty, int cfra,
-                                  struct Sequence * seq);
+                                  int render_size, struct Sequence * seq);
 
 /* sequence prefetch API */
 void seq_start_threads();
 void seq_stop_threads();
-void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown);
+void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown,
+                               int render_size);
 void seq_wait_for_prefetch_ready();
 struct ImBuf * give_ibuf_seq_threaded(int rectx, int recty, int cfra, 
-                                     int chanshown);
+                                     int chanshown, int render_size);
 
 
 void free_imbuf_seq_except(int cfra);

Modified: trunk/blender/source/blender/makesdna/DNA_space_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_space_types.h     2009-05-26 
10:44:14 UTC (rev 20422)
+++ trunk/blender/source/blender/makesdna/DNA_space_types.h     2009-05-26 
12:57:16 UTC (rev 20423)
@@ -146,7 +146,8 @@
        View2D v2d;
        
        float xof, yof; /* offset for drawing the image preview */
-       short mainb, pad;
+       short mainb;
+       short render_size;
        short chanshown;
        short zebra;
        int flag;

Modified: trunk/blender/source/blender/src/drawseq.c
===================================================================
--- trunk/blender/source/blender/src/drawseq.c  2009-05-26 10:44:14 UTC (rev 
20422)
+++ trunk/blender/source/blender/src/drawseq.c  2009-05-26 12:57:16 UTC (rev 
20423)
@@ -849,6 +849,7 @@
        static int recursive= 0;
        float zoom;
        float zoomx, zoomy;
+       int render_size = 0;
 
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
@@ -856,9 +857,17 @@
        sseq= sa->spacedata.first;
        if(sseq==0) return;
 
-       rectx= (G.scene->r.size*G.scene->r.xsch)/100;
-       recty= (G.scene->r.size*G.scene->r.ysch)/100;
+       render_size = sseq->render_size;
+       if (render_size == 0) {
+               render_size = G.scene->r.size;
+       }
+       if (render_size < 0) {
+               return;
+       }
 
+       rectx= (render_size*G.scene->r.xsch)/100;
+       recty= (render_size*G.scene->r.ysch)/100;
+
        /* BIG PROBLEM: the give_ibuf_seq() can call a rendering, which in turn 
calls redraws...
           this shouldn't belong in a window drawing....
           So: solve this once event based. 
@@ -870,16 +879,16 @@
                recursive= 1;
                if (special_seq_update) {
                        ibuf= give_ibuf_seq_direct(
-                               rectx, recty, (G.scene->r.cfra),
+                               rectx, recty, (G.scene->r.cfra), render_size,
                                special_seq_update);
                } else if (!U.prefetchframes || (G.f & G_PLAYANIM) == 0) {
                        ibuf= (ImBuf *)give_ibuf_seq(
                                rectx, recty, (G.scene->r.cfra), 
-                               sseq->chanshown);
+                               sseq->chanshown, render_size);
                } else {
                        ibuf= (ImBuf *)give_ibuf_seq_threaded(
                                rectx, recty, (G.scene->r.cfra), 
-                               sseq->chanshown);
+                               sseq->chanshown, render_size);
                }
                recursive= 0;
                
@@ -930,7 +939,7 @@
        
        zoom= SEQ_ZOOM_FAC(sseq->zoom);
        if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
-               zoom /= G.scene->r.size / 100.0;
+               zoom /= render_size / 100.0;
                zoomx = zoom * ((float)G.scene->r.xasp / 
(float)G.scene->r.yasp);
                zoomy = zoom;
        } else {
@@ -1112,13 +1121,21 @@
 {
        SpaceSeq *sseq= sa->spacedata.first;
        int rectx, recty;
+       int render_size = sseq->render_size;
+       if (render_size == 0) {
+               render_size = G.scene->r.size;
+       }
+       if (render_size < 0) {
+               return;
+       }
 
-       rectx= (G.scene->r.size*G.scene->r.xsch)/100;
-       recty= (G.scene->r.size*G.scene->r.ysch)/100;
+       rectx= (render_size*G.scene->r.xsch)/100;
+       recty= (render_size*G.scene->r.ysch)/100;
 
        if(sseq->mainb) {
                give_ibuf_prefetch_request(
-                       rectx, recty, (G.scene->r.cfra), sseq->chanshown);
+                       rectx, recty, (G.scene->r.cfra), sseq->chanshown,
+                       render_size);
        }
 }
 

Modified: trunk/blender/source/blender/src/header_seq.c
===================================================================
--- trunk/blender/source/blender/src/header_seq.c       2009-05-26 10:44:14 UTC 
(rev 20422)
+++ trunk/blender/source/blender/src/header_seq.c       2009-05-26 12:57:16 UTC 
(rev 20423)
@@ -740,6 +740,22 @@
                
                xco+= 8 + XIC*3.5;
 
+               uiDefButS(block, MENU, B_REDR, 
+                         "Render size: %t"
+                         "|R 100 %x100"
+                         "|R 75  %x75"
+                         "|R 50  %x50"
+                         "|R 25  %x25"
+                         "|R Sce %x0"
+                         "|R Off %x-1", 
+                         xco,0,3.0 * XIC, YIC, &sseq->render_size, 
+                         0,0,0,0, 
+                         "Use different (proxy) render size "
+                         "for this preview screen, use scene render size "
+                         "or disable this preview completely");
+
+               xco+= 8 + XIC*3.0;
+
                if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
                        uiDefButS(block, MENU, B_REDR, 
                                  "Show zebra: %t"

Modified: trunk/blender/source/blender/src/sequence.c
===================================================================
--- trunk/blender/source/blender/src/sequence.c 2009-05-26 10:44:14 UTC (rev 
20422)
+++ trunk/blender/source/blender/src/sequence.c 2009-05-26 12:57:16 UTC (rev 
20423)
@@ -1047,7 +1047,8 @@
 
 #define PROXY_MAXFILE (2*FILE_MAXDIR+FILE_MAXFILE)
 
-static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name)
+static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name,
+                              int render_size)
 {
        int frameno;
        char dir[FILE_MAXDIR];
@@ -1080,7 +1081,7 @@
        if (seq->type == SEQ_IMAGE) {
                StripElem * se = give_stripelem(seq, cfra);
                snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy",
-                        dir, G.scene->r.size, se->name);
+                        dir, render_size, se->name);
                frameno = 1;
        } else if (seq->type == SEQ_MOVIE) {
                TStripElem * tse = give_tstripelem(seq, cfra);
@@ -1089,14 +1090,14 @@
 
                snprintf(name, PROXY_MAXFILE, "%s/%s/%d/####", dir,
                         seq->strip->stripdata->name,
-                        G.scene->r.size);
+                        render_size);
        } else {
                TStripElem * tse = give_tstripelem(seq, cfra);
 
                frameno = tse->nr + seq->anim_startofs;
 
                snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/####", dir,
-                        G.scene->r.size);
+                        render_size);
        }
 
        BLI_convertstringcode(name, G.sce);
@@ -1108,7 +1109,8 @@
        return TRUE;
 }
 
-static struct ImBuf * seq_proxy_fetch(Sequence * seq, int cfra)
+static struct ImBuf * seq_proxy_fetch(Sequence * seq, int cfra,
+                                     int render_size)
 {
        char name[PROXY_MAXFILE];
 
@@ -1117,7 +1119,7 @@
        }
 
        /* rendering at 100% ? No real sense in proxy-ing, right? */
-       if (G.scene->r.size == 100.0) {
+       if (render_size == 100) {
                return 0;
        }
 
@@ -1125,7 +1127,7 @@
                TStripElem * tse = give_tstripelem(seq, cfra);
                int frameno = tse->nr + seq->anim_startofs;
                if (!seq->strip->proxy->anim) {
-                       if (!seq_proxy_get_fname(seq, cfra, name)) {
+                       if (!seq_proxy_get_fname(seq, cfra,name,render_size)) {
                                return 0;
                        }
 
@@ -1138,7 +1140,7 @@
                return IMB_anim_absolute(seq->strip->proxy->anim, frameno);
        }
 
-       if (!seq_proxy_get_fname(seq, cfra, name)) {
+       if (!seq_proxy_get_fname(seq, cfra, name, render_size)) {
                return 0;
        }
 
@@ -1150,9 +1152,9 @@
 }
 
 static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
-                             int build_proxy_run);
+                             int build_proxy_run, int render_size);
 
-static void seq_proxy_build_frame(Sequence * seq, int cfra)
+static void seq_proxy_build_frame(Sequence * seq, int cfra, int render_size)
 {
        char name[PROXY_MAXFILE];
        int quality;
@@ -1166,7 +1168,7 @@
        }
 
        /* rendering at 100% ? No real sense in proxy-ing, right? */
-       if (G.scene->r.size == 100.0) {
+       if (render_size == 100.0) {
                return;
        }
 
@@ -1175,7 +1177,7 @@
                return;
        }
 
-       if (!seq_proxy_get_fname(seq, cfra, name)) {
+       if (!seq_proxy_get_fname(seq, cfra, name, render_size)) {
                return;
        }
 
@@ -1189,14 +1191,14 @@
                se->ibuf = 0;
        }
        
-       do_build_seq_ibuf(seq, se, cfra, TRUE);
+       do_build_seq_ibuf(seq, se, cfra, TRUE, render_size);
 
        if (!se->ibuf) {
                return;
        }
 
-       rectx= (G.scene->r.size*G.scene->r.xsch)/100;
-       recty= (G.scene->r.size*G.scene->r.ysch)/100;
+       rectx= (render_size*G.scene->r.xsch)/100;
+       recty= (render_size*G.scene->r.ysch)/100;
 
        ibuf = se->ibuf;
 
@@ -1251,7 +1253,8 @@
                        TStripElem * tse = give_tstripelem(seq, cfra);
 
                        if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) {
-                               seq_proxy_build_frame(seq, cfra);
+                               seq_proxy_build_frame(seq, cfra,
+                                                     G.scene->r.size);
                                tse->flag |= STRIPELEM_PREVIEW_DONE;
                        }
                        if (blender_test_break()) {
@@ -1264,7 +1267,8 @@
                        TStripElem * tse = give_tstripelem(seq, cfra);
 
                        if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) {
-                               seq_proxy_build_frame(seq, cfra);
+                               seq_proxy_build_frame(seq, cfra,
+                                                     G.scene->r.size);
                                tse->flag |= STRIPELEM_PREVIEW_DONE;
                        }
                        if (blender_test_break()) {
@@ -1752,10 +1756,10 @@
 }
 
 static TStripElem* do_build_seq_array_recursively(
-       ListBase *seqbasep, int cfra, int chanshown);
+       ListBase *seqbasep, int cfra, int chanshown, int render_size);
 
 static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
-                             int build_proxy_run)
+                             int build_proxy_run, int render_size)
 {
        char name[FILE_MAXDIR+FILE_MAXFILE];
        int use_limiter = TRUE;
@@ -1769,7 +1773,7 @@
                use_limiter = FALSE;
 
                if (!build_proxy_run && se->ibuf == 0) {
-                       se->ibuf = seq_proxy_fetch(seq, cfra);
+                       se->ibuf = seq_proxy_fetch(seq, cfra, render_size);
                        if (se->ibuf) {
                                use_limiter = TRUE;
                                use_preprocess = TRUE;
@@ -1778,7 +1782,8 @@
 
                if(!se->ibuf && seq->seqbase.first) {
                        meta_se = do_build_seq_array_recursively(
-                               &seq->seqbase, seq->start + se->nr, 0);
+                               &seq->seqbase, seq->start + se->nr, 0,
+                               render_size);
 
                        check_limiter_refcount("do_build_seq_ibuf: for META",
                                               meta_se);
@@ -1820,7 +1825,7 @@
                /* should the effect be recalculated? */
                
                if (!build_proxy_run && se->ibuf == 0) {
-                       se->ibuf = seq_proxy_fetch(seq, cfra);
+                       se->ibuf = seq_proxy_fetch(seq, cfra, render_size);
                }
 
                if(se->ibuf == 0) {
@@ -1841,7 +1846,8 @@
                        BLI_convertstringcode(name, G.sce);
                        BLI_convertstringframe(name, G.scene->r.cfra);

@@ 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