From 6bdf1d6ddebbbb6ef4ae58aae26f35ea0643f086 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 28 Aug 2015 11:07:41 +1000 Subject: Sequence/Scene render fixes - wasn't checking subframe to see if the scene needed to be re-evaluated. - unneeded int/float conversion storing original frame. - moved cleanup block into one place to avoid confusion. --- source/blender/blenkernel/intern/sequencer.c | 55 ++++++++++++++++------------ 1 file changed, 32 insertions(+), 23 deletions(-) (limited to 'source/blender/blenkernel/intern/sequencer.c') diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 08e73b6bf55..f0e59eda321 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -3084,9 +3084,16 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq { ImBuf *ibuf = NULL; double frame; - float oldcfra, oldsubframe; Object *camera; - ListBase oldmarkers; + + struct { + int scemode; + int cfra; + float subframe; +#ifdef DURIAN_CAMERA_SWITCH + ListBase markers; +#endif + } orig_data; /* Old info: * Hack! This function can be called from do_render_seq(), in that case @@ -3124,10 +3131,11 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq const bool do_seq_gl = is_rendering ? 0 /* (context->scene->r.seq_flag & R_SEQ_GL_REND) */ : (context->scene->r.seq_flag & R_SEQ_GL_PREV) != 0; - int do_seq; // bool have_seq = false; /* UNUSED */ bool have_comp = false; bool use_gpencil = true; + /* do we need to re-evaluate the frame after rendering? */ + bool is_frame_update = false; Scene *scene; int is_thread_main = BLI_thread_is_main(); @@ -3142,8 +3150,12 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq // have_seq = (scene->r.scemode & R_DOSEQ) && scene->ed && scene->ed->seqbase.first); /* UNUSED */ have_comp = (scene->r.scemode & R_DOCOMP) && scene->use_nodes && scene->nodetree; - oldcfra = scene->r.cfra; - oldsubframe = scene->r.subframe; + orig_data.scemode = scene->r.scemode; + orig_data.cfra = scene->r.cfra; + orig_data.subframe = scene->r.subframe; +#ifdef DURIAN_CAMERA_SWITCH + orig_data.markers = scene->markers; +#endif BKE_scene_frame_set(scene, frame); @@ -3155,28 +3167,24 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq camera = scene->camera; } - if (seq->flag & SEQ_SCENE_NO_GPENCIL) { - use_gpencil = false; + if (have_comp == false && camera == NULL) { + goto finally; } - if (have_comp == false && camera == NULL) { - scene->r.cfra = oldcfra; - scene->r.subframe = oldsubframe; - return NULL; + if (seq->flag & SEQ_SCENE_NO_GPENCIL) { + use_gpencil = false; } /* prevent eternal loop */ - do_seq = scene->r.scemode & R_DOSEQ; scene->r.scemode &= ~R_DOSEQ; #ifdef DURIAN_CAMERA_SWITCH /* stooping to new low's in hackyness :( */ - oldmarkers = scene->markers; BLI_listbase_clear(&scene->markers); -#else - (void)oldmarkers; #endif + is_frame_update = (orig_data.cfra != scene->r.cfra) || (orig_data.subframe != scene->r.subframe); + if ((sequencer_view3d_cb && do_seq_gl && camera) && is_thread_main) { char err_out[256] = "unknown"; int width = (scene->r.xsch * scene->r.size) / 100; @@ -3271,20 +3279,21 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq // BIF_end_render_callbacks(); } - + + +finally: /* restore */ - scene->r.scemode |= do_seq; - - scene->r.cfra = oldcfra; - scene->r.subframe = oldsubframe; + scene->r.scemode = orig_data.scemode; + scene->r.cfra = orig_data.cfra; + scene->r.subframe = orig_data.subframe; - if (frame != oldcfra) { + if (is_frame_update) { BKE_scene_update_for_newframe(context->eval_ctx, context->bmain, scene, scene->lay); } - + #ifdef DURIAN_CAMERA_SWITCH /* stooping to new low's in hackyness :( */ - scene->markers = oldmarkers; + scene->markers = orig_data.markers; #endif return ibuf; -- cgit v1.2.3