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 <sean.harmer@kdab.com>
bb10
Kevin Ottens 2017-07-05 16:15:01 +02:00 committed by Sean Harmer
parent f7fefed2ea
commit 5667c870fb
2 changed files with 34 additions and 13 deletions

View File

@ -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 &parameterName : parametersObject.keys()) {
node.setParameter(parameterName, parametersObject.value(parameterName).toVariant());
}
}
const auto rulesValue = nodeObject.value(QStringLiteral("rules"));
if (rulesValue.isArray()) {
const auto rulesArray = rulesValue.toArray();

View File

@ -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));