From 5b90a6e188f78ee4544b528c55fb0f2a8f6e9fd6 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 30 Nov 2015 00:51:30 +0100 Subject: Fix T38245: render slot getting lost when switching slots while compositing. --- source/blender/blenkernel/BKE_image.h | 2 +- source/blender/blenkernel/intern/image.c | 17 +++++++++++------ source/blender/editors/render/render_internal.c | 4 ++-- source/blender/editors/render/render_opengl.c | 2 +- source/blender/editors/space_node/node_edit.c | 2 +- 5 files changed, 16 insertions(+), 11 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index ea63161e008..ff0b5a1d4bf 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -221,7 +221,7 @@ void BKE_image_release_renderresult(struct Scene *scene, struct Image *ima); bool BKE_image_is_openexr(struct Image *ima); /* for multiple slot render, call this before render */ -void BKE_image_backup_render(struct Scene *scene, struct Image *ima); +void BKE_image_backup_render(struct Scene *scene, struct Image *ima, bool free_current_slot); /* for singlelayer openexr saving */ bool BKE_image_save_openexr_multiview(struct Image *ima, struct ImBuf *ibuf, const char *filepath, const int flags); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index f4fce5c0019..6ff30134210 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -2923,7 +2923,7 @@ bool BKE_image_is_openexr(struct Image *ima) return false; } -void BKE_image_backup_render(Scene *scene, Image *ima) +void BKE_image_backup_render(Scene *scene, Image *ima, bool free_current_slot) { /* called right before rendering, ima->renders contains render * result pointers for everything but the current render */ @@ -2931,13 +2931,18 @@ void BKE_image_backup_render(Scene *scene, Image *ima) int slot = ima->render_slot, last = ima->last_render_slot; if (slot != last) { - if (ima->renders[slot]) { - RE_FreeRenderResult(ima->renders[slot]); - ima->renders[slot] = NULL; - } - ima->renders[last] = NULL; RE_SwapResult(re, &ima->renders[last]); + + if (ima->renders[slot]) { + if (free_current_slot) { + RE_FreeRenderResult(ima->renders[slot]); + ima->renders[slot] = NULL; + } + else { + RE_SwapResult(re, &ima->renders[slot]); + } + } } ima->last_render_slot = slot; diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index f44374b1d7b..a7038ac53cc 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -311,7 +311,7 @@ static int screen_render_exec(bContext *C, wmOperator *op) ima = BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE); - BKE_image_backup_render(scene, ima); + BKE_image_backup_render(scene, ima, true); /* cleanup sequencer caches before starting user triggered render. * otherwise, invalidated cache entries can make their way into @@ -956,7 +956,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even /* get a render result image, and make sure it is empty */ ima = BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE); - BKE_image_backup_render(rj->scene, ima); + BKE_image_backup_render(rj->scene, ima, true); rj->image = ima; /* setup new render */ diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 2e9ccc520d9..f94f3cdf758 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -559,7 +559,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) /* create image and image user */ oglrender->ima = BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); BKE_image_signal(oglrender->ima, NULL, IMA_SIGNAL_FREE); - BKE_image_backup_render(oglrender->scene, oglrender->ima); + BKE_image_backup_render(oglrender->scene, oglrender->ima, true); oglrender->iuser.scene = scene; oglrender->iuser.ok = 1; diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 413cdc208dd..a312888fc44 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -277,7 +277,7 @@ void ED_node_composite_job(const bContext *C, struct bNodeTree *nodetree, Scene G.is_break = false; #endif - BKE_image_backup_render(scene, BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result")); + BKE_image_backup_render(scene, BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"), false); wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene_owner, "Compositing", WM_JOB_EXCL_RENDER | WM_JOB_PROGRESS, WM_JOB_TYPE_COMPOSITE); -- cgit v1.2.3