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()
978 const QMetaObject *mo = metaObject();
979 const QMetaMethod changedSignal = QMetaMethod::fromSignal(&QQuick3DShaderUtilsRenderCommand::changed);
980 for (
int i = QQuick3DShaderUtilsRenderCommand::staticMetaObject.methodCount(); i < mo->methodCount(); ++i) {
981 const QMetaMethod mm = mo->method(i);
982 if (mm.methodType() == QMetaMethod::Signal)
983 connect(
this, mm,
this, changedSignal);
987QQuick3DShaderUtilsPipelineStateOverride::~QQuick3DShaderUtilsPipelineStateOverride()
993
994
995
996
997bool QQuick3DShaderUtilsPipelineStateOverride::depthTestEnabled()
const
999 if (command.m_depthTestEnabled)
1000 return *command.m_depthTestEnabled;
1004void QQuick3DShaderUtilsPipelineStateOverride::setDepthTestEnabled(
bool newDepthTestEnabled)
1006 if (command.m_depthTestEnabled && *command.m_depthTestEnabled == newDepthTestEnabled)
1008 command.m_depthTestEnabled = newDepthTestEnabled;
1009 emit depthTestEnabledChanged();
1012void QQuick3DShaderUtilsPipelineStateOverride::resetDepthTestEnabled()
1014 command.m_depthTestEnabled.reset();
1015 emit depthTestEnabledChanged();
1019
1020
1021
1022
1023bool QQuick3DShaderUtilsPipelineStateOverride::depthWriteEnabled()
const
1025 if (command.m_depthWriteEnabled)
1026 return *command.m_depthWriteEnabled;
1030void QQuick3DShaderUtilsPipelineStateOverride::setDepthWriteEnabled(
bool newDepthWriteEnabled)
1032 if (command.m_depthWriteEnabled && *command.m_depthWriteEnabled == newDepthWriteEnabled)
1034 command.m_depthWriteEnabled = newDepthWriteEnabled;
1035 emit depthWriteEnabledChanged();
1038void QQuick3DShaderUtilsPipelineStateOverride::resetDepthWriteEnabled()
1040 command.m_depthWriteEnabled.reset();
1041 emit depthWriteEnabledChanged();
1045
1046
1047
1048
1049bool QQuick3DShaderUtilsPipelineStateOverride::blendEnabled()
const
1051 if (command.m_blendEnabled)
1052 return *command.m_blendEnabled;
1056void QQuick3DShaderUtilsPipelineStateOverride::setBlendEnabled(
bool newBlendEnabled)
1058 if (command.m_blendEnabled && *command.m_blendEnabled == newBlendEnabled)
1060 command.m_blendEnabled = newBlendEnabled;
1061 emit blendEnabledChanged();
1064void QQuick3DShaderUtilsPipelineStateOverride::resetBlendEnabled()
1066 command.m_blendEnabled.reset();
1067 emit blendEnabledChanged();
1071
1072
1073
1074
1075bool QQuick3DShaderUtilsPipelineStateOverride::usesStencilReference()
const
1077 if (command.m_usesStencilReference)
1078 return *command.m_usesStencilReference;
1082void QQuick3DShaderUtilsPipelineStateOverride::setUsesStencilReference(
bool newUsesStencilReference)
1084 if (command.m_usesStencilReference && *command.m_usesStencilReference == newUsesStencilReference)
1086 command.m_usesStencilReference = newUsesStencilReference;
1087 emit usesStencilReferenceChanged();
1090void QQuick3DShaderUtilsPipelineStateOverride::resetUsesStencilReference()
1092 command.m_usesStencilReference.reset();
1093 emit usesStencilReferenceChanged();
1097
1098
1099
1100
1101bool QQuick3DShaderUtilsPipelineStateOverride::usesScissor()
const
1103 if (command.m_usesScissor)
1104 return *command.m_usesScissor;
1108void QQuick3DShaderUtilsPipelineStateOverride::setUsesScissor(
bool newUsesScissor)
1110 if (command.m_usesScissor && *command.m_usesScissor == newUsesScissor)
1112 command.m_usesScissor = newUsesScissor;
1113 emit usesScissorChanged();
1116void QQuick3DShaderUtilsPipelineStateOverride::resetUsesScissor()
1118 command.m_usesScissor.reset();
1119 emit usesScissorChanged();
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135QQuick3DShaderUtilsPipelineStateOverride::CompareOperation QQuick3DShaderUtilsPipelineStateOverride::depthFunction()
const
1137 if (command.m_depthFunction)
1138 return CompareOperation(*command.m_depthFunction);
1139 return CompareOperation::Less;
1142void QQuick3DShaderUtilsPipelineStateOverride::setDepthFunction(CompareOperation newDepthFunction)
1144 if (command.m_depthFunction && *command.m_depthFunction == QRhiGraphicsPipeline::CompareOp(newDepthFunction))
1146 command.m_depthFunction = QRhiGraphicsPipeline::CompareOp(newDepthFunction);
1147 emit depthFunctionChanged();
1150void QQuick3DShaderUtilsPipelineStateOverride::resetDepthFunction()
1152 command.m_depthFunction.reset();
1153 emit depthFunctionChanged();
1157
1158
1159
1160
1161
1162
1163
1164QQuick3DShaderUtilsPipelineStateOverride::CullMode QQuick3DShaderUtilsPipelineStateOverride::cullMode()
const
1166 if (command.m_cullMode)
1167 return CullMode(*command.m_cullMode);
1168 return CullMode::Back;
1171void QQuick3DShaderUtilsPipelineStateOverride::setCullMode(CullMode newCullMode)
1173 if (command.m_cullMode && *command.m_cullMode == QRhiGraphicsPipeline::CullMode(newCullMode))
1175 command.m_cullMode = QRhiGraphicsPipeline::CullMode(newCullMode);
1176 emit cullModeChanged();
1179void QQuick3DShaderUtilsPipelineStateOverride::resetCullMode()
1181 command.m_cullMode.reset();
1182 emit cullModeChanged();
1186
1187
1188
1189
1190
1191
1192QQuick3DShaderUtilsPipelineStateOverride::PolygonMode QQuick3DShaderUtilsPipelineStateOverride::polygonMode()
const
1194 if (command.m_polygonMode)
1195 return PolygonMode(*command.m_polygonMode);
1196 return PolygonMode::Fill;
1199void QQuick3DShaderUtilsPipelineStateOverride::setPolygonMode(PolygonMode newPolygonMode)
1201 if (command.m_polygonMode && *command.m_polygonMode == QRhiGraphicsPipeline::PolygonMode(newPolygonMode))
1203 command.m_polygonMode = QRhiGraphicsPipeline::PolygonMode(newPolygonMode);
1204 emit polygonModeChanged();
1207void QQuick3DShaderUtilsPipelineStateOverride::resetPolygonMode()
1209 command.m_polygonMode.reset();
1210 emit polygonModeChanged();
1214
1215
1216
1217
1218quint32 QQuick3DShaderUtilsPipelineStateOverride::stencilWriteMask()
const
1220 if (command.m_stencilWriteMask)
1221 return *command.m_stencilWriteMask;
1225void QQuick3DShaderUtilsPipelineStateOverride::setStencilWriteMask(quint32 newStencilWriteMask)
1227 if (command.m_stencilWriteMask && *command.m_stencilWriteMask == newStencilWriteMask)
1229 command.m_stencilWriteMask = newStencilWriteMask;
1230 emit stencilWriteMaskChanged();
1233void QQuick3DShaderUtilsPipelineStateOverride::resetStencilWriteMask()
1235 command.m_stencilWriteMask.reset();
1236 emit stencilWriteMaskChanged();
1240
1241
1242
1243
1244quint32 QQuick3DShaderUtilsPipelineStateOverride::stencilReference()
const
1246 if (command.m_stencilReference)
1247 return *command.m_stencilReference;
1251void QQuick3DShaderUtilsPipelineStateOverride::setStencilReference(quint32 newStencilReference)
1253 if (command.m_stencilReference && *command.m_stencilReference == newStencilReference)
1255 command.m_stencilReference = newStencilReference;
1256 emit stencilReferenceChanged();
1259void QQuick3DShaderUtilsPipelineStateOverride::resetStencilReference()
1261 command.m_stencilReference.reset();
1262 emit stencilReferenceChanged();
1266
1267
1268
1269
1270
1271QRectF QQuick3DShaderUtilsPipelineStateOverride::viewport()
const
1273 if (command.m_viewport) {
1274 const QRhiViewport &vp = *command.m_viewport;
1275 return QRectF(vp.viewport()[0], vp.viewport()[1], vp.viewport()[2], vp.viewport()[3]);
1280void QQuick3DShaderUtilsPipelineStateOverride::setViewport(
const QRectF &newViewport)
1282 if (command.m_viewport) {
1283 const QRhiViewport &vp = *command.m_viewport;
1284 if (vp.viewport()[0] == newViewport.x() &&
1285 vp.viewport()[1] == newViewport.y() &&
1286 vp.viewport()[2] == newViewport.width() &&
1287 vp.viewport()[3] == newViewport.height())
1290 command.m_viewport = QRhiViewport(newViewport.x(), newViewport.y(), newViewport.width(), newViewport.height());
1291 emit viewportChanged();
1294void QQuick3DShaderUtilsPipelineStateOverride::resetViewport()
1296 command.m_viewport.reset();
1297 emit viewportChanged();
1301
1302
1303
1304
1305QRect QQuick3DShaderUtilsPipelineStateOverride::scissor()
const
1307 if (command.m_scissor) {
1308 const QRhiScissor &sc = *command.m_scissor;
1309 return QRect(sc.scissor()[0], sc.scissor()[1], sc.scissor()[2], sc.scissor()[3]);
1314void QQuick3DShaderUtilsPipelineStateOverride::setScissor(
const QRect &newScissor)
1316 if (command.m_viewport) {
1317 const QRhiScissor &sc = *command.m_scissor;
1318 if (sc.scissor()[0] == newScissor.x() &&
1319 sc.scissor()[1] == newScissor.y() &&
1320 sc.scissor()[2] == newScissor.width() &&
1321 sc.scissor()[3] == newScissor.height())
1324 command.m_scissor = QRhiScissor(newScissor.x(), newScissor.y(), newScissor.width(), newScissor.height());
1325 emit scissorChanged();
1328void QQuick3DShaderUtilsPipelineStateOverride::resetScissor()
1330 command.m_scissor.reset();
1334
1335
1336
1337
1338QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend0()
const
1340 if (command.m_targetBlend0)
1341 return *command.m_targetBlend0;
1345void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend0(
const QQuick3DRenderPassTargetBlend &newTargetBlend0)
1347 if (command.m_targetBlend0 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend0) == newTargetBlend0)
1350 command.m_targetBlend0 = newTargetBlend0.toRhiTargetBlend();;
1351 emit targetBlend0Changed();
1354void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend0()
1356 command.m_targetBlend0.reset();
1357 emit targetBlend0Changed();
1361
1362
1363
1364
1365QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend1()
const
1367 if (command.m_targetBlend1)
1368 return *command.m_targetBlend1;
1372void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend1(
const QQuick3DRenderPassTargetBlend &newTargetBlend1)
1374 if (command.m_targetBlend1 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend1) == newTargetBlend1)
1376 command.m_targetBlend1 = newTargetBlend1.toRhiTargetBlend();
1377 emit targetBlend1Changed();
1380void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend1()
1382 command.m_targetBlend1.reset();
1383 emit targetBlend1Changed();
1387
1388
1389
1390
1391QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend2()
const
1393 if (command.m_targetBlend2)
1394 return *command.m_targetBlend2;
1398void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend2(
const QQuick3DRenderPassTargetBlend &newTargetBlend2)
1400 if (command.m_targetBlend2 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend2) == newTargetBlend2)
1402 command.m_targetBlend2 = newTargetBlend2.toRhiTargetBlend();
1403 emit targetBlend2Changed();
1406void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend2()
1408 command.m_targetBlend2.reset();
1409 emit targetBlend2Changed();
1413
1414
1415
1416
1417QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend3()
const
1419 if (command.m_targetBlend3)
1420 return *command.m_targetBlend3;
1424void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend3(
const QQuick3DRenderPassTargetBlend &newTargetBlend3)
1426 if (command.m_targetBlend3 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend3) == newTargetBlend3)
1428 command.m_targetBlend3 = newTargetBlend3.toRhiTargetBlend();
1429 emit targetBlend3Changed();
1432void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend3()
1434 command.m_targetBlend3.reset();
1435 emit targetBlend3Changed();
1439
1440
1441
1442
1443QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend4()
const
1445 if (command.m_targetBlend4)
1446 return *command.m_targetBlend4;
1450void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend4(
const QQuick3DRenderPassTargetBlend &newTargetBlend4)
1452 if (command.m_targetBlend4 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend4) == newTargetBlend4)
1454 command.m_targetBlend4 = newTargetBlend4.toRhiTargetBlend();
1455 emit targetBlend4Changed();
1458void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend4()
1460 command.m_targetBlend4.reset();
1461 emit targetBlend4Changed();
1465
1466
1467
1468
1469QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend5()
const
1471 if (command.m_targetBlend5)
1472 return *command.m_targetBlend5;
1476void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend5(
const QQuick3DRenderPassTargetBlend &newTargetBlend5)
1478 if (command.m_targetBlend5 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend5) == newTargetBlend5)
1480 command.m_targetBlend5 = newTargetBlend5.toRhiTargetBlend();
1481 emit targetBlend5Changed();
1484void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend5()
1486 command.m_targetBlend5.reset();
1487 emit targetBlend5Changed();
1491
1492
1493
1494
1495QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend6()
const
1497 if (command.m_targetBlend6)
1498 return *command.m_targetBlend6;
1502void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend6(
const QQuick3DRenderPassTargetBlend &newTargetBlend6)
1504 if (command.m_targetBlend6 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend6) == newTargetBlend6)
1506 command.m_targetBlend6 = newTargetBlend6.toRhiTargetBlend();
1507 emit targetBlend6Changed();
1510void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend6()
1512 command.m_targetBlend6.reset();
1513 emit targetBlend6Changed();
1517
1518
1519
1520
1521QQuick3DRenderPassTargetBlend QQuick3DShaderUtilsPipelineStateOverride::targetBlend7()
const
1523 if (command.m_targetBlend7)
1524 return *command.m_targetBlend7;
1528void QQuick3DShaderUtilsPipelineStateOverride::setTargetBlend7(
const QQuick3DRenderPassTargetBlend &newTargetBlend7)
1530 if (command.m_targetBlend7 && QQuick3DRenderPassTargetBlend(*command.m_targetBlend7) == newTargetBlend7)
1532 command.m_targetBlend7 = newTargetBlend7.toRhiTargetBlend();
1533 emit targetBlend7Changed();
1536void QQuick3DShaderUtilsPipelineStateOverride::resetTargetBlend7()
1538 command.m_targetBlend7.reset();
1539 emit targetBlend7Changed();
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1598QQuick3DShaderUtilsRenderPassTexture::TextureFormat QQuick3DShaderUtilsRenderPassTexture::format()
const
1600 return fromRenderTextureFormat(command->format());
1603QQuick3DShaderUtilsRenderPassTexture::~QQuick3DShaderUtilsRenderPassTexture()
1608void QQuick3DShaderUtilsRenderPassTexture::setFormat(TextureFormat newFormat)
1611 command = std::make_shared<QSSGAllocateTexture>();
1612 command->setFormat(asRenderTextureFormat(newFormat));
1615QSSGRenderTextureFormat QQuick3DShaderUtilsRenderPassTexture::asRenderTextureFormat(TextureFormat fmt)
1618 case TextureFormat::Unknown:
return QSSGRenderTextureFormat::Unknown;
1619 case TextureFormat::RGBA8:
return QSSGRenderTextureFormat::RGBA8;
1620 case TextureFormat::RGBA16F:
return QSSGRenderTextureFormat::RGBA16F;
1621 case TextureFormat::RGBA32F:
return QSSGRenderTextureFormat::RGBA32F;
1622 case TextureFormat::R8:
return QSSGRenderTextureFormat::R8;
1623 case TextureFormat::R16:
return QSSGRenderTextureFormat::R16;
1624 case TextureFormat::R16F:
return QSSGRenderTextureFormat::R16F;
1625 case TextureFormat::R32F:
return QSSGRenderTextureFormat::R32F;
1626 case TextureFormat::Depth16:
return QSSGRenderTextureFormat::Depth16;
1627 case TextureFormat::Depth24:
return QSSGRenderTextureFormat::Depth24;
1628 case TextureFormat::Depth32:
return QSSGRenderTextureFormat::Depth32;
1629 case TextureFormat::Depth24Stencil8:
return QSSGRenderTextureFormat::Depth24Stencil8;
1633 return QSSGRenderTextureFormat::Unknown;
1636QQuick3DShaderUtilsRenderPassTexture::TextureFormat QQuick3DShaderUtilsRenderPassTexture::fromRenderTextureFormat(QSSGRenderTextureFormat fmt)
1638 switch (fmt.format) {
1639 case QSSGRenderTextureFormat::Unknown:
return TextureFormat::Unknown;
1640 case QSSGRenderTextureFormat::RGBA8:
return TextureFormat::RGBA8;
1641 case QSSGRenderTextureFormat::RGBA16F:
return TextureFormat::RGBA16F;
1642 case QSSGRenderTextureFormat::RGBA32F:
return TextureFormat::RGBA32F;
1643 case QSSGRenderTextureFormat::R8:
return TextureFormat::R8;
1644 case QSSGRenderTextureFormat::R16:
return TextureFormat::R16;
1645 case QSSGRenderTextureFormat::R16F:
return TextureFormat::R16F;
1646 case QSSGRenderTextureFormat::R32F:
return TextureFormat::R32F;
1647 case QSSGRenderTextureFormat::Depth16:
return TextureFormat::Depth16;
1648 case QSSGRenderTextureFormat::Depth24:
return TextureFormat::Depth24;
1649 case QSSGRenderTextureFormat::Depth32:
return TextureFormat::Depth32;
1650 case QSSGRenderTextureFormat::Depth24Stencil8:
return TextureFormat::Depth24Stencil8;
1654 return TextureFormat::Unknown;
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1691
1692
1693
1694
1697
1698
1699
1700
1701
1702
1704QQuick3DShaderUtilsRenderPassColorAttachment::~QQuick3DShaderUtilsRenderPassColorAttachment()
1709QByteArray QQuick3DShaderUtilsRenderPassColorAttachment::name()
const
1714void QQuick3DShaderUtilsRenderPassColorAttachment::setName(
const QByteArray &newName)
1719QSSGCommand *QQuick3DShaderUtilsRenderPassColorAttachment::cloneCommand()
1722 QSSGColorAttachment *cmd =
new QSSGColorAttachment(m_name);
1723 cmd->m_textureCmd = target->command;
1730QQuick3DPropertyChangedTracker::~QQuick3DPropertyChangedTracker()
1735std::optional<QQuick3DPropertyChangedTracker::UniformProperty> QQuick3DPropertyChangedTracker::createOrUpdateTrackedProperty(
const QMetaProperty property,
1738 Q_ASSERT(property.isValid());
1740 std::optional<QQuick3DPropertyChangedTracker::UniformProperty> result;
1741 const int propertyIndex = property.propertyIndex();
1743 static auto getSamplerHint = [](
const QQuick3DTexture &texture) {
1744 if (
auto *po = QQuick3DObjectPrivate::get(&texture)) {
1745 if (po->type == QQuick3DObjectPrivate::Type::TextureProvider) {
1746 auto textureProvider =
static_cast<QQuick3DTextureProviderExtension *>(texture.textureProvider());
1747 switch (textureProvider->samplerHint()) {
1748 case QQuick3DTextureProviderExtension::SamplerHint::Sampler2D:
1749 return QSSGRenderSamplerType::Sampler2D;
1750 case QQuick3DTextureProviderExtension::SamplerHint::Sampler2DArray:
1751 return QSSGRenderSamplerType::Sampler2DArray;
1752 case QQuick3DTextureProviderExtension::SamplerHint::Sampler3D:
1753 return QSSGRenderSamplerType::Sampler3D;
1754 case QQuick3DTextureProviderExtension::SamplerHint::SamplerCube:
1755 return QSSGRenderSamplerType::SamplerCube;
1756 case QQuick3DTextureProviderExtension::SamplerHint::SamplerCubeArray:
1757 return QSSGRenderSamplerType::SamplerCubeArray;
1758 case QQuick3DTextureProviderExtension::SamplerHint::SamplerBuffer:
1759 return QSSGRenderSamplerType::SamplerBuffer;
1761 }
else if (po->type == QQuick3DObjectPrivate::Type::ImageCube) {
1762 return QSSGRenderSamplerType::SamplerCube;
1763 }
else if (texture.textureData() && texture.textureData()->depth() > 0) {
1764 return QSSGRenderSamplerType::Sampler3D;
1768 return QSSGRenderSamplerType::Sampler2D;
1771 const auto addTextureToUniforms =
1772 [&](
const char *name, QQuick3DTexture *texture,
int propertyIndex) -> QQuick3DPropertyChangedTracker::UniformProperty {
1773 QSSGRenderImage *ri =
static_cast<QSSGRenderImage *>(QQuick3DObjectPrivate::get(texture)->spatialNode);
1774 auto samplerName = QSSGBaseTypeHelpers::toString(getSamplerHint(*texture));
1776 if (
auto textureProvider = qobject_cast<QQuick3DTextureProviderExtension *>(texture->textureProvider())) {
1779 QObject::connect(textureProvider, &QQuick3DTextureProviderExtension::surfaceChanged, m_owner, [
this, property, texture]() {
1780 addPropertyWatcher(property, DirtyPropertyHint::Reference, texture);
1783 QObject::connect(texture, &QQuick3DTexture::textureProviderChanged, m_owner, [
this, property, texture]() {
1784 addPropertyWatcher(property, DirtyPropertyHint::Reference, texture);
1787 QObject::connect(texture, &QQuick3DTexture::textureInternalChange, m_owner,
1788 [
this, property, texture](QQuick3DTextureInternalChange change) {
1789 if (change.type == QQuick3DTextureInternalChange::Type::BackendNode)
1790 addPropertyWatcher(property, DirtyPropertyHint::Reference, texture);
1794 return UniformProperty(name, samplerName, QVariant::fromValue(ri), QSSGRenderShaderValue::Texture, propertyIndex);
1798 const auto addTextureInputWatchers = [&](QMetaProperty property, QQuick3DShaderUtilsTextureInput *textureInput) {
1799 QObject::connect(textureInput, &QQuick3DShaderUtilsTextureInput::enabledChanged, m_owner, [
this, property, textureInput]() {
1800 addPropertyWatcher(property, DirtyPropertyHint::Reference, textureInput);
1802 QObject::connect(textureInput, &QQuick3DShaderUtilsTextureInput::textureChanged, m_owner, [
this, property, textureInput]() {
1803 addPropertyWatcher(property, DirtyPropertyHint::Reference, textureInput);
1807 const char *name = property.name();
1808 QMetaType propType = property.metaType();
1809 QVariant propValue = property.read(m_owner);
1810 if (propType == QMetaType(QMetaType::QVariant))
1811 propType = propValue.metaType();
1813 const auto type = QSSGShaderUtils::uniformType(propType);
1814 if (type != QSSGRenderShaderValue::Unknown) {
1815 result = UniformProperty(name, QSSGShaderUtils::uniformTypeName(propType), propValue, QSSGShaderUtils::uniformType(propType), propertyIndex);
1817 addPropertyWatcher(property, DirtyPropertyHint::Value);
1819 if (propType.id() >= QMetaType::User) {
1820 if (propType.id() == qMetaTypeId<QQuick3DTexture *>()) {
1821 if (QQuick3DTexture *texture = property.read(m_owner).value<QQuick3DTexture *>()) {
1822 result = addTextureToUniforms(name, texture, propertyIndex);
1824 addPropertyWatcher(property, DirtyPropertyHint::Reference, texture);
1826 }
else if (propType.id() == qMetaTypeId<QQuick3DShaderUtilsTextureInput *>()) {
1827 if (QQuick3DShaderUtilsTextureInput *textureInput = property.read(m_owner).value<QQuick3DShaderUtilsTextureInput *>();
1828 textureInput && textureInput->texture()) {
1829 result = addTextureToUniforms(property.name(), textureInput->texture(), propertyIndex);
1831 addTextureInputWatchers(property, textureInput);
1832 addPropertyWatcher(property, DirtyPropertyHint::Reference, textureInput);
1836 }
else if (propType == QMetaType(QMetaType::QObjectStar)) {
1837 if (QQuick3DTexture *texture = qobject_cast<QQuick3DTexture *>(propValue.value<QObject *>())) {
1838 result = addTextureToUniforms(name, texture, propertyIndex);
1840 addPropertyWatcher(property, DirtyPropertyHint::Reference, texture);
1841 }
else if (QQuick3DShaderUtilsTextureInput *textureInput = qobject_cast<QQuick3DShaderUtilsTextureInput *>(
1842 propValue.value<QObject *>());
1843 textureInput && textureInput->texture()) {
1844 result = addTextureToUniforms(property.name(), textureInput->texture(), propertyIndex);
1846 addTextureInputWatchers(property, textureInput);
1847 addPropertyWatcher(property, DirtyPropertyHint::Reference, textureInput);
1856QList<QQuick3DPropertyChangedTracker::UniformProperty> QQuick3DPropertyChangedTracker::extractProperties()
1858 if (!m_dirtyProperties.empty()) {
1859 for (
int propertyIndex : std::as_const(m_dirtyProperties)) {
1860 auto it = std::lower_bound(m_propertyList.begin(),
1861 m_propertyList.end(),
1863 [](
const UniformProperty &p,
int index) {
return p.pid < index; });
1864 if (it == m_propertyList.end()) {
1869 QMetaProperty property = m_owner->metaObject()->property(propertyIndex);
1870 if (Q_UNLIKELY(!property.isValid())) {
1871 m_propertyList.erase(it);
1875 if (
auto trackedProperty = createOrUpdateTrackedProperty(property,
false); trackedProperty.has_value())
1876 *it = *trackedProperty;
1878 m_propertyList.erase(it);
1880 m_dirtyProperties.clear();
1884 return m_propertyList;
1886 auto metaObject = m_owner->metaObject();
1889 const int propCount = metaObject->propertyCount();
1890 int propOffset = metaObject->propertyOffset();
1891 m_propertyList.reserve(propCount);
1895 const QMetaObject *superClass = metaObject->superClass();
1896 while (superClass && qstrcmp(superClass->className(), m_superClassName) != 0) {
1897 propOffset = superClass->propertyOffset();
1898 superClass = superClass->superClass();
1901 for (
int i = propOffset; i != propCount; ++i) {
1902 const QMetaProperty property = metaObject->property(i);
1903 if (Q_UNLIKELY(!property.isValid()))
1905 if (
auto uniformProperty = createOrUpdateTrackedProperty(property,
true); uniformProperty.has_value()) {
1906 m_propertyList.push_back(*uniformProperty);
1910 m_dirtyProperties.reserve(m_propertyList.size());
1913 return m_propertyList;
1916void QQuick3DPropertyChangedTracker::addPropertyWatcher(QMetaProperty property, DirtyPropertyHint hint, QQuick3DObject *object)
1918 if (property.isValid() && property.hasNotifySignal()) {
1920 const auto pid = property.propertyIndex();
1921 Q_ASSERT(pid != -1);
1922 auto it = m_trackedProperties.find(pid);
1923 const bool found = (it != m_trackedProperties.end());
1924 QQuick3DObject *oldObj =
nullptr;
1926 QQuick3DPropertyWatcher *watcher =
new QQuick3DPropertyWatcher(
this, property);
1927 it = m_trackedProperties.insert(pid, Tracked { watcher, object, pid });
1929 oldObj = it->object;
1930 it->object = object;
1933 if (hint == DirtyPropertyHint::Reference) {
1934 const auto &sm = QQuick3DObjectPrivate::get(m_owner)->sceneManager;
1937 const bool changed = (oldObj != object);
1940 if (changed && oldObj) {
1941 QQuick3DObjectPrivate::get(oldObj)->derefSceneManager();
1942 QObject::disconnect(oldObj, &QObject::destroyed, m_owner,
nullptr);
1946 if (changed && object) {
1947 QQuick3DObjectPrivate::get(object)->refSceneManager(*sm);
1948 QObject::connect(object, &QObject::destroyed, m_owner, [
this, property](QObject *obj) {
1950 addPropertyWatcher(property, DirtyPropertyHint::Reference,
nullptr);
1955 m_dirtyProperties.push_back(property.propertyIndex());
1956 markTrackedPropertyDirty(property, hint);
1960void QQuick3DPropertyChangedTracker::markTrackedPropertyDirty(QMetaProperty property, DirtyPropertyHint hint)
1964 QSSG_CHECK_X(
false,
"QQuick3DPropertyChangedTracker::onPropertyDirty implementation missing");
1968 : m_tracker(tracker)
1969 , m_property(property)
1971 Q_ASSERT(tracker !=
nullptr);
1972 Q_ASSERT(property.isValid() && property.hasNotifySignal());
1974 const bool isPointerType = (property.metaType().flags().testFlag(QMetaType::IsPointer));
1976 if (!isPointerType) {
1978 const auto idx = staticMetaObject.indexOfSlot(
"onValuePropertyChanged()");
1979 if (QSSG_GUARD_X(idx != -1,
"Method not found!")) {
1980 auto onPropertyChangedMethod = staticMetaObject.method(idx);
1981 connect(m_tracker->m_owner, property.notifySignal(),
this, onPropertyChangedMethod);
1985 const auto idx = staticMetaObject.indexOfSlot(
"onPointerPropertyChanged()");
1986 if (QSSG_GUARD_X(idx != -1,
"Method not found!")) {
1987 auto onPointerPropertyChangedMethod = staticMetaObject.method(idx);
1988 connect(m_tracker->m_owner, property.notifySignal(),
this, onPointerPropertyChangedMethod);
1995 m_tracker->m_dirtyProperties.push_back(m_property.propertyIndex());
1996 m_tracker->markTrackedPropertyDirty(m_property, QQuick3DPropertyChangedTracker::DirtyPropertyHint::Value);
2001 m_tracker->m_dirtyProperties.push_back(m_property.propertyIndex());
2002 m_tracker->markTrackedPropertyDirty(m_property, QQuick3DPropertyChangedTracker::DirtyPropertyHint::Reference);;
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2036
2037
2038
2039
2042
2043
2044
2045
2047QQuick3DShaderUtilsRenderPassAddDefine::QQuick3DShaderUtilsRenderPassAddDefine()
2052QQuick3DShaderUtilsRenderPassAddDefine::~QQuick3DShaderUtilsRenderPassAddDefine() =
default;
2054QByteArray QQuick3DShaderUtilsRenderPassAddDefine::name()
const
2056 return command.m_name;
2059void QQuick3DShaderUtilsRenderPassAddDefine::setName(
const QByteArray &newName)
2061 if (command.m_name != newName) {
2062 command.m_name = newName;
2068int QQuick3DShaderUtilsRenderPassAddDefine::value()
const
2070 return command.m_value;
2073void QQuick3DShaderUtilsRenderPassAddDefine::setValue(
int newValue)
2075 if (command.m_value != newValue) {
2076 command.m_value = newValue;
2077 emit valueChanged();
2082QSSGCommand *QQuick3DShaderUtilsRenderPassAddDefine::cloneCommand() {
2083 QSSGAddShaderDefine *cmd =
new QSSGAddShaderDefine(command);
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2161
2162
2163
2165QQuick3DShaderUtilsSubRenderPass::~QQuick3DShaderUtilsSubRenderPass()
2170QSSGCommand *QQuick3DShaderUtilsSubRenderPass::cloneCommand()
2172 QSSGSubRenderPass *cmd =
nullptr;
2174 if (!m_renderPass) {
2175 if (!m_hasWarnedAboutInvalidId) {
2176 qCWarning(lcSubRenderPass,
"SubRenderPass: No render pass specified. Set the 'renderPass' property.");
2177 m_hasWarnedAboutInvalidId =
true;
2182 QSSGResourceId userPassId = QQuick3DExtensionHelpers::getResourceId(*m_renderPass);
2184 if (userPassId != QSSGResourceId::Invalid) {
2185 cmd =
new QSSGSubRenderPass();
2186 cmd->setSubPass(userPassId);
2188 m_hasWarnedAboutInvalidId =
false;
2191 qCDebug(lcSubRenderPass,
"SubRenderPass: Render pass resource ID not yet available, will retry.");
2198QSSGRenderGraphObject *QQuick3DShaderUtilsSubRenderPass::updateSpatialNode(QSSGRenderGraphObject *node)
2203void QQuick3DShaderUtilsSubRenderPass::itemChange(ItemChange change,
const ItemChangeData &value)
2205 if (change == QQuick3DObject::ItemSceneChange)
2206 updateSceneManager(value.sceneManager);
2209void QQuick3DShaderUtilsSubRenderPass::updateSceneManager(QQuick3DSceneManager *sceneManager)
2212 QQuick3DObjectPrivate::refSceneManager(m_renderPass, *sceneManager);
2214 QQuick3DObjectPrivate::derefSceneManager(m_renderPass);
2217QQuick3DRenderPass *QQuick3DShaderUtilsSubRenderPass::renderPass()
const
2219 return m_renderPass;
2222void QQuick3DShaderUtilsSubRenderPass::setRenderPass(QQuick3DRenderPass *newRenderPass)
2224 if (m_renderPass == newRenderPass)
2227 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DShaderUtilsSubRenderPass::setRenderPass, newRenderPass, m_renderPass);
2230 newRenderPass->update();
2232 m_renderPass = newRenderPass;
2233 m_hasWarnedAboutInvalidId =
false;
2234 emit renderPassChanged();
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2277
2278
2279
2280
2281
2283QQuick3DShaderUtilsRenderPassDepthTextureAttachment::~QQuick3DShaderUtilsRenderPassDepthTextureAttachment()
2288QSSGCommand *QQuick3DShaderUtilsRenderPassDepthTextureAttachment::cloneCommand()
2291 QSSGDepthTextureAttachment *cmd =
new QSSGDepthTextureAttachment(QByteArrayLiteral(
"__depth__"));
2292 cmd->m_textureCmd = target->command;
2299QQuick3DShaderUtilsRenderPassDepthStencilAttachment::~QQuick3DShaderUtilsRenderPassDepthStencilAttachment()
2304QSSGCommand *QQuick3DShaderUtilsRenderPassDepthStencilAttachment::cloneCommand()
2306 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.