diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2017-07-18 16:09:11 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-08-02 17:34:48 +0000 |
commit | f3c70ab9f316a28c0c71fe94b90de8e42c45d9a5 (patch) | |
tree | 778e3eee3286dcd72a920d880ec832f1568da5c3 /src/gui | |
parent | 32281653bf3564afe075fd684365b640082c695f (diff) |
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 <sean.harmer@kdab.com>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/util/qshadergraph.cpp | 40 | ||||
-rw-r--r-- | src/gui/util/qshadergraph_p.h | 2 |
2 files changed, 34 insertions, 8 deletions
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::Edge> QShaderGraph::edges() const Q_DECL_NOTHROW return m_edges; } -QVector<QShaderGraph::Statement> QShaderGraph::createStatements() const +QVector<QShaderGraph::Statement> 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<QShaderNode>(); + 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<Edge>(); + 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<QUuid, Statement>(); - for (const auto &node : qAsConst(m_nodes)) + for (const auto &node : enabledNodes) res.insert(node.uuid(), nodeToStatement(node, nextVarId)); return res; }(); auto result = QVector<Statement>(); - 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<QUuid>(); std::transform(inputs.cbegin(), inputs.cend(), std::back_inserter(res), @@ -201,7 +227,7 @@ QVector<QShaderGraph::Statement> 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<Edge> edges() const Q_DECL_NOTHROW; - Q_GUI_EXPORT QVector<Statement> createStatements() const; + Q_GUI_EXPORT QVector<Statement> createStatements(const QStringList &enabledLayers = QStringList()) const; private: QVector<QShaderNode> m_nodes; |