Fix T38245: render slot getting lost when switching slots while compositing.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user