summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-08-06 15:45:31 +0200
committerPaul Lemire <paul.lemire@kdab.com>2015-08-07 16:50:36 +0000
commit16455ef340279642afb59948fe3997fa1a6104e4 (patch)
tree126c1989da665d47d7530e825ad782c56e237586
parent43d49a9d24dfdc08e660ac2b4a1eb7b8ac51f33f (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.cpp6
-rw-r--r--src/render/backend/rendergeometryrenderer_p.h3
-rw-r--r--tests/auto/render/rendergeometryrenderer/tst_rendergeometryrenderer.cpp50
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));