Fix T87252: File output node broken with more than 4 inputs.

In recent refactor the operator sockets were migrated from a std::list to a blender::Vector.
The way how the file output node created the sockets along mapping the sockets could
lead to storing incorrect pointers.

This patch fixes this by defining and mapping the sockets in separate loops.
This commit is contained in:
Jeroen Bakker 2021-04-12 09:18:40 +02:00
parent 175c1382da
commit 75642b4cfd
Notes: blender-bot 2023-02-14 07:08:26 +01:00
Referenced by issue #87252, 2.93 file output node broken with more than 4 inputs
2 changed files with 38 additions and 17 deletions

View File

@ -18,7 +18,6 @@
#include "COM_OutputFileNode.h"
#include "COM_ExecutionSystem.h"
#include "COM_OutputFileMultiViewOperation.h"
#include "COM_OutputFileOperation.h"
#include "BKE_scene.h"
@ -32,6 +31,31 @@ OutputFileNode::OutputFileNode(bNode *editorNode) : Node(editorNode)
/* pass */
}
void OutputFileNode::add_input_sockets(OutputOpenExrMultiLayerOperation &operation) const
{
for (NodeInput *input : inputs) {
NodeImageMultiFileSocket *sockdata =
(NodeImageMultiFileSocket *)input->getbNodeSocket()->storage;
/* note: layer becomes an empty placeholder if the input is not linked */
operation.add_layer(sockdata->layer, input->getDataType(), input->isLinked());
}
}
void OutputFileNode::map_input_sockets(NodeConverter &converter,
OutputOpenExrMultiLayerOperation &operation) const
{
bool previewAdded = false;
int index = 0;
for (NodeInput *input : inputs) {
converter.mapInputSocket(input, operation.getInputSocket(index++));
if (!previewAdded) {
converter.addNodeInputPreview(input);
previewAdded = true;
}
}
}
void OutputFileNode::convertToOperations(NodeConverter &converter,
const CompositorContext &context) const
{
@ -71,22 +95,11 @@ void OutputFileNode::convertToOperations(NodeConverter &converter,
}
converter.addOperation(outputOperation);
bool previewAdded = false;
int index = 0;
for (NodeInput *input : inputs) {
NodeImageMultiFileSocket *sockdata =
(NodeImageMultiFileSocket *)input->getbNodeSocket()->storage;
/* note: layer becomes an empty placeholder if the input is not linked */
outputOperation->add_layer(sockdata->layer, input->getDataType(), input->isLinked());
converter.mapInputSocket(input, outputOperation->getInputSocket(index++));
if (!previewAdded) {
converter.addNodeInputPreview(input);
previewAdded = true;
}
}
/* First add all inputs. Inputs are stored in a Vector and can be moved to a different
* memory address during this time.*/
add_input_sockets(*outputOperation);
/* After adding the sockets the memory addresses will stick. */
map_input_sockets(converter, *outputOperation);
}
else { /* single layer format */
bool previewAdded = false;

View File

@ -19,6 +19,9 @@
#pragma once
#include "COM_Node.h"
#include "COM_OutputFileMultiViewOperation.h"
#include "DNA_node_types.h"
namespace blender::compositor {
@ -32,6 +35,11 @@ class OutputFileNode : public Node {
OutputFileNode(bNode *editorNode);
void convertToOperations(NodeConverter &converter,
const CompositorContext &context) const override;
private:
void add_input_sockets(OutputOpenExrMultiLayerOperation &operation) const;
void map_input_sockets(NodeConverter &converter,
OutputOpenExrMultiLayerOperation &operation) const;
};
} // namespace blender::compositor