Revision: 32638
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32638
Author:   jhk
Date:     2010-10-21 19:00:38 +0200 (Thu, 21 Oct 2010)

Log Message:
-----------
Temporary fix for sequencer bugs #22925, #21429, #21783, #24165
* This fix is really only a bandage, as the underlying issue is that sequencer 
preview render doesn't yet use the job system.
* The sequencer preview can start a full render of the scene, and this can 
collide with other preview/actual renders in many cases.
* Drawing the sequencer preview is now disabled when an other render is in 
progress, but the sequence preview rendering could have already been started 
before the other render, so this doesn't really fix anything.
* For now only OpenGL rendering can be used for the sequencer preview reliably 
until it's reimplemented using the job system.
* Using the job system in the future can handle the clashes between different 
renders properly and will give users a nice progress bar to indicate something 
is happening while the preview is recalculated.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_sequencer.py
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/release/scripts/ui/space_sequencer.py
===================================================================
--- trunk/blender/release/scripts/ui/space_sequencer.py 2010-10-21 15:02:39 UTC 
(rev 32637)
+++ trunk/blender/release/scripts/ui/space_sequencer.py 2010-10-21 17:00:38 UTC 
(rev 32638)
@@ -760,9 +760,10 @@
         render = context.scene.render
 
         col = layout.column()
+        col.active = False #Currently only opengl preview works!
         col.prop(render, "use_sequencer_gl_preview", text="Open GL Preview")
         col = layout.column()
-        col.active = render.use_sequencer_gl_preview
+        #col.active = render.use_sequencer_gl_preview
         col.prop(render, "sequencer_gl_preview", text="")
 
         '''

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c  2010-10-21 
15:02:39 UTC (rev 32637)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c  2010-10-21 
17:00:38 UTC (rev 32638)
@@ -1801,7 +1801,8 @@
        Object *oldcamera;
        ListBase oldmarkers;
        
-       /* Hack! This function can be called from do_render_seq(), in that case
+       /* Old info:
+          Hack! This function can be called from do_render_seq(), in that case
           the seq->scene can already have a Render initialized with same name,
           so we have to use a default name. (compositor uses scene name to
           find render).
@@ -1813,9 +1814,27 @@
           and since G.rendering is uhm, gone... (Peter)
        */
 
+       /* New info:
+          Using the same name for the renders works just fine as the 
do_render_seq()
+          render is not used while the scene strips are rendered.
+          
+          However rendering from UI (through sequencer_preview_area_draw) can 
crash in
+          very many cases since other renders (material preview, an actual 
render etc.)
+          can be started while this sequence preview render is running. The 
only proper
+          solution is to make the sequencer preview render a proper job, which 
can be
+          stopped when needed. This would also give a nice progress bar for 
the preview
+          space so that users know there's something happening.
+
+          As a result the active scene now only uses OpenGL rendering for the 
sequencer
+          preview. This is far from nice, but is the only way to prevent 
crashes at this
+          time. 
+
+          -jahka
+       */
+
        int rendering = G.rendering;
        int doseq;
-       int doseq_gl= G.rendering ? /*(scene->r.seq_flag & R_SEQ_GL_REND)*/ 0 : 
(scene->r.seq_flag & R_SEQ_GL_PREV);
+       int doseq_gl= G.rendering ? /*(scene->r.seq_flag & R_SEQ_GL_REND)*/ 0 : 
/*(scene->r.seq_flag & R_SEQ_GL_PREV)*/ 1;
        int have_seq= FALSE;
        Scene *sce= seq->scene; /* dont refer to seq->scene above this point!, 
it can be NULL */
        int sce_valid= FALSE;
@@ -1848,31 +1867,29 @@
 #endif
        
        if(sequencer_view3d_cb && BLI_thread_is_main() && doseq_gl && 
(seq->scene == scene || have_seq==0) && seq->scene->camera) {
+               /* for old scened this can be uninitialized, should probably be 
added to do_versions at some point if the functionality stays */
+               if(scene->r.seq_prev_type==0)
+                       scene->r.seq_prev_type = 3 /* ==OB_SOLID */; 
+
                /* opengl offscreen render */
                scene_update_for_newframe(bmain, seq->scene, seq->scene->lay);
-               ibuf= sequencer_view3d_cb(seq->scene, seqrectx, seqrecty, 
IB_rect,
-                                         scene->r.seq_prev_type);
+               ibuf= sequencer_view3d_cb(seq->scene, seqrectx, seqrecty, 
IB_rect, scene->r.seq_prev_type);
        }
        else {
-               Render *re;
+               Render *re = RE_GetRender(sce->id.name);
                RenderResult rres;
+
+               /* XXX: this if can be removed when sequence preview rendering 
uses the job system */
+               if(rendering || scene != sce) {
+                       if(re==NULL)
+                               re= RE_NewRender(sce->id.name);
+                       
+                       RE_BlenderFrame(re, bmain, sce, NULL, sce->lay, frame);
+
+                       /* restore previous state after it was toggled on & off 
by RE_BlenderFrame */
+                       G.rendering = rendering;
+               }
                
-               if(rendering)
-                       re= RE_NewRender(" do_build_seq_ibuf");
-               /* If the top level scene that does the sequencer rendering is 
included 
-                * as a strip the default render name for the strip will 
conflict with
-                * the original render, so override the name in this case.
-                * See bugs #22236 and #24160 for examples.
-                * XXX: Somebody with deeper insight to the rendering pipeline 
should
-                *      probably check if this is the best way to handle this. 
-jahka
-                */
-               else if(seq->scene == scene)
-                       re= RE_NewRender("scene_conflict_render");
-               else
-                       re= RE_NewRender(sce->id.name);
-               
-               RE_BlenderFrame(re, bmain, sce, NULL, sce->lay, frame);
-               
                RE_AcquireResultImage(re, &rres);
                
                if(rres.rectf) {

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c       
2010-10-21 15:02:39 UTC (rev 32637)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c       
2010-10-21 17:00:38 UTC (rev 32638)
@@ -728,6 +728,10 @@
        UI_view2d_totRect_set(v2d, viewrectx + 0.5f, viewrecty + 0.5f);
        UI_view2d_curRect_validate(v2d);
 
+       /* only initialize the preview if a render is in progress */
+       if(G.rendering)
+               return;
+
        if (special_seq_update)
                ibuf= give_ibuf_seq_direct(bmain, scene, rectx, recty, cfra + 
frame_ofs, proxy_size, special_seq_update);
        else if (!U.prefetchframes) // XXX || (G.f & G_PLAYANIM) == 0) {

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c        
2010-10-21 15:02:39 UTC (rev 32637)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c        
2010-10-21 17:00:38 UTC (rev 32638)
@@ -2451,7 +2451,7 @@
 {
        static int recurs_depth = 0;
        struct ImBuf *ibuf;
-       RenderResult *rr = re->result;
+       RenderResult *rr; /* don't assign re->result here as it might change 
during give_ibuf_seq */
        int cfra = re->r.cfra;
 
        re->i.cfra= cfra;
@@ -2463,9 +2463,11 @@
 
        recurs_depth++;
 
-       ibuf= give_ibuf_seq(re->main, re->scene, rr->rectx, rr->recty, cfra, 0, 
100.0);
+       ibuf= give_ibuf_seq(re->main, re->scene, re->result->rectx, 
re->result->recty, cfra, 0, 100.0);
 
        recurs_depth--;
+
+       rr = re->result;
        
        BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
 


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

Reply via email to