[Bf-blender-cvs] [2910b0c] multiview: Writing Multiview single layer-ish openexr from compositor

Dalai Felinto noreply at git.blender.org
Wed Sep 17 14:12:23 CEST 2014


Commit: 2910b0c77fc9a29b5a58211b93b2d584673e7db5
Author: Dalai Felinto
Date:   Thu Sep 11 23:38:06 2014 +0200
Branches: multiview
https://developer.blender.org/rB2910b0c77fc9a29b5a58211b93b2d584673e7db5

Writing Multiview single layer-ish openexr from compositor

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

M	source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp
M	source/blender/imbuf/intern/openexr/openexr_api.cpp
M	source/blender/imbuf/intern/openexr/openexr_multi.h
M	source/blender/imbuf/intern/openexr/openexr_stub.cpp
M	source/blender/render/intern/source/render_result.c

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

diff --git a/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp b/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp
index 6e125ee..4d794eb 100644
--- a/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp
+++ b/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp
@@ -69,11 +69,44 @@ void *OutputOpenExrSingleLayerMultiViewOperation::get_handle(const char* filenam
 
 		IMB_exr_clear_channels(exrhandle);
 
-		for (srv = (SceneRenderView *) this->m_rd->views.first; srv; srv = srv->next)
-			if (BKE_scene_render_view_active(this->m_rd, srv))
-				IMB_exr_add_view(exrhandle, srv->name);
+		for (srv = (SceneRenderView *) this->m_rd->views.first; srv; srv = srv->next) {
+			if (BKE_scene_render_view_active(this->m_rd, srv) == false)
+				continue;
 
-		return exrhandle;
+			IMB_exr_add_view(exrhandle, srv->name);
+
+			/* create channels */
+			switch (this->m_datatype) {
+				case COM_DT_VALUE:
+					IMB_exr_add_channel(exrhandle, 0, "V", srv->name, 1, width, NULL);
+					break;
+				case COM_DT_VECTOR:
+					IMB_exr_add_channel(exrhandle, 0, "X", srv->name, 3, 3 * width, NULL);
+					IMB_exr_add_channel(exrhandle, 0, "Y", srv->name, 3, 3 * width, NULL);
+					IMB_exr_add_channel(exrhandle, 0, "Z", srv->name, 3, 3 * width, NULL);
+					break;
+				case COM_DT_COLOR:
+					IMB_exr_add_channel(exrhandle, 0, "R", srv->name, 4, 4 * width, NULL);
+					IMB_exr_add_channel(exrhandle, 0, "G", srv->name, 4, 4 * width, NULL);
+					IMB_exr_add_channel(exrhandle, 0, "B", srv->name, 4, 4 * width, NULL);
+					IMB_exr_add_channel(exrhandle, 0, "A", srv->name, 4, 4 * width, NULL);
+					break;
+				default:
+					break;
+			}
+		}
+
+		BLI_make_existing_file(filename);
+
+		/* prepare the file with all the channels */
+		if (IMB_exrmultiview_begin_write(exrhandle, filename, width, height, this->m_format->exr_codec, true, false) == 0)
+		{
+			printf("Error Writing Singlelayer Multiview Openexr\n");
+			IMB_exr_close(exrhandle);
+		}
+		else {
+			return exrhandle;
+		}
 	}
 	return NULL;
 }
@@ -122,9 +155,6 @@ void OutputOpenExrSingleLayerMultiViewOperation::deinitExecution()
 		if (this->m_outputBuffer)
 			MEM_freeN(this->m_outputBuffer);
 
-		if (this->m_imageInput)
-			MEM_freeN(this->m_imageInput);
-
 		this->m_outputBuffer = NULL;
 		this->m_imageInput = NULL;
 
