Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-06-19 17:07:10 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-06-19 17:19:49 +0300
commit86c1cad1cf479be0b3125015926aeeb05d7b6065 (patch)
tree19901d80ce180f766b4aec36592d2b5d7cf644b1 /source
parent7c3ecbf040604d98375ac8839ca1787309f22372 (diff)
Fix missing render slots bugs after recent changes.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/image.c30
-rw-r--r--source/blender/blenloader/intern/readfile.c3
-rw-r--r--source/blender/blenloader/intern/writefile.c2
-rw-r--r--source/blender/editors/space_image/image_edit.c3
-rw-r--r--source/blender/editors/space_image/image_ops.c3
-rw-r--r--source/blender/makesrna/intern/rna_image.c2
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);