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

This commit is contained in:
2015-11-30 00:51:30 +01:00
parent f448659a56
commit 5b90a6e188
5 changed files with 16 additions and 11 deletions

View File

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

View File

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

View File

@@ -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 */

View File

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

View File

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