Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Ebb <matt@mke3.net>2010-01-06 03:09:07 +0300
committerMatt Ebb <matt@mke3.net>2010-01-06 03:09:07 +0300
commit06e6011ae97f58b718f7d2ca45fd03814a345078 (patch)
tree6cf1a19fed113d235a5518272f5123a3b4918526 /source/blender/render
parent4b202b562a056351f3d585145d739f738b2a073a (diff)
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.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h5
-rw-r--r--source/blender/render/intern/source/convertblender.c2
-rw-r--r--source/blender/render/intern/source/envmap.c2
-rw-r--r--source/blender/render/intern/source/pipeline.c121
4 files changed, 66 insertions, 64 deletions
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);