summaryrefslogtreecommitdiffstats
path: root/src/render/materialsystem/qrenderpass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/materialsystem/qrenderpass.cpp')
-rw-r--r--src/render/materialsystem/qrenderpass.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/render/materialsystem/qrenderpass.cpp b/src/render/materialsystem/qrenderpass.cpp
index 69098f9ec..9ec7a452b 100644
--- a/src/render/materialsystem/qrenderpass.cpp
+++ b/src/render/materialsystem/qrenderpass.cpp
@@ -92,21 +92,23 @@ void QRenderPass::setShaderProgram(QShaderProgram *shaderProgram)
d->notifyObservers(change);
}
- d->m_shader = shaderProgram;
- emit shaderProgramChanged(shaderProgram);
+ if (d->m_shader)
+ d->unregisterDestructionHelper(d->m_shader);
// We need to add it as a child of the current node if it has been declared inline
// Or not previously added as a child of the current node so that
// 1) The backend gets notified about it's creation
// 2) When the current node is destroyed, it gets destroyed as well
- if (!shaderProgram->parent())
+ if (shaderProgram && !shaderProgram->parent())
shaderProgram->setParent(this);
- if (d->m_shader && d->m_changeArbiter != nullptr) {
- const auto change = QPropertyNodeAddedChangePtr::create(id(), d->m_shader);
- change->setPropertyName("shaderProgram");
- d->notifyObservers(change);
- }
+ d->m_shader = shaderProgram;
+
+ // Ensures proper bookkeeping
+ if (d->m_shader)
+ d->registerDestructionHelper(d->m_shader, &QRenderPass::setShaderProgram, d->m_shader);
+
+ emit shaderProgramChanged(shaderProgram);
}
}
@@ -123,6 +125,9 @@ void QRenderPass::addFilterKey(QFilterKey *filterKey)
if (!d->m_filterKeyList.contains(filterKey)) {
d->m_filterKeyList.append(filterKey);
+ // Ensures proper bookkeeping
+ d->registerDestructionHelper(filterKey, &QRenderPass::removeFilterKey, d->m_filterKeyList);
+
// We need to add it as a child of the current node if it has been declared inline
// Or not previously added as a child of the current node so that
// 1) The backend gets notified about it's creation
@@ -148,6 +153,8 @@ void QRenderPass::removeFilterKey(QFilterKey *filterKey)
d->notifyObservers(change);
}
d->m_filterKeyList.removeOne(filterKey);
+ // Remove bookkeeping connection
+ d->unregisterDestructionHelper(filterKey);
}
QVector<QFilterKey *> QRenderPass::filterKeys() const
@@ -171,6 +178,9 @@ void QRenderPass::addRenderState(QRenderState *state)
if (!d->m_renderStates.contains(state)) {
d->m_renderStates.append(state);
+ // Ensures proper bookkeeping
+ d->registerDestructionHelper(state, &QRenderPass::removeRenderState, d->m_renderStates);
+
if (!state->parent())
state->setParent(this);
@@ -195,6 +205,8 @@ void QRenderPass::removeRenderState(QRenderState *state)
d->notifyObservers(change);
}
d->m_renderStates.removeOne(state);
+ // Remove bookkeeping connection
+ d->unregisterDestructionHelper(state);
}
/*!
@@ -214,6 +226,9 @@ void QRenderPass::addParameter(QParameter *parameter)
if (!d->m_parameters.contains(parameter)) {
d->m_parameters.append(parameter);
+ // Ensures proper bookkeeping
+ d->registerDestructionHelper(parameter, &QRenderPass::removeParameter, d->m_parameters);
+
// We need to add it as a child of the current node if it has been declared inline
// Or not previously added as a child of the current node so that
// 1) The backend gets notified about it's creation
@@ -239,6 +254,8 @@ void QRenderPass::removeParameter(QParameter *parameter)
d->notifyObservers(change);
}
d->m_parameters.removeOne(parameter);
+ // Remove bookkeeping connection
+ d->unregisterDestructionHelper(parameter);
}