diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-04-24 14:55:12 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-04-27 11:19:38 +0000 |
commit | 69efa162f9ac0659814968512604afde4419aa27 (patch) | |
tree | ced162e3b81642dcad1cdde415a08fd42bb4548b | |
parent | 5e6567c809d8771343aed756e30a6fdb7d034873 (diff) |
RenderPass use new added/removed change types
Again, we should be able to avoid the NodeRemoved/NodeAdded changes
for the QShaderProgram* property and rely upon the automatic handling.
Leaving this for a followup round of changes.
Change-Id: I8a9eb2b8471a47c84032191513d86b59e15a087e
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r-- | src/render/materialsystem/qrenderpass.cpp | 43 | ||||
-rw-r--r-- | src/render/materialsystem/renderpass.cpp | 51 | ||||
-rw-r--r-- | src/render/materialsystem/renderpass_p.h | 4 | ||||
-rw-r--r-- | tests/auto/render/renderpass/tst_renderpass.cpp | 26 |
4 files changed, 58 insertions, 66 deletions
diff --git a/src/render/materialsystem/qrenderpass.cpp b/src/render/materialsystem/qrenderpass.cpp index 66b39455e..c0191512a 100644 --- a/src/render/materialsystem/qrenderpass.cpp +++ b/src/render/materialsystem/qrenderpass.cpp @@ -44,6 +44,8 @@ #include "qfilterkey.h" #include "qrenderstate.h" #include <Qt3DCore/qnodepropertychange.h> +#include <Qt3DCore/qnodeaddedpropertychange.h> +#include <Qt3DCore/qnoderemovedpropertychange.h> #include <Qt3DCore/private/qnode_p.h> QT_BEGIN_NAMESPACE @@ -94,10 +96,9 @@ void QRenderPass::setShaderProgram(QShaderProgram *shaderProgram) if (d->m_shader != shaderProgram) { if (d->m_shader != Q_NULLPTR && d->m_changeArbiter != Q_NULLPTR) { - QNodePropertyChangePtr e(new QNodePropertyChange(NodeRemoved, QSceneChange::Node, id())); - e->setPropertyName("shaderProgram"); - e->setValue(QVariant::fromValue(d->m_shader->id())); - d->notifyObservers(e); + const auto change = QNodeRemovedPropertyChangePtr::create(id(), d->m_shader->id()); + change->setPropertyName("shaderProgram"); + d->notifyObservers(change); } d->m_shader = shaderProgram; @@ -110,11 +111,11 @@ void QRenderPass::setShaderProgram(QShaderProgram *shaderProgram) if (!shaderProgram->parent()) shaderProgram->setParent(this); - if (d->m_changeArbiter != Q_NULLPTR) { + if (d->m_shader && d->m_changeArbiter != Q_NULLPTR) { QNodePropertyChangePtr e(new QNodePropertyChange(NodeAdded, QSceneChange::Node, id())); - e->setPropertyName("shaderProgram"); - e->setValue(QVariant::fromValue(shaderProgram->id())); - d->notifyObservers(e); + const auto change = QNodeAddedPropertyChangePtr::create(id(), d->m_shader->id()); + change->setPropertyName("shaderProgram"); + d->notifyObservers(change); } } } @@ -127,6 +128,7 @@ QShaderProgram *QRenderPass::shaderProgram() const void QRenderPass::addFilterKey(QFilterKey *filterKey) { + Q_ASSERT(filterKey); Q_D(QRenderPass); if (!d->m_filterKeyList.contains(filterKey)) { d->m_filterKeyList.append(filterKey); @@ -139,9 +141,8 @@ void QRenderPass::addFilterKey(QFilterKey *filterKey) filterKey->setParent(this); if (d->m_changeArbiter != Q_NULLPTR) { - QNodePropertyChangePtr change(new QNodePropertyChange(NodeAdded, QSceneChange::Node, id())); + const auto change = QNodeAddedPropertyChangePtr::create(id(), filterKey->id()); change->setPropertyName("filterKeys"); - change->setValue(QVariant::fromValue(filterKey->id())); d->notifyObservers(change); } } @@ -149,11 +150,11 @@ void QRenderPass::addFilterKey(QFilterKey *filterKey) void QRenderPass::removeFilterKey(QFilterKey *filterKey) { + Q_ASSERT(filterKey); Q_D(QRenderPass); if (d->m_changeArbiter != Q_NULLPTR) { - QNodePropertyChangePtr change(new QNodePropertyChange(NodeRemoved, QSceneChange::Node, id())); + const auto change = QNodeRemovedPropertyChangePtr::create(id(), filterKey->id()); change->setPropertyName("filterKeys"); - change->setValue(QVariant::fromValue(filterKey->id())); d->notifyObservers(change); } d->m_filterKeyList.removeOne(filterKey); @@ -175,8 +176,8 @@ QVector<QFilterKey *> QRenderPass::filterKeys() const */ void QRenderPass::addRenderState(QRenderState *state) { + Q_ASSERT(state); Q_D(QRenderPass); - if (!d->m_renderStates.contains(state)) { d->m_renderStates.append(state); @@ -184,9 +185,8 @@ void QRenderPass::addRenderState(QRenderState *state) state->setParent(this); if (d->m_changeArbiter != Q_NULLPTR) { - QNodePropertyChangePtr change(new QNodePropertyChange(NodeAdded, QSceneChange::Node, id())); + const auto change = QNodeAddedPropertyChangePtr::create(id(), state->id()); change->setPropertyName("renderState"); - change->setValue(QVariant::fromValue(QNodePtr(QNode::clone(state)))); d->notifyObservers(change); } } @@ -197,11 +197,11 @@ void QRenderPass::addRenderState(QRenderState *state) */ void QRenderPass::removeRenderState(QRenderState *state) { + Q_ASSERT(state); Q_D(QRenderPass); if (d->m_changeArbiter != Q_NULLPTR) { - QNodePropertyChangePtr change(new QNodePropertyChange(NodeRemoved, QSceneChange::Node, id())); + const auto change = QNodeRemovedPropertyChangePtr::create(id(), state->id()); change->setPropertyName("renderState"); - change->setValue(QVariant::fromValue(state->id())); d->notifyObservers(change); } d->m_renderStates.removeOne(state); @@ -219,6 +219,7 @@ QVector<QRenderState *> QRenderPass::renderStates() const void QRenderPass::addParameter(QParameter *parameter) { + Q_ASSERT(parameter); Q_D(QRenderPass); if (!d->m_parameters.contains(parameter)) { d->m_parameters.append(parameter); @@ -231,9 +232,8 @@ void QRenderPass::addParameter(QParameter *parameter) parameter->setParent(this); if (d->m_changeArbiter != Q_NULLPTR) { - QNodePropertyChangePtr change(new QNodePropertyChange(NodeAdded, QSceneChange::Node, id())); + const auto change = QNodeAddedPropertyChangePtr::create(id(), parameter->id()); change->setPropertyName("parameter"); - change->setValue(QVariant::fromValue(parameter->id())); d->notifyObservers(change); } } @@ -241,12 +241,11 @@ void QRenderPass::addParameter(QParameter *parameter) void QRenderPass::removeParameter(QParameter *parameter) { + Q_ASSERT(parameter); Q_D(QRenderPass); - if (d->m_changeArbiter != Q_NULLPTR) { - QNodePropertyChangePtr change(new QNodePropertyChange(NodeRemoved, QSceneChange::Node, id())); + const auto change = QNodeAddedPropertyChangePtr::create(id(), parameter->id()); change->setPropertyName("parameter"); - change->setValue(QVariant::fromValue(parameter->id())); d->notifyObservers(change); } d->m_parameters.removeOne(parameter); diff --git a/src/render/materialsystem/renderpass.cpp b/src/render/materialsystem/renderpass.cpp index cfc5d6164..22f3bb252 100644 --- a/src/render/materialsystem/renderpass.cpp +++ b/src/render/materialsystem/renderpass.cpp @@ -49,6 +49,8 @@ #include <Qt3DRender/private/renderstateset_p.h> #include <Qt3DCore/qnodepropertychange.h> +#include <Qt3DCore/qnodeaddedpropertychange.h> +#include <Qt3DCore/qnoderemovedpropertychange.h> QT_BEGIN_NAMESPACE @@ -81,7 +83,7 @@ void RenderPass::updateFromPeer(Qt3DCore::QNode *peer) // The RenderPass clones frontend bindings in case the frontend ever removes them // TO DO: We probably need a QParameterMapper manager Q_FOREACH (QFilterKey *c, pass->filterKeys()) - appendAnnotation(c->id()); + appendFilterKey(c->id()); Q_FOREACH (QRenderState *renderState, pass->renderStates()) appendRenderState(renderState->id()); Q_FOREACH (QParameter *p, pass->parameters()) @@ -101,33 +103,30 @@ void RenderPass::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &c void RenderPass::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { - QNodePropertyChangePtr propertyChange = qSharedPointerCast<QNodePropertyChange>(e); switch (e->type()) { - case NodeAdded: { - if (propertyChange->propertyName() == QByteArrayLiteral("filterKeys")) { - appendAnnotation(propertyChange->value().value<QNodeId>()); - } else if (propertyChange->propertyName() == QByteArrayLiteral("shaderProgram")) { - m_shaderUuid = propertyChange->value().value<QNodeId>(); - } else if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) { - QNodePtr nodePtr = propertyChange->value().value<QNodePtr>(); - appendRenderState(nodePtr->id()); - } else if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.appendParameter(propertyChange->value().value<QNodeId>()); - } + const auto change = qSharedPointerCast<QNodeAddedPropertyChange>(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")) + appendRenderState(change->addedNodeId()); + else if (change->propertyName() == QByteArrayLiteral("parameter")) + m_parameterPack.appendParameter(change->addedNodeId()); break; } case NodeRemoved: { - if (propertyChange->propertyName() == QByteArrayLiteral("filterKeys")) { - removeAnnotation(propertyChange->value().value<QNodeId>()); - } else if (propertyChange->propertyName() == QByteArrayLiteral("shaderProgram")) { + const auto change = qSharedPointerCast<QNodeRemovedPropertyChange>(e); + if (change->propertyName() == QByteArrayLiteral("filterKeys")) + removeFilterKey(change->removedNodeId()); + else if (change->propertyName() == QByteArrayLiteral("shaderProgram")) m_shaderUuid = QNodeId(); - } else if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) { - removeRenderState(propertyChange->value().value<QNodeId>()); - } else if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.removeParameter(propertyChange->value().value<QNodeId>()); - } + else if (change->propertyName() == QByteArrayLiteral("renderState")) + removeRenderState(change->removedNodeId()); + else if (change->propertyName() == QByteArrayLiteral("parameter")) + m_parameterPack.removeParameter(change->removedNodeId()); break; } @@ -154,15 +153,15 @@ QVector<Qt3DCore::QNodeId> RenderPass::parameters() const return m_parameterPack.parameters(); } -void RenderPass::appendAnnotation(Qt3DCore::QNodeId annotationId) +void RenderPass::appendFilterKey(Qt3DCore::QNodeId filterKeyId) { - if (!m_filterKeyList.contains(annotationId)) - m_filterKeyList.append(annotationId); + if (!m_filterKeyList.contains(filterKeyId)) + m_filterKeyList.append(filterKeyId); } -void RenderPass::removeAnnotation(Qt3DCore::QNodeId annotationId) +void RenderPass::removeFilterKey(Qt3DCore::QNodeId filterKeyId) { - m_filterKeyList.removeOne(annotationId); + m_filterKeyList.removeOne(filterKeyId); } } // namespace Render diff --git a/src/render/materialsystem/renderpass_p.h b/src/render/materialsystem/renderpass_p.h index 67f7dda97..67aa015b9 100644 --- a/src/render/materialsystem/renderpass_p.h +++ b/src/render/materialsystem/renderpass_p.h @@ -88,8 +88,8 @@ public: QVector<Qt3DCore::QNodeId> parameters() const; private: - void appendAnnotation(Qt3DCore::QNodeId criterionId); - void removeAnnotation(Qt3DCore::QNodeId criterionId); + void appendFilterKey(Qt3DCore::QNodeId filterKeyId); + void removeFilterKey(Qt3DCore::QNodeId filterKeyId); void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; diff --git a/tests/auto/render/renderpass/tst_renderpass.cpp b/tests/auto/render/renderpass/tst_renderpass.cpp index ee91d7b58..213772857 100644 --- a/tests/auto/render/renderpass/tst_renderpass.cpp +++ b/tests/auto/render/renderpass/tst_renderpass.cpp @@ -30,6 +30,8 @@ #include <Qt3DRender/private/renderpass_p.h> #include <Qt3DCore/QNodePropertyChange> +#include <Qt3DCore/QNodeAddedPropertyChange> +#include <Qt3DCore/QNodeRemovedPropertyChange> #include <Qt3DRender/QFilterKey> #include <Qt3DRender/QRenderPass> @@ -132,8 +134,7 @@ private slots: backend.setRenderer(&renderer); // WHEN - QNodePropertyChangePtr addChange(new QNodePropertyChange(NodeAdded, QSceneChange::Node, shader->id())); - addChange->setValue(QVariant::fromValue(shader->id())); + const auto addChange = Qt3DCore::QNodeAddedPropertyChangePtr::create(Qt3DCore::QNodeId(), shader->id()); addChange->setPropertyName("shaderProgram"); backend.sceneChangeEvent(addChange); @@ -142,8 +143,7 @@ private slots: QVERIFY(renderer.dirtyBits() != 0); // WHEN - QNodePropertyChangePtr removeChange(new QNodePropertyChange(NodeRemoved, QSceneChange::Node, shader->id())); - removeChange->setValue(QVariant::fromValue(shader->id())); + const auto removeChange = Qt3DCore::QNodeRemovedPropertyChangePtr::create(Qt3DCore::QNodeId(), shader->id()); removeChange->setPropertyName("shaderProgram"); backend.sceneChangeEvent(removeChange); @@ -161,8 +161,7 @@ private slots: backend.setRenderer(&renderer); // WHEN - QNodePropertyChangePtr addChange(new QNodePropertyChange(NodeAdded, QSceneChange::Node, annotation->id())); - addChange->setValue(QVariant::fromValue(annotation->id())); + const auto addChange = Qt3DCore::QNodeAddedPropertyChangePtr::create(Qt3DCore::QNodeId(), annotation->id()); addChange->setPropertyName("filterKeys"); backend.sceneChangeEvent(addChange); @@ -172,8 +171,7 @@ private slots: QVERIFY(renderer.dirtyBits() != 0); // WHEN - QNodePropertyChangePtr removeChange(new QNodePropertyChange(NodeRemoved, QSceneChange::Node, annotation->id())); - removeChange->setValue(QVariant::fromValue(annotation->id())); + const auto removeChange = Qt3DCore::QNodeRemovedPropertyChangePtr::create(Qt3DCore::QNodeId(), annotation->id()); removeChange->setPropertyName("filterKeys"); backend.sceneChangeEvent(removeChange); @@ -191,8 +189,7 @@ private slots: backend.setRenderer(&renderer); // WHEN - QNodePropertyChangePtr addChange(new QNodePropertyChange(NodeAdded, QSceneChange::Node, parameter->id())); - addChange->setValue(QVariant::fromValue(parameter->id())); + const auto addChange = Qt3DCore::QNodeAddedPropertyChangePtr::create(Qt3DCore::QNodeId(), parameter->id()); addChange->setPropertyName("parameter"); backend.sceneChangeEvent(addChange); @@ -202,8 +199,7 @@ private slots: QVERIFY(renderer.dirtyBits() != 0); // WHEN - QNodePropertyChangePtr removeChange(new QNodePropertyChange(NodeRemoved, QSceneChange::Node, parameter->id())); - removeChange->setValue(QVariant::fromValue(parameter->id())); + const auto removeChange = Qt3DCore::QNodeRemovedPropertyChangePtr::create(Qt3DCore::QNodeId(), parameter->id()); removeChange->setPropertyName("parameter"); backend.sceneChangeEvent(removeChange); @@ -224,8 +220,7 @@ private slots: backendState->setPeer(frontendState); // WHEN - QNodePropertyChangePtr addChange(new QNodePropertyChange(NodeAdded, QSceneChange::Node, frontendState->id())); - addChange->setValue(QVariant::fromValue(frontendStatePtr)); + const auto addChange = Qt3DCore::QNodeAddedPropertyChangePtr::create(Qt3DCore::QNodeId(), frontendState->id()); addChange->setPropertyName("renderState"); backend.sceneChangeEvent(addChange); @@ -235,8 +230,7 @@ private slots: QVERIFY(renderer.dirtyBits() != 0); // WHEN - QNodePropertyChangePtr removeChange(new QNodePropertyChange(NodeRemoved, QSceneChange::Node, frontendState->id())); - removeChange->setValue(QVariant::fromValue(frontendState->id())); + const auto removeChange = Qt3DCore::QNodeRemovedPropertyChangePtr::create(Qt3DCore::QNodeId(), frontendState->id()); removeChange->setPropertyName("renderState"); backend.sceneChangeEvent(removeChange); |