diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-09-24 03:00:47 +0200 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-09-24 03:00:54 +0200 |
commit | c5f12acd27dee5fdec38b78a02a95cf7debfe9a5 (patch) | |
tree | 0dbb89ecc77e9401eb3f2200dcbc9f3a6ea9dd68 /src/render/materialsystem/technique.cpp | |
parent | 4106737900476f9c98325252ec9fedcad602af92 (diff) | |
parent | 25ecd0881ded8e4f265a4eb01ab775eafcee65d8 (diff) |
Merge "Merge remote-tracking branch 'origin/5.15' into dev"
Diffstat (limited to 'src/render/materialsystem/technique.cpp')
-rw-r--r-- | src/render/materialsystem/technique.cpp | 90 |
1 files changed, 33 insertions, 57 deletions
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 |