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
97
98
99
100
101
102
103
104
105
106
107
108
111
112
113
114
115
116
117
118
119
120
121
122
123
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
144
145
146
147
148
149
150
151
152
153
154
155
156
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
184QQuick3DSkyMaterial::QQuick3DSkyMaterial(QQuick3DObject *parent)
185 : QQuick3DObject(parent), QQuick3DPropertyChangedTracker(
this, QQuick3DSuperClassInfo<QQuick3DSkyMaterial>())
189int QQuick3DSkyMaterial::radianceMapSize()
const
191 return m_radianceMapSize;
194QSSGRenderGraphObject *QQuick3DSkyMaterial::updateSpatialNode(QSSGRenderGraphObject *node)
196 QSSGRenderSkyMaterial *material =
static_cast<QSSGRenderSkyMaterial *>(node);
198 material =
new QSSGRenderSkyMaterial;
199 material->isDirty =
true;
204 if (material->radianceMapSize != m_radianceMapSize || (m_dirtyFlag & (Dirty::FragmentShader | Dirty::TrackedProperty))) {
205 material->isDirty =
true;
208 material->radianceMapSize = m_radianceMapSize;
209 material->enableIBL = m_enableIBL;
210 material->iblSampleCount = m_iblSampleCount;
215 material->iblSamplesPerFrame = (m_iblRenderFrames <= 1) ? 0 : (m_iblSampleCount + m_iblRenderFrames - 1) / m_iblRenderFrames;
217 if (m_dirtyFlag & Dirty::FragmentShader) {
218 const QQmlContext *context = qmlContext(
this);
219 material->fragmentShaderSource = !m_fragmentShaderCode.isEmpty() ? m_fragmentShaderCode.toUtf8()
220 : !m_fragmentShader.isEmpty() ? QSSGShaderUtils::resolveShader(m_fragmentShader, context, material->shaderPathKey)
222 material->isFragmentShaderDirty =
true;
225 if (m_dirtyFlag & Dirty::TrackedProperty) {
226 material->propertyUniforms = extractProperties();
231 return QQuick3DObject::updateSpatialNode(material);
234void QQuick3DSkyMaterial::markTrackedPropertyDirty(QMetaProperty property, DirtyPropertyHint hint)
238 markDirty(Dirty::TrackedProperty);
241void QQuick3DSkyMaterial::markDirty(Dirty v)
247void QQuick3DSkyMaterial::setRadianceMapSize(
int radianceMapSize)
252 const int upper = qNextPowerOfTwo(qMax(1, radianceMapSize));
253 const int lower = upper >> 1;
254 radianceMapSize = (radianceMapSize - lower < upper - radianceMapSize) ? lower : upper;
255 radianceMapSize = qBound(8, radianceMapSize, 2048);
256 if (m_radianceMapSize == radianceMapSize)
259 m_radianceMapSize = radianceMapSize;
260 emit radianceMapSizeChanged();
264QUrl QQuick3DSkyMaterial::fragmentShader()
const
266 return m_fragmentShader;
269void QQuick3DSkyMaterial::setFragmentShader(
const QUrl &newFragmentShader)
271 if (m_fragmentShader == newFragmentShader)
273 m_fragmentShader = newFragmentShader;
274 emit fragmentShaderChanged();
275 markDirty(Dirty::FragmentShader);
278QString QQuick3DSkyMaterial::fragmentShaderCode()
const
280 return m_fragmentShaderCode;
283void QQuick3DSkyMaterial::setFragmentShaderCode(
const QString &newFragmentShaderCode)
285 if (m_fragmentShaderCode == newFragmentShaderCode)
287 m_fragmentShaderCode = newFragmentShaderCode;
288 emit fragmentShaderCodeChanged();
289 markDirty(Dirty::FragmentShader);
292bool QQuick3DSkyMaterial::enableIBL()
const
297void QQuick3DSkyMaterial::setEnableIBL(
bool newEnableIBL)
299 if (m_enableIBL == newEnableIBL)
301 m_enableIBL = newEnableIBL;
302 emit enableIBLChanged();
306int QQuick3DSkyMaterial::iblSampleCount()
const
308 return m_iblSampleCount;
311void QQuick3DSkyMaterial::setIblSampleCount(
int newIblSampleCount)
313 const int clamped = qBound(1, newIblSampleCount, 1024);
314 if (m_iblSampleCount == clamped)
316 m_iblSampleCount = clamped;
317 emit iblSampleCountChanged();
321int QQuick3DSkyMaterial::iblRenderFrames()
const
323 return m_iblRenderFrames;
326void QQuick3DSkyMaterial::setIblRenderFrames(
int newIblRenderFrames)
328 const int clamped = qMax(1, newIblRenderFrames);
329 if (m_iblRenderFrames == clamped)
331 m_iblRenderFrames = clamped;
332 emit iblRenderFramesChanged();