QmlDesigner: Add conversion functionality for uniforms and shaders

This includes qml and shader types and properties

Task-number: QDS-10499
Change-Id: I3a81ceb3a9e55280545e3ed498fb1ba0433a58fd
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Amr Essam
2023-08-28 13:30:36 +03:00
committed by Amr Elsayed
parent 2a301d41c4
commit 2d99b07907
4 changed files with 87 additions and 64 deletions

View File

@@ -39,6 +39,11 @@ QObject *CompositionNode::uniformsModel()
return &m_unifomrsModel; return &m_unifomrsModel;
} }
QStringList CompositionNode::requiredNodes() const
{
return m_requiredNodes;
}
void CompositionNode::parse(const QString &qenPath) void CompositionNode::parse(const QString &qenPath)
{ {
@@ -77,8 +82,8 @@ void CompositionNode::parse(const QString &qenPath)
m_vertexCode = EffectUtils::codeFromJsonArray(json.value("vertexCode").toArray()); m_vertexCode = EffectUtils::codeFromJsonArray(json.value("vertexCode").toArray());
// parse properties // parse properties
QJsonArray properties = json.value("properties").toArray(); QJsonArray jsonProps = json.value("properties").toArray();
for (const auto /*QJsonValueRef*/ &prop : properties) for (const auto /*QJsonValueRef*/ &prop : jsonProps)
m_unifomrsModel.addUniform(new Uniform(prop.toObject())); m_unifomrsModel.addUniform(new Uniform(prop.toObject()));
} }

View File

@@ -6,6 +6,7 @@
#include "effectmakeruniformsmodel.h" #include "effectmakeruniformsmodel.h"
#include <QObject> #include <QObject>
#include <QVariant>
namespace QmlDesigner { namespace QmlDesigner {
@@ -27,6 +28,8 @@ public:
QObject *uniformsModel(); QObject *uniformsModel();
QStringList requiredNodes() const;
signals: signals:
void uniformsModelChanged(); void uniformsModelChanged();
@@ -37,6 +40,7 @@ private:
QString m_fragmentCode; QString m_fragmentCode;
QString m_vertexCode; QString m_vertexCode;
QString m_description; QString m_description;
QStringList m_requiredNodes;
EffectMakerUniformsModel m_unifomrsModel; EffectMakerUniformsModel m_unifomrsModel;
}; };

View File

