From 73a386d4f62dcf83576d8f3e8b7ee7bb688b661d Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Mon, 5 Sep 2016 09:03:05 +0200 Subject: 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 --- src/render/jobs/renderviewjobutils.cpp | 2 +- src/render/materialsystem/shaderdata.cpp | 32 ++++++++++++---------- src/render/materialsystem/shaderdata_p.h | 3 +- .../render/renderviewutils/tst_renderviewutils.cpp | 10 ++++--- 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()); case ModelToWorldDirection: return QVariant::fromValue((m_worldMatrix * QVector4D(m_originalProperties.value(it.key()).value(), 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(); const QVector3D position2Value = backendShaderData->getTransformedProperty(QStringLiteral("position2"), viewMatrix).value(); const QVector3D position3Value = backendShaderData->getTransformedProperty(QStringLiteral("position3"), viewMatrix).value(); + 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()); -- cgit v1.2.3