[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