From 5667c870fb526b2bf0a5d4097e0f166b546550f0 Mon Sep 17 00:00:00 2001 From: Kevin Ottens Date: Wed, 5 Jul 2017 16:15:01 +0200 Subject: [PATCH] Add support for node parameters in QShaderNodesLoader This will allow to make the prototypes more extensible when referred to from a graph file while providing some sane defaults. Change-Id: I1ae10182427d8a7d29c51a64e19e99139494ea92 Reviewed-by: Sean Harmer --- src/gui/util/qshadernodesloader.cpp | 8 ++++ .../tst_qshadernodesloader.cpp | 39 ++++++++++++------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/gui/util/qshadernodesloader.cpp b/src/gui/util/qshadernodesloader.cpp index 83472d664b..390518596d 100644 --- a/src/gui/util/qshadernodesloader.cpp +++ b/src/gui/util/qshadernodesloader.cpp @@ -147,6 +147,14 @@ void QShaderNodesLoader::load() } } + const auto parametersValue = nodeObject.value(QStringLiteral("parameters")); + if (parametersValue.isObject()) { + const auto parametersObject = parametersValue.toObject(); + for (const auto ¶meterName : parametersObject.keys()) { + node.setParameter(parameterName, parametersObject.value(parameterName).toVariant()); + } + } + const auto rulesValue = nodeObject.value(QStringLiteral("rules")); if (rulesValue.isArray()) { const auto rulesArray = rulesValue.toArray(); diff --git a/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp b/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp index 59c476acc3..ad76012e2f 100644 --- a/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp +++ b/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp @@ -126,10 +126,13 @@ void tst_QShaderNodesLoader::shouldLoadFromJsonStream_data() QTest::newRow("empty") << createBuffer("", QIODevice::ReadOnly) << NodeHash() << QShaderNodesLoader::Error; const auto smallJson = "{" - " \"worldPosition\": {" + " \"inputValue\": {" " \"outputs\": [" - " \"worldPosition\"" + " \"value\"" " ]," + " \"parameters\": {" + " \"name\": \"defaultName\"" + " }," " \"rules\": [" " {" " \"format\": {" @@ -137,8 +140,8 @@ void tst_QShaderNodesLoader::shouldLoadFromJsonStream_data() " \"major\": 2," " \"minor\": 0" " }," - " \"substitution\": \"highp vec3 $worldPosition = worldPosition;\"," - " \"headerSnippets\": [ \"varying highp vec3 worldPosition;\" ]" + " \"substitution\": \"highp vec3 $value = $name;\"," + " \"headerSnippets\": [ \"varying highp vec3 $name;\" ]" " }," " {" " \"format\": {" @@ -146,8 +149,8 @@ void tst_QShaderNodesLoader::shouldLoadFromJsonStream_data() " \"major\": 2," " \"minor\": 1" " }," - " \"substitution\": \"vec3 $worldPosition = worldPosition;\"," - " \"headerSnippets\": [ \"in vec3 worldPosition;\" ]" + " \"substitution\": \"vec3 $value = $name;\"," + " \"headerSnippets\": [ \"in vec3 $name;\" ]" " }" " ]" " }," @@ -218,14 +221,15 @@ void tst_QShaderNodesLoader::shouldLoadFromJsonStream_data() auto protos = NodeHash(); - auto worldPosition = createNode({ - createPort(QShaderNodePort::Output, "worldPosition") + auto inputValue = createNode({ + createPort(QShaderNodePort::Output, "value") }); - worldPosition.addRule(openGLES2, QShaderNode::Rule("highp vec3 $worldPosition = worldPosition;", - QByteArrayList() << "varying highp vec3 worldPosition;")); - worldPosition.addRule(openGL2, QShaderNode::Rule("vec3 $worldPosition = worldPosition;", - QByteArrayList() << "in vec3 worldPosition;")); - protos.insert("worldPosition", worldPosition); + inputValue.setParameter("name", "defaultName"); + inputValue.addRule(openGLES2, QShaderNode::Rule("highp vec3 $value = $name;", + QByteArrayList() << "varying highp vec3 $name;")); + inputValue.addRule(openGL2, QShaderNode::Rule("vec3 $value = $name;", + QByteArrayList() << "in vec3 $name;")); + protos.insert("inputValue", inputValue); auto fragColor = createNode({ createPort(QShaderNodePort::Input, "fragColor") @@ -275,6 +279,11 @@ void tst_QShaderNodesLoader::shouldLoadFromJsonStream() res.sort(); return res; }; + const auto sortedParameters = [](const QShaderNode &node) { + auto res = node.parameterNames(); + res.sort(); + return res; + }; QCOMPARE(sortedKeys(loader.nodes()), sortedKeys(nodes)); for (const auto &key : nodes.keys()) { const auto actual = loader.nodes().value(key); @@ -282,6 +291,10 @@ void tst_QShaderNodesLoader::shouldLoadFromJsonStream() QVERIFY(actual.uuid().isNull()); QCOMPARE(actual.ports(), expected.ports()); + QCOMPARE(sortedParameters(actual), sortedParameters(expected)); + for (const auto &name : expected.parameterNames()) { + QCOMPARE(actual.parameter(name), expected.parameter(name)); + } QCOMPARE(actual.availableFormats(), expected.availableFormats()); for (const auto &format : expected.availableFormats()) { QCOMPARE(actual.rule(format), expected.rule(format));