summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-08-12 09:04:06 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-09-05 17:14:36 +0000
commit0c7e6a3904624e80e53c15c3ecffac8eb96cdfab (patch)
treea81cdd2600558f31cb971c4689d568b7b2d893d9 /tests
parentc576d9f2ef0ddbab6159d969105c54a9183cfd21 (diff)
ShaderData: refactoring
Only store the original properties (does not store transformed values anymore as these can change on a per thread basis and lead to races in the ShaderData). Instead introduce a method to check if a property needs to be transformed and a method which given a viewMatrix returns the transformed value. This can then be used concurrently by each UniformBlockValueBuilder without introducing races. Also since building UBO from a ShaderData has been disabled since 5.7, remove all the nested ShaderData update logic. Unit tests updated. Change-Id: Id0e5956b9f7d93f8d019c3d8999268fc3ad68e79 Task-number: QTBUG-54818 Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/render/renderviewutils/tst_renderviewutils.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp b/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
index df68a61d4..b3ef1ba74 100644
--- a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
+++ b/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
@@ -47,6 +47,7 @@ private Q_SLOTS:
void topLevelStructValue_data();
void topLevelStructValue();
void topLevelDynamicProperties();
+ void transformedProperties();
void shouldNotifyDynamicPropertyChanges();
private:
@@ -496,6 +497,49 @@ void tst_RenderViewUtils::topLevelDynamicProperties()
shaderData->property("array"));
}
+void tst_RenderViewUtils::transformedProperties()
+{
+ // GIVEN
+ QScopedPointer<Qt3DRender::QShaderData> shaderData(new Qt3DRender::QShaderData());
+ QScopedPointer<Qt3DRender::Render::ShaderDataManager> manager(new Qt3DRender::Render::ShaderDataManager());
+
+ // WHEN
+ const QVector3D position = QVector3D(15.0f, -5.0f, 10.0f);
+ QMatrix4x4 worldMatrix;
+ QMatrix4x4 viewMatrix;
+
+ worldMatrix.translate(-3.0f, 2.0f, 7.5f);
+ viewMatrix.translate(9.0f, 6.0f, 12.0f);
+
+ shaderData->setProperty("position0", position);
+ shaderData->setProperty("position1", position);
+ shaderData->setProperty("position2", position);
+ shaderData->setProperty("position3", position);
+ shaderData->setProperty("position1Transformed", Qt3DRender::Render::ShaderData::ModelToEye);
+ shaderData->setProperty("position2Transformed", Qt3DRender::Render::ShaderData::ModelToWorld);
+ shaderData->setProperty("position3Transformed", Qt3DRender::Render::ShaderData::ModelToWorldDirection);
+ initBackendShaderData(shaderData.data(), manager.data());
+
+ // 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")));
+
+ // 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>();
+
+ // THEN
+ QCOMPARE(position1Value, viewMatrix * worldMatrix * position);
+ QCOMPARE(position2Value, worldMatrix * position);
+ QCOMPARE(position3Value, (worldMatrix * QVector4D(position, 0.0f)).toVector3D());
+}
+
void tst_RenderViewUtils::shouldNotifyDynamicPropertyChanges()
{
// GIVEN