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
9QT_BEGIN_NAMESPACE
10
11
12namespace Qt3DRender {
13
14using namespace Qt3DCore;
15
16QRenderStateSetPrivate::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
128QRenderStateSet::QRenderStateSet(QNode *parent)
129 : QFrameGraphNode(*new QRenderStateSetPrivate, parent)
130{
131}
132
133/*! \internal */
134QRenderStateSet::~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 */
144void 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 */
165void 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 */
180QList<QRenderState *> QRenderStateSet::renderStates() const
181{
182 Q_D(const QRenderStateSet);
183 return d->m_renderStates;
184}
185
186} // namespace Qt3DRender
187
188QT_END_NAMESPACE
189
190#include "moc_qrenderstateset.cpp"
191

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of qt3d/src/render/framegraph/qrenderstateset.cpp