diff options
Diffstat (limited to 'source/blender/editors/render/render_internal.c')
-rw-r--r-- | source/blender/editors/render/render_internal.c | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 7110c3aa7a7..083202e5a03 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -38,7 +38,6 @@ #include "DNA_scene_types.h" #include "BKE_blender.h" -#include "BKE_colortools.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_image.h" @@ -46,9 +45,7 @@ #include "BKE_main.h" #include "BKE_multires.h" #include "BKE_report.h" -#include "BKE_scene.h" -#include "BKE_screen.h" -#include "BKE_utildefines.h" +#include "BKE_sequencer.h" #include "WM_api.h" #include "WM_types.h" @@ -403,6 +400,7 @@ static int screen_render_exec(bContext *C, wmOperator *op) Render *re= RE_NewRender(scene->id.name); Image *ima; View3D *v3d= CTX_wm_view3d(C); + Main *mainp= CTX_data_main(C); int lay= (v3d)? v3d->lay: scene->lay; if(re==NULL) { @@ -417,10 +415,16 @@ static int screen_render_exec(bContext *C, wmOperator *op) BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE); BKE_image_backup_render(scene, ima); + /* cleanup sequencer caches before starting user triggered render. + otherwise, invalidated cache entries can make their way into + the output rendering. We can't put that into RE_BlenderFrame, + since sequence rendering can call that recursively... (peter) */ + seq_stripelem_cache_cleanup(); + if(RNA_boolean_get(op->ptr, "animation")) - RE_BlenderAnim(re, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports); + RE_BlenderAnim(re, mainp, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports); else - RE_BlenderFrame(re, scene, NULL, lay, scene->r.cfra); + RE_BlenderFrame(re, mainp, scene, NULL, lay, scene->r.cfra); // no redraw needed, we leave state as we entered it ED_update_for_newframe(C, 1); @@ -431,6 +435,7 @@ static int screen_render_exec(bContext *C, wmOperator *op) } typedef struct RenderJob { + Main *main; Scene *scene; Render *re; wmWindow *win; @@ -555,23 +560,24 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec static void render_startjob(void *rjv, short *stop, short *do_update, float *progress) { RenderJob *rj= rjv; -// Main *mainp= BKE_undo_get_main(&rj->scene); rj->stop= stop; rj->do_update= do_update; rj->progress= progress; if(rj->anim) - RE_BlenderAnim(rj->re, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports); + RE_BlenderAnim(rj->re, rj->main, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports); else - RE_BlenderFrame(rj->re, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra); - -// if(mainp) -// free_main(mainp); + RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra); } static void render_endjob(void *rjv) { + RenderJob *rj= rjv; + + if(rj->main != G.main) + free_main(rj->main); + /* XXX render stability hack */ G.rendering = 0; WM_main_add_notifier(NC_WINDOW, NULL); @@ -610,6 +616,7 @@ static int screen_render_modal(bContext *C, wmOperator *op, wmEvent *event) static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) { /* new render clears all callbacks */ + Main *mainp; Scene *scene= CTX_data_scene(C); SceneRenderLayer *srl=NULL; bScreen *screen= CTX_wm_screen(C); @@ -626,6 +633,14 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) /* stop all running jobs, currently previews frustrate Render */ WM_jobs_stop_all(CTX_wm_manager(C)); + /* get main */ + if(G.rt == 101) { + /* thread-safety experiment, copy main from the undo buffer */ + mainp= BKE_undo_get_main(&scene); + } + else + mainp= CTX_data_main(C); + /* cancel animation playback */ if (screen->animtimer) ED_screen_animation_play(C, 0, 0); @@ -636,6 +651,12 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) /* flush multires changes (for sculpt) */ multires_force_render_update(CTX_data_active_object(C)); + /* cleanup sequencer caches before starting user triggered render. + otherwise, invalidated cache entries can make their way into + the output rendering. We can't put that into RE_BlenderFrame, + since sequence rendering can call that recursively... (peter) */ + seq_stripelem_cache_cleanup(); + /* get editmode results */ ED_object_exit_editmode(C, 0); /* 0 = does not exit editmode */ @@ -655,7 +676,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) RNA_string_get(op->ptr, "layer", rl_name); RNA_string_get(op->ptr, "scene", scene_name); - scn = (Scene *)BLI_findstring(&CTX_data_main(C)->scene, scene_name, offsetof(ID, name) + 2); + scn = (Scene *)BLI_findstring(&mainp->scene, scene_name, offsetof(ID, name) + 2); rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name)); if (scn && rl) { @@ -666,6 +687,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) /* job custom data */ rj= MEM_callocN(sizeof(RenderJob), "render job"); + rj->main= mainp; rj->scene= scene; rj->win= CTX_wm_window(C); rj->srl = srl; |