From b3566c035298feb506a83ef0dda81c6135c784a1 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Fri, 27 Mar 2015 14:36:37 +0100 Subject: QTechniqueFilter: add/remove QParameter Change-Id: Ia198b01555bbeeaecc7062dbdd05275b49b43b62 Reviewed-by: Sean Harmer --- .../backend/framegraph/techniquefilternode.cpp | 13 +++++++ .../backend/framegraph/techniquefilternode_p.h | 4 +++ .../framegraph-components/qtechniquefilter.cpp | 42 ++++++++++++++++++++++ .../framegraph-components/qtechniquefilter.h | 5 +++ .../framegraph-components/qtechniquefilter_p.h | 1 + 5 files changed, 65 insertions(+) diff --git a/src/render/backend/framegraph/techniquefilternode.cpp b/src/render/backend/framegraph/techniquefilternode.cpp index c9256ea87..9f8bd3c78 100644 --- a/src/render/backend/framegraph/techniquefilternode.cpp +++ b/src/render/backend/framegraph/techniquefilternode.cpp @@ -39,6 +39,7 @@ #include "qtechniquefilter.h" #include #include +#include QT_BEGIN_NAMESPACE @@ -54,11 +55,19 @@ void TechniqueFilter::updateFromPeer(QNode *peer) { QTechniqueFilter *filter = static_cast(peer); m_filters.clear(); + m_parameterPack.clear(); Q_FOREACH (QAnnotation *criterion, filter->criteria()) appendFilter(criterion); + Q_FOREACH (QParameter *p, filter->parameters()) + m_parameterPack.appendParameter(p->id()); setEnabled(filter->isEnabled()); } +QList TechniqueFilter::parameters() const +{ + return m_parameterPack.parameters(); +} + QList TechniqueFilter::filters() const { return m_filters; @@ -89,11 +98,15 @@ void TechniqueFilter::sceneChangeEvent(const QSceneChangePtr &e) case NodeAdded: { if (propertyChange->propertyName() == QByteArrayLiteral("require")) appendFilter(propertyChange->value().value()); + else if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) + m_parameterPack.appendParameter(propertyChange->value().value()); } break; case NodeRemoved: { if (propertyChange->propertyName() == QByteArrayLiteral("require")) removeFilter(propertyChange->value().value()); + else if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) + m_parameterPack.removeParameter(propertyChange->value().value()); } break; default: diff --git a/src/render/backend/framegraph/techniquefilternode_p.h b/src/render/backend/framegraph/techniquefilternode_p.h index 1d4338d37..af32e991c 100644 --- a/src/render/backend/framegraph/techniquefilternode_p.h +++ b/src/render/backend/framegraph/techniquefilternode_p.h @@ -38,6 +38,7 @@ #define QT3D_RENDER_TECHNIQUEFILTER_H #include +#include #include #include @@ -62,6 +63,8 @@ public: TechniqueFilter(); void updateFromPeer(QNode *peer) Q_DECL_OVERRIDE; + QList parameters() const; + QList filters() const; void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE; @@ -70,6 +73,7 @@ private: void removeFilter(const QNodeId &criterionId); QList m_filters; + ParameterPack m_parameterPack; }; } // Render diff --git a/src/render/frontend/framegraph-components/qtechniquefilter.cpp b/src/render/frontend/framegraph-components/qtechniquefilter.cpp index 70984bd0d..d0801a535 100644 --- a/src/render/frontend/framegraph-components/qtechniquefilter.cpp +++ b/src/render/frontend/framegraph-components/qtechniquefilter.cpp @@ -38,6 +38,7 @@ #include "qtechniquefilter.h" #include "qtechniquefilter_p.h" #include +#include #include QT_BEGIN_NAMESPACE @@ -111,6 +112,47 @@ void QTechniqueFilter::removeRequirement(QAnnotation *criterion) d->m_requireList.removeOne(criterion); } +void QTechniqueFilter::addParameter(QParameter *parameter) +{ + Q_D(QTechniqueFilter); + 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 QTechniqueFilter::removeParameter(QParameter *parameter) +{ + Q_D(QTechniqueFilter); + + 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 QTechniqueFilter::parameters() const +{ + Q_D(const QTechniqueFilter); + return d->m_parameters; +} + } // Qt3D QT_END_NAMESPACE diff --git a/src/render/frontend/framegraph-components/qtechniquefilter.h b/src/render/frontend/framegraph-components/qtechniquefilter.h index 6d509d12c..b7ddcb9b4 100644 --- a/src/render/frontend/framegraph-components/qtechniquefilter.h +++ b/src/render/frontend/framegraph-components/qtechniquefilter.h @@ -46,6 +46,7 @@ namespace Qt3D { class QTechniqueFilterPrivate; class QAnnotation; +class QParameter; class QT3DRENDERERSHARED_EXPORT QTechniqueFilter : public QFrameGraphNode { @@ -57,6 +58,10 @@ public: void addRequirement(QAnnotation *criterion); void removeRequirement(QAnnotation *criterion); + void addParameter(QParameter *p); + void removeParameter(QParameter *p); + QList parameters() const; + protected: QTechniqueFilter(QTechniqueFilterPrivate &dd, QNode *parent = 0); void copy(const QNode *ref) Q_DECL_OVERRIDE; diff --git a/src/render/frontend/framegraph-components/qtechniquefilter_p.h b/src/render/frontend/framegraph-components/qtechniquefilter_p.h index 08e03cb4f..eb522c6cc 100644 --- a/src/render/frontend/framegraph-components/qtechniquefilter_p.h +++ b/src/render/frontend/framegraph-components/qtechniquefilter_p.h @@ -52,6 +52,7 @@ public : Q_DECLARE_PUBLIC(QTechniqueFilter) QList m_requireList; + QList m_parameters; }; } // Qt3D -- cgit v1.2.3