[Bf-blender-cvs] [fd14bbe] multiview: Export Stereo Output during render too (also works for animation)
Dalai Felinto
noreply at git.blender.org
Wed Aug 13 12:16:02 CEST 2014
Commit: fd14bbeee1c56d5dafce963c7c6b1dfeaa32c4be
Author: Dalai Felinto
Date: Tue Aug 12 20:31:09 2014 +0200
Branches: multiview
https://developer.blender.org/rBfd14bbeee1c56d5dafce963c7c6b1dfeaa32c4be
Export Stereo Output during render too (also works for animation)
===================================================================
M source/blender/render/intern/source/pipeline.c
===================================================================
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index b79b291..b020c29 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -3000,6 +3000,39 @@ void RE_RenderFreestyleExternal(Render *re)
}
#endif
+
+static void save_image_get_view_filepath(Scene *scene, const char *filepath, RenderView *rv,
+ char *r_filepath, char *r_view)
+{
+ SceneRenderView *srv;
+ char suffix[FILE_MAX];
+
+ srv = BLI_findstring(&scene->r.views, rv->name, offsetof(SceneRenderView, name));
+
+ if (srv) {
+ if (r_filepath) {
+ BLI_strncpy(suffix, srv->suffix, sizeof(suffix));
+ BLI_strncpy(r_filepath, filepath, FILE_MAX);
+ BLI_path_view(r_filepath, suffix);
+ }
+
+ if (r_view) {
+ BLI_strncpy(r_view, srv->name, FILE_MAX);
+ }
+ }
+ else {
+ if (r_filepath) {
+ BLI_strncpy(suffix, rv->name, sizeof(suffix));
+ BLI_strncpy(r_filepath, filepath, FILE_MAX);
+ BLI_path_view(r_filepath, suffix);
+ }
+
+ if (r_view) {
+ BLI_strncpy(r_view, rv->name, FILE_MAX);
+ }
+ }
+}
+
static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle **mh, const size_t totvideos, const char *name_override)
{
char name[FILE_MAX];
@@ -3010,7 +3043,7 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
bool is_mono;
RE_AcquireResultImage(re, &rres, -1);
- is_mono = BLI_countlist(&rres.views) < 2;
+ is_mono = (scene->r.scemode & R_MULTIVIEW) && BLI_countlist(&rres.views) < 2;
/* write movie or image */
if (BKE_imtype_is_movie(scene->r.im_format.imtype)) {
@@ -3031,10 +3064,10 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
}
IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings,
- &scene->display_settings, &scene->r.im_format);
+ &scene->display_settings, &scene->r.im_format);
ok = mh[view_id]->append_movie(&re->r, scene->r.sfra, scene->r.cfra, (int *) ibuf->rect,
- ibuf->x, ibuf->y, re->reports);
+ ibuf->x, ibuf->y, re->reports);
if (do_free) {
MEM_freeN(ibuf->rect);
ibuf->rect = NULL;
@@ -3067,13 +3100,13 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
}
IMB_colormanagement_imbuf_for_write(ibuf[i], true, false, &scene->view_settings,
- &scene->display_settings, &scene->r.im_format);
+ &scene->display_settings, &scene->r.im_format);
}
ibuf[2] = IMB_stereoImBuf(&scene->r.im_format, ibuf[0], ibuf[1]);
ok = mh[0]->append_movie(&re->r, scene->r.sfra, scene->r.cfra, (int *) ibuf[2]->rect,
- ibuf[2]->x, ibuf[2]->y, re->reports);
+ ibuf[2]->x, ibuf[2]->y, re->reports);
for (i = 0; i < 2; i++) {
if (do_free[i]) {
@@ -3094,27 +3127,106 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
BKE_makepicstring(name, scene->r.pic, bmain->name, scene->r.cfra,
&scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, true, "");
- if (re->r.im_format.imtype == R_IMF_IMTYPE_MULTILAYER) {
- if (re->result) {
- //XXX MV TODO
- RE_WriteRenderResult(re->reports, re->result, name, scene->r.im_format.exr_codec, false, "");
- printf("Saved: %s", name);
+ if (re->r.im_format.imtype == R_IMF_IMTYPE_MULTIVIEW) {
+ RE_WriteRenderResult(re->reports, re->result, name, scene->r.im_format.exr_codec, true, "");
+ printf("Saved: %s", name);
+ }
+
+ /* mono, legacy code */
+ else if ((is_mono) ||
+ (scene->r.im_format.views_output == R_IMF_VIEWS_INDIVIDUAL))
+ {
+ RenderView *rv;
+ size_t view_id;
+ char filepath[FILE_MAX];
+ char view[FILE_MAX];
+
+ BLI_strncpy(filepath, name, sizeof(filepath));
+
+ for (view_id = 0, rv = (RenderView *) rres.views.first; rv; rv = rv->next, view_id++) {
+ if (!is_mono) {
+ save_image_get_view_filepath(scene, filepath, rv, name, view);
+ }
+
+ if (re->r.im_format.imtype == R_IMF_IMTYPE_MULTILAYER) {
+ if (re->result) {
+ RE_WriteRenderResult(re->reports, re->result, name, scene->r.im_format.exr_codec, false, view);
+ printf("Saved: %s", name);
+ }
+ }
+ else {
+ ImBuf *ibuf = render_result_rect_to_ibuf(&rres, &scene->r, view_id);
+
+ IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings,
+ &scene->display_settings, &scene->r.im_format);
+
+ ok = BKE_imbuf_write_stamp(scene, camera, ibuf, name, &scene->r.im_format);
+
+ if (ok == 0) {
+ printf("Render error: cannot save %s\n", name);
+ }
+ else printf("Saved: %s", name);
+
+ /* optional preview images for exr */
+ if (ok && scene->r.im_format.imtype == R_IMF_IMTYPE_OPENEXR && (scene->r.im_format.flag & R_IMF_FLAG_PREVIEW_JPG)) {
+ ImageFormatData imf = scene->r.im_format;
+ imf.imtype = R_IMF_IMTYPE_JPEG90;
+
+ if (BLI_testextensie(name, ".exr"))
+ name[strlen(name) - 4] = 0;
+ BKE_add_image_extension(name, &imf);
+ ibuf->planes = 24;
+
+ IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings,
+ &scene->display_settings, &scene->r.im_format);
+
+ BKE_imbuf_write_stamp(scene, camera, ibuf, name, &scene->r.im_format);
+ printf("\nSaved: %s", name);
+ }
+
+ /* imbuf knows which rects are not part of ibuf */
+ IMB_freeImBuf(ibuf);
+ }
}
}
- else {
- //XXX MV TODO
- ImBuf *ibuf = render_result_rect_to_ibuf(&rres, &scene->r, 0);
+ else { /* R_IMF_VIEWS_STEREO_3D */
+ ImBuf *ibuf[2] = {NULL};
+ const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
+ int i;
- IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings,
- &scene->display_settings, &scene->r.im_format);
+ BLI_assert(scene->r.im_format.views_output == R_IMF_VIEWS_STEREO_3D);
+
+ for (i = 0; i < 2; i++) {
+ int view_id = BLI_findstringindex(&rres.views, names[i], offsetof(RenderView, name));
+ ibuf[i] = render_result_rect_to_ibuf(&rres, &scene->r, view_id);
+ IMB_colormanagement_imbuf_for_write(ibuf[i], true, false, &scene->view_settings,
+ &scene->display_settings, &scene->r.im_format);
+ IMB_prepare_write_ImBuf(IMB_isfloat(ibuf[i]), ibuf[i]);
+ }
+
+ ibuf[2] = IMB_stereoImBuf(&scene->r.im_format, ibuf[0], ibuf[1]);
+
+ if (re->r.im_format.imtype == R_IMF_IMTYPE_MULTILAYER) {
+ if (re->result) {
+ rres.rectf = ibuf[2]->rect_float;
+ rres.rectz = ibuf[2]->zbuf_float;
+ rres.rect32 = (int *) ibuf[2]->rect;
+
+ /* NOTE we are not stereo'ing all the layers, only the combined and depth */
+
+ RE_WriteRenderResult(re->reports, &rres, name, scene->r.im_format.exr_codec, false, "");
+ printf("Saved: %s", name);
+ }
+ }
+ else {
+ ok = BKE_imbuf_write_stamp(scene, camera, ibuf[2], name, &scene->r.im_format);
+ }
- ok = BKE_imbuf_write_stamp(scene, camera, ibuf, name, &scene->r.im_format);
-
if (ok == 0) {
printf("Render error: cannot save %s\n", name);
}
else printf("Saved: %s", name);
-
+
/* optional preview images for exr */
if (ok && scene->r.im_format.imtype == R_IMF_IMTYPE_OPENEXR && (scene->r.im_format.flag & R_IMF_FLAG_PREVIEW_JPG)) {
ImageFormatData imf = scene->r.im_format;
@@ -3123,17 +3235,19 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
if (BLI_testextensie(name, ".exr"))
name[strlen(name) - 4] = 0;
BKE_add_image_extension(name, &imf);
- ibuf->planes = 24;
+ ibuf[2]->planes = 24;
- IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings,
+ IMB_colormanagement_imbuf_for_write(ibuf[2], true, false, &scene->view_settings,
&scene->display_settings, &imf);
- BKE_imbuf_write_stamp(scene, camera, ibuf, name, &imf);
+ BKE_imbuf_write_stamp(scene, camera, ibuf[2], name, &imf);
printf("\nSaved: %s", name);
}
-
+
/* imbuf knows which rects are not part of ibuf */
- IMB_freeImBuf(ibuf);
+ for (i = 0; i < 3; i++) {
+ IMB_freeImBuf(ibuf[i]);
+ }
}
}
More information about the Bf-blender-cvs
mailing list