summaryrefslogtreecommitdiffstats
path: root/src/render/materialsystem/qparameter.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-12-08 09:03:14 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-01-13 16:08:31 +0000
commitd7e9c7a9844b658d93c3f1ac47e96f069162de3d (patch)
treef8ae86fe21d07d59ef806296379c0355a0e4f00c /src/render/materialsystem/qparameter.cpp
parent71b4e8612e558115edd12e8ac19f8d6abe583475 (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.cpp19
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);
}