29 Q_PROPERTY(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> commands READ commands)
30 Q_PROPERTY(MaterialModes materialMode READ materialMode WRITE setMaterialMode NOTIFY materialModeChanged)
31 Q_PROPERTY(QColor clearColor READ clearColor WRITE setClearColor NOTIFY clearColorChanged)
32 Q_PROPERTY(
float depthClearValue READ depthClearValue WRITE setDepthClearValue NOTIFY depthClearValueChanged)
33 Q_PROPERTY(quint32 stencilClearValue READ stencilClearValue WRITE setStencilClearValue NOTIFY stencilClearValueChanged)
34 Q_PROPERTY(QQuick3DMaterial* overrideMaterial READ overrideMaterial WRITE setOverrideMaterial NOTIFY overrideMaterialChanged)
35 Q_PROPERTY(QUrl augmentShader READ augmentShader WRITE setAugmentShader NOTIFY augmentShaderChanged)
36 Q_PROPERTY(PassMode passMode READ passMode WRITE setPassMode NOTIFY passModeChanged)
37 Q_PROPERTY(RenderTargetFlags renderTargetFlags READ renderTargetFlags WRITE setRenderTargetFlags NOTIFY renderTargetFlagsChanged)
38 QML_NAMED_ELEMENT(RenderPass)
39 QML_ADDED_IN_VERSION(6, 11)
55 enum class RenderTargetFlag {
57 PreserveColorContents = 1 << 0,
58 PreserveDepthStencilContents = 1 << 1,
59 DoNotStoreDepthStencilContents = 1 << 2
61 Q_DECLARE_FLAGS(RenderTargetFlags, RenderTargetFlag)
62 Q_FLAGS(RenderTargetFlags)
64 explicit QQuick3DRenderPass(QQuick3DObject *parent =
nullptr);
66 QQmlListProperty<QQuick3DShaderUtilsRenderCommand> commands();
68 QColor clearColor()
const;
69 void setClearColor(
const QColor &newClearColor);
71 MaterialModes materialMode()
const;
72 void setMaterialMode(MaterialModes newMaterialMode);
74 QQuick3DMaterial *overrideMaterial()
const;
75 void setOverrideMaterial(QQuick3DMaterial *newOverrideMaterial);
77 QUrl augmentShader()
const;
78 void setAugmentShader(
const QUrl &newAugmentShader);
80 PassMode passMode()
const;
81 void setPassMode(PassMode newPassMode);
83 float depthClearValue()
const;
84 void setDepthClearValue(
float newDepthClearValue);
86 quint32 stencilClearValue()
const;
87 void setStencilClearValue(quint32 newStencilClearValue);
89 void markAllDirty() override { m_dirtyAttributes = AllDirty; }
91 RenderTargetFlags renderTargetFlags()
const;
92 void setRenderTargetFlags(RenderTargetFlags newRenderTargetFlags);
96 void materialModeChanged();
97 void clearColorChanged();
98 void overrideMaterialChanged();
99 void augmentShaderChanged();
100 void passModeChanged();
101 void depthClearValueChanged();
102 void stencilClearValueChanged();
103 void renderTargetFlagsChanged();
106 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
107 void itemChange(QQuick3DObject::ItemChange ,
const QQuick3DObject::ItemChangeData &) override;
108 void markTrackedPropertyDirty(QMetaProperty property, QQuick3DPropertyChangedTracker::DirtyPropertyHint hint) override;
111 void onMaterialDestroyed(QObject *object);
114 static void qmlAppendCommand(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list, QQuick3DShaderUtilsRenderCommand *command);
115 static QQuick3DShaderUtilsRenderCommand *qmlCommandAt(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list, qsizetype index);
116 static qsizetype qmlCommandCount(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list);
117 static void qmlCommandClear(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list);
124 MaterialModeDirty = 0x20,
125 OverrideMaterialDirty = 0x40,
126 AugmentShaderDirty = 0x80,
127 PassTypeDirty = 0x100
130 using DirtyT = std::underlying_type_t<Dirty>;
131 static constexpr DirtyT AllDirty { std::numeric_limits<DirtyT>::max() };
133 void updateSceneManager(QQuick3DSceneManager *sceneManager);
134 void markDirty(QQuick3DRenderPass::Dirty type,
bool requestSecondaryUpdate =
false);
135 void clearDirty(QQuick3DRenderPass::Dirty type);
137 quint32 m_dirtyAttributes = AllDirty;
138 QVector<QQuick3DShaderUtilsRenderCommand *> m_commands;
139 QColor m_clearColor = Qt::black;
140 MaterialModes m_materialMode = OriginalMaterial;
141 QQuick3DMaterial *m_overrideMaterial =
nullptr;
142 bool m_overrideMaterialRefed =
false;
143 QUrl m_augmentShader;
144 PassMode m_passMode = UserPass;
145 float m_depthClearValue = 1.0f;
146 quint32 m_stencilClearValue = 0;
147 RenderTargetFlags m_renderTargetFlags = RenderTargetFlag::None;