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 +