Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/source/pipeline.c
| Show First 20 Lines • Show All 3,301 Lines • ▼ Show 20 Lines | for (rv = re->result->views.first; rv; rv = rv->next) { | ||||
| RE_Database_Free(re); | RE_Database_Free(re); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| #endif | #endif | ||||
| bool RE_WriteRenderViewsImage(ReportList *reports, RenderResult *rr, Scene *scene, const bool stamp, char *name) | bool RE_WriteRenderViewsImage(ReportList *reports, RenderResult *rr, Scene *scene, const bool stamp, char *name) | ||||
| { | { | ||||
| bool is_mono; | |||||
| bool ok = true; | bool ok = true; | ||||
| RenderData *rd = &scene->r; | RenderData *rd = &scene->r; | ||||
| if (!rr) | if (!rr) | ||||
| return false; | return false; | ||||
| is_mono = BLI_listbase_count_ex(&rr->views, 2) < 2; | bool is_mono = BLI_listbase_count_ex(&rr->views, 2) < 2; | ||||
| bool is_exr_rr = ELEM(rd->im_format.imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER); | |||||
| if (ELEM(rd->im_format.imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER) && | if (rd->im_format.views_format == R_IMF_VIEWS_MULTIVIEW && is_exr_rr) | ||||
| rd->im_format.views_format == R_IMF_VIEWS_MULTIVIEW) | |||||
| { | { | ||||
| ok = RE_WriteRenderResult(reports, rr, name, &rd->im_format, true, NULL); | ok = RE_WriteRenderResult(reports, rr, name, &rd->im_format, NULL, -1); | ||||
| render_print_save_message(reports, name, ok, errno); | render_print_save_message(reports, name, ok, errno); | ||||
| } | } | ||||
| /* mono, legacy code */ | /* mono, legacy code */ | ||||
| else if (is_mono || (rd->im_format.views_format == R_IMF_VIEWS_INDIVIDUAL)) | else if (is_mono || (rd->im_format.views_format == R_IMF_VIEWS_INDIVIDUAL)) | ||||
| { | { | ||||
| RenderView *rv; | RenderView *rv; | ||||
| int view_id; | int view_id; | ||||
| char filepath[FILE_MAX]; | char filepath[FILE_MAX]; | ||||
| BLI_strncpy(filepath, name, sizeof(filepath)); | BLI_strncpy(filepath, name, sizeof(filepath)); | ||||
| for (view_id = 0, rv = rr->views.first; rv; rv = rv->next, view_id++) { | for (view_id = 0, rv = rr->views.first; rv; rv = rv->next, view_id++) { | ||||
| if (!is_mono) { | if (!is_mono) { | ||||
| BKE_scene_multiview_view_filepath_get(&scene->r, filepath, rv->name, name); | BKE_scene_multiview_view_filepath_get(&scene->r, filepath, rv->name, name); | ||||
| } | } | ||||
| if (rd->im_format.imtype == R_IMF_IMTYPE_MULTILAYER) { | if (is_exr_rr) { | ||||
| ok = RE_WriteRenderResult(reports, rr, name, &rd->im_format, false, rv->name); | ok = RE_WriteRenderResult(reports, rr, name, &rd->im_format, rv->name, -1); | ||||
| render_print_save_message(reports, name, ok, errno); | render_print_save_message(reports, name, ok, errno); | ||||
| } | } | ||||
| else { | else { | ||||
| ImBuf *ibuf = render_result_rect_to_ibuf(rr, rd, view_id); | ImBuf *ibuf = render_result_rect_to_ibuf(rr, rd, view_id); | ||||
| IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings, | IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings, | ||||
| &scene->display_settings, &rd->im_format); | &scene->display_settings, &rd->im_format); | ||||
| ok = render_imbuf_write_stamp_test(reports, scene, rr, ibuf, name, &rd->im_format, stamp); | ok = render_imbuf_write_stamp_test(reports, scene, rr, ibuf, name, &rd->im_format, stamp); | ||||
| /* optional preview images for exr */ | /* optional preview images for exr */ | ||||
| if (ok && rd->im_format.imtype == R_IMF_IMTYPE_OPENEXR && (rd->im_format.flag & R_IMF_FLAG_PREVIEW_JPG)) { | if (ok && is_exr_rr && (rd->im_format.flag & R_IMF_FLAG_PREVIEW_JPG)) { | ||||
| ImageFormatData imf = rd->im_format; | ImageFormatData imf = rd->im_format; | ||||
| imf.imtype = R_IMF_IMTYPE_JPEG90; | imf.imtype = R_IMF_IMTYPE_JPEG90; | ||||
| if (BLI_testextensie(name, ".exr")) | if (BLI_testextensie(name, ".exr")) | ||||
| name[strlen(name) - 4] = 0; | name[strlen(name) - 4] = 0; | ||||
| BKE_image_path_ensure_ext_from_imformat(name, &imf); | BKE_image_path_ensure_ext_from_imformat(name, &imf); | ||||
| ibuf->planes = 24; | ibuf->planes = 24; | ||||
| IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings, | IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings, | ||||
| &scene->display_settings, &imf); | &scene->display_settings, &imf); | ||||
| ok = render_imbuf_write_stamp_test(reports, scene, rr, ibuf, name, &imf, stamp); | ok = render_imbuf_write_stamp_test(reports, scene, rr, ibuf, name, &imf, stamp); | ||||
| } | } | ||||
| /* imbuf knows which rects are not part of ibuf */ | /* imbuf knows which rects are not part of ibuf */ | ||||
| IMB_freeImBuf(ibuf); | IMB_freeImBuf(ibuf); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { /* R_IMF_VIEWS_STEREO_3D */ | else { /* R_IMF_VIEWS_STEREO_3D */ | ||||
| BLI_assert(scene->r.im_format.views_format == R_IMF_VIEWS_STEREO_3D); | BLI_assert(scene->r.im_format.views_format == R_IMF_VIEWS_STEREO_3D); | ||||
| if (rd->im_format.imtype == R_IMF_IMTYPE_MULTILAYER) { | if (rd->im_format.imtype == R_IMF_IMTYPE_MULTILAYER) { | ||||
| printf("Stereo 3D not support for MultiLayer image: %s\n", name); | printf("Stereo 3D not supported for MultiLayer image: %s\n", name); | ||||
| } | } | ||||
| else { | else { | ||||
| ImBuf *ibuf_arr[3] = {NULL}; | ImBuf *ibuf_arr[3] = {NULL}; | ||||
| const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; | const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; | ||||
| int i; | int i; | ||||
| for (i = 0; i < 2; i++) { | for (i = 0; i < 2; i++) { | ||||
| int view_id = BLI_findstringindex(&rr->views, names[i], offsetof(RenderView, name)); | int view_id = BLI_findstringindex(&rr->views, names[i], offsetof(RenderView, name)); | ||||
| ibuf_arr[i] = render_result_rect_to_ibuf(rr, rd, view_id); | ibuf_arr[i] = render_result_rect_to_ibuf(rr, rd, view_id); | ||||
| IMB_colormanagement_imbuf_for_write(ibuf_arr[i], true, false, &scene->view_settings, | IMB_colormanagement_imbuf_for_write(ibuf_arr[i], true, false, &scene->view_settings, | ||||
| &scene->display_settings, &scene->r.im_format); | &scene->display_settings, &scene->r.im_format); | ||||
| IMB_prepare_write_ImBuf(IMB_isfloat(ibuf_arr[i]), ibuf_arr[i]); | IMB_prepare_write_ImBuf(IMB_isfloat(ibuf_arr[i]), ibuf_arr[i]); | ||||
| } | } | ||||
| ibuf_arr[2] = IMB_stereo3d_ImBuf(&scene->r.im_format, ibuf_arr[0], ibuf_arr[1]); | ibuf_arr[2] = IMB_stereo3d_ImBuf(&scene->r.im_format, ibuf_arr[0], ibuf_arr[1]); | ||||
| ok = render_imbuf_write_stamp_test(reports, scene, rr, ibuf_arr[2], name, &rd->im_format, stamp); | ok = render_imbuf_write_stamp_test(reports, scene, rr, ibuf_arr[2], name, &rd->im_format, stamp); | ||||
| /* optional preview images for exr */ | /* optional preview images for exr */ | ||||
| if (ok && rd->im_format.imtype == R_IMF_IMTYPE_OPENEXR && | if (ok && is_exr_rr && | ||||
| (rd->im_format.flag & R_IMF_FLAG_PREVIEW_JPG)) | (rd->im_format.flag & R_IMF_FLAG_PREVIEW_JPG)) | ||||
| { | { | ||||
| ImageFormatData imf = rd->im_format; | ImageFormatData imf = rd->im_format; | ||||
| imf.imtype = R_IMF_IMTYPE_JPEG90; | imf.imtype = R_IMF_IMTYPE_JPEG90; | ||||
| if (BLI_testextensie(name, ".exr")) | if (BLI_testextensie(name, ".exr")) | ||||
| name[strlen(name) - 4] = 0; | name[strlen(name) - 4] = 0; | ||||
| ▲ Show 20 Lines • Show All 619 Lines • ▼ Show 20 Lines | if (ok) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| else { | else { | ||||
| BKE_report(reports, RPT_ERROR, "Error writing environment map"); | BKE_report(reports, RPT_ERROR, "Error writing environment map"); | ||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| /* used in the interface to decide whether to show layers */ | /* Used in the interface to decide whether to show layers or passes. */ | ||||
| bool RE_layers_have_name(struct RenderResult *rr) | bool RE_layers_have_name(struct RenderResult *rr) | ||||
| { | { | ||||
| switch (BLI_listbase_count_ex(&rr->layers, 2)) { | switch (BLI_listbase_count_ex(&rr->layers, 2)) { | ||||
| case 0: | case 0: | ||||
| return false; | return false; | ||||
| case 1: | case 1: | ||||
| return (((RenderLayer *)rr->layers.first)->name[0] != '\0'); | return (((RenderLayer *)rr->layers.first)->name[0] != '\0'); | ||||
| default: | default: | ||||
| return true; | return true; | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| bool RE_passes_have_name(struct RenderLayer *rl) | |||||
| { | |||||
| for (RenderPass *rp = rl->passes.first; rp; rp = rp->next) { | |||||
| if (!STREQ(rp->name, "Combined")) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| RenderPass *RE_pass_find_by_name(volatile RenderLayer *rl, const char *name, const char *viewname) | RenderPass *RE_pass_find_by_name(volatile RenderLayer *rl, const char *name, const char *viewname) | ||||
| { | { | ||||
| RenderPass *rp = NULL; | RenderPass *rp = NULL; | ||||
| for (rp = rl->passes.last; rp; rp = rp->prev) { | for (rp = rl->passes.last; rp; rp = rp->prev) { | ||||
| if (STREQ(rp->name, name)) { | if (STREQ(rp->name, name)) { | ||||
| if (viewname == NULL || viewname[0] == '\0') | if (viewname == NULL || viewname[0] == '\0') | ||||
| break; | break; | ||||
| ▲ Show 20 Lines • Show All 78 Lines • Show Last 20 Lines | |||||