diff options
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 21 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/envmap.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 66 |
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; |