diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-09-17 14:10:35 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-20 14:26:13 +0200 |
commit | 88f97f70f8eeb6de4739175827d492019258312e (patch) | |
tree | 5a3a98ca070c2dcfdc78129e878c76d10c3a5fdd | |
parent | b27d2684e765b4cd49d985e23768a9199e72a509 (diff) |
Update QTechniqueFilter to use direct sync
Change-Id: I03da474dffbc8171fc4c3cbd24fe0e5e8432979e
Reviewed-by: Mike Krus <mike.krus@kdab.com>
-rw-r--r-- | src/render/framegraph/qtechniquefilter.cpp | 24 | ||||
-rw-r--r-- | src/render/framegraph/techniquefilternode.cpp | 62 | ||||
-rw-r--r-- | src/render/framegraph/techniquefilternode_p.h | 4 | ||||
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 2 | ||||
-rw-r--r-- | tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp | 49 |
5 files changed, 47 insertions, 94 deletions
diff --git a/src/render/framegraph/qtechniquefilter.cpp b/src/render/framegraph/qtechniquefilter.cpp index 404ad6991..28b151fc7 100644 --- a/src/render/framegraph/qtechniquefilter.cpp +++ b/src/render/framegraph/qtechniquefilter.cpp @@ -147,11 +147,7 @@ void QTechniqueFilter::addMatch(QFilterKey *filterKey) if (!filterKey->parent()) filterKey->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), filterKey); - change->setPropertyName("matchAll"); - d->notifyObservers(change); - } + d->update(); } } @@ -162,11 +158,7 @@ void QTechniqueFilter::removeMatch(QFilterKey *filterKey) { Q_ASSERT(filterKey); Q_D(QTechniqueFilter); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), filterKey); - change->setPropertyName("matchAll"); - d->notifyObservers(change); - } + d->update(); d->m_matchList.removeOne(filterKey); // Remove bookkeeping connection d->unregisterDestructionHelper(filterKey); @@ -192,11 +184,7 @@ void QTechniqueFilter::addParameter(QParameter *parameter) if (!parameter->parent()) parameter->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); } } @@ -207,11 +195,7 @@ void QTechniqueFilter::removeParameter(QParameter *parameter) { Q_ASSERT(parameter); Q_D(QTechniqueFilter); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); d->m_parameters.removeOne(parameter); // Remove bookkeeping connection d->unregisterDestructionHelper(parameter); diff --git a/src/render/framegraph/techniquefilternode.cpp b/src/render/framegraph/techniquefilternode.cpp index 8816984ee..8739143e6 100644 --- a/src/render/framegraph/techniquefilternode.cpp +++ b/src/render/framegraph/techniquefilternode.cpp @@ -59,13 +59,30 @@ TechniqueFilter::TechniqueFilter() { } -void TechniqueFilter::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void TechniqueFilter::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - FrameGraphNode::initializeFromPeer(change); - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QTechniqueFilterData>>(change); - const auto &data = typedChange->data; - m_filters = data.matchIds; - m_parameterPack.setParameters(data.parameterIds); + const QTechniqueFilter *node = qobject_cast<const QTechniqueFilter *>(frontEnd); + if (!node) + return; + + FrameGraphNode::syncFromFrontEnd(frontEnd, firstTime); + + if (firstTime) + m_parameterPack.clear(); + + auto parameters = qIdsForNodes(node->parameters()); + std::sort(std::begin(parameters), std::end(parameters)); + if (m_parameterPack.parameters() != parameters) { + m_parameterPack.setParameters(parameters); + markDirty(AbstractRenderer::FrameGraphDirty); + } + + auto filterIds = qIdsForNodes(node->matchAll()); + std::sort(std::begin(filterIds), std::end(filterIds)); + if (m_filters != filterIds) { + m_filters = filterIds; + markDirty(AbstractRenderer::FrameGraphDirty); + } } QVector<Qt3DCore::QNodeId> TechniqueFilter::parameters() const @@ -89,39 +106,6 @@ void TechniqueFilter::removeFilter(Qt3DCore::QNodeId criterionId) m_filters.removeOne(criterionId); } -void TechniqueFilter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - switch (e->type()) { - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("matchAll")) { - appendFilter(change->addedNodeId()); - markDirty(AbstractRenderer::FrameGraphDirty); - } else if (change->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.appendParameter(change->addedNodeId()); - markDirty(AbstractRenderer::FrameGraphDirty); - } - break; - } - - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("matchAll")) { - removeFilter(change->removedNodeId()); - markDirty(AbstractRenderer::FrameGraphDirty); - } else if (change->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.removeParameter(change->removedNodeId()); - markDirty(AbstractRenderer::FrameGraphDirty); - } - break; - } - - default: - break; - } - FrameGraphNode::sceneChangeEvent(e); -} - } // namespace Render } // namespace Qt3DRender diff --git a/src/render/framegraph/techniquefilternode_p.h b/src/render/framegraph/techniquefilternode_p.h index d7e6c1508..e424e37e5 100644 --- a/src/render/framegraph/techniquefilternode_p.h +++ b/src/render/framegraph/techniquefilternode_p.h @@ -79,11 +79,9 @@ public: QVector<Qt3DCore::QNodeId> parameters() const; QVector<Qt3DCore::QNodeId> filters() const; - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - void appendFilter(Qt3DCore::QNodeId criterionId); void removeFilter(Qt3DCore::QNodeId criterionId); diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index f7cd73496..c444fec2d 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -307,7 +307,7 @@ void QRenderAspectPrivate::registerBackendTypes() q->registerBackendType<QRenderSurfaceSelector, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::RenderSurfaceSelector, QRenderSurfaceSelector> >::create(m_renderer)); q->registerBackendType<QRenderTargetSelector, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::RenderTargetSelector, QRenderTargetSelector> >::create(m_renderer)); q->registerBackendType<QSortPolicy, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::SortPolicy, QSortPolicy> >::create(m_renderer)); - q->registerBackendType<QTechniqueFilter>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::TechniqueFilter, QTechniqueFilter> >::create(m_renderer)); + q->registerBackendType<QTechniqueFilter, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::TechniqueFilter, QTechniqueFilter> >::create(m_renderer)); q->registerBackendType<QViewport>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::ViewportNode, QViewport> >::create(m_renderer)); q->registerBackendType<QRenderCapture>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::RenderCapture, QRenderCapture> >::create(m_renderer)); q->registerBackendType<QBufferCapture>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::BufferCapture, QBufferCapture> >::create(m_renderer)); diff --git a/tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp b/tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp index 4f6daae8c..648fbd5ce 100644 --- a/tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp +++ b/tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp @@ -159,14 +159,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - Qt3DCore::QPropertyNodeAddedChangePtr nodeAddedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(nodeAddedChange->propertyName(), "parameter"); - QCOMPARE(nodeAddedChange->subjectId(),techniqueFilter->id()); - QCOMPARE(nodeAddedChange->addedNodeId(), param1->id()); - QCOMPARE(nodeAddedChange->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), techniqueFilter.data()); + arbiter.dirtyNodes.clear(); - arbiter.events.clear(); // WHEN techniqueFilter->addParameter(param1); @@ -174,20 +171,17 @@ private Q_SLOTS: // THEN QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 0); // WHEN techniqueFilter->removeParameter(param1); QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - Qt3DCore::QPropertyNodeRemovedChangePtr nodeRemovedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(nodeRemovedChange->propertyName(), "parameter"); - QCOMPARE(nodeRemovedChange->subjectId(), techniqueFilter->id()); - QCOMPARE(nodeRemovedChange->removedNodeId(), param1->id()); - QCOMPARE(nodeRemovedChange->type(), Qt3DCore::PropertyValueRemoved); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), techniqueFilter.data()); + arbiter.dirtyNodes.clear(); // WHEN Qt3DRender::QFilterKey *filterKey1 = new Qt3DRender::QFilterKey(); @@ -195,14 +189,10 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - nodeAddedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(nodeAddedChange->propertyName(), "matchAll"); - QCOMPARE(nodeAddedChange->subjectId(),techniqueFilter->id()); - QCOMPARE(nodeAddedChange->addedNodeId(), filterKey1->id()); - QCOMPARE(nodeAddedChange->type(), Qt3DCore::PropertyValueAdded); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), techniqueFilter.data()); + arbiter.dirtyNodes.clear(); // WHEN techniqueFilter->addMatch(filterKey1); @@ -210,20 +200,17 @@ private Q_SLOTS: // THEN QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 0); // WHEN techniqueFilter->removeMatch(filterKey1); QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - nodeRemovedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(nodeRemovedChange->propertyName(), "matchAll"); - QCOMPARE(nodeRemovedChange->subjectId(), techniqueFilter->id()); - QCOMPARE(nodeRemovedChange->removedNodeId(), filterKey1->id()); - QCOMPARE(nodeRemovedChange->type(), Qt3DCore::PropertyValueRemoved); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), techniqueFilter.data()); + arbiter.dirtyNodes.clear(); } void checkParameterBookkeeping() |