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
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2010-02-09 22:37:37 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2010-02-09 22:37:37 +0300
commit10240261e9504c4d17ce6679d074e869d876d347 (patch)
tree6b5c8897666a75aeb417d2b28906cda109453875 /source
parent52b1c3764595c87506d1a164c46bf83773549cd6 (diff)
J-key render switching back, now with 10 slots.
Implementation note: this was done by giving each Render a slot number, and for every slot a new Render will be created. Not sure if this is ideal, but it ensures that all passes, render info, etc are separate so you can also compare render layers and passes, in 2.4x only whatever it was currently displaying was backed up.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/displist.c6
-rw-r--r--source/blender/blenkernel/intern/image.c10
-rw-r--r--source/blender/blenkernel/intern/sequencer.c13
-rw-r--r--source/blender/editors/object/object_bake.c2
-rw-r--r--source/blender/editors/render/render_preview.c8
-rw-r--r--source/blender/editors/screen/screen_ops.c8
-rw-r--r--source/blender/editors/space_file/writeimage.c6
-rw-r--r--source/blender/editors/space_image/image_buttons.c75
-rw-r--r--source/blender/editors/space_image/image_intern.h2
-rw-r--r--source/blender/editors/space_image/image_ops.c46
-rw-r--r--source/blender/editors/space_image/space_image.c4
-rw-r--r--source/blender/editors/space_node/node_edit.c2
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_composite.c2
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_image.c2
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h17
-rw-r--r--source/blender/render/intern/include/render_types.h1
-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.c87
19 files changed, 208 insertions, 87 deletions
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index b35cf917895..7d89d94c6d5 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -321,9 +321,9 @@ static Render *fastshade_get_render(Scene *scene)
/* XXX ugly global still, but we can't do preview while rendering */
if(G.rendering==0) {
- Render *re= RE_GetRender("_Shade View_");
+ Render *re= RE_GetRender("_Shade View_", RE_SLOT_DEFAULT);
if(re==NULL) {
- re= RE_NewRender("_Shade View_");
+ re= RE_NewRender("_Shade View_", RE_SLOT_DEFAULT);
RE_Database_Baking(re, scene, 0, 0); /* 0= no faces */
}
@@ -337,7 +337,7 @@ static Render *fastshade_get_render(Scene *scene)
/* called on file reading */
void fastshade_free_render(void)
{
- Render *re= RE_GetRender("_Shade View_");
+ Render *re= RE_GetRender("_Shade View_", RE_SLOT_DEFAULT);
if(re) {
RE_Database_Free(re);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 09b86234d33..41a05a989e6 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -1088,7 +1088,7 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
}
{
- Render *re= RE_GetRender(scene->id.name);
+ Render *re= RE_GetRender(scene->id.name, RE_SLOT_RENDERING);
RenderStats *stats= re ? RE_GetStats(re):NULL;
if (stats && (scene->r.stamp & R_STAMP_RENDERTIME)) {
@@ -1599,7 +1599,7 @@ RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, Image *ima)
if(ima->rr)
return ima->rr;
else if(ima->type==IMA_TYPE_R_RESULT)
- return RE_AcquireResultRead(RE_GetRender(scene->id.name));
+ return RE_AcquireResultRead(RE_GetRender(scene->id.name, RE_SLOT_VIEW));
return NULL;
}
@@ -1607,7 +1607,7 @@ void BKE_image_release_renderresult(struct Scene *scene, Image *ima)
{
if(ima->rr);
else if(ima->type==IMA_TYPE_R_RESULT)
- RE_ReleaseResult(RE_GetRender(scene->id.name));
+ RE_ReleaseResult(RE_GetRender(scene->id.name, RE_SLOT_VIEW));
}
/* after imbuf load, openexr type can return with a exrhandle open */
@@ -1919,7 +1919,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
return NULL;
if(iuser && iuser->scene) {
- re= RE_GetRender(iuser->scene->id.name);
+ re= RE_GetRender(iuser->scene->id.name, RE_SLOT_VIEW);
rr= RE_AcquireResultRead(re);
/* release is done in BKE_image_release_ibuf using lock_r */
@@ -1953,7 +1953,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
pass= (iuser)? iuser->pass: 0;
/* this gives active layer, composite or seqence result */
- RE_AcquireResultImage(RE_GetRender(iuser->scene->id.name), &rres);
+ RE_AcquireResultImage(RE_GetRender(iuser->scene->id.name, RE_SLOT_VIEW), &rres);
rect= (unsigned int *)rres.rect32;
rectf= rres.rectf;
rectz= rres.rectz;
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 8c119eb753b..c5865db5e26 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -2049,7 +2049,6 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int
Scene *sce= seq->scene;// *oldsce= scene;
Render *re;
RenderResult rres;
- char scenename[64];
int have_seq= FALSE;
int sce_valid= FALSE;
@@ -2093,11 +2092,10 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int
oldcfra = seq->scene->r.cfra;
- if(rendering) {
- BLI_strncpy(scenename, sce->id.name+2, 64);
- strcpy(sce->id.name+2, " do_build_seq_ibuf");
- }
- re= RE_NewRender(sce->id.name);
+ if(rendering)
+ re= RE_NewRender(" do_build_seq_ibuf", RE_SLOT_DEFAULT);
+ else
+ re= RE_NewRender(sce->id.name, RE_SLOT_VIEW);
/* prevent eternal loop */
doseq= scene->r.scemode & R_DOSEQ;
@@ -2106,9 +2104,6 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int
RE_BlenderFrame(re, sce, NULL,
seq->sfra+se->nr+seq->anim_startofs);
- if(rendering)
- BLI_strncpy(sce->id.name+2, scenename, 64);
-
RE_AcquireResultImage(re, &rres);
if(rres.rectf) {
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index 7aa9d557118..39eda367d85 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -141,7 +141,7 @@ static void init_bake_internal(BakeRender *bkr, bContext *C)
bkr->sa= biggest_image_area(CTX_wm_screen(C)); /* can be NULL */
bkr->scene= scene;
bkr->actob= (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT : NULL;
- bkr->re= RE_NewRender("_Bake View_");
+ bkr->re= RE_NewRender("_Bake View_", RE_SLOT_DEFAULT);
if(scene->r.bake_mode==RE_BAKE_AO) {
/* If raytracing or AO is disabled, switch it on temporarily for baking. */
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 1f1a0ff859d..8aa57ca3fbb 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -474,7 +474,7 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
}
}
- re= RE_GetRender(name);
+ re= RE_GetRender(name, RE_SLOT_DEFAULT);
RE_AcquireResultImage(re, &rres);
if(rres.rectf) {
@@ -702,7 +702,7 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa)
ri->status= 0;
sprintf(name, "View3dPreview %p", sa);
- re= ri->re= RE_NewRender(name);
+ re= ri->re= RE_NewRender(name, RE_SLOT_DEFAULT);
//RE_display_draw_cb(re, view3d_previewrender_progress);
//RE_stats_draw_cb(re, view3d_previewrender_stats);
//RE_test_break_cb(re, qtest);
@@ -890,11 +890,11 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
if(!split || first) sprintf(name, "Preview %p", sp->owner);
else sprintf(name, "SecondPreview %p", sp->owner);
- re= RE_GetRender(name);
+ re= RE_GetRender(name, RE_SLOT_DEFAULT);
/* full refreshed render from first tile */
if(re==NULL)
- re= RE_NewRender(name);
+ re= RE_NewRender(name, RE_SLOT_DEFAULT);
/* sce->r gets copied in RE_InitState! */
sce->r.scemode &= ~(R_MATNODE_PREVIEW|R_TEXNODE_PREVIEW);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 53cd34c46f5..2957e77a89e 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -2885,10 +2885,10 @@ static void screen_set_image_output(bContext *C, int mx, int my)
static int screen_render_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Render *re= RE_GetRender(scene->id.name);
+ Render *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_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break);
@@ -3236,7 +3236,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
rj->image= ima;
/* setup new render */
- re= RE_NewRender(scene->id.name);
+ re= RE_NewRender(scene->id.name, RE_SLOT_VIEW);
RE_test_break_cb(re, rj, render_breakjob);
RE_display_draw_cb(re, rj, image_rect_update);
RE_stats_draw_cb(re, rj, image_renderinfo_cb);
@@ -3398,7 +3398,7 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
oglrender->iuser.ok= 1;
/* create render and render result */
- oglrender->re= RE_NewRender(scene->id.name);
+ oglrender->re= RE_NewRender(scene->id.name, RE_SLOT_VIEW);
RE_InitState(oglrender->re, NULL, &scene->r, NULL, sizex, sizey, NULL);
rr= RE_AcquireResultWrite(oglrender->re);
diff --git a/source/blender/editors/space_file/writeimage.c b/source/blender/editors/space_file/writeimage.c
index 5f0b75d068a..14a8a79a1fa 100644
--- a/source/blender/editors/space_file/writeimage.c
+++ b/source/blender/editors/space_file/writeimage.c
@@ -114,14 +114,14 @@ static void save_rendered_image_cb_real(char *name, int confirm)
if(overwrite) {
if(scene->r.imtype==R_MULTILAYER) {
- Render *re= RE_GetRender(scene->id.name);
+ Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW);
RenderResult *rr= RE_AcquireResultRead(re);
if(rr)
RE_WriteRenderResult(rr, str, scene->r.quality);
RE_ReleaseResult(re);
}
else {
- Render *re= RE_GetRender(scene->id.name);
+ Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW);
RenderResult rres;
ImBuf *ibuf;
@@ -235,7 +235,7 @@ void BIF_save_rendered_image(char *name)
/* calls fileselect */
void BIF_save_rendered_image_fs(Scene *scene)
{
- Render *re= RE_GetRender(scene->id.name);
+ Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW);
RenderResult rres;
RE_AcquireResultImage(re, &rres);
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 94df99d9c8d..2eb371357f1 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -533,6 +533,22 @@ static void image_panel_preview(ScrArea *sa, short cntrl) // IMAGE_HANDLER_PREVI
/* ********************* callbacks for standard image buttons *************** */
+static char *slot_menu()
+{
+ char *str;
+ int a, slot;
+
+ str= MEM_callocN(RE_SLOT_MAX*32, "menu slots");
+
+ strcpy(str, "Slot %t");
+ a= strlen(str);
+
+ for(slot=0; slot<RE_SLOT_MAX; slot++)
+ a += sprintf(str+a, "|Slot %d %%x%d", slot+1, slot);
+
+ return str;
+}
+
static char *layer_menu(RenderResult *rr, short *curlay)
{
RenderLayer *rl;
@@ -599,7 +615,10 @@ static void set_frames_cb(bContext *C, void *ima_v, void *iuser_v)
/* 5 layer button callbacks... */
static void image_multi_cb(bContext *C, void *rr_v, void *iuser_v)
{
- BKE_image_multilayer_index(rr_v, iuser_v);
+ ImageUser *iuser= iuser_v;
+
+ RE_SetViewSlot(iuser->menunr);
+ BKE_image_multilayer_index(rr_v, iuser);
WM_event_add_notifier(C, NC_IMAGE|ND_DRAW, NULL);
}
static void image_multi_inclay_cb(bContext *C, void *rr_v, void *iuser_v)
@@ -699,34 +718,45 @@ static void image_user_change(bContext *C, void *iuser_v, void *unused)
}
#endif
-static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int w)
+static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int w, int render)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiBut *but;
RenderLayer *rl= NULL;
- int wmenu1, wmenu2;
+ int wmenu1, wmenu2, wmenu3;
char *strp;
uiLayoutRow(layout, 1);
/* layer menu is 1/3 larger than pass */
- wmenu1= (3*w)/5;
- wmenu2= (2*w)/5;
+ wmenu1= (2*w)/5;
+ wmenu2= (3*w)/5;
+ wmenu3= (3*w)/6;
/* menu buts */
- strp= layer_menu(rr, &iuser->layer);
- but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu1, 20, &iuser->layer, 0,0,0,0, "Select Layer");
- uiButSetFunc(but, image_multi_cb, rr, iuser);
- MEM_freeN(strp);
-
- rl= BLI_findlink(&rr->layers, iuser->layer - (rr->rectf?1:0)); /* fake compo layer, return NULL is meant to be */
- strp= pass_menu(rl, &iuser->pass);
- but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu2, 20, &iuser->pass, 0,0,0,0, "Select Pass");
- uiButSetFunc(but, image_multi_cb, rr, iuser);
- MEM_freeN(strp);
+ if(render) {
+ strp= slot_menu();
+ iuser->menunr= RE_GetViewSlot();
+ but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu1, 20, &iuser->menunr, 0,0,0,0, "Select Slot");
+ uiButSetFunc(but, image_multi_cb, rr, iuser);
+ MEM_freeN(strp);
+ }
+
+ if(rr) {
+ strp= layer_menu(rr, &iuser->layer);
+ but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu2, 20, &iuser->layer, 0,0,0,0, "Select Layer");
+ uiButSetFunc(but, image_multi_cb, rr, iuser);
+ MEM_freeN(strp);
+
+ rl= BLI_findlink(&rr->layers, iuser->layer - (rr->rectf?1:0)); /* fake compo layer, return NULL is meant to be */
+ strp= pass_menu(rl, &iuser->pass);
+ but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu3, 20, &iuser->pass, 0,0,0,0, "Select Pass");
+ uiButSetFunc(but, image_multi_cb, rr, iuser);
+ MEM_freeN(strp);
+ }
}
-static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser)
+static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int render)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiLayout *row;
@@ -747,7 +777,7 @@ static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr,
but= uiDefIconBut(block, BUT, 0, ICON_TRIA_RIGHT, 0,0,18,20, NULL, 0, 0, 0, 0, "Next Layer");
uiButSetFunc(but, image_multi_inclay_cb, rr, iuser);
- uiblock_layer_pass_buttons(row, rr, iuser, 230);
+ uiblock_layer_pass_buttons(row, rr, iuser, 230, render);
/* decrease, increase arrows */
but= uiDefIconBut(block, BUT, 0, ICON_TRIA_LEFT, 0,0,17,20, NULL, 0, 0, 0, 0, "Previous Pass");
@@ -856,9 +886,9 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
}
else if(ima->type==IMA_TYPE_R_RESULT) {
/* browse layer/passes */
- Render *re= RE_GetRender(scene->id.name);
+ Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW);
RenderResult *rr= RE_AcquireResultRead(re);
- uiblock_layer_pass_arrow_buttons(layout, rr, iuser);
+ uiblock_layer_pass_arrow_buttons(layout, rr, iuser, 1);
RE_ReleaseResult(re);
}
}
@@ -885,7 +915,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
/* multilayer? */
if(ima->type==IMA_TYPE_MULTILAYER && ima->rr) {
- uiblock_layer_pass_arrow_buttons(layout, ima->rr, iuser);
+ uiblock_layer_pass_arrow_buttons(layout, ima->rr, iuser, 0);
}
else if(ima->source != IMA_SRC_GENERATED) {
if(compact == 0) {
@@ -965,10 +995,7 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
/* render layers and passes */
if(ima && iuser) {
rr= BKE_image_acquire_renderresult(scene, ima);
-
- if(rr)
- uiblock_layer_pass_buttons(layout, rr, iuser, 160);
-
+ uiblock_layer_pass_buttons(layout, rr, iuser, 160, ima->type==IMA_TYPE_R_RESULT);
BKE_image_release_renderresult(scene, ima);
}
}
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index b7f81245296..80fcbe5f240 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -77,6 +77,8 @@ void IMAGE_OT_save_sequence(struct wmOperatorType *ot);
void IMAGE_OT_pack(struct wmOperatorType *ot);
void IMAGE_OT_unpack(struct wmOperatorType *ot);
+void IMAGE_OT_cycle_render_slot(struct wmOperatorType *ot);
+
void IMAGE_OT_sample(struct wmOperatorType *ot);
void IMAGE_OT_curves_point_set(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 2011649fda6..a1557e424da 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1791,6 +1791,51 @@ void IMAGE_OT_record_composite(wmOperatorType *ot)
ot->poll= space_image_poll;
}
+/********************* cycle render slot operator *********************/
+
+static int cycle_render_slot_poll(bContext *C)
+{
+ Image *ima= CTX_data_edit_image(C);
+
+ return (ima && ima->type == IMA_TYPE_R_RESULT);
+}
+
+static int cycle_render_slot_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ int a, slot, cur= RE_GetViewSlot();
+
+ for(a=1; a<RE_SLOT_MAX; a++) {
+ slot= (cur+a)%RE_SLOT_MAX;
+
+ if(RE_GetRender(scene->id.name, slot)) {
+ RE_SetViewSlot(slot);
+ break;
+ }
+ }
+
+ if(a == RE_SLOT_MAX)
+ RE_SetViewSlot((cur == 1)? 0: 1);
+
+ WM_event_add_notifier(C, NC_IMAGE|ND_DRAW, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void IMAGE_OT_cycle_render_slot(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Cycle Render Slot";
+ ot->idname= "IMAGE_OT_cycle_render_slot";
+
+ /* api callbacks */
+ ot->exec= cycle_render_slot_exec;
+ ot->poll= cycle_render_slot_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/******************** TODO ********************/
/* XXX notifier? */
@@ -1843,3 +1888,4 @@ void BIF_image_update_frame(void)
}
#endif
+
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index a653838c073..c8c110b3d02 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -472,6 +472,8 @@ void image_operatortypes(void)
WM_operatortype_append(IMAGE_OT_pack);
WM_operatortype_append(IMAGE_OT_unpack);
+ WM_operatortype_append(IMAGE_OT_cycle_render_slot);
+
WM_operatortype_append(IMAGE_OT_sample);
WM_operatortype_append(IMAGE_OT_curves_point_set);
@@ -493,6 +495,8 @@ void image_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "IMAGE_OT_save_as", F3KEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_properties", NKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_scopes", PKEY, KM_PRESS, 0, 0);
+
+ WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, 0, 0);
keymap= WM_keymap_find(keyconf, "Image", SPACE_IMAGE, 0);
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 89fb40367e8..e03e6e023dd 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -1661,7 +1661,7 @@ void node_read_renderlayers(SpaceNode *snode)
void node_read_fullsamplelayers(SpaceNode *snode)
{
Scene *curscene= NULL; // XXX
- Render *re= RE_NewRender(curscene->id.name);
+ Render *re= RE_NewRender(curscene->id.name, RE_SLOT_VIEW);
WM_cursor_wait(1);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
index d117a3cb235..079d2ebeac1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
@@ -50,7 +50,7 @@ static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **i
RenderData *rd= data;
if(scene && (rd->scemode & R_DOCOMP)) {
- Render *re= RE_GetRender(scene->id.name);
+ Render *re= RE_GetRender(scene->id.name, RE_SLOT_RENDERING);
RenderResult *rr= RE_AcquireResultWrite(re);
if(rr) {
CompBuf *outbuf, *zbuf=NULL;
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
index f209687d6a5..09f826ebff7 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
@@ -346,7 +346,7 @@ void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out
static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
Scene *sce= (Scene *)node->id;
- Render *re= (sce)? RE_GetRender(sce->id.name): NULL;
+ Render *re= (sce)? RE_GetRender(sce->id.name, RE_SLOT_RENDERING): NULL;
RenderData *rd= data;
RenderResult *rr= NULL;
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index a90220b9c1b..4084958488c 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -146,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);
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index de7d176759e..c4465781940 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -113,6 +113,7 @@ struct Render
{
struct Render *next, *prev;
char name[RE_MAXNAME];
+ int slot;
/* state settings */
short flag, osa, ok, result_ok;
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index d05d88266c7..a24fa47ec3e 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 7ba860955b3..0ab0b1c4141 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 f679b35c627..c5d4392a53c 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -108,14 +108,19 @@
/* ********* globals ******** */
/* here we store all renders */
-static struct ListBase RenderList= {NULL, NULL};
+static struct {
+ ListBase renderlist;
+
+ /* render slots */
+ int viewslot, renderingslot;
+
+ /* commandline thread override */
+ int threads;
+} RenderGlobal = {{NULL, NULL}, 0, 0, -1};
/* hardcopy of current render, used while rendering for speed */
Render R;
-/* commandline thread override */
-static int commandline_threads= -1;
-
/* ********* alloc and free ******** */
@@ -228,11 +233,11 @@ static void push_render_result(Render *re)
/* if scemode is R_SINGLE_LAYER, at end of rendering, merge the both render results */
static void pop_render_result(Render *re)
{
-
if(re->result==NULL) {
printf("pop render result error; no current result!\n");
return;
}
+
if(re->pushedresult) {
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
@@ -989,13 +994,35 @@ 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= 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;
}
}
@@ -1126,24 +1153,26 @@ void RE_ResultGet32(Render *re, unsigned int *rect)
RE_ReleaseResultImage(re);
}
-
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(&RenderList, re);
+ BLI_addtail(&RenderGlobal.renderlist, re);
strncpy(re->name, name, RE_MAXNAME);
+ re->slot= slot;
BLI_rw_mutex_init(&re->resultmutex);
}
@@ -1178,15 +1207,15 @@ void RE_FreeRender(Render *re)
RE_FreeRenderResult(re->result);
RE_FreeRenderResult(re->pushedresult);
- BLI_remlink(&RenderList, re);
+ BLI_remlink(&RenderGlobal.renderlist, re);
MEM_freeN(re);
}
/* exit blender */
void RE_FreeAllRender(void)
{
- while(RenderList.first) {
- RE_FreeRender(RenderList.first);
+ while(RenderGlobal.renderlist.first) {
+ RE_FreeRender(RenderGlobal.renderlist.first);
}
}
@@ -2186,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;
@@ -2313,7 +2342,7 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
Render *re1;
tag_scenes_for_render(re);
- for(re1= RenderList.first; re1; re1= re1->next) {
+ for(re1= RenderGlobal.renderlist.first; re1; re1= re1->next) {
if(re1->scene->id.flag & LIB_DOIT)
if(re1->r.scemode & R_FULL_SAMPLE)
read_render_result(re1, sample);
@@ -2475,7 +2504,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);
@@ -2784,8 +2813,9 @@ 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 */
- G.rendering= 1;
+ RenderGlobal.renderingslot= re->slot;
re->result_ok= 0;
+ G.rendering= 1;
scene->r.cfra= frame;
@@ -2794,8 +2824,9 @@ void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, int frame)
}
/* UGLY WARNING */
- G.rendering= 0;
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)
@@ -2899,6 +2930,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))
@@ -2995,6 +3027,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 */
@@ -3028,9 +3061,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;
@@ -3040,9 +3073,9 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode)
void RE_set_max_threads(int threads)
{
if (threads==0) {
- commandline_threads = BLI_system_thread_count();
+ RenderGlobal.threads = BLI_system_thread_count();
} else if(threads>=1 && threads<=BLENDER_MAX_THREADS) {
- commandline_threads= threads;
+ RenderGlobal.threads= threads;
} else {
printf("Error, threads has to be in range 0-%d\n", BLENDER_MAX_THREADS);
}
@@ -3050,9 +3083,9 @@ void RE_set_max_threads(int threads)
void RE_init_threadcount(Render *re)
{
- if(commandline_threads >= 1) { /* only set as an arg in background mode */
- re->r.threads= MIN2(commandline_threads, BLENDER_MAX_THREADS);
- } else if ((re->r.mode & R_FIXED_THREADS)==0 || commandline_threads == 0) { /* Automatic threads */
+ if(RenderGlobal.threads >= 1) { /* only set as an arg in background mode */
+ re->r.threads= MIN2(RenderGlobal.threads, BLENDER_MAX_THREADS);
+ } else if ((re->r.mode & R_FIXED_THREADS)==0 || RenderGlobal.threads == 0) { /* Automatic threads */
re->r.threads = BLI_system_thread_count();
}
}