@@ -206,15 +236,12 @@ void *OutputOpenExrMultiLayerMultiViewOperation::get_handle(const char* filename
 		BLI_make_existing_file(filename);
 
 		/* prepare the file with all the channels */
-		if(IMB_exrmultiview_begin_write(exrhandle, filename, width, height, this->m_exr_codec, true) == 0)
+		if (IMB_exrmultiview_begin_write(exrhandle, filename, width, height, this->m_exr_codec, true, true) == 0)
 		{
-			/* TODO, get the error from openexr's exception */
-			/* XXX nice way to do report? */
-			printf("Error Writing Render Result, see console\n");
+			printf("Error Writing Multilayer Multiview Openexr\n");
 			IMB_exr_close(exrhandle);
 		}
 		else {
-			/* the actual writing */
 			return exrhandle;
 		}
 	}
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index 2f73cc2..65e397c 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -886,7 +886,8 @@ static int imb_exr_begin_write_multiview(void *handle, const char *filename, int
 #endif
 
 /* used for final output images */
-int IMB_exrmultiview_begin_write(void *handle, const char *filename, int width, int height, int compress, int splitviews)
+int IMB_exrmultiview_begin_write(void *handle, const char *filename, int width, int height, int compress, int splitviews,
+                                 const bool multilayer)
 {
 	ExrHandle *data = (ExrHandle *)handle;
 	Header header(width, height);
@@ -898,8 +899,12 @@ int IMB_exrmultiview_begin_write(void *handle, const char *filename, int width,
 	data->height = height;
 
 	openexr_header_compression(&header, compress);
-	header.insert("BlenderMultiChannel", StringAttribute("Blender V2.55.1 and newer"));
-	header.insert("BlenderMultiView", StringAttribute("Blender V2.68"));
+
+	if (multilayer)
+		header.insert("BlenderMultiChannel", StringAttribute("Blender V2.55.1 and newer"));
+
+	header.insert("BlenderMultiView", StringAttribute("Blender V2.73 and newer"));
+
 	header.setType(SCANLINEIMAGE);
 
 	exr_printf("\nIMB_exrmultiview_begin_write()\n");
diff --git a/source/blender/imbuf/intern/openexr/openexr_multi.h b/source/blender/imbuf/intern/openexr/openexr_multi.h
index 7558110..73746a9 100644
--- a/source/blender/imbuf/intern/openexr/openexr_multi.h
+++ b/source/blender/imbuf/intern/openexr/openexr_multi.h
@@ -55,7 +55,7 @@ void    IMB_exr_add_channel(void *handle, const char *layname, const char *passn
 int     IMB_exr_begin_read(void *handle, const char *filename, int *width, int *height);
 int     IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress);
 void    IMB_exrtile_begin_write(void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley);
-int     IMB_exrmultiview_begin_write(void *handle, const char *filename, int width, int height, int compress, int splitviews);
+int     IMB_exrmultiview_begin_write(void *handle, const char *filename, int width, int height, int compress, int splitviews, const bool multilayer);
 
 void    IMB_exr_set_channel(void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect);
 float  *IMB_exr_channel_rect(void *handle, const char *layname, const char *passname, const char *view);
diff --git a/source/blender/imbuf/intern/openexr/openexr_stub.cpp b/source/blender/imbuf/intern/openexr/openexr_stub.cpp
index e7f1ec7..f69c391 100644
--- a/source/blender/imbuf/intern/openexr/openexr_stub.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_stub.cpp
@@ -40,7 +40,7 @@ void    IMB_exr_add_channel         (void *handle, const char *layname, const ch
 int     IMB_exr_begin_read          (void *handle, const char *filename, int *width, int *height) { (void)handle; (void)filename; (void)width; (void)height; return 0;}
 int     IMB_exr_begin_write         (void *handle, const char *filename, int width, int height, int compress) { (void)handle; (void)filename; (void)width; (void)height; (void)compress; return 0;}
 void    IMB_exrtile_begin_write     (void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley) { (void)handle; (void)filename; (void)mipmap; (void)width; (void)height; (void)tilex; (void)tiley; }
-int     IMB_exrmultiview_begin_write (void *handle, const char *filename, int width, int height, int compress) { (void)handle; (void)filename; (void)width; (void)height; (void)compress; }
+int     IMB_exrmultiview_begin_write (void *handle, const char *filename, int width, int height, int compress, int splitviews, const bool multilayer) { (void)handle; (void)filename; (void)width; (void)height; (void)compress; (void) splitviews; (void) multilayer; }
 
 void    IMB_exr_set_channel         (void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect) { (void)handle; (void)layname; (void)passname; (void)xstride; (void)ystride; (void)rect; }
 float  *IMB_exr_channel_rect        (void *handle, const char *layname, const char *passname, const char *view) { (void)handle; (void)layname; (void)passname; (void)view; }
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index 0f029e8..8d637c7 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -1185,7 +1185,7 @@ bool RE_WriteRenderResult(ReportList *reports, RenderResult *rr, const char *fil
 
 	/* when the filename has no permissions, this can fail */
 	if (multiview) {
-		if (IMB_exrmultiview_begin_write(exrhandle, filename, width, height, compress, false)) {
+		if (IMB_exrmultiview_begin_write(exrhandle, filename, width, height, compress, false, true)) {
 			IMB_exrmultiview_write_channels(exrhandle, RR_ALL_VIEWS);
 			success = true;
 		}




More information about the Bf-blender-cvs mailing list