Qt Quick 3D - Procedural Texture Example

// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

#ifndef GRADIENTTEXTURE_H
#define GRADIENTTEXTURE_H

#include <QtQuick3D/QQuick3DTextureData>

#include <QtGui/QColor>

class GradientTexture : public QQuick3DTextureData
{
    Q_OBJECT
    Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightChanged)
    Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged)
    Q_PROPERTY(QColor startColor READ startColor WRITE setStartColor NOTIFY startColorChanged)
    Q_PROPERTY(QColor endColor READ endColor WRITE setEndColor NOTIFY endColorChanged)
    QML_NAMED_ELEMENT(GradientTexture)

public:
    GradientTexture();

    int height() const;
    int width() const;
    QColor startColor() const;
    QColor endColor() const;

public Q_SLOTS:
    void setHeight(int height);
    void setWidth(int width);
    void setStartColor(QColor startColor);
    void setEndColor(QColor endColor);

Q_SIGNALS:
    void heightChanged(int height);
    void widthChanged(int width);
    void startColorChanged(QColor startColor);
    void endColorChanged(QColor endColor);

private:
    void updateTexture();
    QByteArray generateTexture();

    static QColor linearInterpolate(const QColor &color1, const QColor &color2, float value);

    int m_height = 256;
    int m_width = 256;
    QColor m_startColor = QColor(QStringLiteral("#d4fc79"));
    QColor m_endColor = QColor(QStringLiteral("#96e6a1"));
};

#endif // GRADIENTTEXTURE_H