Fix T41067: Muted nodes still do data type conversions.

Proxy operations from muted nodes would still create conversion
operations where the datatypes don't match, which creates unexpected
behavior. Arguably datatype conversion could still happen even when the
main operation is muted, but this would be a design change and so is
disabled now.
This commit is contained in:
Lukas Tönne 2014-07-15 10:55:49 +02:00
parent fa8ff63b48
commit 2bdb872cfb
Notes: blender-bot 2023-02-14 10:21:11 +01:00
Referenced by issue #41067, Compositing Problems in 2.71
10 changed files with 45 additions and 18 deletions

View File

@ -83,9 +83,9 @@ NodeOperation *NodeConverter::setInvalidOutput(NodeOutput *output)
return operation;
}
NodeOperationOutput *NodeConverter::addInputProxy(NodeInput *input)
NodeOperationOutput *NodeConverter::addInputProxy(NodeInput *input, bool use_conversion)
{
SocketProxyOperation *proxy = new SocketProxyOperation(input->getDataType());
SocketProxyOperation *proxy = new SocketProxyOperation(input->getDataType(), use_conversion);
m_builder->addOperation(proxy);
m_builder->mapInputSocket(input, proxy->getInputSocket(0));
@ -93,9 +93,9 @@ NodeOperationOutput *NodeConverter::addInputProxy(NodeInput *input)
return proxy->getOutputSocket();
}
NodeOperationInput *NodeConverter::addOutputProxy(NodeOutput *output)
NodeOperationInput *NodeConverter::addOutputProxy(NodeOutput *output, bool use_conversion)
{
SocketProxyOperation *proxy = new SocketProxyOperation(output->getDataType());
SocketProxyOperation *proxy = new SocketProxyOperation(output->getDataType(), use_conversion);
m_builder->addOperation(proxy);
m_builder->mapOutputSocket(output, proxy->getOutputSocket());

View File

@ -70,12 +70,12 @@ public:
* This operation will be removed later and replaced
* by direct links between the connected operations.
*/
NodeOperationOutput *addInputProxy(NodeInput *input);
NodeOperationOutput *addInputProxy(NodeInput *input, bool use_conversion);
/** Create a proxy operation for a node output.
* This operation will be removed later and replaced
* by direct links between the connected operations.
*/
NodeOperationInput *addOutputProxy(NodeOutput *output);
NodeOperationInput *addOutputProxy(NodeOutput *output, bool use_conversion);
/** Define a constant input value. */
void addInputValue(NodeOperationInput *input, float value);

View File

@ -202,7 +202,7 @@ void NodeGraph::add_bNodeLink(const NodeRange &node_range, bNodeLink *b_nodelink
void NodeGraph::add_proxies_mute(bNodeTree *b_ntree, bNode *b_node, bNodeInstanceKey key, bool is_active_group)
{
for (bNodeLink *b_link = (bNodeLink *)b_node->internal_links.first; b_link; b_link = b_link->next) {
SocketProxyNode *proxy = new SocketProxyNode(b_node, b_link->fromsock, b_link->tosock);
SocketProxyNode *proxy = new SocketProxyNode(b_node, b_link->fromsock, b_link->tosock, false);
add_node(proxy, b_ntree, key, is_active_group);
}
}
@ -219,7 +219,7 @@ void NodeGraph::add_proxies_skip(bNodeTree *b_ntree, bNode *b_node, bNodeInstanc
}
if (input) {
SocketProxyNode *proxy = new SocketProxyNode(b_node, input, output);
SocketProxyNode *proxy = new SocketProxyNode(b_node, input, output, true);
add_node(proxy, b_ntree, key, is_active_group);
}
}
@ -237,7 +237,7 @@ void NodeGraph::add_proxies_group_inputs(bNode *b_node, bNode *b_node_io)
for (bNodeSocket *b_sock_io = (bNodeSocket *)b_node_io->outputs.first; b_sock_io; b_sock_io = b_sock_io->next) {
bNodeSocket *b_sock_group = find_b_node_input(b_node, b_sock_io->identifier);
if (b_sock_group) {
SocketProxyNode *proxy = new SocketProxyNode(b_node_io, b_sock_group, b_sock_io);
SocketProxyNode *proxy = new SocketProxyNode(b_node_io, b_sock_group, b_sock_io, true);
add_node(proxy, b_group_tree, key, is_active_group);
}
}
@ -260,7 +260,7 @@ void NodeGraph::add_proxies_group_outputs(bNode *b_node, bNode *b_node_io, bool
add_node(buffer, b_group_tree, key, is_active_group);
}
else {
SocketProxyNode *proxy = new SocketProxyNode(b_node_io, b_sock_io, b_sock_group);
SocketProxyNode *proxy = new SocketProxyNode(b_node_io, b_sock_io, b_sock_group, true);
add_node(proxy, b_group_tree, key, is_active_group);
}
}
@ -294,6 +294,6 @@ void NodeGraph::add_proxies_group(const CompositorContext &context, bNode *b_nod
void NodeGraph::add_proxies_reroute(bNodeTree *b_ntree, bNode *b_node, bNodeInstanceKey key, bool is_active_group)
{
SocketProxyNode *proxy = new SocketProxyNode(b_node, (bNodeSocket *)b_node->inputs.first, (bNodeSocket *)b_node->outputs.first);
SocketProxyNode *proxy = new SocketProxyNode(b_node, (bNodeSocket *)b_node->inputs.first, (bNodeSocket *)b_node->outputs.first, false);
add_node(proxy, b_ntree, key, is_active_group);
}

View File

@ -288,6 +288,8 @@ public:
virtual bool isFileOutputOperation() const { return false; }
virtual bool isProxyOperation() const { return false; }
virtual bool useDatatypeConversion() const { return true; }
inline bool isBreaked() const {
return this->m_btree->test_break(this->m_btree->tbh);
}

View File

@ -269,6 +269,13 @@ void NodeOperationBuilder::add_datatype_conversions()
Links convert_links;
for (Links::const_iterator it = m_links.begin(); it != m_links.end(); ++it) {
const Link &link = *it;
/* proxy operations can skip data type conversion */
NodeOperation *from_op = &link.from()->getOperation();
NodeOperation *to_op = &link.to()->getOperation();
if (!from_op->useDatatypeConversion() || !to_op->useDatatypeConversion())
continue;
if (link.from()->getDataType() != link.to()->getDataType())
convert_links.push_back(link);
}

View File

@ -29,7 +29,9 @@
#include "COM_WriteBufferOperation.h"
#include "COM_ReadBufferOperation.h"
SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput) : Node(editorNode, false)
SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput, bool use_conversion) :
Node(editorNode, false),
m_use_conversion(use_conversion)
{
DataType dt;
@ -46,7 +48,7 @@ SocketProxyNode::SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bN
void SocketProxyNode::convertToOperations(NodeConverter &converter, const CompositorContext &context) const
{
NodeOperationOutput *proxy_output = converter.addInputProxy(getInputSocket(0));
NodeOperationOutput *proxy_output = converter.addInputProxy(getInputSocket(0), m_use_conversion);
converter.mapOutputSocket(getOutputSocket(), proxy_output);
}

View File

@ -31,8 +31,15 @@
*/
class SocketProxyNode : public Node {
public:
SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput);
SocketProxyNode(bNode *editorNode, bNodeSocket *editorInput, bNodeSocket *editorOutput, bool use_conversion);
void convertToOperations(NodeConverter &converter, const CompositorContext &context) const;
bool getUseConversion() const { return m_use_conversion; }
void setUseConversion(bool use_conversion) { m_use_conversion = use_conversion; }
private:
/** If true, the proxy will convert input and output data to/from the proxy socket types. */
bool m_use_conversion;
};

