[Bf-blender-cvs] [9475d5e] multiview: Stereo Output for Multilayer when rendering or saving from Image Editor

Dalai Felinto noreply at git.blender.org
Thu Aug 14 19:56:05 CEST 2014


Commit: 9475d5e8c24136f7f5f1907c4fc3f13aaf75869e
Author: Dalai Felinto
Date:   Wed Aug 13 14:10:48 2014 +0200
Branches: multiview
https://developer.blender.org/rB9475d5e8c24136f7f5f1907c4fc3f13aaf75869e

Stereo Output for Multilayer when rendering or saving from Image Editor

We now do stereo-magic to ALL layers of multilayers.

The only remaining part of stereo output is for videos when saved with
individual views (the naming scheme at the moment is handled inside the
movie code), to be tackled later (TODO).

===================================================================

M	source/blender/editors/space_image/image_ops.c
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/source/pipeline.c
M	source/blender/render/intern/source/render_result.c

===================================================================

diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index fceaa2a..d84d9fd 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1645,10 +1645,6 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 				BKE_report(op->reports, RPT_ERROR, "Did not write, the image doesn't have multiple views");
 				goto cleanup;
 			}
-
-			else {
-				BKE_image_release_renderresult(scene, ima);
-			}
 		}
 		else {
 			if (imf->imtype != R_IMF_IMTYPE_MULTIVIEW && imf->views_output == R_IMF_VIEWS_STEREO_3D) {
@@ -1672,7 +1668,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 
 		/* fancy multiview OpenEXR */
 		if (imf->imtype == R_IMF_IMTYPE_MULTIVIEW) {
-			ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf->exr_codec, true, "");
+			ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, true, NULL);
 			save_image_post(op, ibuf, ima, ok, true, relbase, relative, do_newpath, simopts->filepath);
 			ED_space_image_release_buffer(sima, ibuf, lock);
 		}
@@ -1680,7 +1676,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 		/* mono, legacy code */
 		else if(is_mono) {
 			if (is_multilayer) {
-				ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf->exr_codec, false, "");
+				ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, false, NULL);
 			}
 			else {
 				colormanaged_ibuf = IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, true, &imf->view_settings, &imf->display_settings, imf);
@@ -1709,8 +1705,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 					char view[FILE_MAX];
 
 					save_image_get_view_filepath(scene, simopts->filepath, rv, filepath, view);
-
-					ok_view = RE_WriteRenderResult(op->reports, rr, filepath, imf->exr_codec, false, view);
+					ok_view = RE_WriteRenderResult(op->reports, rr, filepath, imf, false, view);
 					save_image_post(op, ibuf, ima, ok_view, true, relbase, relative, do_newpath, filepath);
 				}
 				else {
@@ -1742,62 +1737,63 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 		}
 		/* stereo (multiview) images */
 		else if (simopts->im_format.views_output == R_IMF_VIEWS_STEREO_3D) {
-			ImBuf *ibuf_stereo[2] = {NULL};
+			if (imf->imtype == R_IMF_IMTYPE_MULTILAYER) {
+				ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, false, NULL);
+				save_image_post(op, ibuf, ima, ok, true, relbase, relative, do_newpath, simopts->filepath);
+				ED_space_image_release_buffer(sima, ibuf, lock);
+			}
+			else {
+				ImBuf *ibuf_stereo[2] = {NULL};
 
-			unsigned char planes = ibuf->planes;
-			const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
-			int i;
+				unsigned char planes = ibuf->planes;
+				const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
+				int i;
 
-			/* we need to get the specific per-view buffers */
-			ED_space_image_release_buffer(sima, ibuf, lock);
+				/* we need to get the specific per-view buffers */
+				ED_space_image_release_buffer(sima, ibuf, lock);
 
-			for (i = 0; i < 2; i ++) {
-				ImageUser iuser = sima->iuser;
-				int id = BLI_findstringindex(&rr->views, names[i], offsetof(RenderView, name));
+				for (i = 0; i < 2; i ++) {
+					ImageUser iuser = sima->iuser;
+					int id = BLI_findstringindex(&rr->views, names[i], offsetof(RenderView, name));
 
-				iuser.pass = get_multiview_pass_id(rr, &sima->iuser, id);
-				iuser.view = id;
-				iuser.flag &= ~IMA_SHOW_STEREO;
+					iuser.pass = get_multiview_pass_id(rr, &sima->iuser, id);
+					iuser.view = id;
+					iuser.flag &= ~IMA_SHOW_STEREO;
 
-				BKE_image_multilayer_index(rr, &iuser);
-				ibuf = BKE_image_acquire_ibuf(sima->image, &iuser, &lock);
+					BKE_image_multilayer_index(rr, &iuser);
+					ibuf = BKE_image_acquire_ibuf(sima->image, &iuser, &lock);
 
-				if (ibuf == NULL) {
-					BKE_report(op->reports, RPT_ERROR, "Did not write, unexpected error when saving stereo image");
-					goto cleanup;
-				}
+					if (ibuf == NULL) {
+						BKE_report(op->reports, RPT_ERROR, "Did not write, unexpected error when saving stereo image");
+						goto cleanup;
+					}
 
-				ibuf->planes = planes;
+					ibuf->planes = planes;
 
-				/* color manage the ImBuf leaving it ready for saving */
-				colormanaged_ibuf = IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, true,
-				                                                        &imf->view_settings, &imf->display_settings, imf);
+					/* color manage the ImBuf leaving it ready for saving */
+					colormanaged_ibuf = IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, true,
+					                                                        &imf->view_settings, &imf->display_settings, imf);
 
-				BKE_imbuf_prepare_write(colormanaged_ibuf, imf);
-				IMB_prepare_write_ImBuf(IMB_isfloat(colormanaged_ibuf), colormanaged_ibuf);
+					BKE_imbuf_prepare_write(colormanaged_ibuf, imf);
+					IMB_prepare_write_ImBuf(IMB_isfloat(colormanaged_ibuf), colormanaged_ibuf);
 
-				/* duplicate buffer to prevent locker issue when using render result */
-				ibuf_stereo[i] = IMB_dupImBuf(colormanaged_ibuf);
+					/* duplicate buffer to prevent locker issue when using render result */
+					ibuf_stereo[i] = IMB_dupImBuf(colormanaged_ibuf);
 
-				save_imbuf_post(ibuf, colormanaged_ibuf);
-				BKE_image_release_ibuf(sima->image, ibuf, lock);
-			}
+					save_imbuf_post(ibuf, colormanaged_ibuf);
+					BKE_image_release_ibuf(sima->image, ibuf, lock);
+				}
 
