From af22d66fcfbb80f1cc4e42948aca29613443f44a Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Thu, 6 Aug 2015 11:52:27 +0200 Subject: Update RenderBuffer/QBuffer unit tests Change-Id: Iadb91977da8927544bd3b90ee512128367d70b84 Reviewed-by: Sean Harmer --- src/render/backend/renderbuffer.cpp | 7 +-- src/render/backend/renderbuffer_p.h | 1 + tests/auto/render/qbuffer/tst_qbuffer.cpp | 50 +++++++++++++++++++++- .../auto/render/renderbuffer/tst_renderbuffer.cpp | 48 +++++++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-) diff --git a/src/render/backend/renderbuffer.cpp b/src/render/backend/renderbuffer.cpp index 7fd576290..423255786 100644 --- a/src/render/backend/renderbuffer.cpp +++ b/src/render/backend/renderbuffer.cpp @@ -64,6 +64,7 @@ void RenderBuffer::cleanup() m_type = QBuffer::VertexBuffer; m_usage = QBuffer::StaticDraw; m_data.clear(); + m_functor.reset(); m_bufferDirty = false; } @@ -87,7 +88,7 @@ void RenderBuffer::updateFromPeer(QNode *peer) m_data = buffer->data(); m_functor = buffer->bufferFunctor(); // Add to dirty list in the manager - if (m_functor) + if (m_functor && m_manager != Q_NULLPTR) m_manager->addDirtyBuffer(peerUuid()); m_bufferDirty = true; } @@ -110,9 +111,9 @@ void RenderBuffer::sceneChangeEvent(const QSceneChangePtr &e) m_bufferDirty = true; } else if (propertyName == QByteArrayLiteral("bufferFunctor")) { QBufferFunctorPtr newFunctor = propertyChange->value().value(); - m_bufferDirty |= !(*newFunctor == *m_functor); + m_bufferDirty |= !(newFunctor && m_functor && *newFunctor == *m_functor); m_functor = newFunctor; - if (m_functor) + if (m_functor && m_manager != Q_NULLPTR) m_manager->addDirtyBuffer(peerUuid()); } } diff --git a/src/render/backend/renderbuffer_p.h b/src/render/backend/renderbuffer_p.h index d71548e18..698ad8084 100644 --- a/src/render/backend/renderbuffer_p.h +++ b/src/render/backend/renderbuffer_p.h @@ -66,6 +66,7 @@ public: inline QBuffer::UsageType usage() const { return m_usage; } inline QByteArray data() const { return m_data; } inline bool isDirty() const { return m_bufferDirty; } + inline QBufferFunctorPtr bufferFunctor() const { return m_functor; } void unsetDirty(); private: diff --git a/tests/auto/render/qbuffer/tst_qbuffer.cpp b/tests/auto/render/qbuffer/tst_qbuffer.cpp index 3b8a67c63..6ebe841ea 100644 --- a/tests/auto/render/qbuffer/tst_qbuffer.cpp +++ b/tests/auto/render/qbuffer/tst_qbuffer.cpp @@ -42,6 +42,7 @@ #include #include +#include class TestArbiter; @@ -118,6 +119,32 @@ void TestPostman::notifyBackend(const Qt3D::QSceneChangePtr &e) m_arbiter->sceneChangeEventWithLock(e); } +class TestFunctor : public Qt3D::QBufferFunctor +{ +public: + explicit TestFunctor(int size) + : m_size(size) + {} + + QByteArray operator ()() Q_DECL_FINAL + { + return QByteArray(); + } + + bool operator ==(const Qt3D::QBufferFunctor &other) const + { + const TestFunctor *otherFunctor = functor_cast(&other); + if (otherFunctor != Q_NULLPTR) + return otherFunctor->m_size == m_size; + return false; + } + + QT3D_FUNCTOR(TestFunctor) + +private: + int m_size; +}; + // We need to call QNode::clone which is protected // So we sublcass QNode instead of QObject class tst_QBuffer: public Qt3D::QNode @@ -141,11 +168,13 @@ private Q_SLOTS: Qt3D::QBuffer *buffer = new Qt3D::QBuffer(Qt3D::QBuffer::VertexBuffer); buffer->setUsage(Qt3D::QBuffer::DynamicRead); buffer->setData(QByteArrayLiteral("There's no replacement")); + buffer->setBufferFunctor(Qt3D::QBufferFunctorPtr(new TestFunctor(883))); QTest::newRow("vertex") << buffer; Qt3D::QBuffer *indexBuffer = new Qt3D::QBuffer(Qt3D::QBuffer::IndexBuffer); - buffer->setUsage(Qt3D::QBuffer::StaticCopy); - buffer->setData(QByteArrayLiteral("For displacement")); + indexBuffer->setUsage(Qt3D::QBuffer::StaticCopy); + indexBuffer->setData(QByteArrayLiteral("For displacement")); + indexBuffer->setBufferFunctor(Qt3D::QBufferFunctorPtr(new TestFunctor(1340))); QTest::newRow("index") << indexBuffer; } @@ -165,6 +194,10 @@ private Q_SLOTS: QCOMPARE(buffer->usage(), clone->usage()); QCOMPARE(buffer->type(), clone->type()); QCOMPARE(buffer->bufferFunctor(), clone->bufferFunctor()); + if (buffer->bufferFunctor()) { + QVERIFY(clone->bufferFunctor()); + QVERIFY(*clone->bufferFunctor() == *buffer->bufferFunctor()); + } } void checkPropertyUpdates() @@ -208,6 +241,19 @@ private Q_SLOTS: QCOMPARE(change->value().value(), QByteArrayLiteral("Z28")); arbiter.events.clear(); + + // WHEN + Qt3D::QBufferFunctorPtr functor(new TestFunctor(355)); + buffer->setBufferFunctor(functor); + QCoreApplication::processEvents(); + + // THEN + QCOMPARE(arbiter.events.size(), 1); + change = arbiter.events.first().staticCast(); + QCOMPARE(change->propertyName(), "bufferFunctor"); + QCOMPARE(change->value().value(), functor); + + arbiter.events.clear(); } protected: diff --git a/tests/auto/render/renderbuffer/tst_renderbuffer.cpp b/tests/auto/render/renderbuffer/tst_renderbuffer.cpp index f951e8691..0f66e1cf2 100644 --- a/tests/auto/render/renderbuffer/tst_renderbuffer.cpp +++ b/tests/auto/render/renderbuffer/tst_renderbuffer.cpp @@ -38,6 +38,32 @@ #include #include +class TestFunctor : public Qt3D::QBufferFunctor +{ +public: + explicit TestFunctor(int size) + : m_size(size) + {} + + QByteArray operator ()() Q_DECL_FINAL + { + return QByteArray(); + } + + bool operator ==(const Qt3D::QBufferFunctor &other) const + { + const TestFunctor *otherFunctor = functor_cast(&other); + if (otherFunctor != Q_NULLPTR) + return otherFunctor->m_size == m_size; + return false; + } + + QT3D_FUNCTOR(TestFunctor) + +private: + int m_size; +}; + class tst_RenderBuffer : public QObject { Q_OBJECT @@ -50,6 +76,7 @@ private Q_SLOTS: Qt3D::QBuffer buffer(Qt3D::QBuffer::IndexBuffer); buffer.setUsage(Qt3D::QBuffer::DynamicCopy); buffer.setData(QByteArrayLiteral("Corvette")); + buffer.setBufferFunctor(Qt3D::QBufferFunctorPtr(new TestFunctor(883))); // WHEN renderBuffer.setPeer(&buffer); @@ -60,6 +87,8 @@ private Q_SLOTS: QCOMPARE(renderBuffer.type(), buffer.type()); QCOMPARE(renderBuffer.usage(), buffer.usage()); QCOMPARE(renderBuffer.data(), buffer.data()); + QCOMPARE(renderBuffer.bufferFunctor(), buffer.bufferFunctor()); + QVERIFY(*renderBuffer.bufferFunctor() == *buffer.bufferFunctor()); } void checkInitialAndCleanedUpState() @@ -73,11 +102,13 @@ private Q_SLOTS: QCOMPARE(renderBuffer.usage(), Qt3D::QBuffer::StaticDraw); QVERIFY(renderBuffer.data().isEmpty()); QVERIFY(renderBuffer.peerUuid().isNull()); + QVERIFY(renderBuffer.bufferFunctor().isNull()); // GIVEN Qt3D::QBuffer buffer(Qt3D::QBuffer::IndexBuffer); buffer.setUsage(Qt3D::QBuffer::DynamicCopy); buffer.setData(QByteArrayLiteral("C7")); + buffer.setBufferFunctor(Qt3D::QBufferFunctorPtr(new TestFunctor(73))); // WHEN renderBuffer.updateFromPeer(&buffer); @@ -88,6 +119,7 @@ private Q_SLOTS: QCOMPARE(renderBuffer.type(), Qt3D::QBuffer::VertexBuffer); QCOMPARE(renderBuffer.usage(), Qt3D::QBuffer::StaticDraw); QVERIFY(renderBuffer.data().isEmpty()); + QVERIFY(renderBuffer.bufferFunctor().isNull()); } void checkPropertyChanges() @@ -137,6 +169,22 @@ private Q_SLOTS: QCOMPARE(renderBuffer.data(), QByteArrayLiteral("LS9")); QVERIFY(renderBuffer.isDirty()); + renderBuffer.unsetDirty(); + + QVERIFY(!renderBuffer.isDirty()); + + + // WHEN + Qt3D::QBufferFunctorPtr functor(new TestFunctor(355)); + updateChange.reset(new Qt3D::QScenePropertyChange(Qt3D::NodeUpdated, Qt3D::QSceneChange::Node, Qt3D::QNodeId())); + updateChange->setValue(QVariant::fromValue(functor)); + updateChange->setPropertyName("bufferFunctor"); + renderBuffer.sceneChangeEvent(updateChange); + + // THEN + QCOMPARE(renderBuffer.bufferFunctor(), functor); + QVERIFY(renderBuffer.isDirty()); + renderBuffer.unsetDirty(); QVERIFY(!renderBuffer.isDirty()); } -- cgit v1.2.3