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:
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h21
-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.c66
4 files changed, 61 insertions, 30 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index dafed36d8e5..f9c4e9690a1 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -129,9 +129,6 @@ typedef struct RenderResult {
/* for render results in Image, verify validity for sequences */
int framenr;
-
- /* render info text */
- char *text;
} RenderResult;
@@ -149,8 +146,21 @@ typedef struct RenderStats {
/* the name is used as identifier, so elsewhere in blender the result can retrieved */
/* calling a new render with same name, frees automatic existing render */
-struct Render *RE_NewRender (const char *name);
-struct Render *RE_GetRender(const char *name);
+struct Render *RE_NewRender (const char *name, int slot);
+struct Render *RE_GetRender(const char *name, int slot);
+
+/* render slots. for most cases like baking or preview render this will
+ always be default, for actual render multiple slots can be used. in
+ that case 'rendering' is the slot being rendered to, and 'view' is the
+ slot being viewed. these are always the same except if the currently
+ viewed slot is changed during render, at the end they will be synced. */
+#define RE_SLOT_RENDERING -2
+#define RE_SLOT_VIEW -1
+#define RE_SLOT_DEFAULT 0
+#define RE_SLOT_MAX 10
+
+void RE_SetViewSlot(int slot);
+int RE_GetViewSlot(void);
/* returns 1 while render is working (or renders called from within render) */
int RE_RenderInProgress(struct Render *re);
@@ -165,7 +175,6 @@ void RE_FreeRenderResult(struct RenderResult *rr);
struct RenderResult *RE_AcquireResultRead(struct Render *re);
struct RenderResult *RE_AcquireResultWrite(struct Render *re);
void RE_ReleaseResult(struct Render *re);
-void RE_SwapResult(struct Render *re, struct RenderResult **rr);
void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr);
void RE_ReleaseResultImage(struct Render *re);
struct RenderStats *RE_GetStats(struct Render *re);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index ef6b1a4ce77..c44d83f4f06 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)
return;
}
- re= RE_NewRender("_make sticky_");
+ re= RE_NewRender("_make sticky_", RE_SLOT_DEFAULT);
RE_InitState(re, NULL, &scene->r, NULL, scene->r.xsch, scene->r.ysch, NULL);
/* use renderdata and camera to set viewplane */
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index d2c130508fa..5a69bcb45bd 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -108,7 +108,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
Render *envre;
int cuberes;
- envre= RE_NewRender("Envmap");
+ envre= RE_NewRender("Envmap", RE_SLOT_DEFAULT);
env->lastsize= re->r.size;
cuberes = (env->cuberes * re->r.size) / 100;
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 225b9ce1aa6..0122f1b5d65 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -111,9 +111,12 @@
static struct {
ListBase renderlist;
+ /* render slots */
+ int viewslot, renderingslot;
+
/* commandline thread override */
int threads;
-} RenderGlobal = {{NULL, NULL}, -1};
+} RenderGlobal = {{NULL, NULL}, 0, 0, -1};
/* hardcopy of current render, used while rendering for speed */
Render R;
@@ -193,8 +196,6 @@ void RE_FreeRenderResult(RenderResult *res)
MEM_freeN(res->rectz);
if(res->rectf)
MEM_freeN(res->rectf);
- if(res->text)
- MEM_freeN(res->text);
MEM_freeN(res);
}
@@ -993,15 +994,38 @@ static void read_render_result(Render *re, int sample)
/* *************************************************** */
-Render *RE_GetRender(const char *name)
+void RE_SetViewSlot(int slot)
+{
+ RenderGlobal.viewslot = slot;
+}
+
+int RE_GetViewSlot(void)
+{
+ return RenderGlobal.viewslot;
+}
+
+static int re_get_slot(int slot)
+{
+ if(slot == RE_SLOT_VIEW)
+ return RenderGlobal.viewslot;
+ else if(slot == RE_SLOT_RENDERING)
+ return (G.rendering)? RenderGlobal.renderingslot: RenderGlobal.viewslot;
+
+ return slot;
+}
+
+Render *RE_GetRender(const char *name, int slot)
{
Render *re;
+ slot= re_get_slot(slot);
+
/* search for existing renders */
- for(re= RenderGlobal.renderlist.first; re; re= re->next)
- if(strncmp(re->name, name, RE_MAXNAME)==0)
+ for(re= RenderGlobal.renderlist.first; re; re= re->next) {
+ if(strncmp(re->name, name, RE_MAXNAME)==0 && re->slot==slot) {
break;
-
+ }
+ }
return re;
}
@@ -1026,15 +1050,6 @@ RenderResult *RE_AcquireResultWrite(Render *re)
return NULL;
}
-void RE_SwapResult(Render *re, RenderResult **rr)
-{
- /* for keeping render buffers */
- if(re) {
- SWAP(RenderResult*, re->result, *rr);
- }
-}
-
-
void RE_ReleaseResult(Render *re)
{
if(re)
@@ -1143,18 +1158,21 @@ RenderStats *RE_GetStats(Render *re)
return &re->i;
}
-Render *RE_NewRender(const char *name)
+Render *RE_NewRender(const char *name, int slot)
{
Render *re;
+ slot= re_get_slot(slot);
+
/* only one render per name exists */
- re= RE_GetRender(name);
+ re= RE_GetRender(name, slot);
if(re==NULL) {
/* new render data struct */
re= MEM_callocN(sizeof(Render), "new render");
BLI_addtail(&RenderGlobal.renderlist, re);
strncpy(re->name, name, RE_MAXNAME);
+ re->slot= slot;
BLI_rw_mutex_init(&re->resultmutex);
}
@@ -2197,7 +2215,7 @@ static void do_render_fields_blur_3d(Render *re)
*/
static void render_scene(Render *re, Scene *sce, int cfra)
{
- Render *resc= RE_NewRender(sce->id.name);
+ Render *resc= RE_NewRender(sce->id.name, RE_SLOT_RENDERING);
int winx= re->winx, winy= re->winy;
sce->r.cfra= cfra;
@@ -2487,7 +2505,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
static void renderresult_stampinfo(Scene *scene)
{
RenderResult rres;
- Render *re= RE_GetRender(scene->id.name);
+ Render *re= RE_GetRender(scene->id.name, RE_SLOT_RENDERING);
/* this is the basic trick to get the displayed float or char rect from render result */
RE_AcquireResultImage(re, &rres);
@@ -2796,6 +2814,7 @@ static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLay
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 */
+ RenderGlobal.renderingslot= re->slot;
re->result_ok= 0;
G.rendering= 1;
@@ -2808,6 +2827,7 @@ void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, int frame)
/* UGLY WARNING */
re->result_ok= 1;
G.rendering= 0;
+ RenderGlobal.renderingslot= RenderGlobal.viewslot;
}
static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports)
@@ -2911,6 +2931,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
/* is also set by caller renderwin.c */
G.rendering= 1;
+ RenderGlobal.renderingslot= re->slot;
re->result_ok= 0;
if(BKE_imtype_is_movie(scene->r.imtype))
@@ -3007,6 +3028,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo
/* UGLY WARNING */
G.rendering= 0;
re->result_ok= 1;
+ RenderGlobal.renderingslot= RenderGlobal.viewslot;
}
/* note; repeated win/disprect calc... solve that nicer, also in compo */
@@ -3040,9 +3062,9 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode)
scene= scenode;
/* get render: it can be called from UI with draw callbacks */
- re= RE_GetRender(scene->id.name);
+ re= RE_GetRender(scene->id.name, RE_SLOT_VIEW);
if(re==NULL)
- re= RE_NewRender(scene->id.name);
+ re= RE_NewRender(scene->id.name, RE_SLOT_VIEW);
RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect);
re->scene= scene;