diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-08-06 15:45:31 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2015-08-07 16:50:36 +0000 |
commit | 16455ef340279642afb59948fe3997fa1a6104e4 (patch) | |
tree | 126c1989da665d47d7530e825ad782c56e237586 | |
parent | 43d49a9d24dfdc08e660ac2b4a1eb7b8ac51f33f (diff) |
RenderGeometryRenderer: copy functor from frontend node
Change-Id: I367e1f736d1a55e76fdd4633a9da34832db9bae7
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/render/backend/rendergeometryrenderer.cpp | 6 | ||||
-rw-r--r-- | src/render/backend/rendergeometryrenderer_p.h | 3 | ||||
-rw-r--r-- | tests/auto/render/rendergeometryrenderer/tst_rendergeometryrenderer.cpp | 50 |
3 files changed, 59 insertions, 0 deletions
diff --git a/src/render/backend/rendergeometryrenderer.cpp b/src/render/backend/rendergeometryrenderer.cpp index 4625ae45c..ff40ea337 100644 --- a/src/render/backend/rendergeometryrenderer.cpp +++ b/src/render/backend/rendergeometryrenderer.cpp @@ -71,6 +71,7 @@ void RenderGeometryRenderer::cleanup() m_primitiveType = QGeometryRenderer::Triangles; m_geometryId = QNodeId(); m_dirty = false; + m_functor.reset(); } void RenderGeometryRenderer::updateFromPeer(QNode *peer) @@ -86,6 +87,7 @@ void RenderGeometryRenderer::updateFromPeer(QNode *peer) m_primitiveType = geometryRenderer->primitiveType(); if (geometryRenderer->geometry() != Q_NULLPTR) m_geometryId = geometryRenderer->geometry()->id(); + m_functor = geometryRenderer->geometryFunctor(); m_dirty = true; } } @@ -119,6 +121,10 @@ void RenderGeometryRenderer::sceneChangeEvent(const QSceneChangePtr &e) } else if (propertyName == QByteArrayLiteral("primitiveType")) { m_primitiveType = static_cast<QGeometryRenderer::PrimitiveType>(propertyChange->value().value<int>()); m_dirty = true; + } else if (propertyName == QByteArrayLiteral("geometryFunctor")) { + QGeometryFunctorPtr newFunctor = propertyChange->value().value<QGeometryFunctorPtr>(); + m_dirty |= !(newFunctor && m_functor && *newFunctor == *m_functor); + m_functor = newFunctor; } break; } diff --git a/src/render/backend/rendergeometryrenderer_p.h b/src/render/backend/rendergeometryrenderer_p.h index 40f8f2c85..83ac7fc9d 100644 --- a/src/render/backend/rendergeometryrenderer_p.h +++ b/src/render/backend/rendergeometryrenderer_p.h @@ -39,6 +39,7 @@ #include <Qt3DCore/qbackendnode.h> #include <Qt3DRenderer/qgeometryrenderer.h> +#include <Qt3DRenderer/qgeometryfunctor.h> QT_BEGIN_NAMESPACE @@ -65,6 +66,7 @@ public: inline bool primitiveRestart() const { return m_primitiveRestart; } inline QGeometryRenderer::PrimitiveType primitiveType() const { return m_primitiveType; } inline bool isDirty() const { return m_dirty; } + inline QGeometryFunctorPtr geometryFunctor() const { return m_functor; } void unsetDirty(); private: @@ -77,6 +79,7 @@ private: bool m_primitiveRestart; QGeometryRenderer::PrimitiveType m_primitiveType; bool m_dirty; + QGeometryFunctorPtr m_functor; }; } // Render diff --git a/tests/auto/render/rendergeometryrenderer/tst_rendergeometryrenderer.cpp b/tests/auto/render/rendergeometryrenderer/tst_rendergeometryrenderer.cpp index 086e6330a..1c018865b 100644 --- a/tests/auto/render/rendergeometryrenderer/tst_rendergeometryrenderer.cpp +++ b/tests/auto/render/rendergeometryrenderer/tst_rendergeometryrenderer.cpp @@ -37,8 +37,35 @@ #include <QtTest/QTest> #include <Qt3DRenderer/private/rendergeometryrenderer_p.h> #include <Qt3DRenderer/qgeometry.h> +#include <Qt3DRenderer/qgeometryfunctor.h> #include <Qt3DCore/qscenepropertychange.h> +class TestFunctor : public Qt3D::QGeometryFunctor +{ +public: + explicit TestFunctor(int size) + : m_size(size) + {} + + Qt3D::QGeometry *operator ()() Q_DECL_FINAL + { + return Q_NULLPTR; + } + + bool operator ==(const Qt3D::QGeometryFunctor &other) const + { + const TestFunctor *otherFunctor = functor_cast<TestFunctor>(&other); + if (otherFunctor != Q_NULLPTR) + return otherFunctor->m_size == m_size; + return false; + } + + QT3D_FUNCTOR(TestFunctor) + +private: + int m_size; +}; + class tst_RenderGeometryRenderer : public QObject { Q_OBJECT @@ -50,6 +77,7 @@ private Q_SLOTS: Qt3D::Render::RenderGeometryRenderer renderGeometryRenderer; Qt3D::QGeometryRenderer geometryRenderer; Qt3D::QGeometry geometry; + Qt3D::QGeometryFunctorPtr functor(new TestFunctor(1200)); geometryRenderer.setInstanceCount(1584); geometryRenderer.setPrimitiveCount(1609); @@ -59,6 +87,7 @@ private Q_SLOTS: geometryRenderer.setPrimitiveRestart(true); geometryRenderer.setPrimitiveType(Qt3D::QGeometryRenderer::Patches); geometryRenderer.setGeometry(&geometry); + geometryRenderer.setGeometryFunctor(functor); // WHEN renderGeometryRenderer.setPeer(&geometryRenderer); @@ -74,6 +103,8 @@ private Q_SLOTS: QCOMPARE(renderGeometryRenderer.primitiveRestart(), geometryRenderer.primitiveRestart()); QCOMPARE(renderGeometryRenderer.primitiveType(), geometryRenderer.primitiveType()); QCOMPARE(renderGeometryRenderer.geometryId(), geometry.id()); + QCOMPARE(renderGeometryRenderer.geometryFunctor(), functor); + QVERIFY(*renderGeometryRenderer.geometryFunctor() == *functor); } void checkInitialAndCleanedUpState() @@ -92,10 +123,13 @@ private Q_SLOTS: QCOMPARE(renderGeometryRenderer.restartIndex(), -1); QCOMPARE(renderGeometryRenderer.primitiveRestart(), false); QCOMPARE(renderGeometryRenderer.primitiveType(), Qt3D::QGeometryRenderer::Triangles); + QVERIFY(renderGeometryRenderer.geometryFunctor().isNull()); // GIVEN Qt3D::QGeometryRenderer geometryRenderer; Qt3D::QGeometry geometry; + Qt3D::QGeometryFunctorPtr functor(new TestFunctor(1200)); + geometryRenderer.setInstanceCount(454); geometryRenderer.setPrimitiveCount(350); @@ -105,6 +139,7 @@ private Q_SLOTS: geometryRenderer.setPrimitiveRestart(true); geometryRenderer.setPrimitiveType(Qt3D::QGeometryRenderer::Patches); geometryRenderer.setGeometry(&geometry); + geometryRenderer.setGeometryFunctor(functor); // WHEN renderGeometryRenderer.updateFromPeer(&geometryRenderer); @@ -121,6 +156,7 @@ private Q_SLOTS: QCOMPARE(renderGeometryRenderer.restartIndex(), -1); QCOMPARE(renderGeometryRenderer.primitiveRestart(), false); QCOMPARE(renderGeometryRenderer.primitiveType(), Qt3D::QGeometryRenderer::Triangles); + QVERIFY(renderGeometryRenderer.geometryFunctor().isNull()); } void checkPropertyChanges() @@ -222,6 +258,20 @@ private Q_SLOTS: QVERIFY(!renderGeometryRenderer.isDirty()); // WHEN + updateChange.reset(new Qt3D::QScenePropertyChange(Qt3D::NodeUpdated, Qt3D::QSceneChange::Node, Qt3D::QNodeId())); + updateChange->setPropertyName("geometryFunctor"); + Qt3D::QGeometryFunctorPtr functor(new TestFunctor(1450)); + updateChange->setValue(QVariant::fromValue(functor)); + renderGeometryRenderer.sceneChangeEvent(updateChange); + + // THEN + QCOMPARE(renderGeometryRenderer.geometryFunctor(), functor); + QVERIFY(renderGeometryRenderer.isDirty()); + + renderGeometryRenderer.unsetDirty(); + QVERIFY(!renderGeometryRenderer.isDirty()); + + // WHEN updateChange.reset(new Qt3D::QScenePropertyChange(Qt3D::NodeAdded, Qt3D::QSceneChange::Node, Qt3D::QNodeId())); Qt3D::QNodeId geometryId = Qt3D::QNodeId::createId(); updateChange->setValue(QVariant::fromValue(geometryId)); |