diff options
Diffstat (limited to 'source/blender/editors/space_image/image_buttons.c')
-rw-r--r-- | source/blender/editors/space_image/image_buttons.c | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index 191a709af4f..1ee9a67a7a1 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -411,7 +411,7 @@ static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void * uiDefMenuTitleBut(block, IFACE_("Pass")); - nr = (rl ? BLI_listbase_count(&rl->passes) : 0) - 1; + nr = 0; fake_name = ui_imageuser_pass_fake_name(rl); if (fake_name) { @@ -420,7 +420,8 @@ static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void * } /* rendered results don't have a Combined pass */ - for (rpass = rl ? rl->passes.last : NULL; rpass; rpass = rpass->prev, nr--) { + /* multiview: the ordering must be ascending, so the left-most pass is always the one picked */ + for (rpass = rl ? rl->passes.first : NULL; rpass; rpass = rpass->next, nr++) { /* just show one pass of each kind */ if (passflag & rpass->passtype) @@ -429,18 +430,17 @@ static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void * passflag |= rpass->passtype; final: - uiDefButI(block, UI_BTYPE_BUT_MENU, B_NOP, IFACE_(rpass->internal_name), 0, 0, - UI_UNIT_X * 5, UI_UNIT_X, &iuser->passtype, (float) rpass->passtype, 0.0, 0, -1, ""); + uiDefButS(block, UI_BTYPE_BUT_MENU, B_NOP, IFACE_(rpass->internal_name), 0, 0, + UI_UNIT_X * 5, UI_UNIT_X, &iuser->pass, (float) nr, 0.0, 0, -1, ""); } if (fake_name) { fake_name = NULL; rpass = &rpass_fake; + nr = 0; goto final; } - BLI_assert(nr == -1); - BKE_image_release_renderresult(scene, image); } @@ -537,7 +537,6 @@ static void image_multi_incpass_cb(bContext *C, void *rr_v, void *iuser_v) ImageUser *iuser = iuser_v; RenderLayer *rl; RenderPass *rp; - RenderPass *next = NULL; int layer = iuser->layer; if (RE_HasFakeLayer(rr)) @@ -546,20 +545,20 @@ static void image_multi_incpass_cb(bContext *C, void *rr_v, void *iuser_v) rl = BLI_findlink(&rr->layers, layer); if (rl) { - for (rp = rl->passes.first; rp; rp = rp->next) { - if (rp->passtype == iuser->passtype) { - next = rp->next; - if (next != NULL && next->passtype == rp->passtype) - next = next->next; + RenderPass *rpass = BLI_findlink(&rl->passes, iuser->pass); + int rp_index = iuser->pass + 1; + + if (rpass == NULL) + return; + + for (rp = rpass->next; rp; rp = rp->next, rp_index++) { + if (rp->passtype != rpass->passtype) { + iuser->pass = rp_index; + BKE_image_multilayer_index(rr, iuser); + WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL); break; } } - - if (next != NULL && iuser->passtype != next->passtype) { - iuser->passtype = next->passtype; - BKE_image_multilayer_index(rr, iuser); - WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL); - } } } static void image_multi_decpass_cb(bContext *C, void *rr_v, void *iuser_v) @@ -568,29 +567,31 @@ static void image_multi_decpass_cb(bContext *C, void *rr_v, void *iuser_v) ImageUser *iuser = iuser_v; RenderLayer *rl; RenderPass *rp; - RenderPass *prev = NULL; int layer = iuser->layer; + if (iuser->pass == 0) + return; + if (RE_HasFakeLayer(rr)) layer -= 1; rl = BLI_findlink(&rr->layers, layer); if (rl) { - for (rp = rl->passes.last; rp; rp = rp->prev) { - if (rp->passtype == iuser->passtype) { - prev = rp->prev; - if (prev != NULL && prev->passtype == rp->passtype) - prev = prev->prev; + RenderPass *rpass = BLI_findlink(&rl->passes, iuser->pass); + int rp_index = 0; + + if (rpass == NULL) + return; + + for (rp = rl->passes.first; rp; rp = rp->next, rp_index++) { + if (rp->passtype == rpass->passtype) { + iuser->pass = rp_index - 1; + BKE_image_multilayer_index(rr, iuser); + WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL); break; } } - - if (prev != NULL && iuser->passtype != prev->passtype) { - iuser->passtype = prev->passtype; - BKE_image_multilayer_index(rr, iuser); - WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL); - } } } @@ -630,7 +631,7 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes int wmenu1, wmenu2, wmenu3, wmenu4; const char *fake_name; const char *display_name = ""; - const bool show_stereo = (iuser->flag & IMA_SHOW_STEREO); + const bool show_stereo = (iuser->flag & IMA_SHOW_STEREO) != 0; uiLayoutRow(layout, true); @@ -679,7 +680,7 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes /* pass */ fake_name = ui_imageuser_pass_fake_name(rl); - rpass = (rl ? RE_pass_find_by_type(rl, iuser->passtype, ((RenderView *)rr->views.first)->name) : NULL); + rpass = (rl ? BLI_findlink(&rl->passes, iuser->pass - (fake_name ? 1 : 0)) : NULL); display_name = rpass ? rpass->internal_name : (fake_name ? fake_name : ""); but = uiDefMenuBut(block, ui_imageuser_pass_menu, rnd_pt, IFACE_(display_name), @@ -688,7 +689,9 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes UI_but_type_set_menu_from_pulldown(but); /* view */ - if (BLI_listbase_count_ex(&rr->views, 2) > 1 && !show_stereo) { + if (BLI_listbase_count_ex(&rr->views, 2) > 1 && + ((!show_stereo) || (!RE_RenderResult_is_stereo(rr)))) + { rview = BLI_findlink(&rr->views, iuser->view); display_name = rview ? rview->name : ""; @@ -699,8 +702,8 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes } /* stereo image */ - else if (((image->flag & IMA_IS_STEREO) && (!show_stereo)) || - ((image->flag & IMA_IS_MULTIVIEW) && ((image->flag & IMA_IS_STEREO) == 0))) + else if ((BKE_image_is_stereo(image) && (!show_stereo)) || + (BKE_image_is_multiview(image) && !BKE_image_is_stereo(image))) { ImageView *iv; int nr = 0; |