Commit: 5b90a6e188f78ee4544b528c55fb0f2a8f6e9fd6
Author: Brecht Van Lommel
Date:   Mon Nov 30 00:51:30 2015 +0100
Branches: master
https://developer.blender.org/rB5b90a6e188f78ee4544b528c55fb0f2a8f6e9fd6

Fix T38245: render slot getting lost when switching slots while compositing.

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

M       source/blender/blenkernel/BKE_image.h
M       source/blender/blenkernel/intern/image.c
M       source/blender/editors/render/render_internal.c
M       source/blender/editors/render/render_opengl.c
M       source/blender/editors/space_node/node_edit.c

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

diff --git a/source/blender/blenkernel/BKE_image.h 
b/source/blender/blenkernel/BKE_image.h
index ea63161..ff0b5a1 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 f4fce5c..6ff3013 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 f44374b..a7038ac 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 2e9ccc5..f94f3cd 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 413cdc2..a312888 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);

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

Reply via email to