Revision control
Copy as Markdown
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#ifndef PROCEDURALSKYTEXTURE_H
#define PROCEDURALSKYTEXTURE_H
#include <QtQuick3DHelpers/qtquick3dhelpersexports.h>
#include <QtQuick3D/QQuick3DTextureData>
#include <QtQml/QQmlEngine>
#include <QtGui/QColor>
#include <QtCore/QByteArray>
QT_BEGIN_NAMESPACE
class Q_QUICK3DHELPERS_EXPORT ProceduralSkyTextureData : public QQuick3DTextureData
{
Q_OBJECT
Q_PROPERTY(QColor skyTopColor READ skyTopColor WRITE setSkyTopColor NOTIFY skyTopColorChanged)
Q_PROPERTY(QColor skyHorizonColor READ skyHorizonColor WRITE setSkyHorizonColor NOTIFY skyHorizonColorChanged)
Q_PROPERTY(float skyCurve READ skyCurve WRITE setSkyCurve NOTIFY skyCurveChanged)
Q_PROPERTY(float skyEnergy READ skyEnergy WRITE setSkyEnergy NOTIFY skyEnergyChanged)
Q_PROPERTY(QColor groundBottomColor READ groundBottomColor WRITE setGroundBottomColor NOTIFY groundBottomColorChanged)
Q_PROPERTY(QColor groundHorizonColor READ groundHorizonColor WRITE setGroundHorizonColor NOTIFY groundHorizonColorChanged)
Q_PROPERTY(float groundCurve READ groundCurve WRITE setGroundCurve NOTIFY groundCurveChanged)
Q_PROPERTY(float groundEnergy READ groundEnergy WRITE setGroundEnergy NOTIFY groundEnergyChanged)
Q_PROPERTY(QColor sunColor READ sunColor WRITE setSunColor NOTIFY sunColorChanged)
Q_PROPERTY(float sunLatitude READ sunLatitude WRITE setSunLatitude NOTIFY sunLatitudeChanged)
Q_PROPERTY(float sunLongitude READ sunLongitude WRITE setSunLongitude NOTIFY sunLongitudeChanged)
Q_PROPERTY(float sunAngleMin READ sunAngleMin WRITE setSunAngleMin NOTIFY sunAngleMinChanged)
Q_PROPERTY(float sunAngleMax READ sunAngleMax WRITE setSunAngleMax NOTIFY sunAngleMaxChanged)
Q_PROPERTY(float sunCurve READ sunCurve WRITE setSunCurve NOTIFY sunCurveChanged)
Q_PROPERTY(float sunEnergy READ sunEnergy WRITE setSunEnergy NOTIFY sunEnergyChanged)
Q_PROPERTY(SkyTextureQuality textureQuality READ textureQuality WRITE setTextureQuality NOTIFY textureQualityChanged)
QML_ELEMENT
public:
enum class SkyTextureQuality {
SkyTextureQualityLow, // 512
SkyTextureQualityMedium, // 1024
SkyTextureQualityHigh, // 2048
SkyTextureQualityVeryHigh, // 4096
};
Q_ENUM(SkyTextureQuality)
ProceduralSkyTextureData();
~ProceduralSkyTextureData();
QColor skyTopColor() const;
QColor skyHorizonColor() const;
float skyCurve() const;
float skyEnergy() const;
QColor groundBottomColor() const;
QColor groundHorizonColor() const;
float groundCurve() const;
float groundEnergy() const;
QColor sunColor() const;
float sunLatitude() const;
float sunLongitude() const;
float sunAngleMin() const;
float sunAngleMax() const;
float sunCurve() const;
float sunEnergy() const;
SkyTextureQuality textureQuality() const;
public Q_SLOTS:
void setSkyTopColor(QColor skyTopColor);
void setSkyHorizonColor(QColor skyHorizonColor);
void setSkyCurve(float skyCurve);
void setSkyEnergy(float skyEnergy);
void setGroundBottomColor(QColor groundBottomColor);
void setGroundHorizonColor(QColor groundHorizonColor);
void setGroundCurve(float groundCurve);
void setGroundEnergy(float groundEnergy);
void setSunColor(QColor sunColor);
void setSunLatitude(float sunLatitude);
void setSunLongitude(float sunLongitude);
void setSunAngleMin(float sunAngleMin);
void setSunAngleMax(float sunAngleMax);
void setSunCurve(float sunCurve);
void setSunEnergy(float sunEnergy);
void setTextureQuality(SkyTextureQuality textureQuality);
void generateRGBA16FTexture();
Q_SIGNALS:
void skyTopColorChanged(QColor skyTopColor);
void skyHorizonColorChanged(QColor skyHorizonColor);
void skyCurveChanged(float skyCurve);
void skyEnergyChanged(float skyEnergy);
void groundBottomColorChanged(QColor groundBottomColor);
void groundHorizonColorChanged(QColor groundHorizonColor);
void groundCurveChanged(float groundCurve);
void groundEnergyChanged(float groundEnergy);
void sunColorChanged(QColor sunColor);
void sunLatitudeChanged(float sunLatitude);
void sunLongitudeChanged(float sunLongitude);
void sunAngleMinChanged(float sunAngleMin);
void sunAngleMaxChanged(float sunAngleMax);
void sunCurveChanged(float sunCurve);
void sunEnergyChanged(float sunEnergy);
void textureQualityChanged(SkyTextureQuality textureQuality);
private:
struct LinearColor {
float r = 0.0f;
float g = 0.0f;
float b = 0.0f;
float a = 0.0f;
LinearColor(const QColor &color);
LinearColor() {}
LinearColor interpolate(const LinearColor &color, float value) const;
LinearColor blend(const LinearColor &color) const;
quint32 toRGBE9995() const;
quint32 toRGBA8() const;
quint32 toRGBE8() const;
};
QByteArray generateSkyTexture(int width, int height, QByteArray &imageData, bool isRGBE) const;
void scheduleTextureUpdate();
QColor m_skyTopColor = QColor(165, 214, 241);
QColor m_skyHorizonColor = QColor(214, 234, 250);
float m_skyCurve = 0.09f;
float m_skyEnergy = 1.0f;
QColor m_groundBottomColor = QColor(40, 47, 54);
QColor m_groundHorizonColor = QColor(108, 101, 95);
float m_groundCurve = 0.02f;
float m_groundEnergy = 1.0f;
QColor m_sunColor = QColor(255, 255, 255);
float m_sunLatitude = 35.0f;
float m_sunLongitude = 0.0f;
float m_sunAngleMin = 1.0f;
float m_sunAngleMax = 100.0f;
float m_sunCurve = 0.05f;
float m_sunEnergy = 1.0f;
SkyTextureQuality m_textureQuality = SkyTextureQuality::SkyTextureQualityMedium;
};
QT_END_NAMESPACE
#endif // PROCEDURALSKYTEXTURE_H