summaryrefslogtreecommitdiffstats
path: root/src/render/geometry
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2020-02-11 14:14:30 +0000
committerMike Krus <mike.krus@kdab.com>2020-02-27 12:10:04 +0000
commit703090204ef41bced5634bbb332551dea1dd7b37 (patch)
treea2e65326b1783d9cce71436bf787d2bdcfd106df /src/render/geometry
parent17706144e9dc6c2dfde580b7821f18c5f6924682 (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.cpp89
-rw-r--r--src/render/geometry/qgeometryrenderer.cpp42
-rw-r--r--src/render/geometry/qgeometryrenderer.h12
-rw-r--r--src/render/geometry/qgeometryrenderer_p.h1
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