summaryrefslogtreecommitdiffstats
path: root/src/render/materialsystem/shaderbuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/materialsystem/shaderbuilder.cpp')
-rw-r--r--src/render/materialsystem/shaderbuilder.cpp71
1 files changed, 35 insertions, 36 deletions
diff --git a/src/render/materialsystem/shaderbuilder.cpp b/src/render/materialsystem/shaderbuilder.cpp
index c1ec7f75a..b80a66a50 100644
--- a/src/render/materialsystem/shaderbuilder.cpp
+++ b/src/render/materialsystem/shaderbuilder.cpp
@@ -279,47 +279,46 @@ void ShaderBuilder::generateCode(ShaderBuilder::ShaderType type)
notifyObservers(propertyChange);
}
-void ShaderBuilder::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
+void ShaderBuilder::syncFromFrontEnd(const QNode *frontEnd, bool firstTime)
{
- if (e->type() == PropertyUpdated) {
- QPropertyUpdatedChangePtr propertyChange = e.staticCast<QPropertyUpdatedChange>();
- QVariant propertyValue = propertyChange->value();
-
- if (propertyChange->propertyName() == QByteArrayLiteral("shaderProgram"))
- m_shaderProgramId = propertyValue.value<Qt3DCore::QNodeId>();
- else if (propertyChange->propertyName() == QByteArrayLiteral("enabledLayers"))
- setEnabledLayers(propertyValue.toStringList());
- else if (propertyChange->propertyName() == QByteArrayLiteral("vertexShaderGraph"))
- setShaderGraph(Vertex, propertyValue.toUrl());
- else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationControlShaderGraph"))
- setShaderGraph(TessellationControl, propertyValue.toUrl());
- else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationEvaluationShaderGraph"))
- setShaderGraph(TessellationEvaluation, propertyValue.toUrl());
- else if (propertyChange->propertyName() == QByteArrayLiteral("geometryShaderGraph"))
- setShaderGraph(Geometry, propertyValue.toUrl());
- else if (propertyChange->propertyName() == QByteArrayLiteral("fragmentShaderGraph"))
- setShaderGraph(Fragment, propertyValue.toUrl());
- else if (propertyChange->propertyName() == QByteArrayLiteral("computeShaderGraph"))
- setShaderGraph(Compute, propertyValue.toUrl());
+ const QShaderProgramBuilder *node = qobject_cast<const QShaderProgramBuilder *>(frontEnd);
+ if (!node)
+ return;
+
+ const bool oldEnabled = isEnabled();
+ BackendNode::syncFromFrontEnd(frontEnd, firstTime);
+ if (oldEnabled != isEnabled()) {
markDirty(AbstractRenderer::ShadersDirty);
}
- BackendNode::sceneChangeEvent(e);
-}
-void ShaderBuilder::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change)
-{
- const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QShaderProgramBuilderData>>(change);
- const auto &data = typedChange->data;
-
- m_shaderProgramId = data.shaderProgramId;
- m_enabledLayers = data.enabledLayers;
- setShaderGraph(Vertex, data.vertexShaderGraph);
- setShaderGraph(TessellationControl, data.tessellationControlShaderGraph);
- setShaderGraph(TessellationEvaluation, data.tessellationEvaluationShaderGraph);
- setShaderGraph(Geometry, data.geometryShaderGraph);
- setShaderGraph(Fragment, data.fragmentShaderGraph);
- setShaderGraph(Compute, data.computeShaderGraph);
+ const Qt3DCore::QNodeId shaderProgramId = Qt3DCore::qIdForNode(node->shaderProgram());
+ if (shaderProgramId != m_shaderProgramId) {
+ m_shaderProgramId = shaderProgramId;
+ markDirty(AbstractRenderer::ShadersDirty);
+ }
+
+ if (node->enabledLayers() != m_enabledLayers) {
+ setEnabledLayers(node->enabledLayers());
+ markDirty(AbstractRenderer::ShadersDirty);
+ }
+
+ static const std::pair<ShaderType, QUrl (QShaderProgramBuilder::*)() const> shaderTypesToGetters[] = {
+ {Vertex, &QShaderProgramBuilder::vertexShaderGraph},
+ {TessellationControl, &QShaderProgramBuilder::tessellationControlShaderGraph},
+ {TessellationEvaluation, &QShaderProgramBuilder::tessellationEvaluationShaderGraph},
+ {Geometry, &QShaderProgramBuilder::geometryShaderGraph},
+ {Fragment, &QShaderProgramBuilder::fragmentShaderGraph},
+ {Compute, &QShaderProgramBuilder::computeShaderGraph},
+ };
+
+ for (auto it = std::cbegin(shaderTypesToGetters), end = std::cend(shaderTypesToGetters); it != end; ++it) {
+ const QUrl url = (node->*(it->second))();
+ if (url != m_graphs.value(it->first)) {
+ setShaderGraph(it->first, url);
+ markDirty(AbstractRenderer::ShadersDirty);
+ }
+ }
}
} // namespace Render