From 27d35a3ed0d71fd2ad5f213591172c85a767f5ca Mon Sep 17 00:00:00 2001 From: Nicolas Guichard Date: Mon, 17 Feb 2020 13:19:45 +0100 Subject: QShaderGraph: Fix statement creation for graphs with dangling branches For graphs like this one: Input ----> Function1 ----> Output \ ---> Function2 (unbound output) We would have generated only 2 statements, for Function1 and Output. This change fixes this by treating Function2 like an output. Therefore it generates 4 statements: Input, Function1, Output and Function2. Change-Id: Iaada40b9b949d771806dd47efad4f7ef2a775b48 Reviewed-by: Paul Lemire --- src/gui/util/qshadergraph.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/gui/util') diff --git a/src/gui/util/qshadergraph.cpp b/src/gui/util/qshadergraph.cpp index b05b710713..46fe6ac6d6 100644 --- a/src/gui/util/qshadergraph.cpp +++ b/src/gui/util/qshadergraph.cpp @@ -44,13 +44,20 @@ QT_BEGIN_NAMESPACE namespace { - QVector copyOutputNodes(const QVector &nodes) + QVector copyOutputNodes(const QVector &nodes, const QVector &edges) { auto res = QVector(); std::copy_if(nodes.cbegin(), nodes.cend(), std::back_inserter(res), - [] (const QShaderNode &node) { - return node.type() == QShaderNode::Output; + [&edges] (const QShaderNode &node) { + return node.type() == QShaderNode::Output || + (node.type() == QShaderNode::Function && + !std::any_of(edges.cbegin(), + edges.cend(), + [&node] (const QShaderGraph::Edge &edge) { + return edge.sourceNodeUuid == + node.uuid(); + })); }); return res; } @@ -210,8 +217,8 @@ QVector QShaderGraph::createStatements(const QStringLis auto result = QVector(); QVector currentEdges = enabledEdges; - QVector currentUuids = [enabledNodes] { - const QVector inputs = copyOutputNodes(enabledNodes); + QVector currentUuids = [enabledNodes, enabledEdges] { + const QVector inputs = copyOutputNodes(enabledNodes, enabledEdges); auto res = QVector(); std::transform(inputs.cbegin(), inputs.cend(), std::back_inserter(res), -- cgit v1.2.3