diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-02-16 18:49:22 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-02-16 18:49:22 +0300 |
commit | 2061f91741861f5646974b4960b5ff03d509f5eb (patch) | |
tree | a2c121512a2b6a9097b7426385a9d379e627fc02 /source/blender/editors/screen/screen_ops.c | |
parent | bd638da9a0bbd057b72164eed6583888380490ed (diff) |
Render Slots: change the implementation by moving it from the render to the
image code, this should be clearer and makes reusing the Render struct later
on easier.
Diffstat (limited to 'source/blender/editors/screen/screen_ops.c')
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 4addfc9cdda..54dd27c864f 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -2894,18 +2894,23 @@ static void screen_set_image_output(bContext *C, int mx, int my) static int screen_render_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW); + Render *re= RE_GetRender(scene->id.name); + Image *ima; if(re==NULL) { - re= RE_NewRender(scene->id.name, RE_SLOT_VIEW); + re= RE_NewRender(scene->id.name); } RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break); - + + ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); + BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE); + BKE_image_backup_render(scene, ima); + if(RNA_boolean_get(op->ptr, "animation")) RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports); else RE_BlenderFrame(re, scene, NULL, scene->r.cfra); - + // no redraw needed, we leave state as we entered it ED_update_for_newframe(C, 1); @@ -2934,7 +2939,7 @@ static void render_freejob(void *rjv) MEM_freeN(rj); } -/* str is IMA_RW_MAXTEXT in size */ +/* str is IMA_MAX_RENDER_TEXT in size */ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str) { char info_time_str[32]; // used to be extern to header_info.c @@ -2975,7 +2980,7 @@ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str) spos+= sprintf(spos, "| %s ", rs->infostr); /* very weak... but 512 characters is quite safe */ - if(spos >= str+IMA_RW_MAXTEXT) + if(spos >= str+IMA_MAX_RENDER_TEXT) if (G.f & G_DEBUG) printf("WARNING! renderwin text beyond limit \n"); @@ -2984,12 +2989,17 @@ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str) static void image_renderinfo_cb(void *rjv, RenderStats *rs) { RenderJob *rj= rjv; + RenderResult *rr; + rr= RE_AcquireResultRead(rj->re); + /* malloc OK here, stats_draw is not in tile threads */ - if(rj->image->render_text==NULL) - rj->image->render_text= MEM_callocN(IMA_RW_MAXTEXT, "rendertext"); + if(rr->text==NULL) + rr->text= MEM_callocN(IMA_MAX_RENDER_TEXT, "rendertext"); - make_renderinfo_string(rs, rj->scene, rj->image->render_text); + make_renderinfo_string(rs, rj->scene, rr->text); + + RE_ReleaseResult(rj->re); /* make jobs timer to send notifier */ *(rj->do_update)= 1; @@ -3132,7 +3142,9 @@ static void render_startjob(void *rjv, short *stop, short *do_update) // Workaround for Apple gcc 4.2.1 omp vs background thread bug pthread_setspecific (gomp_tls_key, thread_tls_data); #endif - + + BKE_image_backup_render(rj->scene, rj->image); + if(rj->anim) RE_BlenderAnim(rj->re, rj->scene, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports); else @@ -3249,11 +3261,11 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) rj->image= ima; /* setup new render */ - re= RE_NewRender(scene->id.name, RE_SLOT_VIEW); + re= RE_NewRender(scene->id.name); RE_test_break_cb(re, rj, render_breakjob); RE_display_draw_cb(re, rj, image_rect_update); RE_stats_draw_cb(re, rj, image_renderinfo_cb); - + rj->re= re; G.afbreek= 0; @@ -3411,7 +3423,7 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op) oglrender->iuser.ok= 1; /* create render and render result */ - oglrender->re= RE_NewRender(scene->id.name, RE_SLOT_VIEW); + oglrender->re= RE_NewRender(scene->id.name); RE_InitState(oglrender->re, NULL, &scene->r, NULL, sizex, sizey, NULL); rr= RE_AcquireResultWrite(oglrender->re); |