diff options
author | Mike Krus <mike.krus@kdab.com> | 2019-09-06 12:13:02 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-18 12:38:09 +0200 |
commit | 07293eb3e36cafe8196da91d0f7c296618d6e850 (patch) | |
tree | eae2401f4ba3fba2926acb55f004aa18cfe83314 /src/render/geometry | |
parent | c380b57ccf0915ac1cc9f18f59015538c7d3fab4 (diff) |
Update QGeometry to use direct sync
Change-Id: I56397c1962acf0f856d485564b6fac159beebcdd
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/geometry')
-rw-r--r-- | src/render/geometry/geometry.cpp | 56 | ||||
-rw-r--r-- | src/render/geometry/geometry_p.h | 4 | ||||
-rw-r--r-- | src/render/geometry/qgeometry.cpp | 12 |
3 files changed, 21 insertions, 51 deletions
diff --git a/src/render/geometry/geometry.cpp b/src/render/geometry/geometry.cpp index 4ee02a74d..cb401df5b 100644 --- a/src/render/geometry/geometry.cpp +++ b/src/render/geometry/geometry.cpp @@ -45,6 +45,8 @@ #include <Qt3DCore/qpropertynodeaddedchange.h> #include <Qt3DCore/qpropertynoderemovedchange.h> +#include <algorithm> + QT_BEGIN_NAMESPACE using namespace Qt3DCore; @@ -76,51 +78,29 @@ void Geometry::cleanup() m_shouldNotifyMaxExtentChanged = false; } -void Geometry::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QGeometryData>>(change); - const auto &data = typedChange->data; - m_attributes = data.attributeIds; - m_boundingPositionAttribute = data.boundingVolumePositionAttributeId; - m_geometryDirty = true; - markDirty(AbstractRenderer::GeometryDirty); -} - -void Geometry::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) +void Geometry::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - switch (e->type()) { - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("attribute")) { - m_attributes.push_back(change->addedNodeId()); - m_geometryDirty = true; - } - break; - } - - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("attribute")) { - m_attributes.removeOne(change->removedNodeId()); - m_geometryDirty = true; - } - break; + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QGeometry *node = qobject_cast<const QGeometry *>(frontEnd); + if (!node) + return; + + m_geometryDirty |= firstTime; + + QNodeIdVector attribs = qIdsForNodes(node->attributes()); + std::sort(std::begin(attribs), std::end(attribs)); + if (m_attributes != attribs) { + m_attributes = attribs; + m_geometryDirty = true; } - case PropertyUpdated: { + if ((node->boundingVolumePositionAttribute() && node->boundingVolumePositionAttribute()->id() != m_boundingPositionAttribute) || // Note: doesn't set dirtyness as this parameter changing doesn't need a new VAO update. - const auto change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("boundingVolumePositionAttribute")) { - m_boundingPositionAttribute = change->value().value<QNodeId>(); - break; - } + (!node->boundingVolumePositionAttribute() && !m_boundingPositionAttribute.isNull())) { + m_boundingPositionAttribute = node->boundingVolumePositionAttribute() ? node->boundingVolumePositionAttribute()->id() : QNodeId{}; } - default: - break; - } markDirty(AbstractRenderer::GeometryDirty); - BackendNode::sceneChangeEvent(e); } void Geometry::unsetDirty() diff --git a/src/render/geometry/geometry_p.h b/src/render/geometry/geometry_p.h index e66524787..429a577b0 100644 --- a/src/render/geometry/geometry_p.h +++ b/src/render/geometry/geometry_p.h @@ -68,7 +68,7 @@ public: void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; inline QVector<Qt3DCore::QNodeId> attributes() const { return m_attributes; } inline bool isDirty() const { return m_geometryDirty; } @@ -82,8 +82,6 @@ public: void notifyExtentChanged(); private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - QVector<Qt3DCore::QNodeId> m_attributes; bool m_geometryDirty; Qt3DCore::QNodeId m_boundingPositionAttribute; diff --git a/src/render/geometry/qgeometry.cpp b/src/render/geometry/qgeometry.cpp index ec80e2657..47fad4302 100644 --- a/src/render/geometry/qgeometry.cpp +++ b/src/render/geometry/qgeometry.cpp @@ -196,11 +196,7 @@ void QGeometry::addAttribute(QAttribute *attribute) if (!attribute->parent()) attribute->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), attribute); - change->setPropertyName("attribute"); - d->notifyObservers(change); - } + d->update(); } } @@ -212,14 +208,10 @@ void QGeometry::removeAttribute(QAttribute *attribute) { Q_ASSERT(attribute); Q_D(QGeometry); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), attribute); - change->setPropertyName("attribute"); - d->notifyObservers(change); - } d->m_attributes.removeOne(attribute); // Remove bookkeeping connection d->unregisterDestructionHelper(attribute); + d->update(); } void QGeometry::setBoundingVolumePositionAttribute(QAttribute *boundingVolumePositionAttribute) |