@@ -17,7 +17,7 @@ Uniform::Uniform(const QJsonObject &propObj)
m_name = propObj.value("name").toString(); m_name = propObj.value("name").toString();
m_description = propObj.value("description").toString(); m_description = propObj.value("description").toString();
m_type = typeFromString(propObj.value("type").toString()); m_type = Uniform::typeFromString(propObj.value("type").toString());
defaultValue = propObj.value("defaultValue").toString(); defaultValue = propObj.value("defaultValue").toString();
if (m_type == Type::Sampler) { if (m_type == Type::Sampler) {
@@ -45,29 +45,15 @@ Uniform::Uniform(const QJsonObject &propObj)
m_backendValue->setValue(value); m_backendValue->setValue(value);
} }
QString Uniform::type() const Uniform::Type Uniform::type() const
{ {
if (m_type == Type::Bool) return m_type;
return "bool"; }
if (m_type == Type::Int)
return "int";
if (m_type == Type::Float)
return "float";
if (m_type == Type::Vec2)
return "vec2";
if (m_type == Type::Vec3)
return "vec3";
if (m_type == Type::Vec4)
return "vec4";
if (m_type == Type::Color)
return "color";
if (m_type == Type::Sampler)
return "image";
if (m_type == Type::Define)
return "define";
qWarning() << "Unknown type"; // String representation of the type for qml
return "float"; QString Uniform::typeName() const
{
return Uniform::stringFromType(m_type);
} }
QVariant Uniform::value() const QVariant Uniform::value() const
@@ -153,31 +139,6 @@ QString Uniform::mipmapPropertyName(const QString &name) const
return simplifiedName; return simplifiedName;
} }
Uniform::Type Uniform::typeFromString(const QString &typeString) const
{
if (typeString == "bool")
return Type::Bool;
if (typeString == "int")
return Type::Int;
if (typeString == "float")
return Type::Float;
if (typeString == "vec2")
return Type::Vec2;
if (typeString == "vec3")
return Type::Vec3;
if (typeString == "vec4")
return Type::Vec4;
if (typeString == "color")
return Type::Color;
if (typeString == "image")
return Type::Sampler;
if (typeString == "define")
return Type::Define;
qWarning() << QString("Unknown type: %1").arg(typeString).toLatin1();
return Type::Float;
}
// Returns the boolean value of QJsonValue. It can be either boolean // Returns the boolean value of QJsonValue. It can be either boolean
// (true, false) or string ("true", "false"). Returns the defaultValue // (true, false) or string ("true", "false"). Returns the defaultValue
// if QJsonValue is undefined, empty, or some other type. // if QJsonValue is undefined, empty, or some other type.
@@ -205,17 +166,17 @@ QString Uniform::getResourcePath(const QString &value) const
void Uniform::setValueData(const QString &value, const QString &defaultValue, void Uniform::setValueData(const QString &value, const QString &defaultValue,
const QString &minValue, const QString &maxValue) const QString &minValue, const QString &maxValue)
{ {
m_value = value.isEmpty() ? getInitializedVariant(m_type, false) : valueStringToVariant(m_type, value); m_value = value.isEmpty() ? getInitializedVariant(false) : valueStringToVariant(value);
m_defaultValue = defaultValue.isEmpty() ? getInitializedVariant(m_type, false) m_defaultValue = defaultValue.isEmpty() ? getInitializedVariant(false)
: valueStringToVariant(m_type, defaultValue); : valueStringToVariant(defaultValue);
m_minValue = minValue.isEmpty() ? getInitializedVariant(m_type, false) : valueStringToVariant(m_type, minValue); m_minValue = minValue.isEmpty() ? getInitializedVariant(false) : valueStringToVariant(minValue);
m_maxValue = maxValue.isEmpty() ? getInitializedVariant(m_type, true) : valueStringToVariant(m_type, maxValue); m_maxValue = maxValue.isEmpty() ? getInitializedVariant(true) : valueStringToVariant(maxValue);
} }
// Initialize the value variant with correct type // Initialize the value variant with correct type
QVariant Uniform::getInitializedVariant(Uniform::Type type, bool maxValue) QVariant Uniform::getInitializedVariant(bool maxValue)
{ {
switch (type) { switch (m_type) {
case Uniform::Type::Bool: case Uniform::Type::Bool:
return maxValue ? true : false; return maxValue ? true : false;
case Uniform::Type::Int: case Uniform::Type::Int:
@@ -235,10 +196,10 @@ QVariant Uniform::getInitializedVariant(Uniform::Type type, bool maxValue)
} }
} }
QVariant Uniform::valueStringToVariant(const Uniform::Type type, const QString &value) QVariant Uniform::valueStringToVariant(const QString &value)
{ {
QVariant variant; QVariant variant;
switch (type) { switch (m_type) {
case Type::Bool: case Type::Bool:
variant = (value == "true"); variant = (value == "true");
break; break;
@@ -283,4 +244,54 @@ QVariant Uniform::valueStringToVariant(const Uniform::Type type, const QString &
return variant; return variant;
} }
QString Uniform::stringFromType(Uniform::Type type)
{
if (type == Type::Bool)
return "bool";
else if (type == Type::Int)
return "int";
else if (type == Type::Float)
return "float";
else if (type == Type::Vec2)
return "vec2";
else if (type == Type::Vec3)
return "vec3";
else if (type == Type::Vec4)
return "vec4";
else if (type == Type::Color)
return "color";
else if (type == Type::Sampler)
return "image";
else if (type == Type::Define)
return "define";
qWarning() << QString("Unknown type");
return "float";
}
Uniform::Type Uniform::typeFromString(const QString &typeString)
{
if (typeString == "bool")
return Uniform::Type::Bool;
else if (typeString == "int")
return Uniform::Type::Int;
else if (typeString == "float")
return Uniform::Type::Float;
else if (typeString == "vec2")
return Uniform::Type::Vec2;
else if (typeString == "vec3")
return Uniform::Type::Vec3;
else if (typeString == "vec4")
return Uniform::Type::Vec4;
else if (typeString == "color")
return Uniform::Type::Color;
else if (typeString == "image")
return Uniform::Type::Sampler;
else if (typeString == "define")
return Uniform::Type::Define;
qWarning() << QString("Unknown type: %1").arg(typeString).toLatin1();
return Uniform::Type::Float;
}
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -19,7 +19,7 @@ class Uniform : public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString uniformName MEMBER m_name CONSTANT) Q_PROPERTY(QString uniformName MEMBER m_name CONSTANT)
Q_PROPERTY(QString uniformType READ type CONSTANT) Q_PROPERTY(QString uniformType READ typeName CONSTANT)
Q_PROPERTY(QVariant uniformValue READ value WRITE setValue NOTIFY uniformValueChanged) Q_PROPERTY(QVariant uniformValue READ value WRITE setValue NOTIFY uniformValueChanged)
Q_PROPERTY(QVariant uniformBackendValue READ backendValue NOTIFY uniformBackendValueChanged) Q_PROPERTY(QVariant uniformBackendValue READ backendValue NOTIFY uniformBackendValueChanged)
Q_PROPERTY(QVariant uniformMinValue MEMBER m_minValue CONSTANT) Q_PROPERTY(QVariant uniformMinValue MEMBER m_minValue CONSTANT)
@@ -41,7 +41,8 @@ public:
Uniform(const QJsonObject &props); Uniform(const QJsonObject &props);
QString type() const; Type type() const;
QString typeName() const;
QVariant value() const; QVariant value() const;
void setValue(const QVariant &newValue); void setValue(const QVariant &newValue);
@@ -65,20 +66,22 @@ public:
bool enableMipmap() const; bool enableMipmap() const;
static QString stringFromType(Uniform::Type type);
static Uniform::Type typeFromString(const QString &typeString);
signals: signals:
void uniformValueChanged(); void uniformValueChanged();
void uniformBackendValueChanged(); void uniformBackendValueChanged();
private: private:
QString mipmapPropertyName(const QString &name) const; QString mipmapPropertyName(const QString &name) const;
Uniform::Type typeFromString(const QString &typeString) const;
bool getBoolValue(const QJsonValue &jsonValue, bool defaultValue); bool getBoolValue(const QJsonValue &jsonValue, bool defaultValue);
QString getResourcePath(const QString &value) const; QString getResourcePath(const QString &value) const;
void setValueData(const QString &value, const QString &defaultValue, void setValueData(const QString &value, const QString &defaultValue,
const QString &minValue, const QString &maxValue); const QString &minValue, const QString &maxValue);
QVariant getInitializedVariant(Uniform::Type type, bool maxValue);
QVariant valueStringToVariant(const Uniform::Type type, const QString &value); QVariant getInitializedVariant(bool maxValue);
QVariant valueStringToVariant(const QString &value);
Type m_type; Type m_type;
QVariant m_value; QVariant m_value;