diff options
-rw-r--r-- | src/render/io/qsceneloader.cpp | 53 | ||||
-rw-r--r-- | src/render/io/qsceneloader.h | 1 | ||||
-rw-r--r-- | src/render/io/qsceneloader_p.h | 1 | ||||
-rw-r--r-- | src/render/io/scene.cpp | 26 | ||||
-rw-r--r-- | src/render/io/scene_p.h | 1 | ||||
-rw-r--r-- | src/render/jobs/loadscenejob.cpp | 58 | ||||
-rw-r--r-- | src/render/jobs/loadscenejob_p.h | 23 | ||||
-rw-r--r-- | tests/auto/render/loadscenejob/tst_loadscenejob.cpp | 80 | ||||
-rw-r--r-- | tests/auto/render/qsceneloader/tst_qsceneloader.cpp | 53 | ||||
-rw-r--r-- | tests/auto/render/sceneloader/tst_sceneloader.cpp | 45 |
10 files changed, 93 insertions, 248 deletions
diff --git a/src/render/io/qsceneloader.cpp b/src/render/io/qsceneloader.cpp index d66fe3080..cf1e45355 100644 --- a/src/render/io/qsceneloader.cpp +++ b/src/render/io/qsceneloader.cpp @@ -219,6 +219,27 @@ void QSceneLoaderPrivate::setStatus(QSceneLoader::Status status) } } +void QSceneLoaderPrivate::setSceneRoot(QEntity *root) +{ + // If we already have a scene sub tree, delete it + if (m_subTreeRoot) { + delete m_subTreeRoot; + m_subTreeRoot = nullptr; + } + + // If we have successfully loaded a scene, graft it in + if (root) { + // Get the entity to which this component is attached + const Qt3DCore::QNodeIdVector entities = m_scene->entitiesForComponent(m_id); + Q_ASSERT(entities.size() == 1); + Qt3DCore::QNodeId parentEntityId = entities.first(); + QEntity *parentEntity = qobject_cast<QEntity *>(m_scene->lookupNode(parentEntityId)); + root->setParent(parentEntity); + m_subTreeRoot = root; + populateEntityMap(m_subTreeRoot); + } +} + /*! The constructor creates an instance with the specified \a parent. */ @@ -238,38 +259,6 @@ QSceneLoader::QSceneLoader(QSceneLoaderPrivate &dd, QNode *parent) { } -// Called in main thread -/*! \internal */ -void QSceneLoader::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) -{ - Q_D(QSceneLoader); - QPropertyUpdatedChangePtr e = qSharedPointerCast<QPropertyUpdatedChange>(change); - if (e->type() == PropertyUpdated) { - if (e->propertyName() == QByteArrayLiteral("scene")) { - // If we already have a scene sub tree, delete it - if (d->m_subTreeRoot) { - delete d->m_subTreeRoot; - d->m_subTreeRoot = nullptr; - } - - // If we have successfully loaded a scene, graft it in - auto *subTreeRoot = e->value().value<Qt3DCore::QEntity *>(); - if (subTreeRoot) { - // Get the entity to which this component is attached - const Qt3DCore::QNodeIdVector entities = d->m_scene->entitiesForComponent(d->m_id); - Q_ASSERT(entities.size() == 1); - Qt3DCore::QNodeId parentEntityId = entities.first(); - QEntity *parentEntity = qobject_cast<QEntity *>(d->m_scene->lookupNode(parentEntityId)); - subTreeRoot->setParent(parentEntity); - d->m_subTreeRoot = subTreeRoot; - d->populateEntityMap(d->m_subTreeRoot); - } - } else if (e->propertyName() == QByteArrayLiteral("status")) { - d->setStatus(e->value().value<QSceneLoader::Status>()); - } - } -} - QUrl QSceneLoader::source() const { Q_D(const QSceneLoader); diff --git a/src/render/io/qsceneloader.h b/src/render/io/qsceneloader.h index 4cb743333..6842a6926 100644 --- a/src/render/io/qsceneloader.h +++ b/src/render/io/qsceneloader.h @@ -60,7 +60,6 @@ public: explicit QSceneLoader(Qt3DCore::QNode *parent = nullptr); ~QSceneLoader(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) override; enum Status { None = 0, Loading, diff --git a/src/render/io/qsceneloader_p.h b/src/render/io/qsceneloader_p.h index 50745c66f..213bc1104 100644 --- a/src/render/io/qsceneloader_p.h +++ b/src/render/io/qsceneloader_p.h @@ -67,6 +67,7 @@ public: QSceneLoaderPrivate(); void setStatus(QSceneLoader::Status status); + void setSceneRoot(Qt3DCore::QEntity *root); Q_DECLARE_PUBLIC(QSceneLoader) diff --git a/src/render/io/scene.cpp b/src/render/io/scene.cpp index e7f289f8a..089091701 100644 --- a/src/render/io/scene.cpp +++ b/src/render/io/scene.cpp @@ -66,16 +66,6 @@ void Scene::cleanup() m_source.clear(); } -void Scene::setStatus(QSceneLoader::Status status) -{ - // Send the new subtree to the frontend or notify failure - auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId()); - e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll); - e->setPropertyName("status"); - e->setValue(QVariant::fromValue(status)); - notifyObservers(e); -} - void Scene::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) { const QSceneLoader *node = qobject_cast<const QSceneLoader *>(frontEnd); @@ -99,22 +89,6 @@ QUrl Scene::source() const return m_source; } -void Scene::setSceneSubtree(Qt3DCore::QEntity *subTree) -{ - if (subTree) { - // Move scene sub tree to the application thread so that it can be grafted in. - const auto appThread = QCoreApplication::instance()->thread(); - subTree->moveToThread(appThread); - } - - // Send the new subtree to the frontend or notify failure - auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId()); - e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll); - e->setPropertyName("scene"); - e->setValue(QVariant::fromValue(subTree)); - notifyObservers(e); -} - void Scene::setSceneManager(SceneManager *manager) { if (m_sceneManager != manager) diff --git a/src/render/io/scene_p.h b/src/render/io/scene_p.h index 04b9bba1a..bf625b369 100644 --- a/src/render/io/scene_p.h +++ b/src/render/io/scene_p.h @@ -74,7 +74,6 @@ public: void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; QUrl source() const; - void setSceneSubtree(Qt3DCore::QEntity *subTree); void setSceneManager(SceneManager *manager); void cleanup(); diff --git a/src/render/jobs/loadscenejob.cpp b/src/render/jobs/loadscenejob.cpp index 9885d3225..f858f82e3 100644 --- a/src/render/jobs/loadscenejob.cpp +++ b/src/render/jobs/loadscenejob.cpp @@ -42,10 +42,12 @@ #include <private/nodemanagers_p.h> #include <private/scenemanager_p.h> #include <Qt3DCore/qentity.h> +#include <Qt3DCore/private/qaspectmanager_p.h> #include <Qt3DRender/private/job_common_p.h> #include <Qt3DRender/private/qsceneimporter_p.h> #include <Qt3DRender/private/qurlhelper_p.h> #include <Qt3DRender/qsceneloader.h> +#include <Qt3DRender/private/qsceneloader_p.h> #include <Qt3DRender/private/renderlogging_p.h> #include <QFileInfo> #include <QMimeDatabase> @@ -55,10 +57,10 @@ QT_BEGIN_NAMESPACE namespace Qt3DRender { namespace Render { -LoadSceneJob::LoadSceneJob(const QUrl &source, Qt3DCore::QNodeId m_sceneComponent) - : QAspectJob() +LoadSceneJob::LoadSceneJob(const QUrl &source, Qt3DCore::QNodeId sceneComponent) + : QAspectJob(*new LoadSceneJobPrivate(this)) , m_source(source) - , m_sceneComponent(m_sceneComponent) + , m_sceneComponent(sceneComponent) , m_managers(nullptr) { SET_JOB_RUN_STAT_TYPE(this, JobTypes::LoadScene, 0); @@ -97,7 +99,6 @@ void LoadSceneJob::run() Q_ASSERT(scene); // Reset status - scene->setStatus(QSceneLoader::None); QSceneLoader::Status finalStatus = QSceneLoader::None; // Perform the loading only if the source wasn't explicitly set to empty @@ -110,8 +111,7 @@ void LoadSceneJob::run() qCDebug(SceneLoaders) << Q_FUNC_INFO << "Attempting to load" << finfo.filePath(); if (finfo.exists()) { const QStringList extensions(finfo.suffix()); - sceneSubTree = tryLoadScene(scene, - finalStatus, + sceneSubTree = tryLoadScene(finalStatus, extensions, [this] (QSceneImporter *importer) { importer->setSource(m_source); @@ -131,8 +131,7 @@ void LoadSceneJob::run() const QString basePath = m_source.adjusted(QUrl::RemoveFilename).toString(); - sceneSubTree = tryLoadScene(scene, - finalStatus, + sceneSubTree = tryLoadScene(finalStatus, extensions, [this, basePath] (QSceneImporter *importer) { importer->setData(m_data, basePath); @@ -140,19 +139,18 @@ void LoadSceneJob::run() } } - // If the sceneSubTree is null it will trigger the frontend to unload - // any subtree it may hold - // Set clone of sceneTree in sceneComponent. This will move the sceneSubTree - // to the QCoreApplication thread which is where the frontend object tree lives. - scene->setSceneSubtree(sceneSubTree); + Q_D(LoadSceneJob); + d->m_sceneSubtree = sceneSubTree; + d->m_status = finalStatus; - // Note: the status is set after the subtree so that bindinds depending on the status - // in the frontend will be consistent - scene->setStatus(finalStatus); + if (d->m_sceneSubtree) { + // Move scene sub tree to the application thread so that it can be grafted in. + const auto appThread = QCoreApplication::instance()->thread(); + d->m_sceneSubtree->moveToThread(appThread); + } } -Qt3DCore::QEntity *LoadSceneJob::tryLoadScene(Scene *scene, - QSceneLoader::Status &finalStatus, +Qt3DCore::QEntity *LoadSceneJob::tryLoadScene(QSceneLoader::Status &finalStatus, const QStringList &extensions, const std::function<void (QSceneImporter *)> &importerSetupFunc) { @@ -165,9 +163,6 @@ Qt3DCore::QEntity *LoadSceneJob::tryLoadScene(Scene *scene, foundSuitableLoggerPlugin = true; - // If the file type is supported -> enter Loading status - scene->setStatus(QSceneLoader::Loading); - // Set source file or data on importer importerSetupFunc(sceneImporter); @@ -188,6 +183,27 @@ Qt3DCore::QEntity *LoadSceneJob::tryLoadScene(Scene *scene, return sceneSubTree; } +void LoadSceneJobPrivate::postFrame(Qt3DCore::QAspectManager *manager) +{ + Q_Q(LoadSceneJob); + QSceneLoader *node = + qobject_cast<QSceneLoader *>(manager->lookupNode(q->sceneComponentId())); + if (!node) + return; + Qt3DRender::QSceneLoaderPrivate *dNode = + static_cast<decltype(dNode)>(Qt3DCore::QNodePrivate::get(node)); + + // If the sceneSubTree is null it will trigger the frontend to unload + // any subtree it may hold + // Set clone of sceneTree in sceneComponent. This will move the sceneSubTree + // to the QCoreApplication thread which is where the frontend object tree lives. + dNode->setSceneRoot(m_sceneSubtree); + + // Note: the status is set after the subtree so that bindinds depending on the status + // in the frontend will be consistent + dNode->setStatus(m_status); +} + } // namespace Render } // namespace Qt3DRender diff --git a/src/render/jobs/loadscenejob_p.h b/src/render/jobs/loadscenejob_p.h index 0c77dc6e8..3675d94c1 100644 --- a/src/render/jobs/loadscenejob_p.h +++ b/src/render/jobs/loadscenejob_p.h @@ -52,6 +52,7 @@ // #include <Qt3DCore/qaspectjob.h> +#include <Qt3DCore/private/qaspectjob_p.h> #include <Qt3DCore/qnodeid.h> #include <Qt3DRender/qsceneloader.h> #include <QSharedPointer> @@ -69,6 +70,24 @@ namespace Render { class Scene; class NodeManagers; +class LoadSceneJob; + +class Q_AUTOTEST_EXPORT LoadSceneJobPrivate : public Qt3DCore::QAspectJobPrivate +{ +public: + explicit LoadSceneJobPrivate(LoadSceneJob *q): q_ptr(q) {} + ~LoadSceneJobPrivate() override {} + + void postFrame(Qt3DCore::QAspectManager *manager) override; + + Qt3DCore::QEntity *m_sceneSubtree = nullptr; + QSceneLoader::Status m_status = QSceneLoader::None; + + Q_DECLARE_PUBLIC(LoadSceneJob) +private: + LoadSceneJob *q_ptr; +}; + class Q_AUTOTEST_EXPORT LoadSceneJob : public Qt3DCore::QAspectJob { public: @@ -91,10 +110,10 @@ private: NodeManagers *m_managers; QList<QSceneImporter *> m_sceneImporters; - Qt3DCore::QEntity *tryLoadScene(Scene *scene, - QSceneLoader::Status &finalStatus, + Qt3DCore::QEntity *tryLoadScene(QSceneLoader::Status &finalStatus, const QStringList &extensions, const std::function<void (QSceneImporter *)> &importerSetupFunc); + Q_DECLARE_PRIVATE(LoadSceneJob) }; typedef QSharedPointer<LoadSceneJob> LoadSceneJobPtr; diff --git a/tests/auto/render/loadscenejob/tst_loadscenejob.cpp b/tests/auto/render/loadscenejob/tst_loadscenejob.cpp index 66c9271f7..044c3e0f4 100644 --- a/tests/auto/render/loadscenejob/tst_loadscenejob.cpp +++ b/tests/auto/render/loadscenejob/tst_loadscenejob.cpp @@ -148,27 +148,9 @@ private Q_SLOTS: 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); + Qt3DRender::Render::LoadSceneJobPrivate *dJob = static_cast<decltype(dJob)>(Qt3DCore::QAspectJobPrivate::get(&loadSceneJob)); + QCOMPARE(dJob->m_status, Qt3DRender::QSceneLoader::Ready); + QVERIFY(dJob->m_sceneSubtree != nullptr); } void checkEmptySource() @@ -192,21 +174,9 @@ private Q_SLOTS: 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); + Qt3DRender::Render::LoadSceneJobPrivate *dJob = static_cast<decltype(dJob)>(Qt3DCore::QAspectJobPrivate::get(&loadSceneJob)); + QCOMPARE(dJob->m_status, Qt3DRender::QSceneLoader::None); + QVERIFY(dJob->m_sceneSubtree == nullptr); } void checkRunValidSourceUnsupportedFormat() @@ -233,21 +203,9 @@ private Q_SLOTS: 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); + Qt3DRender::Render::LoadSceneJobPrivate *dJob = static_cast<decltype(dJob)>(Qt3DCore::QAspectJobPrivate::get(&loadSceneJob)); + QCOMPARE(dJob->m_status, Qt3DRender::QSceneLoader::Error); + QVERIFY(dJob->m_sceneSubtree == nullptr); } void checkRunErrorAtLoading() @@ -271,22 +229,10 @@ private Q_SLOTS: 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); - delete change->value().value<Qt3DCore::QEntity *>(); - - 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); + // THEN + Qt3DRender::Render::LoadSceneJobPrivate *dJob = static_cast<decltype(dJob)>(Qt3DCore::QAspectJobPrivate::get(&loadSceneJob)); + QCOMPARE(dJob->m_status, Qt3DRender::QSceneLoader::Error); + QVERIFY(dJob->m_sceneSubtree == nullptr); } }; diff --git a/tests/auto/render/qsceneloader/tst_qsceneloader.cpp b/tests/auto/render/qsceneloader/tst_qsceneloader.cpp index 381960c42..9336a0b2e 100644 --- a/tests/auto/render/qsceneloader/tst_qsceneloader.cpp +++ b/tests/auto/render/qsceneloader/tst_qsceneloader.cpp @@ -137,59 +137,6 @@ private Q_SLOTS: arbiter.dirtyNodes.clear(); } - // DEPRECATED -// void checkStatusPropertyUpdate() -// { -// // GIVEN -// qRegisterMetaType<Qt3DRender::QSceneLoader::Status>("Status"); -// TestArbiter arbiter; -// QScopedPointer<Qt3DRender::QSceneLoader> sceneLoader(new Qt3DRender::QSceneLoader()); -// arbiter.setArbiterOnNode(sceneLoader.data()); -// QSignalSpy spy(sceneLoader.data(), SIGNAL(statusChanged(Status))); - - -// // WHEN -// const Qt3DRender::QSceneLoader::Status newStatus = Qt3DRender::QSceneLoader::Ready; -// sceneLoader->setStatus(newStatus); - -// // THEN -// QVERIFY(arbiter.events.empty()); -// QCOMPARE(spy.count(), 1); - -// spy.clear(); -// } - - void checkPropertyChanges() - { - // GIVEN - Qt3DCore::QScene scene; - Qt3DCore::QEntity rootEntity; - QScopedPointer<Qt3DRender::QSceneLoader> sceneLoader(new Qt3DRender::QSceneLoader()); - Qt3DCore::QNodePrivate::get(&rootEntity)->setScene(&scene); - Qt3DCore::QNodePrivate::get(sceneLoader.data())->setScene(&scene); - rootEntity.addComponent(sceneLoader.data()); - - // WHEN - Qt3DCore::QEntity backendCreatedSubtree; - Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - valueChange->setPropertyName("scene"); - valueChange->setValue(QVariant::fromValue(&backendCreatedSubtree)); - sceneLoader->sceneChangeEvent(valueChange); - - // THEN - QCOMPARE(static_cast<Qt3DRender::QSceneLoaderPrivate *>(Qt3DCore::QNodePrivate::get(sceneLoader.data()))->m_subTreeRoot, &backendCreatedSubtree); - - // WHEN - const Qt3DRender::QSceneLoader::Status newStatus = Qt3DRender::QSceneLoader::Ready; - valueChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - valueChange->setPropertyName("status"); - valueChange->setValue(QVariant::fromValue(newStatus)); - sceneLoader->sceneChangeEvent(valueChange); - - // THEN - QCOMPARE(sceneLoader->status(), newStatus); - } - void checkEntities() { // GIVEN diff --git a/tests/auto/render/sceneloader/tst_sceneloader.cpp b/tests/auto/render/sceneloader/tst_sceneloader.cpp index e5ea8b6c1..d146abfcc 100644 --- a/tests/auto/render/sceneloader/tst_sceneloader.cpp +++ b/tests/auto/render/sceneloader/tst_sceneloader.cpp @@ -130,51 +130,6 @@ private Q_SLOTS: QCOMPARE(sceneLoader.isEnabled(), false); } - void checkSubtreeTransmission() - { - // GIVEN - TestRenderer renderer; - TestArbiter arbiter; - Qt3DRender::Render::Scene sceneLoader; - - Qt3DCore::QBackendNodePrivate::get(&sceneLoader)->setArbiter(&arbiter); - sceneLoader.setRenderer(&renderer); - - // WHEN - Qt3DCore::QEntity subtree; - sceneLoader.setSceneSubtree(&subtree); - - // THEN - Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(arbiter.events.count(), 1); - QCOMPARE(change->propertyName(), "scene"); - QCOMPARE(change->value().value<Qt3DCore::QEntity *>(), &subtree); - - arbiter.events.clear(); - } - - void checkStatusTransmission() - { - // GIVEN - TestRenderer renderer; - TestArbiter arbiter; - Qt3DRender::Render::Scene sceneLoader; - - Qt3DCore::QBackendNodePrivate::get(&sceneLoader)->setArbiter(&arbiter); - sceneLoader.setRenderer(&renderer); - - // WHEN - sceneLoader.setStatus(Qt3DRender::QSceneLoader::Ready); - - // THEN - Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(arbiter.events.count(), 1); - QCOMPARE(change->propertyName(), "status"); - QCOMPARE(change->value().value<Qt3DRender::QSceneLoader::Status>(), Qt3DRender::QSceneLoader::Ready); - - arbiter.events.clear(); - } - void checkProcessEmptyPath() { // GIVEN |