Fix missing render slots bugs after recent changes.
This commit is contained in:
parent
7c3ecbf040
commit
86c1cad1cf
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue