From f3c70ab9f316a28c0c71fe94b90de8e42c45d9a5 Mon Sep 17 00:00:00 2001 From: Kevin Ottens Date: Tue, 18 Jul 2017 16:09:11 +0200 Subject: Implement graph layers support in QShaderGraph When creating the statements, it is now possible to pass a list of enabled layer names. Every node or edge which is not in the list of enabled layers will be pruned from the graph prior to traversal. Note that an empty layer list for a node or an edge means it is on all layers. Change-Id: I61a4df7d395b4beb42ee55ce08fef8ebe04263c9 Reviewed-by: Sean Harmer --- src/gui/util/qshadergraph.cpp | 40 +++++++++++++++++++++++++++++++++------- src/gui/util/qshadergraph_p.h | 2 +- 2 files changed, 34 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/gui/util/qshadergraph.cpp b/src/gui/util/qshadergraph.cpp index 5379e6ed7a..828c709a12 100644 --- a/src/gui/util/qshadergraph.cpp +++ b/src/gui/util/qshadergraph.cpp @@ -172,20 +172,46 @@ QVector QShaderGraph::edges() const Q_DECL_NOTHROW return m_edges; } -QVector QShaderGraph::createStatements() const +QVector QShaderGraph::createStatements(const QStringList &enabledLayers) const { - const auto idHash = [this] { + const auto intersectsEnabledLayers = [enabledLayers] (const QStringList &layers) { + return layers.isEmpty() + || std::any_of(layers.cbegin(), layers.cend(), + [enabledLayers] (const QString &s) { return enabledLayers.contains(s); }); + }; + + const auto enabledNodes = [this, intersectsEnabledLayers] { + auto res = QVector(); + std::copy_if(m_nodes.cbegin(), m_nodes.cend(), + std::back_inserter(res), + [intersectsEnabledLayers] (const QShaderNode &node) { + return intersectsEnabledLayers(node.layers()); + }); + return res; + }(); + + const auto enabledEdges = [this, intersectsEnabledLayers] { + auto res = QVector(); + std::copy_if(m_edges.cbegin(), m_edges.cend(), + std::back_inserter(res), + [intersectsEnabledLayers] (const Edge &edge) { + return intersectsEnabledLayers(edge.layers); + }); + return res; + }(); + + const auto idHash = [enabledNodes] { auto nextVarId = 0; auto res = QHash(); - for (const auto &node : qAsConst(m_nodes)) + for (const auto &node : enabledNodes) res.insert(node.uuid(), nodeToStatement(node, nextVarId)); return res; }(); auto result = QVector(); - auto currentEdges = m_edges; - auto currentUuids = [this] { - const auto inputs = copyOutputNodes(m_nodes); + auto currentEdges = enabledEdges; + auto currentUuids = [enabledNodes] { + const auto inputs = copyOutputNodes(enabledNodes); auto res = QVector(); std::transform(inputs.cbegin(), inputs.cend(), std::back_inserter(res), @@ -201,7 +227,7 @@ QVector QShaderGraph::createStatements() const // input nodes while (!currentUuids.isEmpty()) { const auto uuid = currentUuids.takeFirst(); - result.append(completeStatement(idHash, m_edges, uuid)); + result.append(completeStatement(idHash, enabledEdges, uuid)); const auto outgoing = outgoingEdges(currentEdges, uuid); for (const auto &outgoingEdge : outgoing) { diff --git a/src/gui/util/qshadergraph_p.h b/src/gui/util/qshadergraph_p.h index ced6b1430b..756e1b2da2 100644 --- a/src/gui/util/qshadergraph_p.h +++ b/src/gui/util/qshadergraph_p.h @@ -89,7 +89,7 @@ public: Q_GUI_EXPORT void removeEdge(const Edge &edge); Q_GUI_EXPORT QVector edges() const Q_DECL_NOTHROW; - Q_GUI_EXPORT QVector createStatements() const; + Q_GUI_EXPORT QVector createStatements(const QStringList &enabledLayers = QStringList()) const; private: QVector m_nodes; -- cgit v1.2.3