summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-09-05 09:03:05 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-09-07 14:18:10 +0000
commit73a386d4f62dcf83576d8f3e8b7ee7bb688b661d (patch)
tree1ac5c145c591eb3146f35a2c35238862eddc99b9
parentc8531f512eda3074aa66d8a5c7f9525b3be7f75d (diff)
ShaderData: add getter to retrieve transform type of properties
Replaces isPropertyToBeTransformed by propertyTransformType which returns the TransformType (NoTransform) if the property isn't transformed. Change-Id: Ib7d91bdcfe18409e6ad6d6f5bc119c46dd7fb143 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/jobs/renderviewjobutils.cpp2
-rw-r--r--src/render/materialsystem/shaderdata.cpp32
-rw-r--r--src/render/materialsystem/shaderdata_p.h3
-rw-r--r--tests/auto/render/renderviewutils/tst_renderviewutils.cpp10
4 files changed, 26 insertions, 21 deletions
diff --git a/src/render/jobs/renderviewjobutils.cpp b/src/render/jobs/renderviewjobutils.cpp
index 760e931dd..8ffd5ea10 100644
--- a/src/render/jobs/renderviewjobutils.cpp
+++ b/src/render/jobs/renderviewjobutils.cpp
@@ -465,7 +465,7 @@ void UniformBlockValueBuilder::buildActiveUniformNameValueMapHelper(ShaderData *
// If the property needs to be transformed, we transform it here as
// the shaderdata cannot hold transformed properties for multiple
// thread contexts at once
- if (currentShaderData->isPropertyToBeTransformed(qmlPropertyName))
+ if (currentShaderData->propertyTransformType(qmlPropertyName) != ShaderData::NoTransform)
activeUniformNamesToValue.insert(StringToInt::lookupId(varName),
currentShaderData->getTransformedProperty(qmlPropertyName, viewMatrix));
else
diff --git a/src/render/materialsystem/shaderdata.cpp b/src/render/materialsystem/shaderdata.cpp
index d6873e7dc..e7c8a1c37 100644
--- a/src/render/materialsystem/shaderdata.cpp
+++ b/src/render/materialsystem/shaderdata.cpp
@@ -171,21 +171,6 @@ void ShaderData::cleanup(NodeManagers *managers)
m_updatedShaderData.clear();
}
-/*!
- \internal
- Lookup if the current ShaderData or a nested ShaderData has updated properties.
- UpdateProperties contains either the value of the propertie of a QNodeId if it's another ShaderData.
- Transformed properties are updated for all of ShaderData that have ones at the point.
-
- \note This needs to be performed for every top level ShaderData every time it is used.
- As we don't know if the transformed properties use the same viewMatrix for all RenderViews.
- */
-
-bool ShaderData::isPropertyToBeTransformed(const QString &name) const
-{
- return m_transformedProperties.contains(name);
-}
-
QVariant ShaderData::getTransformedProperty(const QString &name, const QMatrix4x4 &viewMatrix)
{
// Note protecting m_worldMatrix at this point as we assume all world updates
@@ -200,6 +185,8 @@ QVariant ShaderData::getTransformedProperty(const QString &name, const QMatrix4x
return QVariant::fromValue(m_worldMatrix * m_originalProperties.value(it.key()).value<QVector3D>());
case ModelToWorldDirection:
return QVariant::fromValue((m_worldMatrix * QVector4D(m_originalProperties.value(it.key()).value<QVector3D>(), 0.0f)).toVector3D());
+ case NoTransform:
+ break;
}
}
return QVariant();
@@ -224,6 +211,21 @@ void ShaderData::markDirty()
ShaderData::m_updatedShaderData.append(peerId());
}
+/*!
+ \internal
+ Lookup if the current ShaderData or a nested ShaderData has updated properties.
+ UpdateProperties contains either the value of the propertie of a QNodeId if it's another ShaderData.
+ Transformed properties are updated for all of ShaderData that have ones at the point.
+
+ \note This needs to be performed for every top level ShaderData every time it is used.
+ As we don't know if the transformed properties use the same viewMatrix for all RenderViews.
+ */
+
+ShaderData::TransformType ShaderData::propertyTransformType(const QString &name) const
+{
+ return m_transformedProperties.value(name, TransformType::NoTransform);
+}
+
void ShaderData::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
{
if (!m_propertyReader.isNull() && e->type() == PropertyUpdated) {
diff --git a/src/render/materialsystem/shaderdata_p.h b/src/render/materialsystem/shaderdata_p.h
index 90568eaea..6ce0c734c 100644
--- a/src/render/materialsystem/shaderdata_p.h
+++ b/src/render/materialsystem/shaderdata_p.h
@@ -71,6 +71,7 @@ class Q_AUTOTEST_EXPORT ShaderData : public BackendNode
{
public:
enum TransformType {
+ NoTransform = -1,
ModelToEye = 0,
ModelToWorld,
ModelToWorldDirection
@@ -87,7 +88,7 @@ public:
// Call by RenderViewJob
void markDirty();
- bool isPropertyToBeTransformed(const QString &name) const;
+ TransformType propertyTransformType(const QString &name) const;
QVariant getTransformedProperty(const QString &name, const QMatrix4x4 &viewMatrix);
// Called by FrameCleanupJob
diff --git a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp b/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
index b3ef1ba74..e4681a257 100644
--- a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
+++ b/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
@@ -523,18 +523,20 @@ void tst_RenderViewUtils::transformedProperties()
// THEN
Qt3DRender::Render::ShaderData *backendShaderData = manager->lookupResource(shaderData->id());
QVERIFY(backendShaderData != nullptr);
- QVERIFY(!backendShaderData->isPropertyToBeTransformed(QStringLiteral("position0")));
- QVERIFY(backendShaderData->isPropertyToBeTransformed(QStringLiteral("position1")));
- QVERIFY(backendShaderData->isPropertyToBeTransformed(QStringLiteral("position2")));
- QVERIFY(backendShaderData->isPropertyToBeTransformed(QStringLiteral("position3")));
+ QCOMPARE(backendShaderData->propertyTransformType(QStringLiteral("position0")), Qt3DRender::Render::ShaderData::NoTransform);
+ QCOMPARE(backendShaderData->propertyTransformType(QStringLiteral("position1")), Qt3DRender::Render::ShaderData::ModelToEye);
+ QCOMPARE(backendShaderData->propertyTransformType(QStringLiteral("position2")), Qt3DRender::Render::ShaderData::ModelToWorld);
+ QCOMPARE(backendShaderData->propertyTransformType(QStringLiteral("position3")), Qt3DRender::Render::ShaderData::ModelToWorldDirection);
// WHEN
backendShaderData->updateWorldTransform(worldMatrix);
const QVector3D position1Value = backendShaderData->getTransformedProperty(QStringLiteral("position1"), viewMatrix).value<QVector3D>();
const QVector3D position2Value = backendShaderData->getTransformedProperty(QStringLiteral("position2"), viewMatrix).value<QVector3D>();
const QVector3D position3Value = backendShaderData->getTransformedProperty(QStringLiteral("position3"), viewMatrix).value<QVector3D>();
+ const QVariant position0Value = backendShaderData->getTransformedProperty(QStringLiteral("position0"), viewMatrix);
// THEN
+ QCOMPARE(position0Value, QVariant());
QCOMPARE(position1Value, viewMatrix * worldMatrix * position);
QCOMPARE(position2Value, worldMatrix * position);
QCOMPARE(position3Value, (worldMatrix * QVector4D(position, 0.0f)).toVector3D());