[Bf-blender-cvs] [86c1cad1cf4] blender2.8: Fix missing render slots bugs after recent changes.

Brecht Van Lommel noreply at git.blender.org
Tue Jun 19 16:31:31 CEST 2018


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



More information about the Bf-blender-cvs mailing list