From d7e9c7a9844b658d93c3f1ac47e96f069162de3d Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Tue, 8 Dec 2015 09:03:14 +0100 Subject: QParameter: only copy QNodeId when parameter value is a QNodeSubclass This avoid doing useless clones and will be further improved to support UBO/SSBO when Buffer are used as a Parameter's value. QNode subclasses that can be used as the value of an attribute are: QAbstractTextureProvider -> default uniform block QShaderData -> UBO (could be made to work with SSBO as well) Buffer -> UBO / SSBO Change-Id: I4928b95107656afc64db1ef989dde5dde8a92df8 Reviewed-by: Paul Lemire --- src/render/materialsystem/parameter.cpp | 39 ++++++-------------------------- src/render/materialsystem/parameter_p.h | 8 ------- src/render/materialsystem/qparameter.cpp | 19 +++++++++------- src/render/materialsystem/qparameter_p.h | 2 +- 4 files changed, 19 insertions(+), 49 deletions(-) (limited to 'src/render/materialsystem') diff --git a/src/render/materialsystem/parameter.cpp b/src/render/materialsystem/parameter.cpp index fea400e0b..d7147e5a4 100644 --- a/src/render/materialsystem/parameter.cpp +++ b/src/render/materialsystem/parameter.cpp @@ -37,8 +37,11 @@ #include "parameter_p.h" #include #include +#include #include #include +#include +#include #include @@ -51,16 +54,14 @@ namespace Render { Parameter::Parameter() : QBackendNode() - , m_shaderDataManager(Q_NULLPTR) - , m_textureManager(Q_NULLPTR) { } -void Parameter::updateFromPeer(Qt3DCore::QNode *mat) +void Parameter::updateFromPeer(Qt3DCore::QNode *peer) { - QParameter *param = static_cast(mat); + QParameter *param = static_cast(peer); m_name = param->name(); - m_value = toBackendValue(param->value()); + m_value = static_cast(QNodePrivate::get(param))->m_backendValue; } void Parameter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) @@ -71,7 +72,7 @@ void Parameter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (propertyChange->propertyName() == QByteArrayLiteral("name")) m_name = propertyChange->value().toString(); else if (propertyChange->propertyName() == QByteArrayLiteral("value")) - m_value = toBackendValue(propertyChange->value()); + m_value = propertyChange->value(); } } @@ -85,32 +86,6 @@ QVariant Parameter::value() const return m_value; } -void Parameter::setShaderDataManager(ShaderDataManager *shaderDataManager) -{ - m_shaderDataManager = shaderDataManager; -} - -void Parameter::setTextureManager(TextureManager *textureManager) -{ - m_textureManager = textureManager; -} - -QVariant Parameter::toBackendValue(const QVariant &value) -{ - QNode *node = value.value(); - - if (node == Q_NULLPTR) { - return value; - } else if (qobject_cast(node)) { - return QVariant::fromValue(static_cast(createBackendNode(node))); - } else if (qobject_cast(node)) { - return QVariant::fromValue(static_cast(createBackendNode(node))); - } else { - qFatal("Texture and ShaderData are the only types of Node allowed as parameters"); - return QVariant(); - } -} - } // namespace Render } // namespace Qt3DRender diff --git a/src/render/materialsystem/parameter_p.h b/src/render/materialsystem/parameter_p.h index a40af65ee..a1175311c 100644 --- a/src/render/materialsystem/parameter_p.h +++ b/src/render/materialsystem/parameter_p.h @@ -72,15 +72,7 @@ public: QString name() const; QVariant value() const; - void setShaderDataManager(ShaderDataManager *shaderDataManager); - void setTextureManager(TextureManager *textureManager); - private: - QVariant toBackendValue(const QVariant &value); - - ShaderDataManager *m_shaderDataManager; - TextureManager *m_textureManager; - QString m_name; QVariant m_value; }; diff --git a/src/render/materialsystem/qparameter.cpp b/src/render/materialsystem/qparameter.cpp index 62e38e3b3..b2c32733a 100644 --- a/src/render/materialsystem/qparameter.cpp +++ b/src/render/materialsystem/qparameter.cpp @@ -57,6 +57,11 @@ QParameterPrivate::QParameterPrivate() void QParameterPrivate::setValue(const QVariant &v) { + Qt3DCore::QNode *nodeValue = v.value(); + if (nodeValue != Q_NULLPTR) + m_backendValue = QVariant::fromValue(nodeValue->id()); + else + m_backendValue = v; m_value = v; } @@ -66,6 +71,7 @@ void QParameter::copy(const QNode *ref) const QParameter *param = static_cast(ref); d_func()->m_name = param->d_func()->m_name; d_func()->m_value = param->d_func()->m_value; + d_func()->m_backendValue = param->d_func()->m_backendValue; } /*! \internal */ @@ -123,17 +129,14 @@ void QParameter::setValue(const QVariant &dv) d->setValue(dv); emit valueChanged(dv); - // In case texture are declared inline - QNode *txt = dv.value(); - if (txt != Q_NULLPTR && !txt->parent()) - txt->setParent(this); + // In case node values are declared inline + QNode *nodeValue = dv.value(); + if (nodeValue != Q_NULLPTR && !nodeValue->parent()) + nodeValue->setParent(this); QScenePropertyChangePtr change(new QScenePropertyChange(NodeUpdated, QSceneChange::Node, id())); change->setPropertyName(d->m_name.toUtf8().data()); - if (txt != Q_NULLPTR) - change->setValue(QVariant::fromValue(QNode::clone(txt))); - else - change->setValue(d->m_value); + change->setValue(d->m_backendValue); d->notifyObservers(change); } diff --git a/src/render/materialsystem/qparameter_p.h b/src/render/materialsystem/qparameter_p.h index 96db66b7a..bc57a7ca0 100644 --- a/src/render/materialsystem/qparameter_p.h +++ b/src/render/materialsystem/qparameter_p.h @@ -68,7 +68,7 @@ public: QString m_name; QVariant m_value; - QString m_meshName; + QVariant m_backendValue; }; } // namespace Qt3DRender -- cgit v1.2.3