5#include <QtQuick3D/private/qquick3dskymaterial_p.h>
6#include <QtQuick3D/private/qquick3dobject_p.h>
8#include <QtQuick3DRuntimeRender/private/qssgrenderskymaterial_p.h>
10#include <QtCore/qmath.h>
11#include <QtGui/qquaternion.h>
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
107
108
109
110
111
112
113
114
115
116
117
118
121
122
123
124
125
126
127
128
129
130
131
132
133
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
221QQuick3DSkyMaterial::QQuick3DSkyMaterial(QQuick3DObject *parent)
222 : QQuick3DObject(parent), QQuick3DPropertyChangedTracker(
this, QQuick3DSuperClassInfo<QQuick3DSkyMaterial>())
226int QQuick3DSkyMaterial::radianceMapSize()
const
228 return m_radianceMapSize;
231QSSGRenderGraphObject *QQuick3DSkyMaterial::updateSpatialNode(QSSGRenderGraphObject *node)
233 QSSGRenderSkyMaterial *material =
static_cast<QSSGRenderSkyMaterial *>(node);
235 material =
new QSSGRenderSkyMaterial;
236 material->isDirty =
true;
241 if (material->radianceMapSize != m_radianceMapSize || (m_dirtyFlag & (Dirty::FragmentShader | Dirty::TrackedProperty))) {
242 material->isDirty =
true;
245 material->radianceMapSize = m_radianceMapSize;
246 material->enableIBL = m_enableIBL;
247 material->iblSampleCount = m_iblSampleCount;
252 material->iblSamplesPerFrame = (m_iblRenderFrames <= 1) ? 0 : (m_iblSampleCount + m_iblRenderFrames - 1) / m_iblRenderFrames;
253 material->iblRenderFrames = m_iblRenderFrames;
254 material->skyboxMode =
static_cast<QSSGRenderSkyMaterial::SkyboxMode>(m_skyboxMode);
256 if (m_dirtyFlag & Dirty::FragmentShader) {
257 const QQmlContext *context = qmlContext(
this);
258 material->fragmentShaderSource = !m_fragmentShaderCode.isEmpty() ? m_fragmentShaderCode.toUtf8()
259 : !m_fragmentShader.isEmpty() ? QSSGShaderUtils::resolveShader(m_fragmentShader, context, material->shaderPathKey)
261 material->isFragmentShaderDirty =
true;
262 material->isBackgroundShaderDirty =
true;
265 if (m_dirtyFlag & Dirty::TrackedProperty) {
266 material->propertyUniforms = extractProperties();
271 return QQuick3DObject::updateSpatialNode(material);
274void QQuick3DSkyMaterial::markTrackedPropertyDirty(QMetaProperty property, DirtyPropertyHint hint)
278 markDirty(Dirty::TrackedProperty);
281void QQuick3DSkyMaterial::markDirty(Dirty v)
287void QQuick3DSkyMaterial::setRadianceMapSize(
int radianceMapSize)
292 const int upper = qNextPowerOfTwo(qMax(1, radianceMapSize));
293 const int lower = upper >> 1;
294 radianceMapSize = (radianceMapSize - lower < upper - radianceMapSize) ? lower : upper;
295 radianceMapSize = qBound(8, radianceMapSize, 2048);
296 if (m_radianceMapSize == radianceMapSize)
299 m_radianceMapSize = radianceMapSize;
300 emit radianceMapSizeChanged();
304QUrl QQuick3DSkyMaterial::fragmentShader()
const
306 return m_fragmentShader;
309void QQuick3DSkyMaterial::setFragmentShader(
const QUrl &newFragmentShader)
311 if (m_fragmentShader == newFragmentShader)
313 m_fragmentShader = newFragmentShader;
314 emit fragmentShaderChanged();
315 markDirty(Dirty::FragmentShader);
318QString QQuick3DSkyMaterial::fragmentShaderCode()
const
320 return m_fragmentShaderCode;
323void QQuick3DSkyMaterial::setFragmentShaderCode(
const QString &newFragmentShaderCode)
325 if (m_fragmentShaderCode == newFragmentShaderCode)
327 m_fragmentShaderCode = newFragmentShaderCode;
328 emit fragmentShaderCodeChanged();
329 markDirty(Dirty::FragmentShader);
332bool QQuick3DSkyMaterial::enableIBL()
const
337void QQuick3DSkyMaterial::setEnableIBL(
bool newEnableIBL)
339 if (m_enableIBL == newEnableIBL)
341 m_enableIBL = newEnableIBL;
342 emit enableIBLChanged();
346int QQuick3DSkyMaterial::iblSampleCount()
const
348 return m_iblSampleCount;
351void QQuick3DSkyMaterial::setIblSampleCount(
int newIblSampleCount)
353 const int clamped = qBound(1, newIblSampleCount, 1024);
354 if (m_iblSampleCount == clamped)
356 m_iblSampleCount = clamped;
357 emit iblSampleCountChanged();
361int QQuick3DSkyMaterial::iblRenderFrames()
const
363 return m_iblRenderFrames;
366void QQuick3DSkyMaterial::setIblRenderFrames(
int newIblRenderFrames)
368 const int clamped = qMax(0, newIblRenderFrames);
369 if (m_iblRenderFrames == clamped)
371 m_iblRenderFrames = clamped;
372 emit iblRenderFramesChanged();
376QQuick3DSkyMaterial::SkyboxMode QQuick3DSkyMaterial::skyboxMode()
const
381void QQuick3DSkyMaterial::setSkyboxMode(SkyboxMode skyboxMode)
383 if (m_skyboxMode == skyboxMode)
385 m_skyboxMode = skyboxMode;
386 emit skyboxModeChanged();