diff options
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 30 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 3 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_edit.c | 3 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 3 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_image.c | 2 |
6 files changed, 30 insertions, 13 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index fc6530a2ca7..b5abdcae2d4 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -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); } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 7362effbe08..7eb6dbcb292 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -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; } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 0dafca67edc..9c55c949fcf 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -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); } } diff --git a/source/blender/editors/space_image/image_edit.c b/source/blender/editors/space_image/image_edit.c index 72d0051d260..f4ecd2e7d34 100644 --- a/source/blender/editors/space_image/image_edit.c +++ b/source/blender/editors/space_image/image_edit.c @@ -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; } diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index b852788f3bb..b2116b1a770 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -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; diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c index d2b9ee47765..e71bd52593e 100644 --- a/source/blender/makesrna/intern/rna_image.c +++ b/source/blender/makesrna/intern/rna_image.c @@ -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); |