diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-09-17 08:44:57 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-19 14:04:43 +0200 |
commit | 29bf6a68c01ad95bd57c34512901a474252be972 (patch) | |
tree | ab44736d76757c93edde3dbc6959913f8489ea52 /src/render/materialsystem | |
parent | f88fa485e3ebfeaefa7aa7e5f277e47fd0ed12b5 (diff) |
Update QTechnique to use direct sync
Change-Id: I9e64880df50f10f7a1eebabe35c7c131044e1ab4
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/materialsystem')
-rw-r--r-- | src/render/materialsystem/qgraphicsapifilter.cpp | 5 | ||||
-rw-r--r-- | src/render/materialsystem/qgraphicsapifilter_p.h | 1 | ||||
-rw-r--r-- | src/render/materialsystem/qtechnique.cpp | 50 | ||||
-rw-r--r-- | src/render/materialsystem/qtechnique.h | 3 | ||||
-rw-r--r-- | src/render/materialsystem/technique.cpp | 90 | ||||
-rw-r--r-- | src/render/materialsystem/technique_p.h | 4 |
6 files changed, 57 insertions, 96 deletions
diff --git a/src/render/materialsystem/qgraphicsapifilter.cpp b/src/render/materialsystem/qgraphicsapifilter.cpp index 70f329172..9b5557930 100644 --- a/src/render/materialsystem/qgraphicsapifilter.cpp +++ b/src/render/materialsystem/qgraphicsapifilter.cpp @@ -107,6 +107,11 @@ QGraphicsApiFilterPrivate *QGraphicsApiFilterPrivate::get(QGraphicsApiFilter *q) return q->d_func(); } +const QGraphicsApiFilterPrivate *QGraphicsApiFilterPrivate::get(const QGraphicsApiFilter *q) +{ + return q->d_func(); +} + /*! \class Qt3DRender::QGraphicsApiFilter \inmodule Qt3DRender diff --git a/src/render/materialsystem/qgraphicsapifilter_p.h b/src/render/materialsystem/qgraphicsapifilter_p.h index 3961d4f93..435451c27 100644 --- a/src/render/materialsystem/qgraphicsapifilter_p.h +++ b/src/render/materialsystem/qgraphicsapifilter_p.h @@ -84,6 +84,7 @@ public: } static QGraphicsApiFilterPrivate *get(QGraphicsApiFilter *q); + static const QGraphicsApiFilterPrivate *get(const QGraphicsApiFilter *q); Q_DECLARE_PUBLIC(QGraphicsApiFilter) GraphicsApiFilterData m_data; diff --git a/src/render/materialsystem/qtechnique.cpp b/src/render/materialsystem/qtechnique.cpp index b668eb25f..dadeb98bd 100644 --- a/src/render/materialsystem/qtechnique.cpp +++ b/src/render/materialsystem/qtechnique.cpp @@ -234,12 +234,7 @@ QTechnique::QTechnique(QTechniquePrivate &dd, QNode *parent) /*! \internal */ void QTechniquePrivate::_q_graphicsApiFilterChanged() { - if (m_changeArbiter != nullptr) { - auto change = QPropertyUpdatedChangePtr::create(m_id); - change->setPropertyName("graphicsApiFilterData"); - change->setValue(QVariant::fromValue(QGraphicsApiFilterPrivate::get(const_cast<QGraphicsApiFilter *>(&m_graphicsApiFilter))->m_data)); - notifyObservers(change); - } + update(); } /*! @@ -262,11 +257,7 @@ void QTechnique::addFilterKey(QFilterKey *filterKey) if (!filterKey->parent()) filterKey->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), filterKey); - change->setPropertyName("filterKeys"); - d->notifyObservers(change); - } + d->update(); } } @@ -277,11 +268,7 @@ void QTechnique::removeFilterKey(QFilterKey *filterKey) { Q_ASSERT(filterKey); Q_D(QTechnique); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), filterKey); - change->setPropertyName("filterKeys"); - d->notifyObservers(change); - } + d->update(); d->m_filterKeys.removeOne(filterKey); // Remove bookkeeping connection d->unregisterDestructionHelper(filterKey); @@ -317,11 +304,7 @@ void QTechnique::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(); } } @@ -332,11 +315,7 @@ void QTechnique::removeParameter(QParameter *parameter) { Q_ASSERT(parameter); Q_D(QTechnique); - 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); @@ -362,11 +341,7 @@ void QTechnique::addRenderPass(QRenderPass *pass) if (!pass->parent()) pass->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), pass); - change->setPropertyName("pass"); - d->notifyObservers(change); - } + d->update(); } } @@ -377,11 +352,7 @@ void QTechnique::removeRenderPass(QRenderPass *pass) { Q_ASSERT(pass); Q_D(QTechnique); - if (d->m_changeArbiter) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), pass); - change->setPropertyName("pass"); - d->notifyObservers(change); - } + d->update(); d->m_renderPasses.removeOne(pass); // Remove bookkeeping connection d->unregisterDestructionHelper(pass); @@ -405,12 +376,19 @@ QVector<QParameter *> QTechnique::parameters() const return d->m_parameters; } +// TODO Qt 6 -> Remove QGraphicsApiFilter *QTechnique::graphicsApiFilter() { Q_D(QTechnique); return &d->m_graphicsApiFilter; } +const QGraphicsApiFilter *QTechnique::graphicsApiFilter() const +{ + Q_D(const QTechnique); + return &d->m_graphicsApiFilter; +} + Qt3DCore::QNodeCreatedChangeBasePtr QTechnique::createNodeCreationChange() const { auto creationChange = Qt3DCore::QNodeCreatedChangePtr<QTechniqueData>::create(this); diff --git a/src/render/materialsystem/qtechnique.h b/src/render/materialsystem/qtechnique.h index 7711cd67f..f0c857c2b 100644 --- a/src/render/materialsystem/qtechnique.h +++ b/src/render/materialsystem/qtechnique.h @@ -76,7 +76,8 @@ public: void removeRenderPass(QRenderPass *pass); QVector<QRenderPass *> renderPasses() const; - QGraphicsApiFilter *graphicsApiFilter(); + Q_DECL_DEPRECATED QGraphicsApiFilter *graphicsApiFilter(); + const QGraphicsApiFilter *graphicsApiFilter() const; protected: explicit QTechnique(QTechniquePrivate &dd, Qt3DCore::QNode *parent = nullptr); diff --git a/src/render/materialsystem/technique.cpp b/src/render/materialsystem/technique.cpp index 42430883e..d4199b7e3 100644 --- a/src/render/materialsystem/technique.cpp +++ b/src/render/materialsystem/technique.cpp @@ -85,72 +85,48 @@ void Technique::cleanup() m_isCompatibleWithRenderer = false; } -void Technique::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void Technique::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QTechniqueData>>(change); - const QTechniqueData &data = typedChange->data; - - m_graphicsApiFilterData = data.graphicsApiFilterData; - m_filterKeyList = data.filterKeyIds; - m_parameterPack.setParameters(data.parameterIds); - m_renderPasses = data.renderPassIds; - m_nodeManager->techniqueManager()->addDirtyTechnique(peerId()); - markDirty(AbstractRenderer::TechniquesDirty); -} + const QTechnique *node = qobject_cast<const QTechnique *>(frontEnd); -void Technique::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - switch (e->type()) { - case PropertyUpdated: { - const auto change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("enabled")) { - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("graphicsApiFilterData")) { - GraphicsApiFilterData filterData = change->value().value<GraphicsApiFilterData>(); - m_graphicsApiFilterData = filterData; - // Notify the manager that our graphicsApiFilterData has changed - // and that we therefore need to be check for compatibility again - m_isCompatibleWithRenderer = false; - m_nodeManager->techniqueManager()->addDirtyTechnique(peerId()); - markDirty(AbstractRenderer::TechniquesDirty); - } - break; + if (!node) + return; + + bool dirty = isEnabled() != frontEnd->isEnabled(); + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + + auto renderPasses = qIdsForNodes(node->renderPasses()); + std::sort(std::begin(renderPasses), std::end(renderPasses)); + if (m_renderPasses != renderPasses) { + m_renderPasses = renderPasses; + dirty = true; } - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("pass")) { - appendRenderPass(change->addedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.appendParameter(change->addedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("filterKeys")) { - appendFilterKey(change->addedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } - break; + auto parameters = qIdsForNodes(node->parameters()); + std::sort(std::begin(parameters), std::end(parameters)); + if (m_parameterPack.parameters() != parameters) { + m_parameterPack.setParameters(parameters); + dirty = true; } - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("pass")) { - removeRenderPass(change->removedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.removeParameter(change->removedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("filterKeys")) { - removeFilterKey(change->removedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } - break; + auto filterKeys = qIdsForNodes(node->filterKeys()); + std::sort(std::begin(filterKeys), std::end(filterKeys)); + if (m_filterKeyList != filterKeys) { + m_filterKeyList = filterKeys; + dirty = true; + } + + auto graphicsApiFilterData = QGraphicsApiFilterPrivate::get(node->graphicsApiFilter())->m_data; + if (m_graphicsApiFilterData != graphicsApiFilterData) { + m_graphicsApiFilterData = graphicsApiFilterData; + m_isCompatibleWithRenderer = false; + dirty = true; } - default: - break; + if (dirty) { + m_nodeManager->techniqueManager()->addDirtyTechnique(peerId()); + markDirty(AbstractRenderer::TechniquesDirty); } - BackendNode::sceneChangeEvent(e); } QVector<Qt3DCore::QNodeId> Technique::parameters() const diff --git a/src/render/materialsystem/technique_p.h b/src/render/materialsystem/technique_p.h index d885c1b87..1d0d0a9dd 100644 --- a/src/render/materialsystem/technique_p.h +++ b/src/render/materialsystem/technique_p.h @@ -80,7 +80,8 @@ public: ~Technique(); void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; + QVector<Qt3DCore::QNodeId> parameters() const; void appendRenderPass(Qt3DCore::QNodeId renderPassId); @@ -102,7 +103,6 @@ public: NodeManagers *nodeManager() const; private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; GraphicsApiFilterData m_graphicsApiFilterData; ParameterPack m_parameterPack; |