summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-09-20 10:39:32 +0200
committerLiang Qi <liang.qi@qt.io>2016-09-20 10:39:32 +0200
commit0e3d54f8d7f9be26687afebcc9f456e4cefc2357 (patch)
treef3826c927305cc137006aed968be6fbf57b42009 /tests
parent52121396c55e6100316f006c87b4fdaa8b5a0719 (diff)
parent7e638edbd15640302516f9a69d20f62d26d4af06 (diff)
Merge remote-tracking branch 'origin/5.7' into 5.8
Conflicts: src/render/framegraph/qrendersurfaceselector.cpp src/render/frontend/qrendersettings.cpp src/render/jobs/renderviewjobutils_p.h tests/auto/render/render.pro Change-Id: Ibe9eb962e3990e07f01a5608a2d60c79bc4c160f
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp180
-rw-r--r--tests/auto/render/loadscenejob/loadscenejob.pro12
-rw-r--r--tests/auto/render/loadscenejob/tst_loadscenejob.cpp287
-rw-r--r--tests/auto/render/render.pro1
-rw-r--r--tests/auto/render/renderviewutils/tst_renderviewutils.cpp46
-rw-r--r--tests/manual/bigscene-cpp/main.cpp2
-rw-r--r--tests/manual/deferred-renderer-cpp/main.cpp4
7 files changed, 517 insertions, 15 deletions
diff --git a/tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp b/tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp
index ddd9eed22..fa1657732 100644
--- a/tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp
+++ b/tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp
@@ -286,13 +286,13 @@ private Q_SLOTS:
<< QVector3D(1.0f, 0.0f, 0.0f)
<< QVector3D(1.0f, 0.0f, 0.0f));
const auto texCoords = (QVector<QVector2D>()
- << QVector2D(0.0f, 0.0f)
- << QVector2D(0.0f, 1.0f)
- << QVector2D(1.0f, 0.0f));
+ << QVector2D(1.0f, 0.0f)
+ << QVector2D(1.0f, 1.0f)
+ << QVector2D(0.0f, 0.0f));
const auto tangents = (QVector<QVector4D>()
- << QVector4D(0.0f, 0.0f, 1.0f, -1.0f)
- << QVector4D(0.0f, 0.0f, 1.0f, -1.0f)
- << QVector4D(0.0f, 0.0f, 1.0f, -1.0f));
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f));
QTest::newRow("default_positiveX_firstTriangle")
<< 1.0f << 1.0f << 1.0f
<< QSize(2,2) << QSize(2,2) << QSize(2,2)
@@ -312,13 +312,13 @@ private Q_SLOTS:
<< QVector3D(-1.0f, 0.0f, 0.0f)
<< QVector3D(-1.0f, 0.0f, 0.0f));
const auto texCoords = (QVector<QVector2D>()
- << QVector2D(1.0f, 0.0f)
- << QVector2D(0.0f, 1.0f)
- << QVector2D(1.0f, 1.0f));
+ << QVector2D(0.0f, 0.0f)
+ << QVector2D(1.0f, 1.0f)
+ << QVector2D(0.0f, 1.0f));
const auto tangents = (QVector<QVector4D>()
- << QVector4D(0.0f, 0.0f, -1.0f, -1.0f)
- << QVector4D(0.0f, 0.0f, -1.0f, -1.0f)
- << QVector4D(0.0f, 0.0f, -1.0f, -1.0f));
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f));
QTest::newRow("default_negativeX_lastTriangle")
<< 1.0f << 1.0f << 1.0f
<< QSize(2,2) << QSize(2,2) << QSize(2,2)
@@ -429,6 +429,162 @@ private Q_SLOTS:
<< triangleIndex
<< indices << positions << normals << texCoords << tangents;
}
+
+ {
+ const int triangleIndex = 0;
+ const auto indices = (QVector<quint16>() << 0 << 1 << 2);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(1.0f, -1.5f, -2.5f)
+ << QVector3D(1.0f, 1.5f, -2.5f)
+ << QVector3D(1.0f, -1.5f, -1.25f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(1.0f, 0.0f, 0.0f)
+ << QVector3D(1.0f, 0.0f, 0.0f)
+ << QVector3D(1.0f, 0.0f, 0.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(1.0f, 0.0f)
+ << QVector2D(1.0f, 1.0f)
+ << QVector2D(0.75f, 0.0f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f));
+ QTest::newRow("default_positiveX_firstTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 15;
+ const auto indices = (QVector<quint16>() << 18 << 17 << 19);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(-1.0f, -1.5f, -2.5f)
+ << QVector3D(-1.0f, 1.5f, -1.25f)
+ << QVector3D(-1.0f, 1.5f, -2.5f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(-1.0f, 0.0f, 0.0f)
+ << QVector3D(-1.0f, 0.0f, 0.0f)
+ << QVector3D(-1.0f, 0.0f, 0.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 0.0f)
+ << QVector2D(0.25f, 1.0f)
+ << QVector2D(0.0f, 1.0f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f));
+ QTest::newRow("default_negativeX_lastTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 16;
+ const auto indices = (QVector<quint16>() << 20 << 21 << 22);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(-1.0f, 1.5f, 2.5f)
+ << QVector3D(1.0f, 1.5f, 2.5f)
+ << QVector3D(-1.0f, 1.5f, 1.875f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(0.0f, 1.0f, 0.0f)
+ << QVector3D(0.0f, 1.0f, 0.0f)
+ << QVector3D(0.0f, 1.0f, 0.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 0.0f)
+ << QVector2D(1.0f, 0.0f)
+ << QVector2D(0.0f, 0.125f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f));
+ QTest::newRow("default_positiveY_firstTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 47;
+ const auto indices = (QVector<quint16>() << 54 << 53 << 55);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(-1.0f, -1.5f, 2.5f)
+ << QVector3D(1.0f, -1.5f, 1.875f)
+ << QVector3D(1.0f, -1.5f, 2.5f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(0.0f, -1.0f, 0.0f)
+ << QVector3D(0.0f, -1.0f, 0.0f)
+ << QVector3D(0.0f, -1.0f, 0.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 1.0f)
+ << QVector2D(1.0f, 0.875f)
+ << QVector2D(1.0f, 1.0f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f));
+ QTest::newRow("default_negativeY_lastTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 48;
+ const auto indices = (QVector<quint16>() << 56 << 57 << 58);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(-1.0f, -1.5f, 2.5f)
+ << QVector3D(1.0f, -1.5f, 2.5f)
+ << QVector3D(-1.0f, 0.0f, 2.5f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(0.0f, 0.0f, 1.0f)
+ << QVector3D(0.0f, 0.0f, 1.0f)
+ << QVector3D(0.0f, 0.0f, 1.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 0.0f)
+ << QVector2D(1.0f, 0.0f)
+ << QVector2D(0.0f, 0.5f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f));
+ QTest::newRow("default_positiveZ_firstTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 55;
+ const auto indices = (QVector<quint16>() << 66 << 65 << 67);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(1.0f, 1.5f, -2.5f)
+ << QVector3D(-1.0f, 0.0f, -2.5f)
+ << QVector3D(-1.0f, 1.5f, -2.5f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(0.0f, 0.0f, -1.0f)
+ << QVector3D(0.0f, 0.0f, -1.0f)
+ << QVector3D(0.0f, 0.0f, -1.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 1.0f)
+ << QVector2D(1.0f, 0.5f)
+ << QVector2D(1.0f, 1.0f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(-1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(-1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(-1.0f, 0.0f, 0.0f, 1.0f));
+ QTest::newRow("default_negativeZ_lastTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
}
void generatedGeometryShouldBeConsistent()
diff --git a/tests/auto/render/loadscenejob/loadscenejob.pro b/tests/auto/render/loadscenejob/loadscenejob.pro
new file mode 100644
index 000000000..3901c3545
--- /dev/null
+++ b/tests/auto/render/loadscenejob/loadscenejob.pro
@@ -0,0 +1,12 @@
+TEMPLATE = app
+
+TARGET = tst_loadscenejob
+
+QT += 3dcore 3dcore-private 3drender 3drender-private testlib
+
+CONFIG += testcase
+
+SOURCES += tst_loadscenejob.cpp
+
+include(../../core/common/common.pri)
+include(../commons/commons.pri)
diff --git a/tests/auto/render/loadscenejob/tst_loadscenejob.cpp b/tests/auto/render/loadscenejob/tst_loadscenejob.cpp
new file mode 100644
index 000000000..3428ecbea
--- /dev/null
+++ b/tests/auto/render/loadscenejob/tst_loadscenejob.cpp
@@ -0,0 +1,287 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 Paul Lemire <paul.lemire350@gmail.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QTest>
+#include <Qt3DRender/private/scene_p.h>
+#include <Qt3DRender/private/loadscenejob_p.h>
+#include <Qt3DRender/private/qsceneiohandler_p.h>
+#include <Qt3DRender/private/nodemanagers_p.h>
+#include <Qt3DRender/private/scenemanager_p.h>
+#include <Qt3DCore/qpropertyupdatedchange.h>
+#include <Qt3DCore/QEntity>
+#include <Qt3DCore/private/qbackendnode_p.h>
+#include "testpostmanarbiter.h"
+
+class TestIOSceneHandler : public Qt3DRender::QSceneIOHandler
+{
+public:
+ explicit TestIOSceneHandler(bool supportsFormat, bool shouldFail)
+ : m_supportsFormat(supportsFormat)
+ , m_shouldFail(shouldFail)
+ {}
+
+ void setSource(const QUrl &source) Q_DECL_OVERRIDE
+ {
+ m_source = source;
+ }
+
+ bool isFileTypeSupported(const QUrl &) const Q_DECL_OVERRIDE
+ {
+ return m_supportsFormat;
+ }
+
+ Qt3DCore::QEntity *scene(const QString &) Q_DECL_OVERRIDE
+ {
+ return m_shouldFail ? nullptr : new Qt3DCore::QEntity();
+ }
+
+ Qt3DCore::QEntity *node(const QString &) Q_DECL_OVERRIDE
+ {
+ return m_shouldFail ? nullptr : new Qt3DCore::QEntity();
+ }
+
+ QUrl source() const
+ {
+ return m_source;
+ }
+
+private:
+ QUrl m_source;
+ bool m_supportsFormat;
+ bool m_shouldFail;
+};
+
+class tst_LoadSceneJob : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+
+ void checkInitialState()
+ {
+ // GIVEN
+ QUrl url;
+ Qt3DCore::QNodeId nodeId;
+ Qt3DRender::Render::LoadSceneJob backendLoadSceneJob(url, nodeId);
+
+ // THEN
+ QCOMPARE(backendLoadSceneJob.source(), url);
+ QCOMPARE(backendLoadSceneJob.sceneComponentId(), nodeId);
+ QVERIFY(backendLoadSceneJob.nodeManagers() == nullptr);
+ QCOMPARE(backendLoadSceneJob.sceneIOHandlers().size(), 0);
+ }
+
+ void checkInitialize()
+ {
+ // GIVEN
+ const QUrl url(QStringLiteral("URL"));
+ const Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId();
+ Qt3DRender::Render::NodeManagers nodeManagers;
+ TestIOSceneHandler fakeHandler(true, true);
+
+ // WHEN
+ Qt3DRender::Render::LoadSceneJob backendLoadSceneJob(url, sceneId);
+ backendLoadSceneJob.setNodeManagers(&nodeManagers);
+ backendLoadSceneJob.setSceneIOHandlers(QList<Qt3DRender::QSceneIOHandler *>() << &fakeHandler);
+
+ // THEN
+ QCOMPARE(backendLoadSceneJob.source(), url);
+ QCOMPARE(backendLoadSceneJob.sceneComponentId(), sceneId);
+ QVERIFY(backendLoadSceneJob.nodeManagers() == &nodeManagers);
+ QCOMPARE(backendLoadSceneJob.sceneIOHandlers().size(), 1);
+ QCOMPARE(backendLoadSceneJob.sceneIOHandlers().first(), &fakeHandler);
+ }
+
+ void checkRunValidSourceSupportedFormat()
+ {
+ // GIVEN
+ const QUrl url(QStringLiteral("URL"));
+ TestArbiter arbiter;
+ Qt3DRender::Render::NodeManagers nodeManagers;
+ TestIOSceneHandler fakeHandler(true, false);
+ Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId();
+ Qt3DRender::Render::Scene *scene = nodeManagers.sceneManager()->getOrCreateResource(sceneId);
+
+ // THEN
+ QVERIFY(scene != nullptr);
+ Qt3DCore::QBackendNodePrivate::get(scene)->setArbiter(&arbiter);
+
+ // WHEN
+ Qt3DRender::Render::LoadSceneJob loadSceneJob(url, sceneId);
+ loadSceneJob.setNodeManagers(&nodeManagers);
+ loadSceneJob.setSceneIOHandlers(QList<Qt3DRender::QSceneIOHandler *>() << &fakeHandler);
+ loadSceneJob.run();
+
+ // THEN
+ QCOMPARE(arbiter.events.count(), 4);
+ auto change = arbiter.events.at(0).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::None);
+
+ change = arbiter.events.at(1).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::Loading);
+
+ change = arbiter.events.at(2).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "scene");
+ QVERIFY(change->value().value<Qt3DCore::QEntity *>() != nullptr);
+ delete change->value().value<Qt3DCore::QEntity *>();
+
+ change = arbiter.events.at(3).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::Ready);
+ }
+
+ void checkEmptySource()
+ {
+ // GIVEN
+ QUrl url;
+ TestArbiter arbiter;
+ Qt3DRender::Render::NodeManagers nodeManagers;
+ TestIOSceneHandler fakeHandler(true, false);
+ Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId();
+ Qt3DRender::Render::Scene *scene = nodeManagers.sceneManager()->getOrCreateResource(sceneId);
+
+ // THEN
+ QVERIFY(scene != nullptr);
+ Qt3DCore::QBackendNodePrivate::get(scene)->setArbiter(&arbiter);
+
+ // WHEN
+ Qt3DRender::Render::LoadSceneJob loadSceneJob(url, sceneId);
+ loadSceneJob.setNodeManagers(&nodeManagers);
+ loadSceneJob.setSceneIOHandlers(QList<Qt3DRender::QSceneIOHandler *>() << &fakeHandler);
+ loadSceneJob.run();
+
+ // THEN
+ QCOMPARE(arbiter.events.count(), 3);
+ auto change = arbiter.events.at(0).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::None);
+
+ change = arbiter.events.at(1).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "scene");
+ QVERIFY(change->value().value<Qt3DCore::QEntity *>() == nullptr);
+
+ change = arbiter.events.at(2).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::None);
+ }
+
+ void checkRunValidSourceUnsupportedFormat()
+ {
+ // GIVEN
+ const QUrl url(QStringLiteral("URL"));
+ TestArbiter arbiter;
+ Qt3DRender::Render::NodeManagers nodeManagers;
+ TestIOSceneHandler fakeHandler(false, false);
+ Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId();
+ Qt3DRender::Render::Scene *scene = nodeManagers.sceneManager()->getOrCreateResource(sceneId);
+
+ // THEN
+ QVERIFY(scene != nullptr);
+ Qt3DCore::QBackendNodePrivate::get(scene)->setArbiter(&arbiter);
+
+ // WHEN
+ Qt3DRender::Render::LoadSceneJob loadSceneJob(url, sceneId);
+ loadSceneJob.setNodeManagers(&nodeManagers);
+ loadSceneJob.setSceneIOHandlers(QList<Qt3DRender::QSceneIOHandler *>() << &fakeHandler);
+ loadSceneJob.run();
+
+ // THEN
+ QCOMPARE(arbiter.events.count(), 3);
+ auto change = arbiter.events.at(0).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::None);
+
+ change = arbiter.events.at(1).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "scene");
+ QVERIFY(change->value().value<Qt3DCore::QEntity *>() == nullptr);
+
+ change = arbiter.events.at(2).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::Error);
+ }
+
+ void checkRunErrorAtLoading()
+ {
+ // GIVEN
+ const QUrl url(QStringLiteral("URL"));
+ TestArbiter arbiter;
+ Qt3DRender::Render::NodeManagers nodeManagers;
+ TestIOSceneHandler fakeHandler(true, true);
+ Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId();
+ Qt3DRender::Render::Scene *scene = nodeManagers.sceneManager()->getOrCreateResource(sceneId);
+
+ // THEN
+ QVERIFY(scene != nullptr);
+ Qt3DCore::QBackendNodePrivate::get(scene)->setArbiter(&arbiter);
+
+ // WHEN
+ Qt3DRender::Render::LoadSceneJob loadSceneJob(url, sceneId);
+ loadSceneJob.setNodeManagers(&nodeManagers);
+ loadSceneJob.setSceneIOHandlers(QList<Qt3DRender::QSceneIOHandler *>() << &fakeHandler);
+ loadSceneJob.run();
+
+ // THEN
+ QCOMPARE(arbiter.events.count(), 4);
+ auto change = arbiter.events.at(0).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::None);
+
+ change = arbiter.events.at(1).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::Loading);
+
+ change = arbiter.events.at(2).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "scene");
+ QVERIFY(change->value().value<Qt3DCore::QEntity *>() == nullptr);
+ delete change->value().value<Qt3DCore::QEntity *>();
+
+ change = arbiter.events.at(3).staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->subjectId(), scene->peerId());
+ QCOMPARE(change->propertyName(), "status");
+ QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::Error);
+ }
+};
+
+QTEST_MAIN(tst_LoadSceneJob)
+
+#include "tst_loadscenejob.moc"
diff --git a/tests/auto/render/render.pro b/tests/auto/render/render.pro
index 34b282610..69080ea47 100644
--- a/tests/auto/render/render.pro
+++ b/tests/auto/render/render.pro
@@ -58,6 +58,7 @@ qtConfig(private_tests) {
qrendertargetoutput \
qcameralens \
qcomputecommand \
+ loadscenejob \
qrendercapture \
uniform
}
diff --git a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp b/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
index df68a61d4..e4681a257 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,51 @@ 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);
+ 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());
+}
+
void tst_RenderViewUtils::shouldNotifyDynamicPropertyChanges()
{
// GIVEN
diff --git a/tests/manual/bigscene-cpp/main.cpp b/tests/manual/bigscene-cpp/main.cpp
index ebbd499f3..791aeb19d 100644
--- a/tests/manual/bigscene-cpp/main.cpp
+++ b/tests/manual/bigscene-cpp/main.cpp
@@ -61,7 +61,7 @@
#include <Qt3DCore/qaspectengine.h>
#include <Qt3DInput/QInputAspect>
#include <Qt3DRender/QParameter>
-#include <Qt3DExtras//QCylinderMesh>
+#include <Qt3DExtras/QCylinderMesh>
#include <Qt3DRender/QRenderAspect>
#include <Qt3DRender/QCameraSelector>
#include <Qt3DExtras/QPhongMaterial>
diff --git a/tests/manual/deferred-renderer-cpp/main.cpp b/tests/manual/deferred-renderer-cpp/main.cpp
index baafb4796..47425e7ee 100644
--- a/tests/manual/deferred-renderer-cpp/main.cpp
+++ b/tests/manual/deferred-renderer-cpp/main.cpp
@@ -51,8 +51,8 @@
#include <Qt3DCore/QEntity>
#include <Qt3DRender/QMaterial>
-#include <Qt3DExtras//QSphereMesh>
-#include <Qt3DExtras//QPlaneMesh>
+#include <Qt3DExtras/QSphereMesh>
+#include <Qt3DExtras/QPlaneMesh>
#include <Qt3DRender/QLayer>
#include <Qt3DRender/QParameter>
#include <Qt3DRender/QCamera>