diff options
author | Mike Krus <mike.krus@kdab.com> | 2019-09-06 21:06:26 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-19 13:42:35 +0200 |
commit | f88fa485e3ebfeaefa7aa7e5f277e47fd0ed12b5 (patch) | |
tree | ef30c8b71bf7beee370801a877ae2a4f22d8d953 /src/render/materialsystem | |
parent | 56785807dc5aec77506ea02174fd46a67de57b5f (diff) |
Update QRenderPass to use direct sync
Change-Id: Ie64d8cd74c8b28c43644f63993f0419ecb511d0e
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/materialsystem')
-rw-r--r-- | src/render/materialsystem/qrenderpass.cpp | 42 | ||||
-rw-r--r-- | src/render/materialsystem/renderpass.cpp | 69 | ||||
-rw-r--r-- | src/render/materialsystem/renderpass_p.h | 4 |
3 files changed, 30 insertions, 85 deletions
diff --git a/src/render/materialsystem/qrenderpass.cpp b/src/render/materialsystem/qrenderpass.cpp index 111bb7b5f..d0821c49c 100644 --- a/src/render/materialsystem/qrenderpass.cpp +++ b/src/render/materialsystem/qrenderpass.cpp @@ -231,12 +231,6 @@ void QRenderPass::setShaderProgram(QShaderProgram *shaderProgram) Q_D(QRenderPass); if (d->m_shader != shaderProgram) { - if (d->m_shader != nullptr && d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), d->m_shader); - change->setPropertyName("shaderProgram"); - d->notifyObservers(change); - } - if (d->m_shader) d->unregisterDestructionHelper(d->m_shader); @@ -283,11 +277,7 @@ void QRenderPass::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(); } } @@ -298,11 +288,7 @@ void QRenderPass::removeFilterKey(QFilterKey *filterKey) { Q_ASSERT(filterKey); Q_D(QRenderPass); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), filterKey); - change->setPropertyName("filterKeys"); - d->notifyObservers(change); - } + d->update(); d->m_filterKeyList.removeOne(filterKey); // Remove bookkeeping connection d->unregisterDestructionHelper(filterKey); @@ -339,11 +325,7 @@ void QRenderPass::addRenderState(QRenderState *state) if (!state->parent()) state->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), state); - change->setPropertyName("renderState"); - d->notifyObservers(change); - } + d->update(); } } @@ -354,11 +336,7 @@ void QRenderPass::removeRenderState(QRenderState *state) { Q_ASSERT(state); Q_D(QRenderPass); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), state); - change->setPropertyName("renderState"); - d->notifyObservers(change); - } + d->update(); d->m_renderStates.removeOne(state); // Remove bookkeeping connection d->unregisterDestructionHelper(state); @@ -394,11 +372,7 @@ void QRenderPass::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(); } } @@ -409,11 +383,7 @@ void QRenderPass::removeParameter(QParameter *parameter) { Q_ASSERT(parameter); Q_D(QRenderPass); - 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/materialsystem/renderpass.cpp b/src/render/materialsystem/renderpass.cpp index e0fadddd9..aaeca3bb4 100644 --- a/src/render/materialsystem/renderpass.cpp +++ b/src/render/materialsystem/renderpass.cpp @@ -52,6 +52,8 @@ #include <Qt3DCore/qpropertynodeaddedchange.h> #include <Qt3DCore/qpropertynoderemovedchange.h> +#include <algorithm> + QT_BEGIN_NAMESPACE using namespace Qt3DCore; @@ -77,58 +79,33 @@ void RenderPass::cleanup() m_shaderUuid = Qt3DCore::QNodeId(); } -void RenderPass::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QRenderPassData>>(change); - const auto &data = typedChange->data; - m_filterKeyList = data.filterKeyIds; - m_parameterPack.setParameters(data.parameterIds); - for (const auto &renderStateId : qAsConst(data.renderStateIds)) - addRenderState(renderStateId); - m_shaderUuid = data.shaderId; -} - -void RenderPass::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) +void RenderPass::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - switch (e->type()) { - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("filterKeys")) - appendFilterKey(change->addedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("shaderProgram")) - m_shaderUuid = change->addedNodeId(); - else if (change->propertyName() == QByteArrayLiteral("renderState")) - addRenderState(change->addedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("parameter")) - m_parameterPack.appendParameter(change->addedNodeId()); - break; + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QRenderPass *node = qobject_cast<const QRenderPass *>(frontEnd); + if (!node) + return; + + if ((node->shaderProgram() && node->shaderProgram()->id() != m_shaderUuid) || + (!node->shaderProgram() && !m_shaderUuid.isNull())) { + m_shaderUuid = node->shaderProgram() ? node->shaderProgram()->id() : QNodeId{}; } - case PropertyUpdated: { - const auto change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("shaderProgram")) - m_shaderUuid = change->value().value<Qt3DCore::QNodeId>(); - break; - } + auto filterList = qIdsForNodes(node->filterKeys()); + std::sort(std::begin(filterList), std::end(filterList)); + if (m_filterKeyList != filterList) + m_filterKeyList = filterList; - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("filterKeys")) - removeFilterKey(change->removedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("shaderProgram")) - m_shaderUuid = QNodeId(); - else if (change->propertyName() == QByteArrayLiteral("renderState")) - removeRenderState(change->removedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("parameter")) - m_parameterPack.removeParameter(change->removedNodeId()); - break; - } + auto parameters = qIdsForNodes(node->parameters()); + std::sort(std::begin(parameters), std::end(parameters)); + if (m_parameterPack.parameters() != parameters) + m_parameterPack.setParameters(parameters); - default: - break; - } + auto renderStates = qIdsForNodes(node->renderStates()); + std::sort(std::begin(renderStates), std::end(renderStates)); + if (m_renderStates != renderStates) + m_renderStates = renderStates; - BackendNode::sceneChangeEvent(e); markDirty(AbstractRenderer::AllDirty); } diff --git a/src/render/materialsystem/renderpass_p.h b/src/render/materialsystem/renderpass_p.h index 1ca02b1ad..314386ad1 100644 --- a/src/render/materialsystem/renderpass_p.h +++ b/src/render/materialsystem/renderpass_p.h @@ -79,7 +79,7 @@ public: void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; Qt3DCore::QNodeId shaderProgram() const; QVector<Qt3DCore::QNodeId> filterKeys() const; @@ -95,8 +95,6 @@ private: void addRenderState(Qt3DCore::QNodeId renderStateId); void removeRenderState(Qt3DCore::QNodeId renderStateId); - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - Qt3DCore::QNodeId m_shaderUuid; QVector<Qt3DCore::QNodeId> m_filterKeyList; ParameterPack m_parameterPack; |