diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-03-27 12:10:00 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-05-09 20:06:32 +0000 |
commit | dad271abb485cffd48417605bc030ad5c6a6845e (patch) | |
tree | a1fd555b252a2f1832b24163b9af16595d780f08 | |
parent | 4cf6ff4a0771fc2dab90525b084c2e90e5335bc2 (diff) |
QRenderPass: add/remove Parameters
Change-Id: Ibccaa97c9cd1d9e8229ea59228ef2535b23b64b7
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/render/backend/renderrenderpass.cpp | 32 | ||||
-rw-r--r-- | src/render/backend/renderrenderpass_p.h | 3 | ||||
-rw-r--r-- | src/render/frontend/qrenderpass.cpp | 42 | ||||
-rw-r--r-- | src/render/frontend/qrenderpass.h | 4 | ||||
-rw-r--r-- | src/render/frontend/qrenderpass_p.h | 1 | ||||
-rw-r--r-- | tests/auto/render/renderrenderpass/tst_renderrenderpass.cpp | 34 |
6 files changed, 104 insertions, 12 deletions
diff --git a/src/render/backend/renderrenderpass.cpp b/src/render/backend/renderrenderpass.cpp index add7f0d2e..85828c14e 100644 --- a/src/render/backend/renderrenderpass.cpp +++ b/src/render/backend/renderrenderpass.cpp @@ -40,6 +40,7 @@ #include <Qt3DRenderer/qparametermapping.h> #include <Qt3DRenderer/qrenderstate.h> #include <Qt3DRenderer/qrenderpass.h> +#include <Qt3DRenderer/qparameter.h> // TODO: Rename this include to something more descriptive #include <Qt3DRenderer/private/blendstate_p.h> @@ -71,6 +72,8 @@ void RenderRenderPass::updateFromPeer(QNode *peer) { QRenderPass *pass = static_cast<QRenderPass *>(peer); + m_parameterPack.clear(); + if (pass->shaderProgram() != Q_NULLPTR) m_shaderUuid = pass->shaderProgram()->id(); // The RenderPass clones frontend bindings in case the frontend ever removes them @@ -81,6 +84,8 @@ void RenderRenderPass::updateFromPeer(QNode *peer) appendAnnotation(c->id()); Q_FOREACH (QRenderState *renderState, pass->renderStates()) appendRenderState(renderState->id(), RenderState::getOrCreateBackendState(renderState)); + Q_FOREACH (QParameter *p, pass->parameters()) + m_parameterPack.appendParameter(p->id()); } void RenderRenderPass::sceneChangeEvent(const QSceneChangePtr &e) @@ -91,17 +96,16 @@ void RenderRenderPass::sceneChangeEvent(const QSceneChangePtr &e) case NodeAdded: { if (propertyChange->propertyName() == QByteArrayLiteral("annotation")) { appendAnnotation(propertyChange->value().value<QNodeId>()); - } - else if (propertyChange->propertyName() == QByteArrayLiteral("shaderProgram")) { + } else if (propertyChange->propertyName() == QByteArrayLiteral("shaderProgram")) { m_shaderUuid = propertyChange->value().value<QNodeId>(); - } - else if (propertyChange->propertyName() == QByteArrayLiteral("binding")) { + } else if (propertyChange->propertyName() == QByteArrayLiteral("binding")) { appendBinding(RenderParameterMapping(propertyChange->value().value<QParameterMapping *>())); - } - else if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) { + } else if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) { QNodePtr nodePtr = propertyChange->value().value<QNodePtr>(); QRenderState *renderState = static_cast<QRenderState *>(nodePtr.data()); appendRenderState(renderState->id(), RenderState::getOrCreateBackendState(renderState)); + } else if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) { + m_parameterPack.appendParameter(propertyChange->value().value<QNodeId>()); } break; } @@ -109,15 +113,14 @@ void RenderRenderPass::sceneChangeEvent(const QSceneChangePtr &e) case NodeRemoved: { if (propertyChange->propertyName() == QByteArrayLiteral("annotation")) { removeAnnotation(propertyChange->value().value<QNodeId>()); - } - else if (propertyChange->propertyName() == QByteArrayLiteral("shaderProgram")) { + } else if (propertyChange->propertyName() == QByteArrayLiteral("shaderProgram")) { m_shaderUuid = QNodeId(); - } - else if (propertyChange->propertyName() == QByteArrayLiteral("binding")) { + } else if (propertyChange->propertyName() == QByteArrayLiteral("binding")) { removeBinding(propertyChange->value().value<QNodeId>()); - } - else if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) { + } else if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) { removeRenderState(propertyChange->value().value<QNodeId>()); + } else if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) { + m_parameterPack.removeParameter(propertyChange->value().value<QNodeId>()); } break; } @@ -147,6 +150,11 @@ QList<RenderState *> RenderRenderPass::renderStates() const return m_renderStates.values(); } +QList<QNodeId> RenderRenderPass::parameters() const +{ + return m_parameterPack.parameters(); +} + void RenderRenderPass::appendAnnotation(const QNodeId &annotationId) { if (!m_annotationList.contains(annotationId)) diff --git a/src/render/backend/renderrenderpass_p.h b/src/render/backend/renderrenderpass_p.h index 87ddf272a..1e9b8ecfd 100644 --- a/src/render/backend/renderrenderpass_p.h +++ b/src/render/backend/renderrenderpass_p.h @@ -40,6 +40,7 @@ #include <Qt3DRenderer/qt3drenderer_global.h> #include <Qt3DRenderer/private/renderparametermapping_p.h> +#include <Qt3DRenderer/private/parameterpack_p.h> #include <Qt3DCore/private/qabstractaspect_p.h> #include <Qt3DCore/qbackendnode.h> #include <Qt3DCore/qnodeid.h> @@ -74,6 +75,7 @@ public: QList<RenderParameterMapping> bindings() const; QList<QNodeId> annotations() const; QList<RenderState *> renderStates() const; + QList<QNodeId> parameters() const; private: void appendAnnotation(const QNodeId &criterionId); @@ -89,6 +91,7 @@ private: QHash<QNodeId, RenderParameterMapping> m_bindings; QHash<QNodeId, RenderState *> m_renderStates; QList<QNodeId> m_annotationList; + ParameterPack m_parameterPack; }; } // Render diff --git a/src/render/frontend/qrenderpass.cpp b/src/render/frontend/qrenderpass.cpp index cfa6fee2e..3c58b87b1 100644 --- a/src/render/frontend/qrenderpass.cpp +++ b/src/render/frontend/qrenderpass.cpp @@ -250,6 +250,48 @@ QList<QRenderState *> QRenderPass::renderStates() const return d->m_renderStates; } +void QRenderPass::addParameter(QParameter *parameter) +{ + Q_D(QRenderPass); + if (!d->m_parameters.contains(parameter)) { + d->m_parameters.append(parameter); + + // 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, the child parameters get destroyed as well + if (!parameter->parent()) + parameter->setParent(this); + + if (d->m_changeArbiter != Q_NULLPTR) { + QScenePropertyChangePtr change(new QScenePropertyChange(NodeAdded, QSceneChange::Node, id())); + change->setPropertyName("parameter"); + change->setValue(QVariant::fromValue(parameter->id())); + d->notifyObservers(change); + } + } +} + +void QRenderPass::removeParameter(QParameter *parameter) +{ + Q_D(QRenderPass); + + if (d->m_changeArbiter != Q_NULLPTR) { + QScenePropertyChangePtr change(new QScenePropertyChange(NodeRemoved, QSceneChange::Node, id())); + change->setPropertyName("parameter"); + change->setValue(QVariant::fromValue(parameter->id())); + d->notifyObservers(change); + } + d->m_parameters.removeOne(parameter); +} + + +QList<QParameter *> QRenderPass::parameters() const +{ + Q_D(const QRenderPass); + return d->m_parameters; +} + } // namespace Qt3D QT_END_NAMESPACE diff --git a/src/render/frontend/qrenderpass.h b/src/render/frontend/qrenderpass.h index f4e53552f..1f401860d 100644 --- a/src/render/frontend/qrenderpass.h +++ b/src/render/frontend/qrenderpass.h @@ -86,6 +86,10 @@ public: void removeRenderState(QRenderState *state); QList<QRenderState *> renderStates() const; + void addParameter(QParameter *p); + void removeParameter(QParameter *p); + QList<QParameter *> parameters() const; + Q_SIGNALS: void shaderProgramChanged(); diff --git a/src/render/frontend/qrenderpass_p.h b/src/render/frontend/qrenderpass_p.h index 3783e3d2e..33017fd83 100644 --- a/src/render/frontend/qrenderpass_p.h +++ b/src/render/frontend/qrenderpass_p.h @@ -71,6 +71,7 @@ public: QList<QAnnotation *> m_annotationList; QList<QParameterMapping *> m_bindings; QList<QRenderState *> m_renderStates; + QList<QParameter *> m_parameters; QShaderProgram *m_shader; }; diff --git a/tests/auto/render/renderrenderpass/tst_renderrenderpass.cpp b/tests/auto/render/renderrenderpass/tst_renderrenderpass.cpp index 61465fc38..4f3983861 100644 --- a/tests/auto/render/renderrenderpass/tst_renderrenderpass.cpp +++ b/tests/auto/render/renderrenderpass/tst_renderrenderpass.cpp @@ -43,6 +43,7 @@ #include <Qt3DRenderer/QParameterMapping> #include <Qt3DRenderer/QRenderPass> #include <Qt3DRenderer/QShaderProgram> +#include <Qt3DRenderer/QParameter> #include <Qt3DRenderer/QAlphaCoverage> #include <Qt3DRenderer/QAlphaTest> @@ -83,6 +84,7 @@ private slots: QVERIFY(backend.annotations().isEmpty()); QVERIFY(backend.bindings().isEmpty()); QVERIFY(backend.renderStates().isEmpty()); + QVERIFY(backend.parameters().isEmpty()); } void shouldHavePropertiesMirroringItsPeer_data() @@ -178,6 +180,8 @@ private slots: frontend.addBinding(new QParameterMapping(&frontend)); + frontend.addParameter(new QParameter(&frontend)); + QFETCH(QRenderState*, frontendState); frontendState->setParent(&frontend); frontend.addRenderState(frontendState); @@ -201,6 +205,9 @@ private slots: QCOMPARE(backend.bindings().first().parameterName(), frontend.bindings().first()->parameterName()); QCOMPARE(backend.bindings().first().shaderVariableName(), frontend.bindings().first()->shaderVariableName()); + QCOMPARE(backend.parameters().size(), 1); + QCOMPARE(backend.parameters().first(), frontend.parameters().first()->id()); + QCOMPARE(backend.renderStates().size(), 1); QCOMPARE(backend.renderStates().first(), backendState); } @@ -288,6 +295,33 @@ private slots: QVERIFY(backend.bindings().isEmpty()); } + void shouldHandleParametersPropertyChangeEvents() + { + // GIVEN + QScopedPointer<QParameter> parameter(new QParameter); + + RenderRenderPass backend; + + // WHEN + QScenePropertyChangePtr addChange(new QScenePropertyChange(NodeAdded, QSceneChange::Node, parameter->id())); + addChange->setValue(QVariant::fromValue(parameter->id())); + addChange->setPropertyName("parameter"); + backend.sceneChangeEvent(addChange); + + // THEN + QCOMPARE(backend.parameters().size(), 1); + QCOMPARE(backend.parameters().first(), parameter->id()); + + // WHEN + QScenePropertyChangePtr removeChange(new QScenePropertyChange(NodeRemoved, QSceneChange::Node, parameter->id())); + removeChange->setValue(QVariant::fromValue(parameter->id())); + removeChange->setPropertyName("parameter"); + backend.sceneChangeEvent(removeChange); + + // THEN + QVERIFY(backend.parameters().isEmpty()); + } + void shouldHandlePropertyChangeEvents_data() { shouldHavePropertiesMirroringItsPeer_data(); |