// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef UNIFORMMODEL_H #define UNIFORMMODEL_H #include #include #include #include #include #include class EffectManager; class UniformModel : public QAbstractListModel { Q_OBJECT public: struct Uniform { enum class Type { Bool, Int, Float, Vec2, Vec3, Vec4, Color, Sampler, Define }; Type type; QVariant value; QVariant defaultValue; QVariant minValue; QVariant maxValue; QByteArray name; QString description; QString customValue; bool useCustomValue = false; bool visible = true; bool exportProperty = true; bool canMoveUp = false; bool canMoveDown = false; bool enableMipmap = false; bool exportImage = true; // The effect node which owns this uniform int nodeId = -1; bool operator==(const Uniform& rhs) const noexcept { return this->name == rhs.name; } }; using UniformTable = QList; enum UniformModelRoles { Type = Qt::UserRole + 1, NodeId, Name, Value, DefaultValue, Description, CustomValue, UseCustomValue, MinValue, MaxValue, Visible, ExportProperty, CanMoveUp, CanMoveDown, EnableMipmap, ExportImage }; explicit UniformModel(QObject *parent = nullptr); void setModelData(UniformTable *data); int rowCount(const QModelIndex & = QModelIndex()) const final; QVariant data(const QModelIndex &index, int role) const final; QHash roleNames() const final; bool setData(const QModelIndex &index, const QVariant &value, int role) final; static QVariant getInitializedVariant(Uniform::Type type, bool maxValue = false); static QString getImageElementName(const Uniform &uniform); static QString typeToProperty(Uniform::Type type); QString typeToUniform(Uniform::Type type); QString valueAsString(const Uniform &uniform); QString valueAsVariable(const Uniform &uniform); QString valueAsBinding(const Uniform &uniform); QString variantAsDataString(const Uniform::Type type, const QVariant &variant); QVariant valueStringToVariant(const Uniform::Type type, const QString &value); Q_INVOKABLE bool updateRow(int nodeId, int rowIndex, int type, const QString &id, const QVariant &defaultValue, const QString &description, const QString &customValue, bool useCustomValue, const QVariant &minValue, const QVariant &maxValue, bool enableMipmap, bool exportImage); Q_INVOKABLE void removeRow(int rowIndex, int rows = 1); Q_INVOKABLE bool resetValue(int rowIndex); Q_INVOKABLE bool setImage(int rowIndex, const QVariant &value); Q_INVOKABLE void moveIndex(int rowIndex, int direction); void appendUniform(Uniform uniform); void setUniformValueData(Uniform *uniform, const QString &value, const QString &defaultValue, const QString &minValue, const QString &maxValue); // These convert between uniform type & string name in JSON UniformModel::Uniform::Type typeFromString(const QString &typeString) const; QString stringFromType(Uniform::Type type); Q_SIGNALS: void uniformsChanged(); void qmlComponentChanged(); void addFSCode(const QString &code); private: friend class EffectManager; bool validateUniformName(const QString &uniformName); void updateCanMoveStatus(); UniformTable *m_uniformTable = nullptr; EffectManager *m_effectManager = nullptr; }; #endif // UNIFORMMODEL_H