-			ibuf = IMB_stereoImBuf(imf, ibuf_stereo[0], ibuf_stereo[1]);
+				ibuf = IMB_stereoImBuf(imf, ibuf_stereo[0], ibuf_stereo[1]);
 
-			/* save via traditional path */
-			if (is_multilayer) {
-				//XXX
-//				ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, simopts->im_format.exr_codec, false, "");
-			}
-			else {
+				/* save via traditional path */
 				ok = BKE_imbuf_write_as(ibuf, simopts->filepath, imf, save_copy);
-			}
 
-			IMB_freeImBuf(ibuf);
+				IMB_freeImBuf(ibuf);
 
-			for (i = 0; i < 2; i ++) {
-				IMB_freeImBuf(ibuf_stereo[i]);
+				for (i = 0; i < 2; i ++) {
+					IMB_freeImBuf(ibuf_stereo[i]);
+				}
 			}
 		}
 
@@ -1806,12 +1802,13 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 	}
 	else {
 cleanup:
-		if (rr) {
-			BKE_image_release_renderresult(scene, ima);
-		}
 		ED_space_image_release_buffer(sima, ibuf, lock);
 	}
 
+	if (rr) {
+		BKE_image_release_renderresult(scene, ima);
+	}
+
 	WM_cursor_wait(0);
 
 	return ok;
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 6aac105..b5f9ad3 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -37,6 +37,7 @@
 
 struct bNodeTree;
 struct Image;
+struct ImageFormatData;
 struct Main;
 struct NodeBlurData;
 struct Object;
@@ -276,7 +277,7 @@ void RE_SetReports(struct Render *re, struct ReportList *reports);
 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
 
 bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
-bool RE_WriteRenderResult(struct ReportList *reports, RenderResult *rr, const char *filename, int compress, bool multiview, const char *view);
+bool RE_WriteRenderResult(struct ReportList *reports, RenderResult *rr, const char *filename, struct ImageFormatData *imf, const bool multiview, const char *view);
 struct RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty);
 
 extern const float default_envmap_layout[];
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index b020c29..2f28c0d 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -3128,7 +3128,7 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
 			                  &scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, true, "");
 		
 		if (re->r.im_format.imtype == R_IMF_IMTYPE_MULTIVIEW) {
-			RE_WriteRenderResult(re->reports, re->result, name, scene->r.im_format.exr_codec, true, "");
+			RE_WriteRenderResult(re->reports, re->result, name, &scene->r.im_format, true, NULL);
 			printf("Saved: %s", name);
 		}
 
@@ -3150,7 +3150,7 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
 
 				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);
+						RE_WriteRenderResult(re->reports, re->result, name, &scene->r.im_format, false, view);
 						printf("Saved: %s", name);
 					}
 				}
@@ -3190,63 +3190,60 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
 			}
 		}
 		else { /* R_IMF_VIEWS_STEREO_3D */
-			ImBuf *ibuf[2] = {NULL};
-			const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
-			int i;
-
 			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, "");
+					RE_WriteRenderResul

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list