1 | // Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #include "qrenderstateset.h" |
5 | #include "qrenderstateset_p.h" |
6 | |
7 | #include <Qt3DRender/qrenderstate.h> |
8 | |
9 | QT_BEGIN_NAMESPACE |
10 | |
11 | |
12 | namespace Qt3DRender { |
13 | |
14 | using namespace Qt3DCore; |
15 | |
16 | QRenderStateSetPrivate::QRenderStateSetPrivate() |
17 | : QFrameGraphNodePrivate() |
18 | { |
19 | } |
20 | |
21 | /*! |
22 | \class Qt3DRender::QRenderStateSet |
23 | \inmodule Qt3DRender |
24 | \since 5.5 |
25 | \brief The QRenderStateSet \l {QFrameGraphNode}{FrameGraph} node offers a way of |
26 | specifying a set of QRenderState objects to be applied during the execution |
27 | of a framegraph branch. |
28 | |
29 | States set on a QRenderStateSet are set globally, contrary to the per-material |
30 | states that can be set on a QRenderPass. By default, an empty |
31 | QRenderStateSet will result in all render states being disabled when |
32 | executed. Adding a QRenderState state explicitly enables that render |
33 | state at runtime. |
34 | |
35 | The RenderStateSet is enabled when added to the active frame graph: |
36 | |
37 | \code |
38 | // using namespace Qt3DRender; |
39 | |
40 | Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity(); |
41 | |
42 | QRenderSettings *renderSettings = new QRenderSettings(); |
43 | |
44 | QViewport *viewport = new QViewport(); |
45 | QCameraSelector *cameraSelector = new QCameraSelector(viewport); |
46 | |
47 | QClearBuffers *clearBuffers = new QClearBuffers(cameraSelector); |
48 | clearBuffers->setBuffers(QClearBuffers::ColorDepthBuffer); |
49 | |
50 | QRenderStateSet *renderStateSet = new QRenderStateSet(cameraSelector); |
51 | QCullFace *cullFace = new QCullFace(renderStateSet); |
52 | cullFace->setMode(QCullFace::Front); |
53 | renderStateSet->addRenderState(cullFace); |
54 | |
55 | renderSettings->setActiveFrameGraph(viewport); |
56 | |
57 | rootEntity->addComponent(renderSettings); |
58 | \endcode |
59 | |
60 | \sa QRenderState, QRenderPass |
61 | */ |
62 | |
63 | /*! |
64 | \qmltype RenderStateSet |
65 | \inqmlmodule Qt3D.Render |
66 | \since 5.5 |
67 | \inherits FrameGraphNode |
68 | \nativetype Qt3DRender::QRenderStateSet |
69 | \brief The RenderStateSet \l {FrameGraphNode}{FrameGraph} node offers a way of |
70 | specifying a set of RenderState objects to be applied during the execution |
71 | of a framegraph branch. |
72 | |
73 | States set on a RenderStateSet are set globally, contrary to the per-material |
74 | states that can be set on a RenderPass. By default, an empty |
75 | RenderStateSet will result in all render states being disabled when |
76 | executed. Adding a RenderState state explicitly enables that render |
77 | state at runtime. |
78 | |
79 | The RenderStateSet is enabled when added to the active frame graph: |
80 | |
81 | \qml |
82 | import Qt3D.Core 2.0 |
83 | import Qt3D.Render 2.0 |
84 | import Qt3D.Extras 2.0 |
85 | |
86 | Entity { |
87 | id: rootNode |
88 | components: [ |
89 | RenderSettings { |
90 | activeFrameGraph: RenderSurfaceSelector { |
91 | ClearBuffers { |
92 | buffers : ClearBuffers.ColorDepthBuffer |
93 | |
94 | CameraSelector { |
95 | camera: Camera { |
96 | position: Qt.vector3d(10, 0, 0) |
97 | viewCenter: Qt.vector3d(0, 0, 0) |
98 | } |
99 | RenderStateSet { |
100 | renderStates: [ |
101 | CullFace { mode: CullFace.Back } |
102 | ] |
103 | } |
104 | } |
105 | } |
106 | } |
107 | } |
108 | ] |
109 | |
110 | Entity { |
111 | id: sphereEntity |
112 | components: [ |
113 | GeometryRenderer { view: SphereMesh {} }, |
114 | PhongMaterial {} |
115 | ] |
116 | } |
117 | } |
118 | \endqml |
119 | |
120 | \sa RenderState, RenderPass |
121 | */ |
122 | |
123 | /*! |
124 | \qmlproperty list<RenderState> RenderStateSet::renderStates |
125 | Holds the list of RenderState objects used by the RenderStateSet. |
126 | */ |
127 | |
128 | QRenderStateSet::QRenderStateSet(QNode *parent) |
129 | : QFrameGraphNode(*new QRenderStateSetPrivate, parent) |
130 | { |
131 | } |
132 | |
133 | /*! \internal */ |
134 | QRenderStateSet::~QRenderStateSet() |
135 | { |
136 | } |
137 | |
138 | /*! |
139 | Adds a new QRenderState \a state to the QRenderStateSet instance. |
140 | |
141 | \note Not setting any QRenderState state on a QRenderStateSet instance |
142 | implies all the render states will be disabled at render time. |
143 | */ |
144 | void QRenderStateSet::addRenderState(QRenderState *state) |
145 | { |
146 | Q_ASSERT(state); |
147 | Q_D(QRenderStateSet); |
148 | |
149 | if (!d->m_renderStates.contains(t: state)) { |
150 | d->m_renderStates.append(t: state); |
151 | |
152 | // Ensures proper bookkeeping |
153 | d->registerDestructionHelper(node: state, func: &QRenderStateSet::removeRenderState, d->m_renderStates); |
154 | |
155 | if (!state->parent()) |
156 | state->setParent(this); |
157 | |
158 | d->update(); |
159 | } |
160 | } |
161 | |
162 | /*! |
163 | Removes the QRenderState \a state from the QRenderStateSet instance. |
164 | */ |
165 | void QRenderStateSet::removeRenderState(QRenderState *state) |
166 | { |
167 | Q_ASSERT(state); |
168 | Q_D(QRenderStateSet); |
169 | |
170 | if (!d->m_renderStates.removeOne(t: state)) |
171 | return; |
172 | d->update(); |
173 | // Remove bookkeeping connection |
174 | d->unregisterDestructionHelper(node: state); |
175 | } |
176 | |
177 | /*! |
178 | Returns the list of QRenderState objects that compose the QRenderStateSet instance. |
179 | */ |
180 | QList<QRenderState *> QRenderStateSet::renderStates() const |
181 | { |
182 | Q_D(const QRenderStateSet); |
183 | return d->m_renderStates; |
184 | } |
185 | |
186 | } // namespace Qt3DRender |
187 | |
188 | QT_END_NAMESPACE |
189 | |
190 | #include "moc_qrenderstateset.cpp" |
191 | |