From 06e6011ae97f58b718f7d2ca45fd03814a345078 Mon Sep 17 00:00:00 2001 From: Matt Ebb Date: Wed, 6 Jan 2010 00:09:07 +0000 Subject: Restored Compositor 're-render single layer' functionality (buttons on renderlayer comp nodes). This works with operator properties - if you pass the name of a scene and renderlayer to the screen.render operator, it will render that layer as a single layer re-render. --- source/blender/render/extern/include/RE_pipeline.h | 5 +- .../blender/render/intern/source/convertblender.c | 2 +- source/blender/render/intern/source/envmap.c | 2 +- source/blender/render/intern/source/pipeline.c | 121 +++++++++++---------- 4 files changed, 66 insertions(+), 64 deletions(-) (limited to 'source/blender/render') diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 76e3e002513..a90220b9c1b 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -46,6 +46,7 @@ struct RenderEngineType; struct RenderResult; struct ReportList; struct Scene; +struct SceneRenderLayer; /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* this include is what is exposed of render to outside world */ @@ -169,7 +170,7 @@ struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name) float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype); /* obligatory initialize call, disprect is optional */ -void RE_InitState (struct Render *re, struct Render *source, struct RenderData *rd, int winx, int winy, rcti *disprect); +void RE_InitState (struct Render *re, struct Render *source, struct RenderData *rd, struct SceneRenderLayer *srl, int winx, int winy, rcti *disprect); /* use this to change disprect of active render */ void RE_SetDispRect (struct Render *re, rcti *disprect); @@ -200,7 +201,7 @@ void RE_init_threadcount(Render *re); void RE_TileProcessor(struct Render *re, int firsttile, int threaded); /* only RE_NewRender() needed, main Blender render calls */ -void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame); +void RE_BlenderFrame(struct Render *re, struct Scene *scene, struct SceneRenderLayer *srl, int frame); void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra, int tfra, struct ReportList *reports); void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode); diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 899ddbe4fb4..63782223c33 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -5605,7 +5605,7 @@ void RE_make_sticky(Scene *scene, View3D *v3d) } re= RE_NewRender("_make sticky_"); - RE_InitState(re, NULL, &scene->r, scene->r.xsch, scene->r.ysch, NULL); + RE_InitState(re, NULL, &scene->r, NULL, scene->r.xsch, scene->r.ysch, NULL); /* use renderdata and camera to set viewplane */ RE_SetCamera(re, scene->camera); diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 323eb6a9500..7ba860955b3 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -127,7 +127,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env) envre->r.size= 100; envre->r.yasp= envre->r.xasp= 1; - RE_InitState(envre, NULL, &envre->r, cuberes, cuberes, NULL); + RE_InitState(envre, NULL, &envre->r, NULL, cuberes, cuberes, NULL); envre->scene= re->scene; /* unsure about this... */ /* view stuff in env render */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index e2b290f655b..ff1f6541f06 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1114,13 +1114,6 @@ Render *RE_NewRender(const char *name) BLI_rw_mutex_init(&re->resultmutex); } - /* prevent UI to draw old results */ - BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); - RE_FreeRenderResult(re->result); - re->result= NULL; - re->result_ok= 0; - BLI_rw_mutex_unlock(&re->resultmutex); - /* set default empty callbacks */ re->display_init= result_nothing; re->display_clear= result_nothing; @@ -1169,7 +1162,7 @@ void RE_FreeAllRender(void) /* what doesn't change during entire render sequence */ /* disprect is optional, if NULL it assumes full window render */ -void RE_InitState(Render *re, Render *source, RenderData *rd, int winx, int winy, rcti *disprect) +void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer *srl, int winx, int winy, rcti *disprect) { re->ok= TRUE; /* maybe flag */ @@ -1195,62 +1188,70 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, int winx, int winy (re->rectx < 16 || re->recty < 16) )) { re->error(re->erh, "Image too small"); re->ok= 0; + return; } - else { + #ifdef WITH_OPENEXR - if(re->r.scemode & R_FULL_SAMPLE) - re->r.scemode |= R_EXR_TILE_FILE; /* enable automatic */ + if(re->r.scemode & R_FULL_SAMPLE) + re->r.scemode |= R_EXR_TILE_FILE; /* enable automatic */ #else - /* can't do this without openexr support */ - re->r.scemode &= ~(R_EXR_TILE_FILE|R_FULL_SAMPLE); + /* can't do this without openexr support */ + re->r.scemode &= ~(R_EXR_TILE_FILE|R_FULL_SAMPLE); #endif - - /* fullsample wants uniform osa levels */ - if(source && (re->r.scemode & R_FULL_SAMPLE)) { - /* but, if source has no full sample we disable it */ - if((source->r.scemode & R_FULL_SAMPLE)==0) - re->r.scemode &= ~R_FULL_SAMPLE; - else - re->r.osa= re->osa= source->osa; + + /* fullsample wants uniform osa levels */ + if(source && (re->r.scemode & R_FULL_SAMPLE)) { + /* but, if source has no full sample we disable it */ + if((source->r.scemode & R_FULL_SAMPLE)==0) + re->r.scemode &= ~R_FULL_SAMPLE; + else + re->r.osa= re->osa= source->osa; + } + else { + /* check state variables, osa? */ + if(re->r.mode & (R_OSA)) { + re->osa= re->r.osa; + if(re->osa>16) re->osa= 16; } - else { - /* check state variables, osa? */ - if(re->r.mode & (R_OSA)) { - re->osa= re->r.osa; - if(re->osa>16) re->osa= 16; - } - else re->osa= 0; + else re->osa= 0; + } + + if (srl) { + int index = BLI_findindex(&re->r.layers, srl); + if (index != -1) { + re->r.actlay = index; + re->r.scemode |= (R_SINGLE_LAYER|R_COMP_RERENDER); } - - /* always call, checks for gamma, gamma tables and jitter too */ - make_sample_tables(re); + } - /* if preview render, we try to keep old result */ - BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); + /* always call, checks for gamma, gamma tables and jitter too */ + make_sample_tables(re); + + /* if preview render, we try to keep old result */ + BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); - if(re->r.scemode & R_PREVIEWBUTS) { - if(re->result && re->result->rectx==re->rectx && re->result->recty==re->recty); - else { - RE_FreeRenderResult(re->result); - re->result= NULL; - } - } + if(re->r.scemode & R_PREVIEWBUTS) { + if(re->result && re->result->rectx==re->rectx && re->result->recty==re->recty); else { - - /* make empty render result, so display callbacks can initialize */ RE_FreeRenderResult(re->result); - re->result= MEM_callocN(sizeof(RenderResult), "new render result"); - re->result->rectx= re->rectx; - re->result->recty= re->recty; + re->result= NULL; } - - BLI_rw_mutex_unlock(&re->resultmutex); - - /* we clip faces with a minimum of 2 pixel boundary outside of image border. see zbuf.c */ - re->clipcrop= 1.0f + 2.0f/(float)(re->winx>re->winy?re->winy:re->winx); + } + else { - RE_init_threadcount(re); + /* make empty render result, so display callbacks can initialize */ + RE_FreeRenderResult(re->result); + re->result= MEM_callocN(sizeof(RenderResult), "new render result"); + re->result->rectx= re->rectx; + re->result->recty= re->recty; } + + BLI_rw_mutex_unlock(&re->resultmutex); + + /* we clip faces with a minimum of 2 pixel boundary outside of image border. see zbuf.c */ + re->clipcrop= 1.0f + 2.0f/(float)(re->winx>re->winy?re->winy:re->winx); + + RE_init_threadcount(re); } /* part of external api, not called for regular render pipeline */ @@ -2156,7 +2157,7 @@ static void render_scene(Render *re, Scene *sce, int cfra) } /* initial setup */ - RE_InitState(resc, re, &sce->r, winx, winy, &re->disprect); + RE_InitState(resc, re, &sce->r, NULL, winx, winy, &re->disprect); /* still unsure entity this... */ resc->scene= sce; @@ -2668,7 +2669,7 @@ static void update_physics_cache(Render *re, Scene *scene, int anim_init) BKE_ptcache_make_cache(&baker); } /* evaluating scene options for general Blender render */ -static int render_initialize_from_scene(Render *re, Scene *scene, int anim, int anim_init) +static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLayer *srl, int anim, int anim_init) { int winx, winy; rcti disprect; @@ -2715,10 +2716,10 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim, int update_physics_cache(re, scene, anim_init); } - if(scene->r.scemode & R_SINGLE_LAYER) + if(srl || scene->r.scemode & R_SINGLE_LAYER) push_render_result(re); - RE_InitState(re, NULL, &scene->r, winx, winy, &disprect); + RE_InitState(re, NULL, &scene->r, srl, winx, winy, &disprect); if(!re->ok) /* if an error was printed, abort */ return 0; @@ -2735,7 +2736,7 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim, int } /* general Blender frame render call */ -void RE_BlenderFrame(Render *re, Scene *scene, int frame) +void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, int frame) { /* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */ G.rendering= 1; @@ -2743,7 +2744,7 @@ void RE_BlenderFrame(Render *re, Scene *scene, int frame) scene->r.cfra= frame; - if(render_initialize_from_scene(re, scene, 0, 0)) { + if(render_initialize_from_scene(re, scene, srl, 0, 0)) { do_render_all_options(re); } @@ -2838,7 +2839,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo int nfra; /* do not fully call for each frame, it initializes & pops output window */ - if(!render_initialize_from_scene(re, scene, 0, 1)) + if(!render_initialize_from_scene(re, scene, NULL, 0, 1)) return; /* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */ @@ -2872,7 +2873,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo char name[FILE_MAX]; /* only border now, todo: camera lens. (ton) */ - render_initialize_from_scene(re, scene, 1, 0); + render_initialize_from_scene(re, scene, NULL, 1, 0); if(nfra!=scene->r.cfra) { /* @@ -2976,7 +2977,7 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode) re= RE_GetRender(scene->id.name); if(re==NULL) re= RE_NewRender(scene->id.name); - RE_InitState(re, NULL, &scene->r, winx, winy, &disprect); + RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect); re->scene= scene; read_render_result(re, 0); -- cgit v1.2.3