From a26275a545fcd9af25a0d507833d48b0f3ec8b3d Mon Sep 17 00:00:00 2001 From: Amr Essam Date: Thu, 17 Aug 2023 18:38:40 +0300 Subject: [PATCH] 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 --- src/plugins/qmldesigner/CMakeLists.txt | 1 + .../effectmaker/compositionnode.cpp | 45 +++++++++++----- .../components/effectmaker/compositionnode.h | 1 + .../components/effectmaker/uniform.cpp | 15 ++++++ .../components/effectmaker/uniform.h | 53 +++++++++++++++++++ 5 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 src/plugins/qmldesigner/components/effectmaker/uniform.cpp create mode 100644 src/plugins/qmldesigner/components/effectmaker/uniform.h diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index ec233e40955..268e40fc8a6 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -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 diff --git a/src/plugins/qmldesigner/components/effectmaker/compositionnode.cpp b/src/plugins/qmldesigner/components/effectmaker/compositionnode.cpp index 7fc4694b718..7f1f84f8d8b 100644 --- a/src/plugins/qmldesigner/components/effectmaker/compositionnode.cpp +++ b/src/plugins/qmldesigner/components/effectmaker/compositionnode.cpp @@ -3,6 +3,8 @@ #include "compositionnode.h" +#include "uniform.h" + #include #include #include @@ -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 diff --git a/src/plugins/qmldesigner/components/effectmaker/compositionnode.h b/src/plugins/qmldesigner/components/effectmaker/compositionnode.h index cc878a428c9..9cb8ae85506 100644 --- a/src/plugins/qmldesigner/components/effectmaker/compositionnode.h +++ b/src/plugins/qmldesigner/components/effectmaker/compositionnode.h @@ -22,6 +22,7 @@ public: private: void parse(const QString &qenPath); + QString codeFromJsonArray(const QJsonArray &codeArray); QString m_name; QString m_fragmentCode; diff --git a/src/plugins/qmldesigner/components/effectmaker/uniform.cpp b/src/plugins/qmldesigner/components/effectmaker/uniform.cpp new file mode 100644 index 00000000000..e4989b8550b --- /dev/null +++ b/src/plugins/qmldesigner/components/effectmaker/uniform.cpp @@ -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 + +namespace QmlDesigner { + +Uniform::Uniform(const QJsonObject &props) +{ + Q_UNUSED(props) +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/effectmaker/uniform.h b/src/plugins/qmldesigner/components/effectmaker/uniform.h new file mode 100644 index 00000000000..e0b48778bd9 --- /dev/null +++ b/src/plugins/qmldesigner/components/effectmaker/uniform.h @@ -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 +#include + +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 +