QmlDesigner: Add some qen parsing functionality

Added Uniform class to store composition node uniforms for shader and ui usage
Implement some shader code parsing
create unique id for composition nodes (basic implementation)

Change-Id: I07ece2058e158b01590bd9b995c179275f489a1c
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Amr Essam
2023-08-17 18:38:40 +03:00
committed by Amr Elsayed
parent 85bf537fc0
commit a26275a545
5 changed files with 102 additions and 13 deletions

View File

@@ -716,6 +716,7 @@ extend_qtc_plugin(QmlDesigner
effectnode.cpp effectnode.h
effectnodescategory.cpp effectnodescategory.h
compositionnode.cpp compositionnode.h
uniform.cpp uniform.h
)
extend_qtc_plugin(QmlDesigner

View File

@@ -3,6 +3,8 @@
#include "compositionnode.h"
#include "uniform.h"
#include <QFileInfo>
#include <QJsonArray>
#include <QJsonDocument>
@@ -53,29 +55,46 @@ void CompositionNode::parse(const QString &qenPath)
QJsonObject json = jsonDoc.object().value("QEN").toObject();
m_name = json.value("name").toString();
int version = -1;
if (json.contains("version"))
version = json["version"].toInt(-1);
if (version != 1) {
QString error = QString("Error: Unknown effect version (%1)").arg(version);
qWarning() << qPrintable(error);
return;
}
m_name = json.value("name").toString(); //TODO: there is a difference between name and type
m_description = json.value("description").toString();
m_fragmentCode = codeFromJsonArray(json.value("fragmentCode").toArray());
m_vertexCode = codeFromJsonArray(json.value("vertexCode").toArray());
// parse properties
QJsonArray properties = json.value("properties").toArray();
for (const auto /*QJsonValueRef*/ &prop : properties) {
QJsonObject propObj = prop.toObject();
Uniform *u = new Uniform(propObj);
Q_UNUSED(u)
// TODO
propObj.value("name");
propObj.value("type");
propObj.value("defaultValue");
propObj.value("description");
// TODO
}
// parse shaders
QJsonArray vertexCode = json.value("vertexCode").toArray();
if (!vertexCode.isEmpty()) {
// TODO
}
QJsonArray fragmentCode = json.value("fragmentCode").toArray();
if (!fragmentCode.isEmpty()) {
// TODO
}
}
QString CompositionNode::codeFromJsonArray(const QJsonArray &codeArray)
{
if (codeArray.isEmpty())
return {};
QString codeString;
for (const auto &element : codeArray)
codeString += element.toString() + '\n';
codeString.chop(1); // Remove last '\n'
return codeString;
}
} // namespace QmlDesigner

View File

@@ -22,6 +22,7 @@ public:
private:
void parse(const QString &qenPath);
QString codeFromJsonArray(const QJsonArray &codeArray);
QString m_name;
QString m_fragmentCode;

View File

@@ -0,0 +1,15 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "uniform.h"
#include <QJsonObject>
namespace QmlDesigner {
Uniform::Uniform(const QJsonObject &props)
{
Q_UNUSED(props)
}
} // namespace QmlDesigner

View File

@@ -0,0 +1,53 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <QObject>
#include <QVariant>
namespace QmlDesigner {
class Uniform : public QObject
{
Q_OBJECT
public:
enum class Type
{
Bool,
Int,
Float,
Vec2,
Vec3,
Vec4,
Color,
Sampler,
Define
};
Uniform(const QJsonObject &props);
// TODO: setters & getters
private:
Type m_type;
QVariant m_value;
QVariant m_defaultValue;
QVariant m_minValue;
QVariant m_maxValue;
QString m_name;
QString m_description;
QString m_customValue;
bool m_useCustomValue = false;
bool m_visible = true;
bool m_enableMipmap = false;
bool operator==(const Uniform& rhs) const noexcept
{
return this->m_name == rhs.m_name;
}
};
} // namespace QmlDesigner