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:
2010-01-06 00:09:07 +00:00
parent 4b202b562a
commit 06e6011ae9
10 changed files with 125 additions and 132 deletions

View File

@@ -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);