diff options
author | Mike Krus <mike.krus@kdab.com> | 2020-02-11 14:14:30 +0000 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2020-02-27 12:10:04 +0000 |
commit | 703090204ef41bced5634bbb332551dea1dd7b37 (patch) | |
tree | a2e65326b1783d9cce71436bf787d2bdcfd106df /src/render/geometry | |
parent | 17706144e9dc6c2dfde580b7821f18c5f6924682 (diff) |
Introduce QGeometryView
Like QGeometryRenderer but not for rendering. A renderer can now be
given a view to render. Further down the line, picking and bounding
volume will be able to be given a view (could use a simplified
non-renderered proxy to calculate the bounding volume).
Change-Id: Ibe18b6e1d7c973e572bb3f2199c0776a4fc6c0e7
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/geometry')
-rw-r--r-- | src/render/geometry/geometryrenderer.cpp | 89 | ||||
-rw-r--r-- | src/render/geometry/qgeometryrenderer.cpp | 42 | ||||
-rw-r--r-- | src/render/geometry/qgeometryrenderer.h | 12 | ||||
-rw-r--r-- | src/render/geometry/qgeometryrenderer_p.h | 1 |
4 files changed, 97 insertions, 47 deletions
diff --git a/src/render/geometry/geometryrenderer.cpp b/src/render/geometry/geometryrenderer.cpp index 6f6227ba7..5a4bdcd9c 100644 --- a/src/render/geometry/geometryrenderer.cpp +++ b/src/render/geometry/geometryrenderer.cpp @@ -107,46 +107,55 @@ void GeometryRenderer::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) const QGeometryRenderer *node = qobject_cast<const QGeometryRenderer *>(frontEnd); if (!node) return; - - m_dirty |= m_instanceCount != node->instanceCount(); - m_instanceCount = node->instanceCount(); - m_dirty |= m_vertexCount != node->vertexCount(); - m_vertexCount = node->vertexCount(); - m_dirty |= m_indexOffset != node->indexOffset(); - m_indexOffset = node->indexOffset(); - m_dirty |= m_firstInstance != node->firstInstance(); - m_firstInstance = node->firstInstance(); - m_dirty |= m_firstVertex != node->firstVertex(); - m_firstVertex = node->firstVertex(); - m_dirty |= m_indexBufferByteOffset != node->indexBufferByteOffset(); - m_indexBufferByteOffset = node->indexBufferByteOffset(); - m_dirty |= m_restartIndexValue != node->restartIndexValue(); - m_restartIndexValue = node->restartIndexValue(); - m_dirty |= m_verticesPerPatch != node->verticesPerPatch(); - m_verticesPerPatch = node->verticesPerPatch(); - m_dirty |= m_primitiveRestartEnabled != node->primitiveRestartEnabled(); - m_primitiveRestartEnabled = node->primitiveRestartEnabled(); - m_dirty |= m_primitiveType != node->primitiveType(); - m_primitiveType = node->primitiveType(); - m_dirty |= (node->geometry() && m_geometryId != node->geometry()->id()) || (!node->geometry() && !m_geometryId.isNull()); - m_geometryId = node->geometry() ? node->geometry()->id() : Qt3DCore::QNodeId(); - - const QGeometryRendererPrivate *dnode = static_cast<const QGeometryRendererPrivate *>(QNodePrivate::get(frontEnd)); - QGeometryFactoryPtr newFunctor = dnode->m_geometryFactory; - const bool functorDirty = ((m_geometryFactory && !newFunctor) - || (!m_geometryFactory && newFunctor) - || (m_geometryFactory && newFunctor && !(*newFunctor == *m_geometryFactory))); - if (functorDirty) { - m_dirty = true; - m_geometryFactory = newFunctor; - if (m_geometryFactory && m_manager != nullptr) { - m_manager->addDirtyGeometryRenderer(peerId()); - - const bool isQMeshFunctor = m_geometryFactory->id() == Qt3DCore::functorTypeId<MeshLoaderFunctor>(); - if (isQMeshFunctor) { - const QMesh *meshNode = static_cast<const QMesh *>(node); - QMeshPrivate *dmeshNode = QMeshPrivate::get(const_cast<QMesh *>(meshNode)); - dmeshNode->setStatus(QMesh::Loading); + const Qt3DCore::QGeometryView *view = node->view(); + + auto propertyUpdater = [this](const auto *node) { + m_dirty |= m_instanceCount != node->instanceCount(); + m_instanceCount = node->instanceCount(); + m_dirty |= m_vertexCount != node->vertexCount(); + m_vertexCount = node->vertexCount(); + m_dirty |= m_indexOffset != node->indexOffset(); + m_indexOffset = node->indexOffset(); + m_dirty |= m_firstInstance != node->firstInstance(); + m_firstInstance = node->firstInstance(); + m_dirty |= m_firstVertex != node->firstVertex(); + m_firstVertex = node->firstVertex(); + m_dirty |= m_indexBufferByteOffset != node->indexBufferByteOffset(); + m_indexBufferByteOffset = node->indexBufferByteOffset(); + m_dirty |= m_restartIndexValue != node->restartIndexValue(); + m_restartIndexValue = node->restartIndexValue(); + m_dirty |= m_verticesPerPatch != node->verticesPerPatch(); + m_verticesPerPatch = node->verticesPerPatch(); + m_dirty |= m_primitiveRestartEnabled != node->primitiveRestartEnabled(); + m_primitiveRestartEnabled = node->primitiveRestartEnabled(); + m_dirty |= m_primitiveType != static_cast<QGeometryRenderer::PrimitiveType>(node->primitiveType()); + m_primitiveType = static_cast<QGeometryRenderer::PrimitiveType>(node->primitiveType()); + m_dirty |= (node->geometry() && m_geometryId != node->geometry()->id()) || (!node->geometry() && !m_geometryId.isNull()); + m_geometryId = node->geometry() ? node->geometry()->id() : Qt3DCore::QNodeId(); + }; + + if (view) { + propertyUpdater(view); + } else { + propertyUpdater(node); + + const QGeometryRendererPrivate *dnode = static_cast<const QGeometryRendererPrivate *>(QNodePrivate::get(frontEnd)); + QGeometryFactoryPtr newFunctor = dnode->m_geometryFactory; + const bool functorDirty = ((m_geometryFactory && !newFunctor) + || (!m_geometryFactory && newFunctor) + || (m_geometryFactory && newFunctor && !(*newFunctor == *m_geometryFactory))); + if (functorDirty) { + m_dirty = true; + m_geometryFactory = newFunctor; + if (m_geometryFactory && m_manager != nullptr) { + m_manager->addDirtyGeometryRenderer(peerId()); + + const bool isQMeshFunctor = m_geometryFactory->id() == Qt3DCore::functorTypeId<MeshLoaderFunctor>(); + if (isQMeshFunctor) { + const QMesh *meshNode = static_cast<const QMesh *>(node); + QMeshPrivate *dmeshNode = QMeshPrivate::get(const_cast<QMesh *>(meshNode)); + dmeshNode->setStatus(QMesh::Loading); + } } } } diff --git a/src/render/geometry/qgeometryrenderer.cpp b/src/render/geometry/qgeometryrenderer.cpp index 11a5460d0..f9029f099 100644 --- a/src/render/geometry/qgeometryrenderer.cpp +++ b/src/render/geometry/qgeometryrenderer.cpp @@ -61,6 +61,7 @@ QGeometryRendererPrivate::QGeometryRendererPrivate() , m_primitiveRestart(false) , m_geometry(nullptr) , m_primitiveType(QGeometryRenderer::Triangles) + , m_view(nullptr) { } @@ -339,6 +340,12 @@ QGeometryRenderer::PrimitiveType QGeometryRenderer::primitiveType() const return d->m_primitiveType; } +QGeometryView *QGeometryRenderer::view() const +{ + Q_D(const QGeometryRenderer); + return d->m_view; +} + void QGeometryRenderer::setInstanceCount(int instanceCount) { Q_D(QGeometryRenderer); @@ -459,6 +466,41 @@ void QGeometryRenderer::setPrimitiveType(QGeometryRenderer::PrimitiveType primit emit primitiveTypeChanged(primitiveType); } +void QGeometryRenderer::setView(QGeometryView *view) +{ + Q_D(QGeometryRenderer); + if (d->m_view == view) + return; + + if (d->m_view) { + d->unregisterDestructionHelper(d->m_view); + d->m_view->disconnect(this); + } + + if (view && !view->parent()) + view->setParent(this); + + d->m_view = view; + + // Ensures proper bookkeeping + if (d->m_view) { + d->registerDestructionHelper(d->m_view, &QGeometryRenderer::setView, d->m_view); + connect(view, &QGeometryView::instanceCountChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::vertexCountChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::indexOffsetChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::firstInstanceChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::firstVertexChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::indexBufferByteOffsetChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::restartIndexValueChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::verticesPerPatchChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::primitiveRestartEnabledChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::geometryChanged, this, [d]() { d->update(); }); + connect(view, &QGeometryView::primitiveTypeChanged, this, [d]() { d->update(); }); + } + + emit viewChanged(view); +} + } // namespace Qt3DRender QT_END_NAMESPACE diff --git a/src/render/geometry/qgeometryrenderer.h b/src/render/geometry/qgeometryrenderer.h index 435a315ad..0eee34b86 100644 --- a/src/render/geometry/qgeometryrenderer.h +++ b/src/render/geometry/qgeometryrenderer.h @@ -42,16 +42,11 @@ #include <Qt3DCore/qcomponent.h> #include <Qt3DCore/qgeometry.h> +#include <Qt3DCore/qgeometryview.h> #include <Qt3DRender/qt3drender_global.h> QT_BEGIN_NAMESPACE -namespace Qt3DCore { -class QGeometryFactory; - -typedef QSharedPointer<QGeometryFactory> QGeometryFactoryPtr; -} - namespace Qt3DRender { class QGeometryRendererPrivate; @@ -70,7 +65,7 @@ class Q_3DRENDERSHARED_EXPORT QGeometryRenderer : public Qt3DCore::QComponent Q_PROPERTY(bool primitiveRestartEnabled READ primitiveRestartEnabled WRITE setPrimitiveRestartEnabled NOTIFY primitiveRestartEnabledChanged) Q_PROPERTY(Qt3DCore::QGeometry* geometry READ geometry WRITE setGeometry NOTIFY geometryChanged) Q_PROPERTY(PrimitiveType primitiveType READ primitiveType WRITE setPrimitiveType NOTIFY primitiveTypeChanged) - + Q_PROPERTY(Qt3DCore::QGeometryView* view READ view WRITE setView NOTIFY viewChanged) public: explicit QGeometryRenderer(Qt3DCore::QNode *parent = nullptr); ~QGeometryRenderer(); @@ -105,6 +100,7 @@ public: bool primitiveRestartEnabled() const; Qt3DCore::QGeometry *geometry() const; PrimitiveType primitiveType() const; + Qt3DCore::QGeometryView *view() const; public Q_SLOTS: void setInstanceCount(int instanceCount); @@ -118,6 +114,7 @@ public Q_SLOTS: void setPrimitiveRestartEnabled(bool enabled); void setGeometry(Qt3DCore::QGeometry *geometry); void setPrimitiveType(PrimitiveType primitiveType); + void setView(Qt3DCore::QGeometryView *view); Q_SIGNALS: void instanceCountChanged(int instanceCount); @@ -131,6 +128,7 @@ Q_SIGNALS: void primitiveRestartEnabledChanged(bool primitiveRestartEnabled); void geometryChanged(Qt3DCore::QGeometry *geometry); void primitiveTypeChanged(PrimitiveType primitiveType); + void viewChanged(Qt3DCore::QGeometryView *view); protected: explicit QGeometryRenderer(QGeometryRendererPrivate &dd, Qt3DCore::QNode *parent = nullptr); diff --git a/src/render/geometry/qgeometryrenderer_p.h b/src/render/geometry/qgeometryrenderer_p.h index ab2a3f0f8..5bacb74c4 100644 --- a/src/render/geometry/qgeometryrenderer_p.h +++ b/src/render/geometry/qgeometryrenderer_p.h @@ -81,6 +81,7 @@ public: Qt3DCore::QGeometry *m_geometry; QGeometryRenderer::PrimitiveType m_primitiveType; Qt3DCore::QGeometryFactoryPtr m_geometryFactory; + Qt3DCore::QGeometryView *m_view; }; } // namespace Qt3DRender |