diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-12-08 09:03:14 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-01-13 16:08:31 +0000 |
commit | d7e9c7a9844b658d93c3f1ac47e96f069162de3d (patch) | |
tree | f8ae86fe21d07d59ef806296379c0355a0e4f00c /src/render/materialsystem/qparameter.cpp | |
parent | 71b4e8612e558115edd12e8ac19f8d6abe583475 (diff) |
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 <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/materialsystem/qparameter.cpp')
-rw-r--r-- | src/render/materialsystem/qparameter.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
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<Qt3DCore::QNode *>(); + 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<const QParameter*>(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<QNode *>(); - if (txt != Q_NULLPTR && !txt->parent()) - txt->setParent(this); + // In case node values are declared inline + QNode *nodeValue = dv.value<QNode *>(); + 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); } |