Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquick3drenderpass_p.h
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5
6#ifndef QQUICK3DRENDERPASS_P_H
7#define QQUICK3DRENDERPASS_P_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include <QtQuick3D/qtquick3dglobal.h>
21#include <QtQuick3D/private/qquick3dobject_p.h>
22#include <QtQuick3D/private/qquick3dshaderutils_p.h>
23
24QT_BEGIN_NAMESPACE
25
26class QQuick3DRenderPass;
27
29// Reference counting used by SubRenderPass commands to classify a pass: a pass
30// referenced by at least one SubRenderPass command is a sub-pass.
31void subPassRef(QQuick3DRenderPass *pass);
32void subPassDeref(QQuick3DRenderPass *pass);
33}
34
35class Q_QUICK3D_EXPORT QQuick3DRenderPass : public QQuick3DObject, public QQuick3DPropertyChangedTracker
36{
37 Q_OBJECT
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)
49public:
50 enum MaterialModes {
51 OriginalMaterial,
52 AugmentMaterial,
53 OverrideMaterial
54 };
55 Q_ENUM(MaterialModes)
56
57 enum PassMode {
58 UserPass,
59 SkyboxPass,
60 Item2DPass,
61 };
62 Q_ENUM(PassMode)
63
64 enum class RenderTargetFlag {
65 None = 0,
66 PreserveColorContents = 1 << 0,
67 PreserveDepthStencilContents = 1 << 1,
68 DoNotStoreDepthStencilContents = 1 << 2
69 };
70 Q_DECLARE_FLAGS(RenderTargetFlags, RenderTargetFlag)
71 Q_FLAG(RenderTargetFlags)
72
73 explicit QQuick3DRenderPass(QQuick3DObject *parent = nullptr);
74
75 QQmlListProperty<QQuick3DShaderUtilsRenderCommand> commands();
76
77 QColor clearColor() const;
78 void setClearColor(const QColor &newClearColor);
79
80 MaterialModes materialMode() const;
81 void setMaterialMode(MaterialModes newMaterialMode);
82
83 QQuick3DMaterial *overrideMaterial() const;
84 void setOverrideMaterial(QQuick3DMaterial *newOverrideMaterial);
85
86 QUrl augmentShader() const;
87 void setAugmentShader(const QUrl &newAugmentShader);
88
89 PassMode passMode() const;
90 void setPassMode(PassMode newPassMode);
91
92 float depthClearValue() const;
93 void setDepthClearValue(float newDepthClearValue);
94
95 quint32 stencilClearValue() const;
96 void setStencilClearValue(quint32 newStencilClearValue);
97
98 void markAllDirty() override { m_dirtyAttributes = AllDirty; }
99
100 RenderTargetFlags renderTargetFlags() const;
101 void setRenderTargetFlags(RenderTargetFlags newRenderTargetFlags);
102
103 enum class AugmentSplitResult {
104 Ok,
105 FunctionNotFound,
106 OpeningBraceNotFound,
107 ClosingBraceNotFound
108 };
109
110 // Splits a "void MAIN_FRAGMENT_AUGMENT() { ... }" augment shader into the body (the code
111 // inside the function's braces) and the preamble (everything outside it). On anything other
112 // than Ok the outputs are left untouched. Exposed for testing.
113 static AugmentSplitResult splitAugmentShader(const QByteArray &augment, QByteArray &preamble, QByteArray &body);
114
115Q_SIGNALS:
116 void outputChanged();
117 void materialModeChanged();
118 void clearColorChanged();
119 void overrideMaterialChanged();
120 void augmentShaderChanged();
121 void passModeChanged();
122 void depthClearValueChanged();
123 void stencilClearValueChanged();
124 void renderTargetFlagsChanged();
125
126protected:
127 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
128 void itemChange(QQuick3DObject::ItemChange , const QQuick3DObject::ItemChangeData &) override;
129 void markTrackedPropertyDirty(QMetaProperty property, QQuick3DPropertyChangedTracker::DirtyPropertyHint hint) override;
130
131private Q_SLOTS:
132 void onMaterialDestroyed(QObject *object);
133 void onCommandChanged();
134
135private:
136 friend void QQuick3DRenderPassPrivateHelper::subPassRef(QQuick3DRenderPass *);
137 friend void QQuick3DRenderPassPrivateHelper::subPassDeref(QQuick3DRenderPass *);
138
139 static void qmlAppendCommand(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list, QQuick3DShaderUtilsRenderCommand *command);
140 static QQuick3DShaderUtilsRenderCommand *qmlCommandAt(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list, qsizetype index);
141 static qsizetype qmlCommandCount(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list);
142 static void qmlCommandClear(QQmlListProperty<QQuick3DShaderUtilsRenderCommand> *list);
143
144 enum Dirty {
145 TextureDirty = 0x1,
146 PropertyDirty = 0x2,
147 CommandsDirty = 0x8,
148 ClearDirty = 0x10,
149 MaterialModeDirty = 0x20,
150 OverrideMaterialDirty = 0x40,
151 AugmentShaderDirty = 0x80,
152 PassTypeDirty = 0x100
153 };
154
155 using DirtyT = std::underlying_type_t<Dirty>;
156 static constexpr DirtyT AllDirty { std::numeric_limits<DirtyT>::max() };
157
158 void updateSceneManager(QQuick3DSceneManager *sceneManager);
159 void markDirty(QQuick3DRenderPass::Dirty type, bool requestSecondaryUpdate = false);
160 void clearDirty(QQuick3DRenderPass::Dirty type);
161
162 quint32 m_dirtyAttributes = AllDirty;
163 QVector<QQuick3DShaderUtilsRenderCommand *> m_commands;
164 QColor m_clearColor = Qt::black;
165 MaterialModes m_materialMode = OriginalMaterial;
166 QQuick3DMaterial *m_overrideMaterial = nullptr;
167 bool m_overrideMaterialRefed = false;
168 QUrl m_augmentShader;
169 PassMode m_passMode = UserPass;
170 float m_depthClearValue = 1.0f;
171 quint32 m_stencilClearValue = 0;
172 // Number of SubRenderPass commands currently referencing this pass. When
173 // greater than 0 the pass is a sub-pass, otherwise it is a top-level pass.
174 quint32 m_subRenderPassRef = 0;
175 RenderTargetFlags m_renderTargetFlags = RenderTargetFlag::None;
176};
177
178QT_END_NAMESPACE
179
180#endif // QQUICK3DRENDERPASS_P_H
void subPassDeref(QQuick3DRenderPass *pass)
void subPassRef(QQuick3DRenderPass *pass)
Combined button and popup list for selecting options.
static void notifySubPassRefChange(QQuick3DRenderPass *pass)