diff options
author | Ton Roosendaal <ton@blender.org> | 2006-02-16 15:27:46 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-02-16 15:27:46 +0300 |
commit | 7f4b01ccf076998cac98c52aa6701f35e1c2500f (patch) | |
tree | 88d0b4ca129aa96a415b6b612ce77fcfb80a147f /source | |
parent | 32a9c7b493e85815c548d49303dcb9fe56d23ac6 (diff) |
Rendering tricks for improving workflow:
- Button option "Single" in render-layer panel will enable to only render
the currently indicated render-layer. It will also skip compositing.
- Brought back the 'Local View' render. This will only render the visible
objects, but with lights from the original view-layers.
To make the option useful, it also temporal enables 'Single', which has
the a disadvantage that you need to set the correct render-layer.
It is a bit a tricky option though... since its quite invisble and
confusing for people who don't know the feature. This might become either
a button in 3d header, or use a popup requester to confirm, or... will
need to think over!
At least; both options display in render window a text to denote the option.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/render/intern/include/renderpipeline.h | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 51 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 5 | ||||
-rw-r--r-- | source/blender/src/buttons_scene.c | 6 | ||||
-rw-r--r-- | source/blender/src/renderwin.c | 22 |
5 files changed, 66 insertions, 22 deletions
diff --git a/source/blender/render/intern/include/renderpipeline.h b/source/blender/render/intern/include/renderpipeline.h index b6fc3b41703..cd6e5028c22 100644 --- a/source/blender/render/intern/include/renderpipeline.h +++ b/source/blender/render/intern/include/renderpipeline.h @@ -31,6 +31,10 @@ #define PIPELINE_H struct Render; +struct RenderResult; +struct RenderLayer; + +struct RenderLayer *render_get_active_layer(struct Render *re, struct RenderResult *rr); #define PASS_VECTOR_MAX 10000.0f diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 72806a554fc..25a4af1fdd3 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -210,7 +210,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop) RenderResult *rr; RenderLayer *rl; SceneRenderLayer *srl; - int rectx, recty; + int rectx, recty, nr; rectx= partrct->xmax - partrct->xmin; recty= partrct->ymax - partrct->ymin; @@ -231,8 +231,11 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop) rr->tilerect.ymax= partrct->ymax - re->disprect.ymax; /* check renderdata for amount of layers */ - for(srl= re->r.layers.first; srl; srl= srl->next) { - + for(nr=0, srl= re->r.layers.first; srl; srl= srl->next, nr++) { + + if((re->r.scemode & R_SINGLE_LAYER) && nr!=re->r.actlay) + continue; + rl= MEM_callocT(sizeof(RenderLayer), "new render layer"); BLI_addtail(&rr->layers, rl); @@ -279,18 +282,20 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop) } /* display active layer */ - rr->renlay= BLI_findlink(&rr->layers, re->r.actlay); + rr->renlay= render_get_active_layer(re, rr); return rr; } -static int render_result_needs_vector(RenderResult *rr) +static int render_result_needs_vector(Render *re) { - RenderLayer *rl; + if(re->r.scemode & R_DOCOMP) { + RenderLayer *rl; - for(rl= rr->layers.first; rl; rl= rl->next) - if(rl->passflag & SCE_PASS_VECTOR) - return 1; + for(rl= re->result->layers.first; rl; rl= rl->next) + if(rl->passflag & SCE_PASS_VECTOR) + return 1; + } return 0; } @@ -383,6 +388,16 @@ RenderResult *RE_GetResult(Render *re) return NULL; } +RenderLayer *render_get_active_layer(Render *re, RenderResult *rr) +{ + if(re->r.scemode & R_SINGLE_LAYER) + return rr->layers.first; + else + return BLI_findlink(&rr->layers, re->r.actlay); + +} + + /* fill provided result struct with what's currently active or done */ void RE_GetResultImage(Render *re, RenderResult *rr) { @@ -399,7 +414,8 @@ void RE_GetResultImage(Render *re, RenderResult *rr) rr->rect32= re->result->rect32; /* active layer */ - rl= BLI_findlink(&re->result->layers, re->r.actlay); + rl= render_get_active_layer(re, re->result); + if(rl) { if(rr->rectf==NULL) rr->rectf= rl->rectf; @@ -542,7 +558,10 @@ void RE_InitState(Render *re, RenderData *rd, int winx, int winy, rcti *disprect /* initialize render result */ free_render_result(re->result); re->result= new_render_result(re, &re->disprect, 0); - + + /* single layer render disables composit */ + if(re->r.scemode & R_SINGLE_LAYER) + re->r.scemode &= ~R_DOCOMP; } } @@ -847,7 +866,7 @@ void render_one_frame(Render *re) // re->cfra= cfra; /* <- unused! */ /* make render verts/faces/halos/lamps */ - if(render_result_needs_vector(re->result)) + if(render_result_needs_vector(re)) RE_Database_FromScene_Vectors(re, re->scene); else RE_Database_FromScene(re, re->scene, 1); @@ -1004,9 +1023,11 @@ static void do_render_final(Render *re) /* checks if there are render-result nodes that need scene */ ntree_render_scenes(re); - ntree->stats_draw= render_composit_stats; - ntreeCompositExecTree(ntree, &re->r, G.background==0); - ntree->stats_draw= NULL; + if(!re->test_break()) { + ntree->stats_draw= render_composit_stats; + ntreeCompositExecTree(ntree, &re->r, G.background==0); + ntree->stats_draw= NULL; + } } } } diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 93e5ad8d95f..2b8a939e832 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -3175,8 +3175,7 @@ void zbufshadeDA_tile(RenderPart *pa) if(edgerect) MEM_freeT(edgerect); /* display active layer */ - rr->renlay= BLI_findlink(&rr->layers, R.r.actlay); - + rr->renlay= render_get_active_layer(&R, rr); } @@ -3279,7 +3278,7 @@ void zbufshade_tile(RenderPart *pa) } /* display active layer */ - rr->renlay= BLI_findlink(&rr->layers, R.r.actlay); + rr->renlay= render_get_active_layer(&R, rr); MEM_freeT(pa->rectp); pa->rectp= NULL; MEM_freeT(pa->rectz); pa->rectz= NULL; diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c index 39791f3a718..d7a2db563dc 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -1847,10 +1847,10 @@ static void render_panel_layers(void) uiDefButS(block, MENU, B_ADD_RENDERLAYER, strp, 10,130,23,20, &(G.scene->r.actlay), 0, 0, 0, 0, "Choose Active Render Layer"); MEM_freeN(strp); -// uiDefButBitS(block, TOG, R_SINGLE_LAYER, B_NOP, "Single", 33,130,50,20, &G.scene->r.scemode, 0, 0, 0, 0, "Only render this layer"); - - bt= uiDefBut(block, TEX, REDRAWNODE, "", 33,130,252,20, srl->name, 0.0, 31.0, 0, 0, ""); + bt= uiDefBut(block, TEX, REDRAWNODE, "", 33,130,192,20, srl->name, 0.0, 31.0, 0, 0, ""); uiButSetFunc(bt, rename_scene_layer_func, srl, NULL); + + uiDefButBitS(block, TOG, R_SINGLE_LAYER, B_NOP, "Single", 230,130,60,20, &G.scene->r.scemode, 0, 0, 0, 0, "Only render this layer"); bt=uiDefIconBut(block, BUT, B_NOP, ICON_X, 285, 130, 25, 20, 0, 0, 0, 0, 0, "Deletes current Render Layer"); uiButSetFunc(bt, delete_scene_layer_func, srl, (void *)(long)G.scene->r.actlay); uiBlockEndAlign(block); diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c index b6a4fda909c..428572e2317 100644 --- a/source/blender/src/renderwin.c +++ b/source/blender/src/renderwin.c @@ -834,6 +834,11 @@ static void printrenderinfo_cb(RenderStats *rs) if(render_win) { megs_used_memory= mem_in_use/(1024.0*1024.0); + if(G.scene->lay & 0xFF000000) + spos+= sprintf(spos, "Localview | "); + else if(G.scene->r.scemode & R_SINGLE_LAYER) + spos+= sprintf(spos, "Single Layer | "); + if(rs->tothalo) spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d Ha:%d La:%d Mem:%.2fM", (G.scene->r.cfra), rs->totvert, rs->totface, rs->tothalo, rs->totlamp, megs_used_memory); else @@ -854,7 +859,7 @@ static void printrenderinfo_cb(RenderStats *rs) } /* temporal render debug printing, needed for testing orange renders atm... will be gone soon (or option) */ - if(rs->convertdone) { + if(G.rt==7 && rs->convertdone) { spos= str; spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", G.scene->r.cfra, megs_used_memory); @@ -980,6 +985,8 @@ static void end_test_break_callback() static void do_render(int anim) { Render *re= RE_NewRender("Render"); + unsigned int lay= G.scene->lay; + int scemode= G.scene->r.scemode; /* we set this flag to prevent renderwindow queue to execute another render */ G.rendering= 1; @@ -1000,11 +1007,24 @@ static void do_render(int anim) if(G.obedit) exit_editmode(0); /* 0 = no free data */ + /* allow localview render for objects with lights in normal layers */ + if(curarea->spacetype==SPACE_VIEW3D) { + if(G.vd->lay & 0xFF000000) { + G.scene->lay |= G.vd->lay; + G.scene->r.scemode |= R_SINGLE_LAYER; + } + else G.scene->lay= G.vd->lay; + } + if(anim) RE_BlenderAnim(re, G.scene, G.scene->r.sfra, G.scene->r.efra); else RE_BlenderFrame(re, G.scene, G.scene->r.cfra); + /* restore local view exception */ + G.scene->lay= lay; + G.scene->r.scemode= scemode; + if(render_win) window_set_cursor(render_win->win, CURSOR_STD); free_filesel_spec(G.scene->r.pic); |