Fix for OutputFile node, this would crash with unconnected sockets in MultiEXR mode...
authorLukas Toenne <lukas.toenne@googlemail.com>
Thu, 19 Sep 2013 08:21:53 +0000 (08:21 +0000)
committerLukas Toenne <lukas.toenne@googlemail.com>
Thu, 19 Sep 2013 08:21:53 +0000 (08:21 +0000)
for all sockets now and then ignore unconnected layers when finally writing to file in deinitExecution.

source/blender/compositor/nodes/COM_OutputFileNode.cpp
source/blender/compositor/operations/COM_OutputFileOperation.cpp

index 3b1871b307ba7483cc813423d32ba0b88325c218..94e5efe77e003ea1130c4f91629fac268628805c 100644 (file)
@@ -59,12 +59,12 @@ void OutputFileNode::convertToOperations(ExecutionSystem *graph, CompositorConte
                bool hasConnections = false;
                for (int i = 0; i < num_inputs; ++i) {
                        InputSocket *input = getInputSocket(i);
+                       NodeImageMultiFileSocket *sockdata = (NodeImageMultiFileSocket *)input->getbNodeSocket()->storage;
+                       
+                       outputOperation->add_layer(sockdata->layer, input->getDataType());
+                       
                        if (input->isConnected()) {
                                hasConnections = true;
-                               NodeImageMultiFileSocket *sockdata = (NodeImageMultiFileSocket *)input->getbNodeSocket()->storage;
-                               
-                               outputOperation->add_layer(sockdata->layer, input->getDataType());
-                               
                                input->relinkConnections(outputOperation->getInputSocket(i));
                        }
                }
index d0eadc5c4d1862dee8676c3ce626cc724642c012..a5be993f24130a3523fc9ebc4445712d75b2bd40 100644 (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);