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.
This commit is contained in:
Lukas Toenne
2013-09-19 08:21:53 +00:00
parent 1ca5de1b51
commit c628c4b45b
2 changed files with 17 additions and 7 deletions

View File

@@ -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);