diff options
author | Paul Lemire <paul.lemire350@gmail.com> | 2015-10-11 13:03:49 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2015-10-14 18:52:33 +0000 |
commit | c8b386a57d53eb2c24f1e32f483569c56db6f362 (patch) | |
tree | 4bed01feb9b11e612c8ddd72926bc2e0437f551b /src | |
parent | f85ae770b47e0e482e88ed5e7b14d8dfb3ea7e97 (diff) |
RenderBuffer: handle the sync property
And update the frontend QBuffer with the data obtained from the functor
if sync is true.
Change-Id: I86e4dff50fedf3fbc6057843a8a60c978d68b047
Task-number: QTBUG-48454
Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/render/geometry/buffer.cpp | 16 | ||||
-rw-r--r-- | src/render/geometry/buffer_p.h | 2 | ||||
-rw-r--r-- | src/render/geometry/qbuffer.cpp | 10 | ||||
-rw-r--r-- | src/render/geometry/qbuffer.h | 1 |
4 files changed, 28 insertions, 1 deletions
diff --git a/src/render/geometry/buffer.cpp b/src/render/geometry/buffer.cpp index 762148182..0fdd258a1 100644 --- a/src/render/geometry/buffer.cpp +++ b/src/render/geometry/buffer.cpp @@ -36,6 +36,7 @@ #include "buffer_p.h" #include <Qt3DCore/qscenepropertychange.h> +#include <Qt3DCore/qbackendscenepropertychange.h> #include <Qt3DRenderer/private/buffermanager_p.h> QT_BEGIN_NAMESPACE @@ -46,10 +47,11 @@ namespace Qt3DRender { namespace Render { Buffer::Buffer() - : QBackendNode(QBackendNode::ReadOnly) + : QBackendNode(QBackendNode::ReadWrite) , m_type(QBuffer::VertexBuffer) , m_usage(QBuffer::StaticDraw) , m_bufferDirty(false) + , m_sync(false) , m_manager(Q_NULLPTR) { // Maybe it could become read write if we want to inform @@ -67,6 +69,7 @@ void Buffer::cleanup() m_data.clear(); m_functor.reset(); m_bufferDirty = false; + m_sync = false; } @@ -79,6 +82,14 @@ void Buffer::executeFunctor() { Q_ASSERT(m_functor); m_data = (*m_functor)(); + if (m_sync) { + // Send data back to the frontend + QBackendScenePropertyChangePtr e(new QBackendScenePropertyChange(NodeUpdated, peerUuid())); + e->setPropertyName("data"); + e->setTargetNode(peerUuid()); + e->setValue(QVariant::fromValue(m_data)); + notifyObservers(e); + } } void Buffer::updateFromPeer(Qt3DCore::QNode *peer) @@ -93,6 +104,7 @@ void Buffer::updateFromPeer(Qt3DCore::QNode *peer) if (m_functor && m_manager != Q_NULLPTR) m_manager->addDirtyBuffer(peerUuid()); m_bufferDirty = true; + m_sync = buffer->isSync(); } } @@ -117,6 +129,8 @@ void Buffer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_functor = newFunctor; if (m_functor && m_manager != Q_NULLPTR) m_manager->addDirtyBuffer(peerUuid()); + } else if (propertyName == QByteArrayLiteral("sync")) { + m_sync = propertyChange->value().toBool(); } } } diff --git a/src/render/geometry/buffer_p.h b/src/render/geometry/buffer_p.h index 1d5d02dae..7da08a2a2 100644 --- a/src/render/geometry/buffer_p.h +++ b/src/render/geometry/buffer_p.h @@ -78,6 +78,7 @@ public: inline QByteArray data() const { return m_data; } inline bool isDirty() const { return m_bufferDirty; } inline QBufferFunctorPtr bufferFunctor() const { return m_functor; } + inline bool isSync() const { return m_sync; } void unsetDirty(); private: @@ -85,6 +86,7 @@ private: QBuffer::UsageType m_usage; QByteArray m_data; bool m_bufferDirty; + bool m_sync; QBufferFunctorPtr m_functor; BufferManager *m_manager; }; diff --git a/src/render/geometry/qbuffer.cpp b/src/render/geometry/qbuffer.cpp index 41c10e7e1..df789486b 100644 --- a/src/render/geometry/qbuffer.cpp +++ b/src/render/geometry/qbuffer.cpp @@ -87,6 +87,16 @@ void QBuffer::copy(const QNode *ref) d_func()->m_sync = buffer->d_func()->m_sync; } +void QBuffer::sceneChangeEvent(const QSceneChangePtr &change) +{ + QScenePropertyChangePtr e = qSharedPointerCast<QScenePropertyChange>(change); + if (e->type() == NodeUpdated && e->propertyName() == QByteArrayLiteral("data")) { + const bool blocked = blockNotifications(true); + setData(e->value().toByteArray()); + blockNotifications(blocked); + } +} + QBuffer::UsageType QBuffer::usage() const { Q_D(const QBuffer); diff --git a/src/render/geometry/qbuffer.h b/src/render/geometry/qbuffer.h index 186f236a6..c2da32fbe 100644 --- a/src/render/geometry/qbuffer.h +++ b/src/render/geometry/qbuffer.h @@ -103,6 +103,7 @@ public: protected: QBuffer(QBufferPrivate &dd, QBuffer::BufferType ty, Qt3DCore::QNode *parent = 0); void copy(const Qt3DCore::QNode *ref) Q_DECL_OVERRIDE; + void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) Q_DECL_OVERRIDE; Q_SIGNALS: void typeChanged(); |