Fix missing render slots bugs after recent changes.

This commit is contained in:
Brecht Van Lommel 2018-06-19 16:07:10 +02:00
parent 7c3ecbf040
commit 86c1cad1cf
6 changed files with 30 additions and 13 deletions

View File

@ -3041,17 +3041,28 @@ void BKE_image_backup_render(Scene *scene, Image *ima, bool free_current_slot)
/* called right before rendering, ima->renderslots contains render
* result pointers for everything but the current render */
Render *re = RE_GetSceneRender(scene);
int slot = ima->render_slot, last = ima->last_render_slot;
if (slot != last) {
RenderSlot *last_slot = BKE_image_get_renderslot(ima, last);
/* Ensure we always have a valid render slot. */
if (!ima->renderslots.first) {
BKE_image_add_renderslot(ima, NULL);
ima->render_slot = 0;
ima->last_render_slot = 0;
}
else if (ima->render_slot >= BLI_listbase_count(&ima->renderslots)) {
ima->render_slot = 0;
ima->last_render_slot = 0;
}
RenderSlot *last_slot = BKE_image_get_renderslot(ima, ima->last_render_slot);
RenderSlot *cur_slot = BKE_image_get_renderslot(ima, ima->render_slot);
if (last_slot && ima->render_slot != ima->last_render_slot) {
last_slot->render = NULL;
RE_SwapResult(re, &last_slot->render);
RenderSlot *cur_slot = BKE_image_get_renderslot(ima, slot);
if (cur_slot->render) {
if (free_current_slot) {
BKE_image_clear_renderslot(ima, NULL, slot);
BKE_image_clear_renderslot(ima, NULL, ima->render_slot);
}
else {
RE_SwapResult(re, &cur_slot->render);
@ -3059,7 +3070,7 @@ void BKE_image_backup_render(Scene *scene, Image *ima, bool free_current_slot)
}
}
ima->last_render_slot = slot;
ima->last_render_slot = ima->render_slot;
}
/**************************** multiview load openexr *********************************/
@ -4713,6 +4724,8 @@ static void image_update_views_format(Image *ima, ImageUser *iuser)
}
}
/**************************** Render Slots ***************************/
RenderSlot *BKE_image_add_renderslot(Image *ima, const char *name)
{
RenderSlot *slot = MEM_callocN(sizeof(RenderSlot), "Image new Render Slot");
@ -4801,7 +4814,6 @@ bool BKE_image_clear_renderslot(Image *ima, ImageUser *iuser, int index)
RenderSlot *BKE_image_get_renderslot(Image *ima, int index)
{
RenderSlot *slot = BLI_findlink(&ima->renderslots, index);
BLI_assert(slot);
return slot;
/* Can be NULL for images without render slots. */
return BLI_findlink(&ima->renderslots, index);
}

View File

@ -3928,8 +3928,9 @@ static void direct_link_image(FileData *fd, Image *ima)
}
}
else {
LISTBASE_FOREACH(RenderSlot *, slot, &ima->renderslots)
LISTBASE_FOREACH(RenderSlot *, slot, &ima->renderslots) {
slot->render = NULL;
}
ima->last_render_slot = ima->render_slot;
}

View File

@ -2260,6 +2260,8 @@ static void write_image(WriteData *wd, Image *ima)
writestruct(wd, DATA, Stereo3dFormat, 1, ima->stereo3d_format);
ima->packedfile = NULL;
writelist(wd, DATA, RenderSlot, &ima->renderslots);
}
}

View File

@ -308,7 +308,8 @@ bool ED_image_slot_cycle(struct Image *image, int direction)
slot = (cur + ((direction == -1) ? -i : i)) % num_slots;
if (slot < 0) slot += num_slots;
if (BKE_image_get_renderslot(image, slot)->render || slot == image->last_render_slot) {
RenderSlot *render_slot = BKE_image_get_renderslot(image, slot);
if ((render_slot && render_slot->render) || slot == image->last_render_slot) {
image->render_slot = slot;
break;
}

View File

@ -3464,7 +3464,8 @@ static int image_cycle_render_slot_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
/* no undo push for browsing existing */
if (BKE_image_get_renderslot(ima, ima->render_slot)->render || ima->render_slot == ima->last_render_slot)
RenderSlot *slot = BKE_image_get_renderslot(ima, ima->render_slot);
if ((slot && slot->render) || ima->render_slot == ima->last_render_slot)
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;

View File

@ -648,7 +648,7 @@ static void rna_def_render_slots(BlenderRNA *brna, PropertyRNA *cprop)
prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "RenderSlot");
RNA_def_property_pointer_funcs(prop, "rna_render_slots_active_get", "rna_render_slots_active_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active", "Active render slot of the image");
RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, NULL);