Add parameters to QShaderNode

This will allow to create nodes having an entry point for tuning, still
need to be exploited by the loaders and the shader generator. Coming in
further commits.

Change-Id: I8384b0f528c9919e9f8d35102adde2b307f08b80
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
bb10
Kevin Ottens 2017-07-05 16:13:45 +02:00 committed by Sean Harmer
parent 74e9a11386
commit f7fefed2ea
3 changed files with 73 additions and 2 deletions

View File

@ -93,6 +93,26 @@ void QShaderNode::removePort(const QShaderNodePort &port)
m_ports.erase(it);
}
QStringList QShaderNode::parameterNames() const
{
return m_parameters.keys();
}
QVariant QShaderNode::parameter(const QString &name) const
{
return m_parameters.value(name);
}
void QShaderNode::setParameter(const QString &name, const QVariant &value)
{
m_parameters.insert(name, value);
}
void QShaderNode::clearParameter(const QString &name)
{
m_parameters.remove(name);
}
void QShaderNode::addRule(const QShaderFormat &format, const QShaderNode::Rule &rule)
{
removeRule(format);

View File

@ -88,6 +88,11 @@ public:
Q_GUI_EXPORT void addPort(const QShaderNodePort &port);
Q_GUI_EXPORT void removePort(const QShaderNodePort &port);
Q_GUI_EXPORT QStringList parameterNames() const;
Q_GUI_EXPORT QVariant parameter(const QString &name) const;
Q_GUI_EXPORT void setParameter(const QString &name, const QVariant &value);
Q_GUI_EXPORT void clearParameter(const QString &name);
Q_GUI_EXPORT void addRule(const QShaderFormat &format, const Rule &rule);
Q_GUI_EXPORT void removeRule(const QShaderFormat &format);
@ -97,6 +102,7 @@ public:
private:
QUuid m_uuid;
QVector<QShaderNodePort> m_ports;
QHash<QString, QVariant> m_parameters;
QVector<QPair<QShaderFormat, QShaderNode::Rule>> m_rules;
};

View File

@ -70,7 +70,7 @@ private slots:
void shouldVerifyPortsEquality_data();
void shouldVerifyPortsEquality();
void shouldManipulateNodeUuidPortsAndRules();
void shouldManipulateNodeMembers();
void shouldHandleNodeRulesSupportAndOrder();
};
@ -336,7 +336,7 @@ void tst_QShaderNodes::shouldVerifyPortsEquality()
QCOMPARE(notEqual, !expected);
}
void tst_QShaderNodes::shouldManipulateNodeUuidPortsAndRules()
void tst_QShaderNodes::shouldManipulateNodeMembers()
{
// GIVEN
const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
@ -352,6 +352,7 @@ void tst_QShaderNodes::shouldManipulateNodeUuidPortsAndRules()
QCOMPARE(node.type(), QShaderNode::Invalid);
QVERIFY(node.uuid().isNull());
QVERIFY(node.ports().isEmpty());
QVERIFY(node.parameterNames().isEmpty());
QVERIFY(node.availableFormats().isEmpty());
// WHEN
@ -395,6 +396,50 @@ void tst_QShaderNodes::shouldManipulateNodeUuidPortsAndRules()
QCOMPARE(node.ports().at(0), secondPort);
QVERIFY(node.availableFormats().isEmpty());
// WHEN
node.setParameter(QStringLiteral("baz"), 42);
// THEN
QCOMPARE(node.type(), QShaderNode::Input);
QCOMPARE(node.ports().size(), 1);
QCOMPARE(node.ports().at(0), secondPort);
auto parameterNames = node.parameterNames();
parameterNames.sort();
QCOMPARE(parameterNames.size(), 1);
QCOMPARE(parameterNames.at(0), QStringLiteral("baz"));
QCOMPARE(node.parameter(QStringLiteral("baz")), QVariant(42));
QVERIFY(node.availableFormats().isEmpty());
// WHEN
node.setParameter(QStringLiteral("bleh"), QStringLiteral("value"));
// THEN
QCOMPARE(node.type(), QShaderNode::Input);
QCOMPARE(node.ports().size(), 1);
QCOMPARE(node.ports().at(0), secondPort);
parameterNames = node.parameterNames();
parameterNames.sort();
QCOMPARE(parameterNames.size(), 2);
QCOMPARE(parameterNames.at(0), QStringLiteral("baz"));
QCOMPARE(parameterNames.at(1), QStringLiteral("bleh"));
QCOMPARE(node.parameter(QStringLiteral("baz")), QVariant(42));
QCOMPARE(node.parameter(QStringLiteral("bleh")), QVariant(QStringLiteral("value")));
QVERIFY(node.availableFormats().isEmpty());
// WHEN
node.clearParameter(QStringLiteral("baz"));
// THEN
QCOMPARE(node.type(), QShaderNode::Input);
QCOMPARE(node.ports().size(), 1);
QCOMPARE(node.ports().at(0), secondPort);
parameterNames = node.parameterNames();
parameterNames.sort();
QCOMPARE(parameterNames.size(), 1);
QCOMPARE(parameterNames.at(0), QStringLiteral("bleh"));
QCOMPARE(node.parameter(QStringLiteral("baz")), QVariant());
QCOMPARE(node.parameter(QStringLiteral("bleh")), QVariant(QStringLiteral("value")));
QVERIFY(node.availableFormats().isEmpty());
// WHEN
node.addRule(openGLES2, es2Rule);