Commit: 86c1cad1cf479be0b3125015926aeeb05d7b6065
Author: Brecht Van Lommel
Date:   Tue Jun 19 16:07:10 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB86c1cad1cf479be0b3125015926aeeb05d7b6065

Fix missing render slots bugs after recent changes.

===================================================================

M       source/blender/blenkernel/intern/image.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/editors/space_image/image_edit.c
M       source/blender/editors/space_image/image_ops.c
M       source/blender/makesrna/intern/rna_image.c

===================================================================

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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to