diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2017-10-20 16:18:26 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2017-11-08 01:20:22 +0300 |
commit | 2a097527f20da98bb4c1199c2854a15eea241153 (patch) | |
tree | 57915a10d37a0451c8493297f2a3ed62a7b264f9 /source/blender/editors/space_image | |
parent | ed7260071bc397dd389737088fce869e8adc0dc3 (diff) |
Fix various issues with (multiview) OpenEXR file save/load.
* Fix saving a multiview render from the image editor giving invalid files.
* Fix failure to load multiview images with a single view per part.
* Fix loss of multiview metadata when saving/loading a single view.
* Fix Z-Buffer writing option for single layer EXR not being respected.
Multiview EXRs are now always handled as multilayer internally, significantly
reducing the amount of code.
Reviewed By: dfelinto
Differential Revision: https://developer.blender.org/D2887
Diffstat (limited to 'source/blender/editors/space_image')
-rw-r--r-- | source/blender/editors/space_image/image_buttons.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 33 |
2 files changed, 14 insertions, 21 deletions
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index d68e4c88935..d2897c7264b 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -1112,7 +1112,7 @@ void uiTemplateImageSettings(uiLayout *layout, PointerRNA *imfptr, int color_man uiItemR(row, imfptr, "use_zbuffer", 0, NULL, ICON_NONE); } - if (is_render_out && (imf->imtype == R_IMF_IMTYPE_OPENEXR)) { + if (is_render_out && ELEM(imf->imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER)) { show_preview = true; uiItemR(row, imfptr, "use_preview", 0, NULL, ICON_NONE); } diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index dacef926df1..f7df29ed2b6 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1824,9 +1824,6 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI const bool save_as_render = (RNA_struct_find_property(op->ptr, "save_as_render") && RNA_boolean_get(op->ptr, "save_as_render")); ImageFormatData *imf = &simopts->im_format; - const bool is_multilayer = imf->imtype == R_IMF_IMTYPE_MULTILAYER; - bool is_mono; - /* old global to ensure a 2nd save goes to same dir */ BLI_strncpy(G.ima, simopts->filepath, sizeof(G.ima)); @@ -1853,7 +1850,8 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI /* we need renderresult for exr and rendered multiview */ scene = CTX_data_scene(C); rr = BKE_image_acquire_renderresult(scene, ima); - is_mono = rr ? BLI_listbase_count_ex(&rr->views, 2) < 2 : BLI_listbase_count_ex(&ima->views, 2) < 2; + bool is_mono = rr ? BLI_listbase_count_ex(&rr->views, 2) < 2 : BLI_listbase_count_ex(&ima->views, 2) < 2; + bool is_exr_rr = rr && ELEM(imf->imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER); /* error handling */ if (!rr) { @@ -1883,28 +1881,23 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI } /* fancy multiview OpenEXR */ - if ((imf->imtype == R_IMF_IMTYPE_MULTILAYER) && (imf->views_format == R_IMF_VIEWS_MULTIVIEW)) { - ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, true, NULL); + if (imf->views_format == R_IMF_VIEWS_MULTIVIEW && is_exr_rr) { + /* save render result */ + ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, sima->iuser.layer); save_image_post(op, ibuf, ima, ok, true, relbase, relative, do_newpath, simopts->filepath); ED_space_image_release_buffer(sima, ibuf, lock); } - else if ((imf->imtype == R_IMF_IMTYPE_OPENEXR) && (imf->views_format == R_IMF_VIEWS_MULTIVIEW)) { - /* treat special Openexr case separetely (this is the singlelayer multiview OpenEXR */ - BKE_imbuf_write_prepare(ibuf, imf); - ok = BKE_image_save_openexr_multiview(ima, ibuf, simopts->filepath, (IB_rect | IB_zbuf | IB_zbuffloat | IB_multiview)); - ED_space_image_release_buffer(sima, ibuf, lock); - } /* regular mono pipeline */ else if (is_mono) { - if (is_multilayer) { - ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, false, NULL); + if (is_exr_rr) { + ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, -1); } else { colormanaged_ibuf = IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, true, &imf->view_settings, &imf->display_settings, imf); ok = BKE_imbuf_write_as(colormanaged_ibuf, simopts->filepath, imf, save_copy); save_imbuf_post(ibuf, colormanaged_ibuf); } - save_image_post(op, ibuf, ima, ok, (is_multilayer ? true : save_copy), relbase, relative, do_newpath, simopts->filepath); + save_image_post(op, ibuf, ima, ok, (is_exr_rr ? true : save_copy), relbase, relative, do_newpath, simopts->filepath); ED_space_image_release_buffer(sima, ibuf, lock); } /* individual multiview images */ @@ -1913,7 +1906,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI unsigned char planes = ibuf->planes; const int totviews = (rr ? BLI_listbase_count(&rr->views) : BLI_listbase_count(&ima->views)); - if (!is_multilayer) { + if (!is_exr_rr) { ED_space_image_release_buffer(sima, ibuf, lock); } @@ -1923,9 +1916,9 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI const char *view = rr ? ((RenderView *) BLI_findlink(&rr->views, i))->name : ((ImageView *) BLI_findlink(&ima->views, i))->name; - if (is_multilayer) { + if (is_exr_rr) { BKE_scene_multiview_view_filepath_get(&scene->r, simopts->filepath, view, filepath); - ok_view = RE_WriteRenderResult(op->reports, rr, filepath, imf, false, view); + ok_view = RE_WriteRenderResult(op->reports, rr, filepath, imf, view, -1); save_image_post(op, ibuf, ima, ok_view, true, relbase, relative, do_newpath, filepath); } else { @@ -1953,14 +1946,14 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI ok &= ok_view; } - if (is_multilayer) { + if (is_exr_rr) { ED_space_image_release_buffer(sima, ibuf, lock); } } /* stereo (multiview) images */ else if (simopts->im_format.views_format == R_IMF_VIEWS_STEREO_3D) { if (imf->imtype == R_IMF_IMTYPE_MULTILAYER) { - ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, false, NULL); + ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, -1); save_image_post(op, ibuf, ima, ok, true, relbase, relative, do_newpath, simopts->filepath); ED_space_image_release_buffer(sima, ibuf, lock); } |