diff --git a/src/gui/util/qshadernodesloader.cpp b/src/gui/util/qshadernodesloader.cpp index 390518596d..db34b6d44d 100644 --- a/src/gui/util/qshadernodesloader.cpp +++ b/src/gui/util/qshadernodesloader.cpp @@ -44,6 +44,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -151,7 +152,30 @@ void QShaderNodesLoader::load() if (parametersValue.isObject()) { const auto parametersObject = parametersValue.toObject(); for (const auto ¶meterName : parametersObject.keys()) { - node.setParameter(parameterName, parametersObject.value(parameterName).toVariant()); + const auto parameterValue = parametersObject.value(parameterName); + if (parameterValue.isObject()) { + const auto parameterObject = parameterValue.toObject(); + const auto type = parameterObject.value(QStringLiteral("type")).toString(); + const auto typeId = QMetaType::type(type.toUtf8()); + + const auto value = parameterObject.value(QStringLiteral("value")).toString(); + auto variant = QVariant(value); + + if (QMetaType::typeFlags(typeId) & QMetaType::IsEnumeration) { + const auto metaObject = QMetaType::metaObjectForType(typeId); + const auto className = metaObject->className(); + const auto enumName = type.mid(static_cast(qstrlen(className)) + 2).toUtf8(); + const auto metaEnum = metaObject->enumerator(metaObject->indexOfEnumerator(enumName)); + const auto enumValue = metaEnum.keyToValue(value.toUtf8()); + variant = QVariant(enumValue); + variant.convert(typeId); + } else { + variant.convert(typeId); + } + node.setParameter(parameterName, variant); + } else { + node.setParameter(parameterName, parameterValue.toVariant()); + } } } diff --git a/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp b/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp index ad76012e2f..4782e40ed8 100644 --- a/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp +++ b/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp @@ -32,6 +32,7 @@ #include #include +#include using QBufferPointer = QSharedPointer; Q_DECLARE_METATYPE(QBufferPointer); @@ -131,7 +132,19 @@ void tst_QShaderNodesLoader::shouldLoadFromJsonStream_data() " \"value\"" " ]," " \"parameters\": {" - " \"name\": \"defaultName\"" + " \"name\": \"defaultName\"," + " \"qualifier\": {" + " \"type\": \"QShaderLanguage::StorageQualifier\"," + " \"value\": \"QShaderLanguage::Uniform\"" + " }," + " \"type\": {" + " \"type\": \"QShaderLanguage::VariableType\"," + " \"value\": \"QShaderLanguage::Vec3\"" + " }," + " \"defaultValue\": {" + " \"type\": \"float\"," + " \"value\": \"1.25\"" + " }" " }," " \"rules\": [" " {" @@ -225,6 +238,9 @@ void tst_QShaderNodesLoader::shouldLoadFromJsonStream_data() createPort(QShaderNodePort::Output, "value") }); inputValue.setParameter("name", "defaultName"); + inputValue.setParameter("qualifier", QVariant::fromValue(QShaderLanguage::Uniform)); + inputValue.setParameter("type", QVariant::fromValue(QShaderLanguage::Vec3)); + inputValue.setParameter("defaultValue", QVariant(1.25f)); inputValue.addRule(openGLES2, QShaderNode::Rule("highp vec3 $value = $name;", QByteArrayList() << "varying highp vec3 $name;")); inputValue.addRule(openGL2, QShaderNode::Rule("vec3 $value = $name;",