8#include <QtCore/qfile.h>
9#include <QtQml/qqmlcontext.h>
10#include <QtQml/qqmlfile.h>
16#include <ssg/qssgrenderextensions.h>
17#include <ssg/qquick3dextensionhelpers.h>
19#include <QtQuick3DRuntimeRender/private/qssgrenderimage_p.h>
21#include <QtCore/QLoggingCategory>
25Q_LOGGING_CATEGORY(lcSubRenderPass,
"qt.quick3d.subrenderpass")
28
29
30
31
32
33
34
35
36
37
38
39
40
42
43
44
45
46
47
48
49
50
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
69
70
71
72
73
74
75
76
77
78
79
80
81
82
84
85
86
88
89
90
91
92
95
96
97
98
99
100
101
102
103
104
105
106
107
109
110
111
113
114
115
117
118
119
122
123
124
125
126
127
128
129
130
131
132
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
151
152
153
155
156
157
158
161
162
163
164
165
166
167
168
169
170
171
173
174
175
176
177
178
179
180
181
182
183
185
186
187
188
189
190
191
193
194
195
196
197
198
199
200
201
203
204
205
206
207
209
210
211
212
213
214
216
217
218
219
220
221
222
223
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
243
244
245
246
248
249
250
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
271
272
273
274
275
278
279
280
281
282
283
284
285
286
287
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
316
317
318
319
320
321
324
325
326
327
328
329
330
331
332
333
336
337
338
339
340
343
344
345
346
347
348
351
352
353
354
355
358
359
360
361
362
363
364
365
366
367
368
369
370
371
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
414 QByteArray shaderData;
415 if (resolveShaderOverride(fileUrl, context, shaderData, shaderPathKey))
419 if (!shaderPathKey.isEmpty())
420 shaderPathKey.append(
'>');
422 const QUrl loadUrl = context ? context->resolvedUrl(fileUrl) : fileUrl;
423 const QString filePath = QQmlFile::urlToLocalFileOrQrc(loadUrl);
426 if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
427 shaderPathKey += loadUrl.fileName().toUtf8();
430 qWarning(
"Failed to read shader code from %s", qPrintable(filePath));
563 case QMetaType::Double:
564 case QMetaType::Float:
565 return ShaderType<QMetaType::Double>::name();
566 case QMetaType::Bool:
567 return ShaderType<QMetaType::Bool>::name();
568 case QMetaType::QVector2D:
569 return ShaderType<QMetaType::QVector2D>::name();
570 case QMetaType::QVector3D:
571 return ShaderType<QMetaType::QVector3D>::name();
572 case QMetaType::QVector4D:
573 return ShaderType<QMetaType::QVector4D>::name();
575 return ShaderType<QMetaType::Int>::name();
576 case QMetaType::QColor:
577 return ShaderType<QMetaType::QColor>::name();
578 case QMetaType::QSize:
579 return ShaderType<QMetaType::QSize>::name();
580 case QMetaType::QSizeF:
581 return ShaderType<QMetaType::QSizeF>::name();
582 case QMetaType::QPoint:
583 return ShaderType<QMetaType::QPoint>::name();
584 case QMetaType::QPointF:
585 return ShaderType<QMetaType::QPointF>::name();
586 case QMetaType::QRect:
587 return ShaderType<QMetaType::QRect>::name();
588 case QMetaType::QRectF:
589 return ShaderType<QMetaType::QRectF>::name();
590 case QMetaType::QQuaternion:
591 return ShaderType<QMetaType::QQuaternion>::name();
592 case QMetaType::QMatrix4x4:
593 return ShaderType<QMetaType::QMatrix4x4>::name();
602 case QSSGRenderShaderValue::Float:
603 return ShaderType<QMetaType::Double>::name();
604 case QSSGRenderShaderValue::Boolean:
605 return ShaderType<QMetaType::Bool>::name();
606 case QSSGRenderShaderValue::Integer:
607 return ShaderType<QMetaType::Int>::name();
608 case QSSGRenderShaderValue::Vec2:
609 return ShaderType<QMetaType::QVector2D>::name();
610 case QSSGRenderShaderValue::Vec3:
611 return ShaderType<QMetaType::QVector3D>::name();
612 case QSSGRenderShaderValue::Vec4:
613 return ShaderType<QMetaType::QVector4D>::name();
614 case QSSGRenderShaderValue::Rgba:
615 return ShaderType<QMetaType::QColor>::name();
616 case QSSGRenderShaderValue::Size:
617 return ShaderType<QMetaType::QSize>::name();
618 case QSSGRenderShaderValue::SizeF:
619 return ShaderType<QMetaType::QSizeF>::name();
620 case QSSGRenderShaderValue::Point:
621 return ShaderType<QMetaType::QPoint>::name();
622 case QSSGRenderShaderValue::PointF:
623 return ShaderType<QMetaType::QPointF>::name();
624 case QSSGRenderShaderValue::Rect:
625 return ShaderType<QMetaType::QRect>::name();
626 case QSSGRenderShaderValue::RectF:
627 return ShaderType<QMetaType::QRectF>::name();
628 case QSSGRenderShaderValue::Quaternion:
629 return ShaderType<QMetaType::QQuaternion>::name();
630 case QSSGRenderShaderValue::Matrix4x4:
631 return ShaderType<QMetaType::QMatrix4x4>::name();
640 case QMetaType::Double:
641 case QMetaType::Float:
642 return ShaderType<QMetaType::Double>::type();
643 case QMetaType::Bool:
644 return ShaderType<QMetaType::Bool>::type();
645 case QMetaType::QVector2D:
646 return ShaderType<QMetaType::QVector2D>::type();
647 case QMetaType::QVector3D:
648 return ShaderType<QMetaType::QVector3D>::type();
649 case QMetaType::QVector4D:
650 return ShaderType<QMetaType::QVector4D>::type();
652 return ShaderType<QMetaType::Int>::type();
653 case QMetaType::QColor:
654 return ShaderType<QMetaType::QColor>::type();
655 case QMetaType::QSize:
656 return ShaderType<QMetaType::QSize>::type();
657 case QMetaType::QSizeF:
658 return ShaderType<QMetaType::QSizeF>::type();
659 case QMetaType::QPoint:
660 return ShaderType<QMetaType::QPoint>::type();
661 case QMetaType::QPointF:
662 return ShaderType<QMetaType::QPointF>::type();
663 case QMetaType::QRect:
664 return ShaderType<QMetaType::QRect>::type();
665 case QMetaType::QRectF:
666 return ShaderType<QMetaType::QRectF>::type();
667 case QMetaType::QQuaternion:
668 return ShaderType<QMetaType::QQuaternion>::type();
669 case QMetaType::QMatrix4x4:
670 return ShaderType<QMetaType::QMatrix4x4>::type();
672 return QSSGRenderShaderValue::Unknown;
678 return {std::begin(qssg_metatype_list), std::end(qssg_metatype_list)};
683QQuick3DShaderUtilsBuffer::TextureFormat QQuick3DShaderUtilsBuffer::mapRenderTextureFormat(QSSGRenderTextureFormat::Format fmt)
685 using TextureFormat = QQuick3DShaderUtilsBuffer::TextureFormat;
687 case QSSGRenderTextureFormat::RGBA8:
return TextureFormat::RGBA8;
688 case QSSGRenderTextureFormat::RGBA16F:
return TextureFormat::RGBA16F;
689 case QSSGRenderTextureFormat::RGBA32F:
return TextureFormat::RGBA32F;
690 case QSSGRenderTextureFormat::R8:
return TextureFormat::R8;
691 case QSSGRenderTextureFormat::R16:
return TextureFormat::R16;
692 case QSSGRenderTextureFormat::R16F:
return TextureFormat::R16F;
693 case QSSGRenderTextureFormat::R32F:
return TextureFormat::R32F;
697 return TextureFormat::Unknown;
700QSSGRenderTextureFormat::Format QQuick3DShaderUtilsBuffer::mapTextureFormat(QQuick3DShaderUtilsBuffer::TextureFormat fmt)
702 using TextureFormat = QQuick3DShaderUtilsBuffer::TextureFormat;
704 case TextureFormat::RGBA8:
return QSSGRenderTextureFormat::RGBA8;
705 case TextureFormat::RGBA16F:
return QSSGRenderTextureFormat::RGBA16F;
706 case TextureFormat::RGBA32F:
return QSSGRenderTextureFormat::RGBA32F;
707 case TextureFormat::R8:
return QSSGRenderTextureFormat::R8;
708 case TextureFormat::R16:
return QSSGRenderTextureFormat::R16;
709 case TextureFormat::R16F:
return QSSGRenderTextureFormat::R16F;
710 case TextureFormat::R32F:
return QSSGRenderTextureFormat::R32F;
714 return QSSGRenderTextureFormat::Unknown;
717QQuick3DShaderUtilsBuffer::TextureFormat QQuick3DShaderUtilsBuffer::format()
const
719 return mapRenderTextureFormat(command.m_format.format);
722void QQuick3DShaderUtilsBuffer::setFormat(TextureFormat format)
724 QSSGRenderTextureFormat::Format mappedTextureFormat = mapTextureFormat(format);
725 if (command.m_format == mappedTextureFormat)
728 command.m_format = mappedTextureFormat;
732void QQuick3DShaderUtilsBuffer::setTextureFilterOperation(TextureFilterOperation op)
734 if (command.m_filterOp == QSSGRenderTextureFilterOp(op))
737 command.m_filterOp = QSSGRenderTextureFilterOp(op);
741void QQuick3DShaderUtilsBuffer::setTextureCoordOperation(TextureCoordOperation texCoordOp)
743 if (command.m_texCoordOp == QSSGRenderTextureCoordOp(texCoordOp))
746 command.m_texCoordOp = QSSGRenderTextureCoordOp(texCoordOp);
750void QQuick3DShaderUtilsBuffer::setBufferFlags(AllocateBufferFlagValues flag)
752 if (quint32(command.m_bufferFlags) == quint32(flag))
755 command.m_bufferFlags = quint32(flag);
759QQuick3DShaderUtilsRenderPass::~QQuick3DShaderUtilsRenderPass()
764void QQuick3DShaderUtilsRenderPass::qmlAppendCommand(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list,
765 QQuick3DShaderUtilsRenderCommand *command)
770 QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object);
771 that->m_commands.push_back(command);
772 emit that->changed();
775QQuick3DShaderUtilsRenderCommand *QQuick3DShaderUtilsRenderPass::qmlCommandAt(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list,
778 QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object);
779 return that->m_commands.at(index);
782qsizetype QQuick3DShaderUtilsRenderPass::qmlCommandCount(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list)
784 QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object);
785 return that->m_commands.size();
788void QQuick3DShaderUtilsRenderPass::qmlCommandClear(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list)
790 QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object);
791 that->m_commands.clear();
792 emit that->changed();
795QQmlListProperty<QQuick3DShaderUtilsRenderCommand> QQuick3DShaderUtilsRenderPass::commands()
797 return QQmlListProperty<QQuick3DShaderUtilsRenderCommand>(
this,
799 QQuick3DShaderUtilsRenderPass::qmlAppendCommand,
800 QQuick3DShaderUtilsRenderPass::qmlCommandCount,
801 QQuick3DShaderUtilsRenderPass::qmlCommandAt,
802 QQuick3DShaderUtilsRenderPass::qmlCommandClear);
805void QQuick3DShaderUtilsRenderPass::qmlAppendShader(QQmlListProperty<QQuick3DShaderUtilsShader> *list,
806 QQuick3DShaderUtilsShader *shader)
811 QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object);
820 that->m_shaders.append(shader);
822 connect(shader, &QQuick3DShaderUtilsShader::shaderChanged, that, &QQuick3DShaderUtilsRenderPass::changed);
823 connect(shader, &QQuick3DShaderUtilsShader::stageChanged, that, &QQuick3DShaderUtilsRenderPass::changed);
825 emit that->changed();
828QQuick3DShaderUtilsShader *QQuick3DShaderUtilsRenderPass::qmlShaderAt(QQmlListProperty<QQuick3DShaderUtilsShader> *list,
831 QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object);
832 return that->m_shaders.at(index);
835qsizetype QQuick3DShaderUtilsRenderPass::qmlShaderCount(QQmlListProperty<QQuick3DShaderUtilsShader> *list)
837 QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object);
838 return that->m_shaders.size();
841void QQuick3DShaderUtilsRenderPass::qmlShaderClear(QQmlListProperty<QQuick3DShaderUtilsShader> *list)
843 QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object);
845 for (QQuick3DShaderUtilsShader *shader : that->m_shaders)
846 shader->disconnect(that);
848 that->m_shaders.clear();
850 emit that->changed();
853QQmlListProperty<QQuick3DShaderUtilsShader> QQuick3DShaderUtilsRenderPass::shaders()
855 return QQmlListProperty<QQuick3DShaderUtilsShader>(
this,
857 QQuick3DShaderUtilsRenderPass::qmlAppendShader,
858 QQuick3DShaderUtilsRenderPass::qmlShaderCount,
859 QQuick3DShaderUtilsRenderPass::qmlShaderAt,
860 QQuick3DShaderUtilsRenderPass::qmlShaderClear);
863QQuick3DShaderUtilsTextureInput::QQuick3DShaderUtilsTextureInput(QQuick3DObject *p) : QQuick3DObject(p) {}
865QQuick3DShaderUtilsTextureInput::~QQuick3DShaderUtilsTextureInput()
869void QQuick3DShaderUtilsTextureInput::setTexture(QQuick3DTexture *texture)
871 if (m_texture == texture)
874 QObject *p = parent();
875 while (p !=
nullptr) {
876 if (QQuick3DCustomMaterial *mat = qobject_cast<QQuick3DCustomMaterial *>(p)) {
877 mat->setDynamicTextureMap(
this);
878 QQuick3DObjectPrivate::attachWatcherPriv(mat,
this, &QQuick3DShaderUtilsTextureInput::setTexture, texture, m_texture);
880 }
else if (QQuick3DEffect *efx = qobject_cast<QQuick3DEffect *>(p)) {
881 efx->setDynamicTextureMap(
this);
882 QQuick3DObjectPrivate::attachWatcherPriv(efx,
this, &QQuick3DShaderUtilsTextureInput::setTexture, texture, m_texture);
889 qWarning(
"A TextureInput was defined without a CustomMaterial or Effect ancestor. This should be avoided.");
893 Q_EMIT textureChanged();
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
941
942
943
944
945
948
949
950
951
952
953
954
955
956
957
958
959QQuick3DShaderUtilsRenderablesFilter::RenderableTypes QQuick3DShaderUtilsRenderablesFilter::renderableTypes()
const
961 return static_cast<QQuick3DShaderUtilsRenderablesFilter::RenderableTypes>(command.renderableTypes);
964QQuick3DShaderUtilsRenderablesFilter::~QQuick3DShaderUtilsRenderablesFilter()
969void QQuick3DShaderUtilsRenderablesFilter::setRenderableTypes(RenderableTypes types)
971 command.renderableTypes =
static_cast<QSSGRenderablesFilterCommand::RenderableTypeT>(types.toInt());
974QQuick3DShaderUtilsPipelineStateOverride::~QQuick3DShaderUtilsPipelineStateOverride()
980
981
982
983
984bool QQuick3DShaderUtilsPipelineStateOverride::depthTestEnabled()
const
986 if (command.m_depthTestEnabled)
987 return *command.m_depthTestEnabled;
991void QQuick3DShaderUtilsPipelineStateOverride::setDepthTestEnabled(
bool newDepthTestEnabled)
993 if (command.m_depthTestEnabled && *command.m_depthTestEnabled == newDepthTestEnabled)
995 command.m_depthTestEnabled = newDepthTestEnabled;
996 emit depthTestEnabledChanged();
999void QQuick3DShaderUtilsPipelineStateOverride::resetDepthTestEnabled()
1001 command.m_depthTestEnabled.reset();
1002 emit depthTestEnabledChanged();
1006
1007
1008
1009
1010bool QQuick3DShaderUtilsPipelineStateOverride::depthWriteEnabled()
const
1012 if (command.m_depthWriteEnabled)
1013 return *command.m_depthWriteEnabled;
1017void QQuick3DShaderUtilsPipelineStateOverride::setDepthWriteEnabled(
bool newDepthWriteEnabled)
1019 if (command.m_depthWriteEnabled && *command.m_depthWriteEnabled == newDepthWriteEnabled)
1021 command.m_depthWriteEnabled = newDepthWriteEnabled;
1022 emit depthWriteEnabledChanged();
1025void QQuick3DShaderUtilsPipelineStateOverride::resetDepthWriteEnabled()
1027 command.m_depthWriteEnabled.reset();
1028 emit depthWriteEnabledChanged();
1032
1033
1034
1035
1036bool QQuick3DShaderUtilsPipelineStateOverride::blendEnabled()
const
1038 if (command.m_blendEnabled)
1039 return *command.m_blendEnabled;
1043void QQuick3DShaderUtilsPipelineStateOverride::setBlendEnabled(
bool newBlendEnabled)
1045 if (command.m_blendEnabled && *command.m_blendEnabled == newBlendEnabled)
1047 command.m_blendEnabled = newBlendEnabled;
1048 emit blendEnabledChanged();
1051void QQuick3DShaderUtilsPipelineStateOverride::resetBlendEnabled()
1053 command.m_blendEnabled.reset();
1054 emit blendEnabledChanged();
1058
1059
1060
1061
1062bool QQuick3DShaderUtilsPipelineStateOverride::usesStencilReference()
const
1064 if (command.m_usesStencilReference)
1065 return *command.m_usesStencilReference;
1069void QQuick3DShaderUtilsPipelineStateOverride::setUsesStencilReference(
bool newUsesStencilReference)
1071 if (command.m_usesStencilReference && *command.m_usesStencilReference == newUsesStencilReference)
1073 command.m_usesStencilReference = newUsesStencilReference;
1074 emit usesStencilReferenceChanged();
1077void QQuick3DShaderUtilsPipelineStateOverride::resetUsesStencilReference()
1079 command.m_usesStencilReference.reset();
1080 emit usesStencilReferenceChanged();
1084
1085
1086
1087
1088bool QQuick3DShaderUtilsPipelineStateOverride::usesScissor()
const
1090 if (command.m_usesScissor)
1091 return *command.m_usesScissor;
1095void QQuick3DShaderUtilsPipelineStateOverride::setUsesScissor(
bool newUsesScissor)
1097 if (command.m_usesScissor && *command.m_usesScissor == newUsesScissor)
1099 command.m_usesScissor = newUsesScissor;
1100 emit usesScissorChanged();
1103void QQuick3DShaderUtilsPipelineStateOverride::resetUsesScissor()
1105 command.m_usesScissor.reset();
1106 emit usesScissorChanged();
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122QQuick3DShaderUtilsPipelineStateOverride::CompareOperation QQuick3DShaderUtilsPipelineStateOverride::depthFunction()
const
1124 if (command.m_depthFunction)
1125 return CompareOperation(*command.m_depthFunction);
1126 return CompareOperation::Less;
1129void QQuick3DShaderUtilsPipelineStateOverride::setDepthFunction(CompareOperation newDepthFunction)
1131 if (command.m_depthFunction && *command.m_depthFunction == QRhiGraphicsPipeline::CompareOp(newDepthFunction))
1133 command.m_depthFunction = QRhiGraphicsPipeline::CompareOp(newDepthFunction);
1134 emit depthFunctionChanged();
1137void QQuick3DShaderUtilsPipelineStateOverride::resetDepthFunction()
1139 command.m_depthFunction.reset();
1140 emit depthFunctionChanged();
1144
1145
1146
1147
1148
1149
1150
1151QQuick3DShaderUtilsPipelineStateOverride::CullMode QQuick3DShaderUtilsPipelineStateOverride::cullMode()
const
1153 if (command.m_cullMode)
1154 return CullMode(*command.m_cullMode);
1155 return CullMode::Back;
1158void QQuick3DShaderUtilsPipelineStateOverride::setCullMode(CullMode newCullMode)
1160 if (command.m_cullMode && *command.m_cullMode == QRhiGraphicsPipeline::CullMode(newCullMode))
1162 command.m_cullMode = QRhiGraphicsPipeline::CullMode(newCullMode);
1163 emit cullModeChanged();
1166void QQuick3DShaderUtilsPipelineStateOverride::resetCullMode()
1168 command.m_cullMode.reset();
1169 emit cullModeChanged();
1173
1174
1175
1176
1177
1178
1179QQuick3DShaderUtilsPipelineStateOverride::PolygonMode QQuick3DShaderUtilsPipelineStateOverride::polygonMode()
const
1181 if (command.m_polygonMode)
1182 return PolygonMode(*command.m_polygonMode);
1183 return PolygonMode::Fill;
1186void QQuick3DShaderUtilsPipelineStateOverride::setPolygonMode(PolygonMode newPolygonMode)
1188 if (command.m_polygonMode && *command.m_polygonMode == QRhiGraphicsPipeline::PolygonMode(newPolygonMode))
1190 command.m_polygonMode = QRhiGraphicsPipeline::PolygonMode(newPolygonMode);
1191 emit polygonModeChanged();
1194void QQuick3DShaderUtilsPipelineStateOverride::resetPolygonMode()
1196 command.m_polygonMode.reset();
1197 emit polygonModeChanged();
1201
1202
1203
1204
1205quint32 QQuick3DShaderUtilsPipelineStateOverride::stencilWriteMask()
const
1207 if (command.m_stencilWriteMask)
1208 return *command.m_stencilWriteMask;
1212void QQuick3DShaderUtilsPipelineStateOverride::setStencilWriteMask(quint32 newStencilWriteMask)
1214 if (command.m_stencilWriteMask && *command.m_stencilWriteMask == newStencilWriteMask)
1216 command.m_stencilWriteMask = newStencilWriteMask;
1217 emit stencilWriteMaskChanged();
1220void QQuick3DShaderUtilsPipelineStateOverride::resetStencilWriteMask()
1222 command.m_stencilWriteMask.reset();
1223 emit stencilWriteMaskChanged();
1227
1228
1229
1230
1231quint32 QQuick3DShaderUtilsPipelineStateOverride::stencilReference()
const
1233 if (command.m_stencilReference)
1234 return *command.m_stencilReference;
1238void QQuick3DShaderUtilsPipelineStateOverride::setStencilReference(quint32 newStencilReference)
1240 if (command.m_stencilReference && *command.m_stencilReference == newStencilReference)
1242 command.m_stencilReference = newStencilReference;
1243 emit stencilReferenceChanged();
1246void QQuick3DShaderUtilsPipelineStateOverride::resetStencilReference()
1248 command.m_stencilReference.reset();
1249 emit stencilReferenceChanged();
1253
1254
1255
1256
1257
1258QRectF QQuick3DShaderUtilsPipelineStateOverride::viewport()
const
1260 if (command.m_viewport) {
1261 const QRhiViewport &vp = *command.m_viewport;
1262 return QRectF(vp.viewport()[0], vp.viewport()[1], vp.viewport()[2], vp.viewport()[3]);
1267void QQuick3DShaderUtilsPipelineStateOverride::setViewport(
const QRectF &newViewport)
1269 if (command.m_viewport) {
1270 const QRhiViewport &vp = *command.m_viewport;
1271 if (vp.viewport()[0] == newViewport.x() &&
1272 vp.viewport()[1] == newViewport.y() &&
1273 vp.viewport()[2] == newViewport.width() &&
1274 vp.viewport()[3] == newViewport.height())
1277 command.m_viewport = QRhiViewport(newViewport.x(), newViewport.y(), newViewport.width(), newViewport.height());
1278 emit viewportChanged();
1281void QQuick3DShaderUtilsPipelineStateOverride::resetViewport()
1283 command.m_viewport.reset();
1284 emit viewportChanged();
1288
1289
1290
1291
1292QRect QQuick3DShaderUtilsPipelineStateOverride::scissor()
const
1294 if (command.m_scissor) {
1295 const QRhiScissor &sc = *command.m_scissor;
1296 return QRect(sc.scissor()[0], sc.scissor()[1], sc.scissor()[2], sc.scissor()[3]);
1301void QQuick3DShaderUtilsPipelineStateOverride::setScissor(
const QRect &newScissor)
1303 if (command.m_viewport) {
1304 const QRhiScissor &sc = *command.m_scissor;
1305 if (sc.scissor()[0] == newScissor.x() &&
1306 sc.scissor()[1] == newScissor.y() &&
1307 sc.scissor()[2] == newScissor.width() &&
1308 sc.scissor()[3] == newScissor.height())
1311 command.m_scissor = QRhiScissor(newScissor.x(), newScissor.y(), newScissor.width(), newScissor.height());
1312 emit scissorChanged();
1315void QQuick3DShaderUtilsPipelineStateOverride::resetScissor()
1317 command.m_scissor.reset();
1321
1322
1323
1324
1325QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend0()
const
1327 if (command.m_targetBlend0)
1328 return *command.m_targetBlend0;
1332void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend0(
const QQuick3DRenderPassTargetBlend &newTargetBlend0)
1334 if (command.m_targetBlend0 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend0) == newTargetBlend0)
1337 command.m_targetBlend0 = newTargetBlend0.toRhiTargetBlend();;
1338 emit targetBlend0Changed();
1341void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend0()
1343 command.m_targetBlend0.reset();
1344 emit targetBlend0Changed();
1348
1349
1350
1351
1352QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend1()
const
1354 if (command.m_targetBlend1)
1355 return *command.m_targetBlend1;
1359void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend1(
const QQuick3DRenderPassTargetBlend &newTargetBlend1)
1361 if (command.m_targetBlend1 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend1) == newTargetBlend1)
1363 command.m_targetBlend1 = newTargetBlend1.toRhiTargetBlend();
1364 emit targetBlend1Changed();
1367void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend1()
1369 command.m_targetBlend1.reset();
1370 emit targetBlend1Changed();
1374
1375
1376
1377
1378QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend2()
const
1380 if (command.m_targetBlend2)
1381 return *command.m_targetBlend2;
1385void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend2(
const QQuick3DRenderPassTargetBlend &newTargetBlend2)
1387 if (command.m_targetBlend2 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend2) == newTargetBlend2)
1389 command.m_targetBlend2 = newTargetBlend2.toRhiTargetBlend();
1390 emit targetBlend2Changed();
1393void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend2()
1395 command.m_targetBlend2.reset();
1396 emit targetBlend2Changed();
1400
1401
1402
1403
1404QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend3()
const
1406 if (command.m_targetBlend3)
1407 return *command.m_targetBlend3;
1411void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend3(
const QQuick3DRenderPassTargetBlend &newTargetBlend3)
1413 if (command.m_targetBlend3 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend3) == newTargetBlend3)
1415 command.m_targetBlend3 = newTargetBlend3.toRhiTargetBlend();
1416 emit targetBlend3Changed();
1419void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend3()
1421 command.m_targetBlend3.reset();
1422 emit targetBlend3Changed();
1426
1427
1428
1429
1430QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend4()
const
1432 if (command.m_targetBlend4)
1433 return *command.m_targetBlend4;
1437void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend4(
const QQuick3DRenderPassTargetBlend &newTargetBlend4)
1439 if (command.m_targetBlend4 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend4) == newTargetBlend4)
1441 command.m_targetBlend4 = newTargetBlend4.toRhiTargetBlend();
1442 emit targetBlend4Changed();
1445void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend4()
1447 command.m_targetBlend4.reset();
1448 emit targetBlend4Changed();
1452
1453
1454
1455
1456QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend5()
const
1458 if (command.m_targetBlend5)
1459 return *command.m_targetBlend5;
1463void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend5(
const QQuick3DRenderPassTargetBlend &newTargetBlend5)
1465 if (command.m_targetBlend5 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend5) == newTargetBlend5)
1467 command.m_targetBlend5 = newTargetBlend5.toRhiTargetBlend();
1468 emit targetBlend5Changed();
1471void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend5()
1473 command.m_targetBlend5.reset();
1474 emit targetBlend5Changed();
1478
1479
1480
1481
1482QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend6()
const
1484 if (command.m_targetBlend6)
1485 return *command.m_targetBlend6;
1489void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend6(
const QQuick3DRenderPassTargetBlend &newTargetBlend6)
1491 if (command.m_targetBlend6 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend6) == newTargetBlend6)
1493 command.m_targetBlend6 = newTargetBlend6.toRhiTargetBlend();
1494 emit targetBlend6Changed();
1497void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend6()
1499 command.m_targetBlend6.reset();
1500 emit targetBlend6Changed();
1504
1505
1506
1507
1508QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend7()
const
1510 if (command.m_targetBlend7)
1511 return *command.m_targetBlend7;
1515void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend7(
const QQuick3DRenderPassTargetBlend &newTargetBlend7)
1517 if (command.m_targetBlend7 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend7) == newTargetBlend7)
1519 command.m_targetBlend7 = newTargetBlend7.toRhiTargetBlend();
1520 emit targetBlend7Changed();
1523void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend7()
1525 command.m_targetBlend7.reset();
1526 emit targetBlend7Changed();
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1585QQuick3DShaderUtilsRenderPassTexture::TextureFormat QQuick3DShaderUtilsRenderPassTexture::format()
const
1587 return fromRenderTextureFormat(command->format());
1590QQuick3DShaderUtilsRenderPassTexture::~QQuick3DShaderUtilsRenderPassTexture()
1595void QQuick3DShaderUtilsRenderPassTexture::setFormat(TextureFormat newFormat)
1598 command = std::make_shared<QSSGAllocateTexture>();
1599 command->setFormat(asRenderTextureFormat(newFormat));
1602QSSGRenderTextureFormat QQuick3DShaderUtilsRenderPassTexture::asRenderTextureFormat(TextureFormat fmt)
1605 case TextureFormat::Unknown:
return QSSGRenderTextureFormat::Unknown;
1606 case TextureFormat::RGBA8:
return QSSGRenderTextureFormat::RGBA8;
1607 case TextureFormat::RGBA16F:
return QSSGRenderTextureFormat::RGBA16F;
1608 case TextureFormat::RGBA32F:
return QSSGRenderTextureFormat::RGBA32F;
1609 case TextureFormat::R8:
return QSSGRenderTextureFormat::R8;
1610 case TextureFormat::R16:
return QSSGRenderTextureFormat::R16;
1611 case TextureFormat::R16F:
return QSSGRenderTextureFormat::R16F;
1612 case TextureFormat::R32F:
return QSSGRenderTextureFormat::R32F;
1613 case TextureFormat::Depth16:
return QSSGRenderTextureFormat::Depth16;
1614 case TextureFormat::Depth24:
return QSSGRenderTextureFormat::Depth24;
1615 case TextureFormat::Depth32:
return QSSGRenderTextureFormat::Depth32;
1616 case TextureFormat::Depth24Stencil8:
return QSSGRenderTextureFormat::Depth24Stencil8;
1620 return QSSGRenderTextureFormat::Unknown;
1623QQuick3DShaderUtilsRenderPassTexture::TextureFormat QQuick3DShaderUtilsRenderPassTexture::fromRenderTextureFormat(QSSGRenderTextureFormat fmt)
1625 switch (fmt.format) {
1626 case QSSGRenderTextureFormat::Unknown:
return TextureFormat::Unknown;
1627 case QSSGRenderTextureFormat::RGBA8:
return TextureFormat::RGBA8;
1628 case QSSGRenderTextureFormat::RGBA16F:
return TextureFormat::RGBA16F;
1629 case QSSGRenderTextureFormat::RGBA32F:
return TextureFormat::RGBA32F;
1630 case QSSGRenderTextureFormat::R8:
return TextureFormat::R8;
1631 case QSSGRenderTextureFormat::R16:
return TextureFormat::R16;
1632 case QSSGRenderTextureFormat::R16F:
return TextureFormat::R16F;
1633 case QSSGRenderTextureFormat::R32F:
return TextureFormat::R32F;
1634 case QSSGRenderTextureFormat::Depth16:
return TextureFormat::Depth16;
1635 case QSSGRenderTextureFormat::Depth24:
return TextureFormat::Depth24;
1636 case QSSGRenderTextureFormat::Depth32:
return TextureFormat::Depth32;
1637 case QSSGRenderTextureFormat::Depth24Stencil8:
return TextureFormat::Depth24Stencil8;
1641 return TextureFormat::Unknown;
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1678
1679
1680
1681
1684
1685
1686
1687
1688
1689
1691QQuick3DShaderUtilsRenderPassColorAttachment::~QQuick3DShaderUtilsRenderPassColorAttachment()
1696QByteArray QQuick3DShaderUtilsRenderPassColorAttachment::name()
const
1701void QQuick3DShaderUtilsRenderPassColorAttachment::setName(
const QByteArray &newName)
1706QSSGCommand *QQuick3DShaderUtilsRenderPassColorAttachment::cloneCommand()
1709 QSSGColorAttachment *cmd =
new QSSGColorAttachment(m_name);
1710 cmd->m_textureCmd = target->command;
1717QQuick3DPropertyChangedTracker::~QQuick3DPropertyChangedTracker()
1722std::optional<QQuick3DPropertyChangedTracker::UniformProperty> QQuick3DPropertyChangedTracker::createOrUpdateTrackedProperty(
const QMetaProperty property,
1725 Q_ASSERT(property.isValid());
1727 std::optional<QQuick3DPropertyChangedTracker::UniformProperty> result;
1728 const int propertyIndex = property.propertyIndex();
1730 static auto getSamplerHint = [](
const QQuick3DTexture &texture) {
1731 if (
auto *po = QQuick3DObjectPrivate::get(&texture)) {
1732 if (po->type == QQuick3DObjectPrivate::Type::TextureProvider) {
1733 auto textureProvider =
static_cast<QQuick3DTextureProviderExtension *>(texture.textureProvider());
1734 switch (textureProvider->samplerHint()) {
1735 case QQuick3DTextureProviderExtension::SamplerHint::Sampler2D:
1736 return QSSGRenderSamplerType::Sampler2D;
1737 case QQuick3DTextureProviderExtension::SamplerHint::Sampler2DArray:
1738 return QSSGRenderSamplerType::Sampler2DArray;
1739 case QQuick3DTextureProviderExtension::SamplerHint::Sampler3D:
1740 return QSSGRenderSamplerType::Sampler3D;
1741 case QQuick3DTextureProviderExtension::SamplerHint::SamplerCube:
1742 return QSSGRenderSamplerType::SamplerCube;
1743 case QQuick3DTextureProviderExtension::SamplerHint::SamplerCubeArray:
1744 return QSSGRenderSamplerType::SamplerCubeArray;
1745 case QQuick3DTextureProviderExtension::SamplerHint::SamplerBuffer:
1746 return QSSGRenderSamplerType::SamplerBuffer;
1748 }
else if (po->type == QQuick3DObjectPrivate::Type::ImageCube) {
1749 return QSSGRenderSamplerType::SamplerCube;
1750 }
else if (texture.textureData() && texture.textureData()->depth() > 0) {
1751 return QSSGRenderSamplerType::Sampler3D;
1755 return QSSGRenderSamplerType::Sampler2D;
1758 const auto addTextureToUniforms =
1759 [&](
const char *name, QQuick3DTexture *texture,
int propertyIndex) -> QQuick3DPropertyChangedTracker::UniformProperty {
1760 QSSGRenderImage *ri =
static_cast<QSSGRenderImage *>(QQuick3DObjectPrivate::get(texture)->spatialNode);
1761 auto samplerName = QSSGBaseTypeHelpers::toString(getSamplerHint(*texture));
1763 QObject::connect(texture, &QQuick3DTexture::textureProviderChanged, m_owner, [
this, property, texture]() {
1764 addPropertyWatcher(property, DirtyPropertyHint::Reference, texture);
1768 return UniformProperty(name, samplerName, QVariant::fromValue(ri), QSSGRenderShaderValue::Texture, propertyIndex);
1772 const auto addTextureInputWatchers = [&](QMetaProperty property, QQuick3DShaderUtilsTextureInput *textureInput) {
1773 QObject::connect(textureInput, &QQuick3DShaderUtilsTextureInput::enabledChanged, m_owner, [
this, property, textureInput]() {
1774 addPropertyWatcher(property, DirtyPropertyHint::Reference, textureInput);
1776 QObject::connect(textureInput, &QQuick3DShaderUtilsTextureInput::textureChanged, m_owner, [
this, property, textureInput]() {
1777 addPropertyWatcher(property, DirtyPropertyHint::Reference, textureInput);
1781 const char *name = property.name();
1782 QMetaType propType = property.metaType();
1783 QVariant propValue = property.read(m_owner);
1784 if (propType == QMetaType(QMetaType::QVariant))
1785 propType = propValue.metaType();
1787 const auto type = QSSGShaderUtils::uniformType(propType);
1788 if (type != QSSGRenderShaderValue::Unknown) {
1789 result = UniformProperty(name, QSSGShaderUtils::uniformTypeName(propType), propValue, QSSGShaderUtils::uniformType(propType), propertyIndex);
1791 addPropertyWatcher(property, DirtyPropertyHint::Value);
1793 if (propType.id() >= QMetaType::User) {
1794 if (propType.id() == qMetaTypeId<QQuick3DTexture *>()) {
1795 if (QQuick3DTexture *texture = property.read(m_owner).value<QQuick3DTexture *>()) {
1796 result = addTextureToUniforms(name, texture, propertyIndex);
1798 addPropertyWatcher(property, DirtyPropertyHint::Reference, texture);
1800 }
else if (propType.id() == qMetaTypeId<QQuick3DShaderUtilsTextureInput *>()) {
1801 if (QQuick3DShaderUtilsTextureInput *textureInput = property.read(m_owner).value<QQuick3DShaderUtilsTextureInput *>();
1802 textureInput && textureInput->texture()) {
1803 result = addTextureToUniforms(property.name(), textureInput->texture(), propertyIndex);
1805 addTextureInputWatchers(property, textureInput);
1806 addPropertyWatcher(property, DirtyPropertyHint::Reference, textureInput);
1810 }
else if (propType == QMetaType(QMetaType::QObjectStar)) {
1811 if (QQuick3DTexture *texture = qobject_cast<QQuick3DTexture *>(propValue.value<QObject *>())) {
1812 result = addTextureToUniforms(name, texture, propertyIndex);
1814 addPropertyWatcher(property, DirtyPropertyHint::Reference, texture);
1815 }
else if (QQuick3DShaderUtilsTextureInput *textureInput = qobject_cast<QQuick3DShaderUtilsTextureInput *>(
1816 propValue.value<QObject *>());
1817 textureInput && textureInput->texture()) {
1818 result = addTextureToUniforms(property.name(), textureInput->texture(), propertyIndex);
1820 addTextureInputWatchers(property, textureInput);
1821 addPropertyWatcher(property, DirtyPropertyHint::Reference, textureInput);
1830QList<QQuick3DPropertyChangedTracker::UniformProperty> QQuick3DPropertyChangedTracker::extractProperties()
1832 if (!m_dirtyProperties.empty()) {
1833 for (
int propertyIndex : std::as_const(m_dirtyProperties)) {
1834 auto it = std::lower_bound(m_propertyList.begin(),
1835 m_propertyList.end(),
1837 [](
const UniformProperty &p,
int index) {
return p.pid < index; });
1838 if (it == m_propertyList.end()) {
1843 QMetaProperty property = m_owner->metaObject()->property(propertyIndex);
1844 if (Q_UNLIKELY(!property.isValid())) {
1845 m_propertyList.erase(it);
1849 if (
auto trackedProperty = createOrUpdateTrackedProperty(property,
false); trackedProperty.has_value())
1850 *it = *trackedProperty;
1852 m_propertyList.erase(it);
1854 m_dirtyProperties.clear();
1858 return m_propertyList;
1860 auto metaObject = m_owner->metaObject();
1863 const int propCount = metaObject->propertyCount();
1864 int propOffset = metaObject->propertyOffset();
1865 m_propertyList.reserve(propCount);
1869 const QMetaObject *superClass = metaObject->superClass();
1870 while (superClass && qstrcmp(superClass->className(), m_superClassName) != 0) {
1871 propOffset = superClass->propertyOffset();
1872 superClass = superClass->superClass();
1875 for (
int i = propOffset; i != propCount; ++i) {
1876 const QMetaProperty property = metaObject->property(i);
1877 if (Q_UNLIKELY(!property.isValid()))
1879 if (
auto uniformProperty = createOrUpdateTrackedProperty(property,
true); uniformProperty.has_value()) {
1880 m_propertyList.push_back(*uniformProperty);
1884 m_dirtyProperties.reserve(m_propertyList.size());
1887 return m_propertyList;
1890void QQuick3DPropertyChangedTracker::addPropertyWatcher(QMetaProperty property, DirtyPropertyHint hint, QQuick3DObject *object)
1892 if (property.isValid() && property.hasNotifySignal()) {
1894 const auto pid = property.propertyIndex();
1895 Q_ASSERT(pid != -1);
1896 auto it = m_trackedProperties.find(pid);
1897 const bool found = (it != m_trackedProperties.end());
1898 QQuick3DObject *oldObj =
nullptr;
1900 QQuick3DPropertyWatcher *watcher =
new QQuick3DPropertyWatcher(
this, property);
1901 it = m_trackedProperties.insert(pid, Tracked { watcher, object, pid });
1903 oldObj = it->object;
1904 it->object = object;
1907 if (hint == DirtyPropertyHint::Reference) {
1908 const auto &sm = QQuick3DObjectPrivate::get(m_owner)->sceneManager;
1911 const bool changed = (oldObj != object);
1914 if (changed && oldObj) {
1915 QQuick3DObjectPrivate::get(oldObj)->derefSceneManager();
1916 QObject::disconnect(oldObj, &QObject::destroyed, m_owner,
nullptr);
1920 if (changed && object) {
1921 QQuick3DObjectPrivate::get(object)->refSceneManager(*sm);
1922 QObject::connect(object, &QObject::destroyed, m_owner, [
this, property](QObject *obj) {
1924 addPropertyWatcher(property, DirtyPropertyHint::Reference,
nullptr);
1929 m_dirtyProperties.push_back(property.propertyIndex());
1930 markTrackedPropertyDirty(property, hint);
1934void QQuick3DPropertyChangedTracker::markTrackedPropertyDirty(QMetaProperty property, DirtyPropertyHint hint)
1938 QSSG_CHECK_X(
false,
"QQuick3DPropertyChangedTracker::onPropertyDirty implementation missing");
1942 : m_tracker(tracker)
1943 , m_property(property)
1945 Q_ASSERT(tracker !=
nullptr);
1946 Q_ASSERT(property.isValid() && property.hasNotifySignal());
1948 const bool isPointerType = (property.metaType().flags().testFlag(QMetaType::IsPointer));
1950 if (!isPointerType) {
1952 const auto idx = staticMetaObject.indexOfSlot(
"onValuePropertyChanged()");
1953 if (QSSG_GUARD_X(idx != -1,
"Method not found!")) {
1954 auto onPropertyChangedMethod = staticMetaObject.method(idx);
1955 connect(m_tracker->m_owner, property.notifySignal(),
this, onPropertyChangedMethod);
1959 const auto idx = staticMetaObject.indexOfSlot(
"onPointerPropertyChanged()");
1960 if (QSSG_GUARD_X(idx != -1,
"Method not found!")) {
1961 auto onPointerPropertyChangedMethod = staticMetaObject.method(idx);
1962 connect(m_tracker->m_owner, property.notifySignal(),
this, onPointerPropertyChangedMethod);
1969 m_tracker->m_dirtyProperties.push_back(m_property.propertyIndex());
1970 m_tracker->markTrackedPropertyDirty(m_property, QQuick3DPropertyChangedTracker::DirtyPropertyHint::Value);
1975 m_tracker->m_dirtyProperties.push_back(m_property.propertyIndex());
1976 m_tracker->markTrackedPropertyDirty(m_property, QQuick3DPropertyChangedTracker::DirtyPropertyHint::Reference);;
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2010
2011
2012
2013
2016
2017
2018
2019
2021QQuick3DShaderUtilsRenderPassAddDefine::QQuick3DShaderUtilsRenderPassAddDefine()
2026QQuick3DShaderUtilsRenderPassAddDefine::~QQuick3DShaderUtilsRenderPassAddDefine() =
default;
2028QSSGCommand *QQuick3DShaderUtilsRenderPassAddDefine::cloneCommand() {
2029 QSSGAddShaderDefine *cmd =
new QSSGAddShaderDefine(command);
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2107
2108
2109
2111QQuick3DShaderUtilsSubRenderPass::~QQuick3DShaderUtilsSubRenderPass()
2116QSSGCommand *QQuick3DShaderUtilsSubRenderPass::cloneCommand()
2118 QSSGSubRenderPass *cmd =
nullptr;
2120 if (!m_renderPass) {
2121 if (!m_hasWarnedAboutInvalidId) {
2122 qCWarning(lcSubRenderPass,
"SubRenderPass: No render pass specified. Set the 'renderPass' property.");
2123 m_hasWarnedAboutInvalidId =
true;
2128 QSSGResourceId userPassId = QQuick3DExtensionHelpers::getResourceId(*m_renderPass);
2130 if (userPassId != QSSGResourceId::Invalid) {
2131 cmd =
new QSSGSubRenderPass();
2132 cmd->setSubPass(userPassId);
2134 m_hasWarnedAboutInvalidId =
false;
2137 qCDebug(lcSubRenderPass,
"SubRenderPass: Render pass resource ID not yet available, will retry.");
2144QSSGRenderGraphObject *QQuick3DShaderUtilsSubRenderPass::updateSpatialNode(QSSGRenderGraphObject *node)
2149void QQuick3DShaderUtilsSubRenderPass::itemChange(ItemChange change,
const ItemChangeData &value)
2151 if (change == QQuick3DObject::ItemSceneChange)
2152 updateSceneManager(value.sceneManager);
2155void QQuick3DShaderUtilsSubRenderPass::updateSceneManager(QQuick3DSceneManager *sceneManager)
2158 QQuick3DObjectPrivate::refSceneManager(m_renderPass, *sceneManager);
2160 QQuick3DObjectPrivate::derefSceneManager(m_renderPass);
2163QQuick3DRenderPass *QQuick3DShaderUtilsSubRenderPass::renderPass()
const
2165 return m_renderPass;
2168void QQuick3DShaderUtilsSubRenderPass::setRenderPass(QQuick3DRenderPass *newRenderPass)
2170 if (m_renderPass == newRenderPass)
2173 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DShaderUtilsSubRenderPass::setRenderPass, newRenderPass, m_renderPass);
2176 newRenderPass->update();
2178 m_renderPass = newRenderPass;
2179 m_hasWarnedAboutInvalidId =
false;
2180 emit renderPassChanged();
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2222
2223
2224
2225
2226
2228QQuick3DShaderUtilsRenderPassDepthTextureAttachment::~QQuick3DShaderUtilsRenderPassDepthTextureAttachment()
2233QSSGCommand *QQuick3DShaderUtilsRenderPassDepthTextureAttachment::cloneCommand()
2236 QSSGDepthTextureAttachment *cmd =
new QSSGDepthTextureAttachment(QByteArrayLiteral(
"__depth__"));
2237 cmd->m_textureCmd = target->command;
2244QQuick3DShaderUtilsRenderPassDepthStencilAttachment::~QQuick3DShaderUtilsRenderPassDepthStencilAttachment()
2249QSSGCommand *QQuick3DShaderUtilsRenderPassDepthStencilAttachment::cloneCommand()
2251 QSSGDepthStencilAttachment *cmd =
new QSSGDepthStencilAttachment;
void onPointerPropertyChanged()
\qmltype Shader \inherits QtObject \inqmlmodule QtQuick3D
ResolveFunction resolveShaderOverride
QSSGRenderShaderValue::Type uniformType(QMetaType type)
QByteArray uniformTypeName(QMetaType type)
bool(*)(const QUrl &url, const QQmlContext *context, QByteArray &shaderData, QByteArray &shaderPathKey) ResolveFunction
static constexpr QMetaType::Type qssg_metatype_list[]
QByteArray resolveShader(const QUrl &fileUrl, const QQmlContext *context, QByteArray &shaderPathKey)
MetaTypeList supportedMetatypes()
void setResolveFunction(ResolveFunction fn)
Combined button and popup list for selecting options.