summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-03-27 12:10:00 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-05-09 20:06:32 +0000
commitdad271abb485cffd48417605bc030ad5c6a6845e (patch)
treea1fd555b252a2f1832b24163b9af16595d780f08
parent4cf6ff4a0771fc2dab90525b084c2e90e5335bc2 (diff)
QRenderPass: add/remove Parameters
Change-Id: Ibccaa97c9cd1d9e8229ea59228ef2535b23b64b7 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/renderrenderpass.cpp32
-rw-r--r--src/render/backend/renderrenderpass_p.h3
-rw-r--r--src/render/frontend/qrenderpass.cpp42
-rw-r--r--src/render/frontend/qrenderpass.h4
-rw-r--r--src/render/frontend/qrenderpass_p.h1
-rw-r--r--tests/auto/render/renderrenderpass/tst_renderrenderpass.cpp34
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();