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 "qgeometryrenderer.h"
5#include "qgeometryrenderer_p.h"
6
7#include <private/qcomponent_p.h>
8
9QT_BEGIN_NAMESPACE
10
11
12namespace Qt3DRender {
13
14using namespace Qt3DCore;
15
16QGeometryRendererPrivate::QGeometryRendererPrivate()
17 : Qt3DCore::QBoundingVolumePrivate()
18 , m_instanceCount(1)
19 , m_vertexCount(0)
20 , m_indexOffset(0)
21 , m_firstInstance(0)
22 , m_firstVertex(0)
23 , m_indexBufferByteOffset(0)
24 , m_restartIndexValue(-1)
25 , m_verticesPerPatch(0)
26 , m_primitiveRestart(false)
27 , m_geometry(nullptr)
28 , m_primitiveType(QGeometryRenderer::Triangles)
29 , m_sortIndex(-1.f)
30{
31 m_primaryProvider = false;
32}
33
34QGeometryRendererPrivate::~QGeometryRendererPrivate()
35{
36}
37
38void QGeometryRendererPrivate::setView(QGeometryView *view)
39{
40 Q_Q(QGeometryRenderer);
41 if (m_view == view)
42 return;
43
44 if (m_view)
45 m_view->disconnect(receiver: q);
46
47 QBoundingVolumePrivate::setView(view);
48
49 // Ensures proper bookkeeping
50 if (m_view) {
51 QObject::connect(sender: view, signal: &QGeometryView::instanceCountChanged, context: q, slot: [this]() { update(); });
52 QObject::connect(sender: view, signal: &QGeometryView::vertexCountChanged, context: q, slot: [this]() { update(); });
53 QObject::connect(sender: view, signal: &QGeometryView::indexOffsetChanged, context: q, slot: [this]() { update(); });
54 QObject::connect(sender: view, signal: &QGeometryView::firstInstanceChanged, context: q, slot: [this]() { update(); });
55 QObject::connect(sender: view, signal: &QGeometryView::firstVertexChanged, context: q, slot: [this]() { update(); });
56 QObject::connect(sender: view, signal: &QGeometryView::indexBufferByteOffsetChanged, context: q, slot: [this]() { update(); });
57 QObject::connect(sender: view, signal: &QGeometryView::restartIndexValueChanged, context: q, slot: [this]() { update(); });
58 QObject::connect(sender: view, signal: &QGeometryView::verticesPerPatchChanged, context: q, slot: [this]() { update(); });
59 QObject::connect(sender: view, signal: &QGeometryView::primitiveRestartEnabledChanged, context: q, slot: [this]() { update(); });
60 QObject::connect(sender: view, signal: &QGeometryView::geometryChanged, context: q, slot: [this]() { update(); });
61 QObject::connect(sender: view, signal: &QGeometryView::primitiveTypeChanged, context: q, slot: [this]() { update(); });
62 }
63}
64
65/*!
66 \qmltype GeometryRenderer
67 \nativetype Qt3DRender::QGeometryRenderer
68 \inqmlmodule Qt3D.Render
69 \inherits BoundingVolume
70 \since 5.7
71 \brief Encapsulates geometry rendering.
72
73 A GeometryRenderer holds all the information necessary to draw
74 a Geometry. A Geometry holds the coordinates of the geometry data -
75 GeometryRenderer specifies how to interpret that data.
76 */
77
78/*!
79 \class Qt3DRender::QGeometryRenderer
80 \inmodule Qt3DRender
81 \since 5.7
82 \brief Encapsulates geometry rendering.
83
84 A Qt3DRender::QGeometryRenderer holds all the information necessary to draw
85 a Qt3DCore::QGeometry. A QGeometry holds the coordinates of the geometry data -
86 QGeometryRenderer specifies how to interpret that data.
87 */
88
89
90/*!
91 \enum Qt3DRender::QGeometryRenderer::PrimitiveType
92
93 The type of the primitive.
94
95 \value Points List of points
96 \value Lines List of lines
97 \value LineLoop Connected group of lines connected at ends forming a loop
98 \value LineStrip Connected group of lines
99 \value Triangles List of triangles
100 \value TriangleStrip List of connected triangles
101 \value TriangleFan List of connected triagles where all triangles share the first vertex
102 \value LinesAdjacency Allows geometry shader to access adjacent lines in a line list
103 \value TrianglesAdjacency Allows geometry shader to access adjacent triangles in a triangle list
104 \value LineStripAdjacency Allows geometry shader to access adjacent lines in a line strip
105 \value TriangleStripAdjacency Allows geometry shader to access adjacent triangles in a triangle strip
106 \value Patches Only primitive type accepted by tesselation shader where a patch consists of arbitrary number of vertices
107 */
108
109/*!
110 \qmlproperty int GeometryRenderer::instanceCount
111
112 Holds the instance count.
113 */
114
115/*!
116 \qmlproperty int GeometryRenderer::vertexCount
117
118 Holds the vertex count.
119 */
120
121/*!
122 \qmlproperty int GeometryRenderer::indexOffset
123
124 Holds the base vertex.
125 */
126
127/*!
128 \qmlproperty int GeometryRenderer::firstInstance
129
130 Holds the base instance.
131 */
132
133/*!
134 \qmlproperty int GeometryRenderer::firstVertex
135
136 Holds the first vertex.
137 */
138
139/*!
140 \qmlproperty int GeometryRenderer::indexBufferByteOffset
141
142 Holds the byte offset into the index buffer.
143 */
144
145/*!
146 \qmlproperty int GeometryRenderer::restartIndexValue
147
148 Holds the restart index.
149 */
150
151/*!
152 \qmlproperty int GeometryRenderer::verticesPerPatch
153
154 Holds vertices per patch.
155 */
156
157/*!
158 \qmlproperty bool GeometryRenderer::primitiveRestartEnabled
159
160 Holds the primitive restart flag.
161 */
162
163/*!
164 \qmlproperty Geometry GeometryRenderer::geometry
165
166 Holds the geometry.
167 */
168
169/*!
170 \qmlproperty enumeration GeometryRenderer::primitiveType
171
172 Holds the primitive type.
173
174 \list
175 \li QGeometryRenderer.Points
176 \li QGeometryRenderer.Lines
177 \li QGeometryRenderer.LineLoop
178 \li QGeometryRenderer.LineStrip
179 \li QGeometryRenderer.Triangles
180 \li QGeometryRenderer.TriangleStrip
181 \li QGeometryRenderer.TriangleFan
182 \li QGeometryRenderer.LinesAdjacency
183 \li QGeometryRenderer.TrianglesAdjacency
184 \li QGeometryRenderer.LineStripAdjacency
185 \li QGeometryRenderer.TriangleStripAdjacency
186 \li QGeometryRenderer.Patches
187 \endlist
188 \sa Qt3DRender::QGeometryRenderer::PrimitiveType
189 */
190/*!
191 \qmlproperty float GeometryRenderer::sortIndex
192 \since 6.0
193
194 Overrides the sorting index when depth sorting is enabled.
195
196 If depth sorting is enabled on the frame graph, the renderer will sort
197 objects based on how far the center of the bounding volume is from
198 the camera and render objects from the furthest to the closest.
199
200 This property can be used to override the depth index and precisely
201 control the order in which objects are rendered. This is useful when
202 all objects are at the same physical distance from the camera.
203
204 The actual values are not significant, only that they define an order
205 to sort the objects. These are sorted such as the object with the
206 smallest value is drawn first, then the second smallest, and so on.
207
208 \note Setting this to -1.f will disable the explicit sorting for this
209 entity and revert to using the distance from the center of the bounding
210 volume.
211
212 \sa SortPolicy
213*/
214
215
216/*!
217 Constructs a new QGeometryRenderer with \a parent.
218 */
219QGeometryRenderer::QGeometryRenderer(QNode *parent)
220 : Qt3DCore::QBoundingVolume(*new QGeometryRendererPrivate(), parent)
221{
222 Q_UNUSED(m_sortIndex)
223}
224
225/*!
226 \internal
227 */
228QGeometryRenderer::~QGeometryRenderer()
229{
230}
231
232/*!
233 \internal
234 */
235QGeometryRenderer::QGeometryRenderer(QGeometryRendererPrivate &dd, QNode *parent)
236 : Qt3DCore::QBoundingVolume(dd, parent)
237{
238}
239
240/*!
241 \property Qt3DRender::QGeometryRenderer::instanceCount
242
243 Holds the instance count.
244 */
245int QGeometryRenderer::instanceCount() const
246{
247 Q_D(const QGeometryRenderer);
248 return d->m_instanceCount;
249}
250
251/*!
252 \property Qt3DRender::QGeometryRenderer::vertexCount
253
254 Holds the primitive count.
255 */
256int QGeometryRenderer::vertexCount() const
257{
258 Q_D(const QGeometryRenderer);
259 return d->m_vertexCount;
260}
261
262/*!
263 \property Qt3DRender::QGeometryRenderer::indexOffset
264
265 Holds the base vertex.
266 */
267int QGeometryRenderer::indexOffset() const
268{
269 Q_D(const QGeometryRenderer);
270 return d->m_indexOffset;
271}
272
273/*!
274 \property Qt3DRender::QGeometryRenderer::firstInstance
275
276 Holds the base instance.
277 */
278int QGeometryRenderer::firstInstance() const
279{
280 Q_D(const QGeometryRenderer);
281 return d->m_firstInstance;
282}
283
284/*!
285 \property Qt3DRender::QGeometryRenderer::firstVertex
286
287 Holds the base vertex.
288 */
289int QGeometryRenderer::firstVertex() const
290{
291 Q_D(const QGeometryRenderer);
292 return d->m_firstVertex;
293}
294
295/*!
296 \property Qt3DRender::QGeometryRenderer::indexBufferByteOffset
297
298 Holds the byte offset into the index buffer.
299 */
300int QGeometryRenderer::indexBufferByteOffset() const
301{
302 Q_D(const QGeometryRenderer);
303 return d->m_indexBufferByteOffset;
304}
305
306/*!
307 \property Qt3DRender::QGeometryRenderer::restartIndexValue
308
309 Holds the restart index.
310 */
311int QGeometryRenderer::restartIndexValue() const
312{
313 Q_D(const QGeometryRenderer);
314 return d->m_restartIndexValue;
315}
316
317/*!
318 \property Qt3DRender::QGeometryRenderer::verticesPerPatch
319
320 Holds vertices per patch.
321 */
322int QGeometryRenderer::verticesPerPatch() const
323{
324 Q_D(const QGeometryRenderer);
325 return d->m_verticesPerPatch;
326}
327
328/*!
329 \property Qt3DRender::QGeometryRenderer::primitiveRestartEnabled
330
331 Holds the primitive restart flag.
332 */
333bool QGeometryRenderer::primitiveRestartEnabled() const
334{
335 Q_D(const QGeometryRenderer);
336 return d->m_primitiveRestart;
337}
338
339/*!
340 \property Qt3DRender::QGeometryRenderer::geometry
341
342 Holds the geometry.
343 */
344QGeometry *QGeometryRenderer::geometry() const
345{
346 Q_D(const QGeometryRenderer);
347 return d->m_geometry;
348}
349
350/*!
351 \property Qt3DRender::QGeometryRenderer::primitiveType
352
353 Holds the primitive type.
354 */
355QGeometryRenderer::PrimitiveType QGeometryRenderer::primitiveType() const
356{
357 Q_D(const QGeometryRenderer);
358 return d->m_primitiveType;
359}
360
361/*!
362 \property Qt3DRender::QGeometryRenderer::sortIndex
363 \since 6.0
364
365 Overrides the sorting index when depth sorting is enabled.
366
367 If depth sorting is enabled on the frame graph, the renderer will sort
368 objects based on how far the center of the bounding volume is from
369 the camera and render objects from the furthest to the closest.
370
371 This property can be used to override the depth index and precisely
372 control the order in which objects are rendered. This is useful when
373 all objects are at the same physical distance from the camera.
374
375 The actual values are not significant, only that they define an order
376 to sort the objects. These are sorted such as the object with the
377 smallest value is drawn first, then the second smallest, and so on.
378
379 \note Setting this to -1.f will disable the explicit sorting for this
380 entity and revert to using the distance from the center of the bounding
381 volume.
382
383 \sa Qt3DRender::QSortPolicy
384*/
385float QGeometryRenderer::sortIndex() const
386{
387 Q_D(const QGeometryRenderer);
388 return d->m_sortIndex;
389}
390
391void QGeometryRenderer::setInstanceCount(int instanceCount)
392{
393 Q_D(QGeometryRenderer);
394 if (d->m_instanceCount == instanceCount)
395 return;
396
397 d->m_instanceCount = instanceCount;
398 emit instanceCountChanged(instanceCount);
399}
400
401void QGeometryRenderer::setVertexCount(int vertexCount)
402{
403 Q_D(QGeometryRenderer);
404 if (d->m_vertexCount == vertexCount)
405 return;
406
407 d->m_vertexCount = vertexCount;
408 emit vertexCountChanged(vertexCount);
409}
410
411void QGeometryRenderer::setIndexOffset(int indexOffset)
412{
413 Q_D(QGeometryRenderer);
414 if (d->m_indexOffset == indexOffset)
415 return;
416
417 d->m_indexOffset = indexOffset;
418 emit indexOffsetChanged(indexOffset);
419}
420
421void QGeometryRenderer::setFirstInstance(int firstInstance)
422{
423 Q_D(QGeometryRenderer);
424 if (d->m_firstInstance == firstInstance)
425 return;
426
427 d->m_firstInstance = firstInstance;
428 emit firstInstanceChanged(firstInstance);
429}
430
431void QGeometryRenderer::setFirstVertex(int firstVertex)
432{
433 Q_D(QGeometryRenderer);
434 if (d->m_firstVertex == firstVertex)
435 return;
436
437 d->m_firstVertex = firstVertex;
438 emit firstVertexChanged(firstVertex);
439}
440
441void QGeometryRenderer::setIndexBufferByteOffset(int offset)
442{
443 Q_D(QGeometryRenderer);
444 if (d->m_indexBufferByteOffset == offset)
445 return;
446
447 d->m_indexBufferByteOffset = offset;
448 emit indexBufferByteOffsetChanged(offset);
449}
450
451void QGeometryRenderer::setRestartIndexValue(int index)
452{
453 Q_D(QGeometryRenderer);
454 if (index == d->m_restartIndexValue)
455 return;
456
457 d->m_restartIndexValue = index;
458 emit restartIndexValueChanged(restartIndexValue: index);
459}
460
461void QGeometryRenderer::setVerticesPerPatch(int verticesPerPatch)
462{
463 Q_D(QGeometryRenderer);
464 if (d->m_verticesPerPatch != verticesPerPatch) {
465 d->m_verticesPerPatch = verticesPerPatch;
466 emit verticesPerPatchChanged(verticesPerPatch);
467 }
468}
469
470void QGeometryRenderer::setPrimitiveRestartEnabled(bool enabled)
471{
472 Q_D(QGeometryRenderer);
473 if (enabled == d->m_primitiveRestart)
474 return;
475
476 d->m_primitiveRestart = enabled;
477 emit primitiveRestartEnabledChanged(primitiveRestartEnabled: enabled);
478}
479
480void QGeometryRenderer::setGeometry(QGeometry *geometry)
481{
482 Q_D(QGeometryRenderer);
483 if (d->m_geometry == geometry)
484 return;
485
486 if (d->m_geometry)
487 d->unregisterDestructionHelper(node: d->m_geometry);
488
489 if (geometry && !geometry->parent())
490 geometry->setParent(this);
491
492 d->m_geometry = geometry;
493
494 // Ensures proper bookkeeping
495 if (d->m_geometry)
496 d->registerDestructionHelper(node: d->m_geometry, func: &QGeometryRenderer::setGeometry, d->m_geometry);
497
498 emit geometryChanged(geometry);
499}
500
501void QGeometryRenderer::setPrimitiveType(QGeometryRenderer::PrimitiveType primitiveType)
502{
503 Q_D(QGeometryRenderer);
504 if (d->m_primitiveType == primitiveType)
505 return;
506
507 d->m_primitiveType = primitiveType;
508 emit primitiveTypeChanged(primitiveType);
509}
510
511void QGeometryRenderer::setSortIndex(float sortIndex)
512{
513 Q_D(QGeometryRenderer);
514 if (qFuzzyCompare(p1: d->m_sortIndex, p2: sortIndex))
515 return;
516
517 d->m_sortIndex = sortIndex;
518 emit sortIndexChanged(sortIndex: d->m_sortIndex);
519}
520
521} // namespace Qt3DRender
522
523QT_END_NAMESPACE
524
525#include "moc_qgeometryrenderer.cpp"
526

source code of qt3d/src/render/geometry/qgeometryrenderer.cpp