35class Q_QUICK3D_EXPORT
QQuick3DRenderPass :
public QQuick3DObject,
public QQuick3DPropertyChangedTracker
38 Q_PROPERTY(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> commands READ commands)
39 Q_PROPERTY(MaterialModes materialMode READ materialMode WRITE setMaterialMode NOTIFY materialModeChanged)
40 Q_PROPERTY(QColor clearColor READ clearColor WRITE setClearColor NOTIFY clearColorChanged)
41 Q_PROPERTY(
float depthClearValue READ depthClearValue WRITE setDepthClearValue NOTIFY depthClearValueChanged)
42 Q_PROPERTY(quint32 stencilClearValue READ stencilClearValue WRITE setStencilClearValue NOTIFY stencilClearValueChanged)
43 Q_PROPERTY(QQuick3DMaterial* overrideMaterial READ overrideMaterial WRITE setOverrideMaterial NOTIFY overrideMaterialChanged)
44 Q_PROPERTY(QUrl augmentShader READ augmentShader WRITE setAugmentShader NOTIFY augmentShaderChanged)
45 Q_PROPERTY(PassMode passMode READ passMode WRITE setPassMode NOTIFY passModeChanged)
46 Q_PROPERTY(RenderTargetFlags renderTargetFlags READ renderTargetFlags WRITE setRenderTargetFlags NOTIFY renderTargetFlagsChanged)
47 QML_NAMED_ELEMENT(RenderPass)
48 QML_ADDED_IN_VERSION(6, 11)
64 enum class RenderTargetFlag {
66 PreserveColorContents = 1 << 0,
67 PreserveDepthStencilContents = 1 << 1,
68 DoNotStoreDepthStencilContents = 1 << 2
70 Q_DECLARE_FLAGS(RenderTargetFlags, RenderTargetFlag)
71 Q_FLAG(RenderTargetFlags)
73 explicit QQuick3DRenderPass(QQuick3DObject *parent =
nullptr);
75 QQmlListProperty<QQuick3DShaderUtilsRenderCommand> commands();
77 QColor clearColor()
const;
78 void setClearColor(
const QColor &newClearColor);
80 MaterialModes materialMode()
const;
81 void setMaterialMode(MaterialModes newMaterialMode);
83 QQuick3DMaterial *overrideMaterial()
const;
84 void setOverrideMaterial(QQuick3DMaterial *newOverrideMaterial);
86 QUrl augmentShader()
const;
87 void setAugmentShader(
const QUrl &newAugmentShader);
89 PassMode passMode()
const;
90 void setPassMode(PassMode newPassMode);
92 float depthClearValue()
const;
93 void setDepthClearValue(
float newDepthClearValue);
95 quint32 stencilClearValue()
const;
96 void setStencilClearValue(quint32 newStencilClearValue);
98 void markAllDirty() override { m_dirtyAttributes = AllDirty; }
100 RenderTargetFlags renderTargetFlags()
const;
101 void setRenderTargetFlags(RenderTargetFlags newRenderTargetFlags);
104 void outputChanged();
105 void materialModeChanged();
106 void clearColorChanged();
107 void overrideMaterialChanged();
108 void augmentShaderChanged();
109 void passModeChanged();
110 void depthClearValueChanged();
111 void stencilClearValueChanged();
112 void renderTargetFlagsChanged();
115 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
116 void itemChange(QQuick3DObject::ItemChange ,
const QQuick3DObject::ItemChangeData &) override;
117 void markTrackedPropertyDirty(QMetaProperty property, QQuick3DPropertyChangedTracker::DirtyPropertyHint hint) override;
120 void onMaterialDestroyed(QObject *object);
121 void onCommandChanged();
124 friend void QQuick3DRenderPassPrivateHelper::subPassRef(QQuick3DRenderPass *);
125 friend void QQuick3DRenderPassPrivateHelper::subPassDeref(QQuick3DRenderPass *);
127 static void qmlAppendCommand(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list, QQuick3DShaderUtilsRenderCommand *command);
128 static QQuick3DShaderUtilsRenderCommand *qmlCommandAt(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list, qsizetype index);
129 static qsizetype qmlCommandCount(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list);
130 static void qmlCommandClear(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list);
137 MaterialModeDirty = 0x20,
138 OverrideMaterialDirty = 0x40,
139 AugmentShaderDirty = 0x80,
140 PassTypeDirty = 0x100
143 using DirtyT = std::underlying_type_t<Dirty>;
144 static constexpr DirtyT AllDirty { std::numeric_limits<DirtyT>::max() };
146 void updateSceneManager(QQuick3DSceneManager *sceneManager);
147 void markDirty(QQuick3DRenderPass::Dirty type,
bool requestSecondaryUpdate =
false);
148 void clearDirty(QQuick3DRenderPass::Dirty type);
150 quint32 m_dirtyAttributes = AllDirty;
151 QVector<QQuick3DShaderUtilsRenderCommand *> m_commands;
152 QColor m_clearColor = Qt::black;
153 MaterialModes m_materialMode = OriginalMaterial;
154 QQuick3DMaterial *m_overrideMaterial =
nullptr;
155 bool m_overrideMaterialRefed =
false;
156 QUrl m_augmentShader;
157 PassMode m_passMode = UserPass;
158 float m_depthClearValue = 1.0f;
159 quint32 m_stencilClearValue = 0;
162 quint32 m_subRenderPassRef = 0;
163 RenderTargetFlags m_renderTargetFlags = RenderTargetFlag::None;