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.
This commit is contained in:
parent
32a9c7b493
commit
7f4b01ccf0
@ -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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user