diff options
author | Lukas Toenne <lukas.toenne@googlemail.com> | 2013-09-19 12:21:53 +0400 |
---|---|---|
committer | Lukas Toenne <lukas.toenne@googlemail.com> | 2013-09-19 12:21:53 +0400 |
commit | c628c4b45b8b0a5e1d0eff11a0be7d456ea2f0a7 (patch) | |
tree | 53ff3fc4a55f2615752138a77a5b36bae3df9a89 /source/blender/compositor/operations/COM_OutputFileOperation.cpp | |
parent | 1ca5de1b51fb57deee02bc65d681f6245103e74b (diff) |
Fix for OutputFile node, this would crash with unconnected sockets in MultiEXR mode, because it matches sockets and EXR layers by index and was skipping unconnected sockets. Simply create EXR layer info
for all sockets now and then ignore unconnected layers when finally writing to file in deinitExecution.
Diffstat (limited to 'source/blender/compositor/operations/COM_OutputFileOperation.cpp')
-rw-r--r-- | source/blender/compositor/operations/COM_OutputFileOperation.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.cpp b/source/blender/compositor/operations/COM_OutputFileOperation.cpp index d0eadc5c4d1..a5be993f241 100644 --- a/source/blender/compositor/operations/COM_OutputFileOperation.cpp +++ b/source/blender/compositor/operations/COM_OutputFileOperation.cpp @@ -184,15 +184,21 @@ void OutputOpenExrMultiLayerOperation::add_layer(const char *name, DataType data void OutputOpenExrMultiLayerOperation::initExecution() { for (unsigned int i = 0; i < this->m_layers.size(); ++i) { - this->m_layers[i].imageInput = getInputSocketReader(i); - this->m_layers[i].outputBuffer = init_buffer(this->getWidth(), this->getHeight(), this->m_layers[i].datatype); + SocketReader *reader = getInputSocketReader(i); + this->m_layers[i].imageInput = reader; + if (reader) + this->m_layers[i].outputBuffer = init_buffer(this->getWidth(), this->getHeight(), this->m_layers[i].datatype); + else + this->m_layers[i].outputBuffer = NULL; } } void OutputOpenExrMultiLayerOperation::executeRegion(rcti *rect, unsigned int tileNumber) { for (unsigned int i = 0; i < this->m_layers.size(); ++i) { - write_buffer_rect(rect, this->m_tree, this->m_layers[i].imageInput, this->m_layers[i].outputBuffer, this->getWidth(), this->m_layers[i].datatype); + OutputOpenExrLayer &layer = this->m_layers[i]; + if (layer.imageInput) + write_buffer_rect(rect, this->m_tree, layer.imageInput, layer.outputBuffer, this->getWidth(), layer.datatype); } } @@ -210,6 +216,10 @@ void OutputOpenExrMultiLayerOperation::deinitExecution() BLI_make_existing_file(filename); for (unsigned int i = 0; i < this->m_layers.size(); ++i) { + OutputOpenExrLayer &layer = this->m_layers[i]; + if (!layer.imageInput) + continue; /* skip unconnected sockets */ + char channelname[EXR_TOT_MAXNAME]; BLI_strncpy(channelname, this->m_layers[i].name, sizeof(channelname) - 2); char *channelname_ext = channelname + strlen(channelname); |