Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
proceduralskytexturedata_p.h
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5
6//
7// W A R N I N G
8// -------------
9//
10// This file is not part of the Qt API. It exists purely as an
11// implementation detail. This header file may change from version to
12// version without notice, or even be removed.
13//
14// We mean it.
15//
16
17
18#ifndef PROCEDURALSKYTEXTURE_H
19#define PROCEDURALSKYTEXTURE_H
20
21#include <QtQuick3DHelpers/qtquick3dhelpersexports.h>
22#include <QtQuick3D/QQuick3DTextureData>
23#include <QtQml/QQmlEngine>
24
25#include <QtGui/QColor>
26#include <QtCore/QByteArray>
27
29
30class Q_QUICK3DHELPERS_EXPORT ProceduralSkyTextureData : public QQuick3DTextureData
31{
32 Q_OBJECT
33 Q_PROPERTY(QColor skyTopColor READ skyTopColor WRITE setSkyTopColor NOTIFY skyTopColorChanged)
34 Q_PROPERTY(QColor skyHorizonColor READ skyHorizonColor WRITE setSkyHorizonColor NOTIFY skyHorizonColorChanged)
35 Q_PROPERTY(float skyCurve READ skyCurve WRITE setSkyCurve NOTIFY skyCurveChanged)
36 Q_PROPERTY(float skyEnergy READ skyEnergy WRITE setSkyEnergy NOTIFY skyEnergyChanged)
37
38 Q_PROPERTY(QColor groundBottomColor READ groundBottomColor WRITE setGroundBottomColor NOTIFY groundBottomColorChanged)
39 Q_PROPERTY(QColor groundHorizonColor READ groundHorizonColor WRITE setGroundHorizonColor NOTIFY groundHorizonColorChanged)
40 Q_PROPERTY(float groundCurve READ groundCurve WRITE setGroundCurve NOTIFY groundCurveChanged)
41 Q_PROPERTY(float groundEnergy READ groundEnergy WRITE setGroundEnergy NOTIFY groundEnergyChanged)
42
43 Q_PROPERTY(QColor sunColor READ sunColor WRITE setSunColor NOTIFY sunColorChanged)
44 Q_PROPERTY(float sunLatitude READ sunLatitude WRITE setSunLatitude NOTIFY sunLatitudeChanged)
45 Q_PROPERTY(float sunLongitude READ sunLongitude WRITE setSunLongitude NOTIFY sunLongitudeChanged)
46 Q_PROPERTY(float sunAngleMin READ sunAngleMin WRITE setSunAngleMin NOTIFY sunAngleMinChanged)
47 Q_PROPERTY(float sunAngleMax READ sunAngleMax WRITE setSunAngleMax NOTIFY sunAngleMaxChanged)
48 Q_PROPERTY(float sunCurve READ sunCurve WRITE setSunCurve NOTIFY sunCurveChanged)
49 Q_PROPERTY(float sunEnergy READ sunEnergy WRITE setSunEnergy NOTIFY sunEnergyChanged)
50 Q_PROPERTY(SkyTextureQuality textureQuality READ textureQuality WRITE setTextureQuality NOTIFY textureQualityChanged)
51 QML_ELEMENT
52
53public:
54 enum class SkyTextureQuality {
55 SkyTextureQualityLow, // 512
56 SkyTextureQualityMedium, // 1024
57 SkyTextureQualityHigh, // 2048
58 SkyTextureQualityVeryHigh, // 4096
59 };
60 Q_ENUM(SkyTextureQuality)
61
62 ProceduralSkyTextureData();
63 ~ProceduralSkyTextureData();
64
65 QColor skyTopColor() const;
66 QColor skyHorizonColor() const;
67 float skyCurve() const;
68 float skyEnergy() const;
69
70 QColor groundBottomColor() const;
71 QColor groundHorizonColor() const;
72 float groundCurve() const;
73 float groundEnergy() const;
74
75 QColor sunColor() const;
76 float sunLatitude() const;
77 float sunLongitude() const;
78 float sunAngleMin() const;
79 float sunAngleMax() const;
80 float sunCurve() const;
81 float sunEnergy() const;
82
83 SkyTextureQuality textureQuality() const;
84
85public Q_SLOTS:
86 void setSkyTopColor(QColor skyTopColor);
87 void setSkyHorizonColor(QColor skyHorizonColor);
88 void setSkyCurve(float skyCurve);
89 void setSkyEnergy(float skyEnergy);
90
91 void setGroundBottomColor(QColor groundBottomColor);
92 void setGroundHorizonColor(QColor groundHorizonColor);
93 void setGroundCurve(float groundCurve);
94 void setGroundEnergy(float groundEnergy);
95
96 void setSunColor(QColor sunColor);
97 void setSunLatitude(float sunLatitude);
98 void setSunLongitude(float sunLongitude);
99 void setSunAngleMin(float sunAngleMin);
100 void setSunAngleMax(float sunAngleMax);
101 void setSunCurve(float sunCurve);
102 void setSunEnergy(float sunEnergy);
103
104 void setTextureQuality(SkyTextureQuality textureQuality);
105
106 void generateRGBA16FTexture();
107
108Q_SIGNALS:
109 void skyTopColorChanged(QColor skyTopColor);
110 void skyHorizonColorChanged(QColor skyHorizonColor);
111 void skyCurveChanged(float skyCurve);
112 void skyEnergyChanged(float skyEnergy);
113
114 void groundBottomColorChanged(QColor groundBottomColor);
115 void groundHorizonColorChanged(QColor groundHorizonColor);
116 void groundCurveChanged(float groundCurve);
117 void groundEnergyChanged(float groundEnergy);
118
119 void sunColorChanged(QColor sunColor);
120
121 void sunLatitudeChanged(float sunLatitude);
122 void sunLongitudeChanged(float sunLongitude);
123 void sunAngleMinChanged(float sunAngleMin);
124 void sunAngleMaxChanged(float sunAngleMax);
125 void sunCurveChanged(float sunCurve);
126 void sunEnergyChanged(float sunEnergy);
127
128 void textureQualityChanged(SkyTextureQuality textureQuality);
129
130private:
131
132 struct LinearColor {
133 float r = 0.0f;
134 float g = 0.0f;
135 float b = 0.0f;
136 float a = 0.0f;
137 LinearColor(const QColor &color);
138 LinearColor() {}
139
140 LinearColor interpolate(const LinearColor &color, float value) const;
141 LinearColor blend(const LinearColor &color) const;
142 quint32 toRGBE9995() const;
143 quint32 toRGBA8() const;
144 quint32 toRGBE8() const;
145 };
146
147 QByteArray generateSkyTexture(int width, int height, QByteArray &imageData, bool isRGBE) const;
148 void scheduleTextureUpdate();
149 QColor m_skyTopColor = QColor(165, 214, 241);
150 QColor m_skyHorizonColor = QColor(214, 234, 250);
151 float m_skyCurve = 0.09f;
152 float m_skyEnergy = 1.0f;
153
154 QColor m_groundBottomColor = QColor(40, 47, 54);
155 QColor m_groundHorizonColor = QColor(108, 101, 95);
156 float m_groundCurve = 0.02f;
157 float m_groundEnergy = 1.0f;
158
159 QColor m_sunColor = QColor(255, 255, 255);
160 float m_sunLatitude = 35.0f;
161 float m_sunLongitude = 0.0f;
162 float m_sunAngleMin = 1.0f;
163 float m_sunAngleMax = 100.0f;
164 float m_sunCurve = 0.05f;
165 float m_sunEnergy = 1.0f;
166
167 SkyTextureQuality m_textureQuality = SkyTextureQuality::SkyTextureQualityMedium;
168};
169
170QT_END_NAMESPACE
171
172#endif // PROCEDURALSKYTEXTURE_H
Combined button and popup list for selecting options.