Fix T42206: RenderLayers popup crashed when clicked while rendering

This commit is contained in:
Campbell Barton 2014-10-13 18:13:50 +02:00
parent f4a260fb3c
commit 02175027f2

@ -325,13 +325,21 @@ static void ui_imageuser_layer_menu(bContext *UNUSED(C), uiLayout *layout, void
{ {
void **rnd_data = rnd_pt; void **rnd_data = rnd_pt;
uiBlock *block = uiLayoutGetBlock(layout); uiBlock *block = uiLayoutGetBlock(layout);
RenderResult *rr = rnd_data[0]; Image *image = rnd_data[0];
ImageUser *iuser = rnd_data[1]; ImageUser *iuser = rnd_data[1];
Scene *scene = iuser->scene;
RenderResult *rr;
RenderLayer *rl; RenderLayer *rl;
RenderLayer rl_fake = {NULL}; RenderLayer rl_fake = {NULL};
const char *fake_name; const char *fake_name;
int nr; int nr;
/* may have been freed since drawing */
rr = BKE_image_acquire_renderresult(scene, image);
if (UNLIKELY(rr == NULL)) {
return;
}
uiBlockSetCurLayout(block, layout); uiBlockSetCurLayout(block, layout);
uiLayoutColumn(layout, false); uiLayoutColumn(layout, false);
@ -360,6 +368,8 @@ final:
} }
BLI_assert(nr == -1); BLI_assert(nr == -1);
BKE_image_release_renderresult(scene, image);
} }
static const char *ui_imageuser_pass_fake_name(RenderLayer *rl) static const char *ui_imageuser_pass_fake_name(RenderLayer *rl)
@ -374,17 +384,28 @@ static const char *ui_imageuser_pass_fake_name(RenderLayer *rl)
static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void *ptrpair_p) static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void *ptrpair_p)
{ {
void **ptrpair = ptrpair_p; void **rnd_data = ptrpair_p;
uiBlock *block = uiLayoutGetBlock(layout); uiBlock *block = uiLayoutGetBlock(layout);
// RenderResult *rr = ptrpair[0]; Image *image = rnd_data[0];
ImageUser *iuser = ptrpair[1]; ImageUser *iuser = rnd_data[1];
/* rl==NULL means composite result */ /* (rpass_index == -1) means composite result */
RenderLayer *rl = ptrpair[2]; const int rpass_index = GET_INT_FROM_POINTER(rnd_data[2]);
Scene *scene = iuser->scene;
RenderResult *rr;
RenderLayer *rl;
RenderPass rpass_fake = {NULL}; RenderPass rpass_fake = {NULL};
RenderPass *rpass; RenderPass *rpass;
const char *fake_name; const char *fake_name;
int nr; int nr;
/* may have been freed since drawing */
rr = BKE_image_acquire_renderresult(scene, image);
if (UNLIKELY(rr == NULL)) {
return;
}
rl = BLI_findlink(&rr->layers, rpass_index);
uiBlockSetCurLayout(block, layout); uiBlockSetCurLayout(block, layout);
uiLayoutColumn(layout, false); uiLayoutColumn(layout, false);
@ -415,6 +436,8 @@ final:
} }
BLI_assert(nr == -1); BLI_assert(nr == -1);
BKE_image_release_renderresult(scene, image);
} }
/* 5 layer button callbacks... */ /* 5 layer button callbacks... */
@ -514,7 +537,7 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes
wmenu2 = (3 * w) / 5; wmenu2 = (3 * w) / 5;
wmenu3 = (3 * w) / 6; wmenu3 = (3 * w) / 6;
rnd_pt[0] = rr; rnd_pt[0] = image;
rnd_pt[1] = iuser; rnd_pt[1] = iuser;
rnd_pt[2] = NULL; rnd_pt[2] = NULL;
@ -534,11 +557,13 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderRes
if (rr) { if (rr) {
RenderPass *rpass; RenderPass *rpass;
int rpass_index;
/* layer */ /* layer */
fake_name = ui_imageuser_layer_fake_name(rr); fake_name = ui_imageuser_layer_fake_name(rr);
rl = BLI_findlink(&rr->layers, iuser->layer - (fake_name ? 1 : 0)); rpass_index = iuser->layer - (fake_name ? 1 : 0);
rnd_pt[2] = rl; rl = BLI_findlink(&rr->layers, rpass_index);
rnd_pt[2] = SET_INT_IN_POINTER(rpass_index);
display_name = rl ? rl->name : (fake_name ? fake_name : ""); display_name = rl ? rl->name : (fake_name ? fake_name : "");
but = uiDefMenuBut(block, ui_imageuser_layer_menu, rnd_pt, display_name, 0, 0, wmenu2, UI_UNIT_Y, TIP_("Select Layer")); but = uiDefMenuBut(block, ui_imageuser_layer_menu, rnd_pt, display_name, 0, 0, wmenu2, UI_UNIT_Y, TIP_("Select Layer"));