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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
#ifdef WITH_OPENEXR
|
||||
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);
|
||||
#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;
|
||||
}
|
||||
else {
|
||||
#ifdef WITH_OPENEXR
|
||||
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);
|
||||
#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;
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user