From 4bbe0ad81a06fb42f3aab592e5645e546bfb90db Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Tue, 4 Aug 2015 16:46:35 +0200 Subject: QBuffer/RenderBuffer: add a functor property Change-Id: Ic896425284c69a4cd71365b592444ce7edbc2dc2 Reviewed-by: Sean Harmer --- src/render/backend/renderbuffer.cpp | 10 ++++++++-- src/render/backend/renderbuffer_p.h | 2 ++ src/render/io/qbuffer.cpp | 22 ++++++++++++++++++++++ src/render/io/qbuffer.h | 5 +++++ src/render/io/qbuffer_p.h | 2 ++ 5 files changed, 39 insertions(+), 2 deletions(-) (limited to 'src/render') diff --git a/src/render/backend/renderbuffer.cpp b/src/render/backend/renderbuffer.cpp index 3f969c27a..81556322c 100644 --- a/src/render/backend/renderbuffer.cpp +++ b/src/render/backend/renderbuffer.cpp @@ -72,6 +72,7 @@ void RenderBuffer::updateFromPeer(QNode *peer) m_type = buffer->type(); m_usage = buffer->usage(); m_data = buffer->data(); + m_functor = buffer->bufferFunctor(); m_bufferDirty = true; } } @@ -82,14 +83,19 @@ void RenderBuffer::sceneChangeEvent(const QSceneChangePtr &e) QScenePropertyChangePtr propertyChange = qSharedPointerCast(e); QByteArray propertyName = propertyChange->propertyName(); if (propertyName == QByteArrayLiteral("data")) { - m_data = propertyChange->value().value(); - m_bufferDirty = true; + QByteArray newData = propertyChange->value().value(); + m_bufferDirty |= m_data != newData; + m_data = newData; } else if (propertyName == QByteArrayLiteral("type")) { m_type = static_cast(propertyChange->value().value()); m_bufferDirty = true; } else if (propertyName == QByteArrayLiteral("usage")) { m_usage = static_cast(propertyChange->value().value()); m_bufferDirty = true; + } else if (propertyName == QByteArrayLiteral("bufferFunctor")) { + QBufferFunctorPtr newFunctor = propertyChange->value().value(); + m_bufferDirty |= !(*newFunctor == *m_functor); + m_functor = newFunctor; } } } diff --git a/src/render/backend/renderbuffer_p.h b/src/render/backend/renderbuffer_p.h index 5a1e2b904..1fd4fd76f 100644 --- a/src/render/backend/renderbuffer_p.h +++ b/src/render/backend/renderbuffer_p.h @@ -39,6 +39,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -67,6 +68,7 @@ private: QBuffer::UsageType m_usage; QByteArray m_data; bool m_bufferDirty; + QBufferFunctorPtr m_functor; }; } // Render diff --git a/src/render/io/qbuffer.cpp b/src/render/io/qbuffer.cpp index ddaa701e6..7f28151ec 100644 --- a/src/render/io/qbuffer.cpp +++ b/src/render/io/qbuffer.cpp @@ -37,6 +37,7 @@ #include "qbuffer.h" #include "qbuffer_p.h" #include +#include QT_BEGIN_NAMESPACE @@ -79,6 +80,7 @@ void QBuffer::copy(const QNode *ref) const QBuffer *buffer = static_cast(ref); d_func()->m_type = buffer->d_func()->m_type; d_func()->m_usage = buffer->d_func()->m_usage; + d_func()->m_functor = buffer->d_func()->m_functor; } QBuffer::UsageType QBuffer::usage() const @@ -102,6 +104,26 @@ QBuffer::BufferType QBuffer::type() const return d->m_type; } +void QBuffer::setBufferFunctor(const QBufferFunctorPtr &functor) +{ + Q_D(QBuffer); + if (functor && d->m_functor && *functor == *d->m_functor) + return; + d->m_functor = functor; + if (d->m_changeArbiter != Q_NULLPTR) { + QScenePropertyChangePtr change(new QScenePropertyChange(NodeUpdated, QSceneChange::Node, id())); + change->setPropertyName("bufferFunctor"); + change->setValue(QVariant::fromValue(d->m_functor)); + d->notifyObservers(change); + } +} + +QBufferFunctorPtr QBuffer::bufferFunctor() const +{ + Q_D(const QBuffer); + return d->m_functor; +} + void QBuffer::setType(QBuffer::BufferType type) { Q_D(QBuffer); diff --git a/src/render/io/qbuffer.h b/src/render/io/qbuffer.h index 5e99a1a80..aad1ebcaa 100644 --- a/src/render/io/qbuffer.h +++ b/src/render/io/qbuffer.h @@ -51,6 +51,8 @@ GLint tupleSizeFromType(GLint type); GLuint byteSizeFromType(GLint type); class QBufferPrivate; +class QBufferFunctor; +typedef QSharedPointer QBufferFunctorPtr; class QT3DRENDERERSHARED_EXPORT QBuffer : public QAbstractBuffer { @@ -91,6 +93,9 @@ public: void setType(BufferType type); BufferType type() const; + void setBufferFunctor(const QBufferFunctorPtr &functor); + QBufferFunctorPtr bufferFunctor() const; + protected: QBuffer(QBufferPrivate &dd, QBuffer::BufferType ty, QNode *parent = 0); void copy(const QNode *ref) Q_DECL_OVERRIDE; diff --git a/src/render/io/qbuffer_p.h b/src/render/io/qbuffer_p.h index 036a9e26d..bab9e95f9 100644 --- a/src/render/io/qbuffer_p.h +++ b/src/render/io/qbuffer_p.h @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -53,6 +54,7 @@ public: QBuffer::BufferType m_type; QBuffer::UsageType m_usage; + QBufferFunctorPtr m_functor; }; } // Qt3D -- cgit v1.2.3