View File

@ -33,9 +33,9 @@ void SwitchNode::convertToOperations(NodeConverter &converter, const CompositorC
NodeOperationOutput *result;
if (!condition)
result = converter.addInputProxy(getInputSocket(0));
result = converter.addInputProxy(getInputSocket(0), false);
else
result = converter.addInputProxy(getInputSocket(1));
result = converter.addInputProxy(getInputSocket(1), false);
converter.mapOutputSocket(getOutputSocket(0), result);
}

View File

@ -22,7 +22,9 @@
#include "COM_SocketProxyOperation.h"
SocketProxyOperation::SocketProxyOperation(DataType type) : NodeOperation()
SocketProxyOperation::SocketProxyOperation(DataType type, bool use_conversion) :
NodeOperation(),
m_use_conversion(use_conversion)
{
this->addInputSocket(type);
this->addOutputSocket(type);

View File

@ -27,9 +27,16 @@
class SocketProxyOperation : public NodeOperation {
public:
SocketProxyOperation(DataType type);
SocketProxyOperation(DataType type, bool use_conversion);
bool isProxyOperation() const { return true; }
bool useDatatypeConversion() const { return m_use_conversion; }
bool getUseConversion() const { return m_use_conversion; }
void setUseConversion(bool use_conversion) { m_use_conversion = use_conversion; }
private:
bool m_use_conversion;
};
#endif