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
80
81
82
83
84
85
86
87
88
89
90
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
118
119
120
121
122
123
124
125
126
127
128
129
132
133
134
135
136
137
138
139
140
141
142
143
144
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
232QQuick3DSkyMaterial::QQuick3DSkyMaterial(QQuick3DObject *parent)
233 : QQuick3DObject(parent), QQuick3DPropertyChangedTracker(
this, QQuick3DSuperClassInfo<QQuick3DSkyMaterial>())
237int QQuick3DSkyMaterial::radianceMapSize()
const
239 return m_radianceMapSize;
242QSSGRenderGraphObject *QQuick3DSkyMaterial::updateSpatialNode(QSSGRenderGraphObject *node)
244 QSSGRenderSkyMaterial *material =
static_cast<QSSGRenderSkyMaterial *>(node);
246 material =
new QSSGRenderSkyMaterial;
247 material->isDirty =
true;
252 if (material->radianceMapSize != m_radianceMapSize || (m_dirtyFlag & (Dirty::FragmentShader | Dirty::TrackedProperty))) {
253 material->isDirty =
true;
256 material->radianceMapSize = m_radianceMapSize;
257 material->enableIBL = m_enableIBL;
258 material->iblSampleCount = m_iblSampleCount;
263 material->iblSamplesPerFrame = (m_iblRenderFrames <= 1) ? 0 : (m_iblSampleCount + m_iblRenderFrames - 1) / m_iblRenderFrames;
264 material->iblRenderFrames = m_iblRenderFrames;
265 material->skyboxMode =
static_cast<QSSGRenderSkyMaterial::SkyboxMode>(m_skyboxMode);
267 if (m_dirtyFlag & Dirty::FragmentShader) {
268 const QQmlContext *context = qmlContext(
this);
269 material->fragmentShaderSource = !m_fragmentShaderCode.isEmpty() ? m_fragmentShaderCode.toUtf8()
270 : !m_fragmentShader.isEmpty() ? QSSGShaderUtils::resolveShader(m_fragmentShader, context, material->shaderPathKey)
272 material->isFragmentShaderDirty =
true;
273 material->isBackgroundShaderDirty =
true;
276 if (m_dirtyFlag & Dirty::TrackedProperty) {
277 material->propertyUniforms = extractProperties();
282 return QQuick3DObject::updateSpatialNode(material);
285void QQuick3DSkyMaterial::markTrackedPropertyDirty(QMetaProperty property, DirtyPropertyHint hint)
289 markDirty(Dirty::TrackedProperty);
292void QQuick3DSkyMaterial::markDirty(Dirty v)
298void QQuick3DSkyMaterial::setRadianceMapSize(
int radianceMapSize)
303 const int upper = qNextPowerOfTwo(qMax(1, radianceMapSize));
304 const int lower = upper >> 1;
305 radianceMapSize = (radianceMapSize - lower < upper - radianceMapSize) ? lower : upper;
306 radianceMapSize = qBound(8, radianceMapSize, 2048);
307 if (m_radianceMapSize == radianceMapSize)
310 m_radianceMapSize = radianceMapSize;
311 emit radianceMapSizeChanged();
315QUrl QQuick3DSkyMaterial::fragmentShader()
const
317 return m_fragmentShader;
320void QQuick3DSkyMaterial::setFragmentShader(
const QUrl &newFragmentShader)
322 if (m_fragmentShader == newFragmentShader)
324 m_fragmentShader = newFragmentShader;
325 emit fragmentShaderChanged();
326 markDirty(Dirty::FragmentShader);
329QString QQuick3DSkyMaterial::fragmentShaderCode()
const
331 return m_fragmentShaderCode;
334void QQuick3DSkyMaterial::setFragmentShaderCode(
const QString &newFragmentShaderCode)
336 if (m_fragmentShaderCode == newFragmentShaderCode)
338 m_fragmentShaderCode = newFragmentShaderCode;
339 emit fragmentShaderCodeChanged();
340 markDirty(Dirty::FragmentShader);
343bool QQuick3DSkyMaterial::enableIBL()
const
348void QQuick3DSkyMaterial::setEnableIBL(
bool newEnableIBL)
350 if (m_enableIBL == newEnableIBL)
352 m_enableIBL = newEnableIBL;
353 emit enableIBLChanged();
357int QQuick3DSkyMaterial::iblSampleCount()
const
359 return m_iblSampleCount;
362void QQuick3DSkyMaterial::setIblSampleCount(
int newIblSampleCount)
364 const int clamped = qBound(1, newIblSampleCount, 1024);
365 if (m_iblSampleCount == clamped)
367 m_iblSampleCount = clamped;
368 emit iblSampleCountChanged();
372int QQuick3DSkyMaterial::iblRenderFrames()
const
374 return m_iblRenderFrames;
377void QQuick3DSkyMaterial::setIblRenderFrames(
int newIblRenderFrames)
379 const int clamped = qMax(0, newIblRenderFrames);
380 if (m_iblRenderFrames == clamped)
382 m_iblRenderFrames = clamped;
383 emit iblRenderFramesChanged();
387QQuick3DSkyMaterial::SkyboxMode QQuick3DSkyMaterial::skyboxMode()
const
392void QQuick3DSkyMaterial::setSkyboxMode(SkyboxMode skyboxMode)
394 if (m_skyboxMode == skyboxMode)
396 m_skyboxMode = skyboxMode;
397 emit skyboxModeChanged();