diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-09-18 12:12:18 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-25 11:39:45 +0200 |
commit | 26ae3af8b1bcadf608b24160601eb0d772bd20ce (patch) | |
tree | 16d687d1cdb50cd2746664456a4f47b31891f785 | |
parent | 56f50210f5eaf603cbb4def1b012a793cf6cc01d (diff) |
Update QSceneLoader to use direct sync
Change-Id: Iae97dca09ae84236caa4e5383f05a4ce7b7226ea
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 2 | ||||
-rw-r--r-- | src/render/io/scene.cpp | 42 | ||||
-rw-r--r-- | src/render/io/scene_p.h | 4 | ||||
-rw-r--r-- | tests/auto/render/sceneloader/tst_sceneloader.cpp | 36 |
4 files changed, 33 insertions, 51 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 3c244f0f5..256c88e3e 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -259,7 +259,7 @@ void QRenderAspectPrivate::registerBackendTypes() q->registerBackendType<QLayer, true>(QSharedPointer<Render::NodeFunctor<Render::Layer, Render::LayerManager> >::create(m_renderer)); q->registerBackendType<QLevelOfDetail, true>(QSharedPointer<Render::NodeFunctor<Render::LevelOfDetail, Render::LevelOfDetailManager> >::create(m_renderer)); q->registerBackendType<QLevelOfDetailSwitch, true>(QSharedPointer<Render::NodeFunctor<Render::LevelOfDetail, Render::LevelOfDetailManager> >::create(m_renderer)); - q->registerBackendType<QSceneLoader>(QSharedPointer<Render::RenderSceneFunctor>::create(m_renderer, m_nodeManagers->sceneManager())); + q->registerBackendType<QSceneLoader, true>(QSharedPointer<Render::RenderSceneFunctor>::create(m_renderer, m_nodeManagers->sceneManager())); q->registerBackendType<QRenderTarget>(QSharedPointer<Render::NodeFunctor<Render::RenderTarget, Render::RenderTargetManager> >::create(m_renderer)); q->registerBackendType<QRenderTargetOutput>(QSharedPointer<Render::NodeFunctor<Render::RenderTargetOutput, Render::AttachmentManager> >::create(m_renderer)); q->registerBackendType<QRenderSettings>(QSharedPointer<Render::RenderSettingsFunctor>::create(m_renderer)); diff --git a/src/render/io/scene.cpp b/src/render/io/scene.cpp index d95f42a48..e7f289f8a 100644 --- a/src/render/io/scene.cpp +++ b/src/render/io/scene.cpp @@ -76,36 +76,20 @@ void Scene::setStatus(QSceneLoader::Status status) notifyObservers(e); } -void Scene::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void Scene::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QSceneLoaderData>>(change); - const auto &data = typedChange->data; - m_source = data.source; - Q_ASSERT(m_sceneManager); - if (Qt3DCore::QDownloadHelperService::isLocal(m_source)) - m_sceneManager->addSceneData(m_source, peerId()); - else - m_sceneManager->startSceneDownload(m_source, peerId()); -} - -void Scene::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - if (e->type() == PropertyUpdated) { - QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (propertyChange->propertyName() == QByteArrayLiteral("source")) { - m_source = propertyChange->value().toUrl(); - - // If the source is empty -> we need to unload anything that was - // previously loaded and reset the status accordingly. This means - // we need to call addSceneData with the empty source to send a - // change to the frontend that will trigger the removal of the - // previous scene. The reason this scheme is employed is because - // the backend also takes care of updating the status. - if (m_source.isEmpty() || Qt3DCore::QDownloadHelperService::isLocal(m_source)) - m_sceneManager->addSceneData(m_source, peerId()); - else - m_sceneManager->startSceneDownload(m_source, peerId()); - } + const QSceneLoader *node = qobject_cast<const QSceneLoader *>(frontEnd); + if (!node) + return; + + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + + if (node->source() != m_source) { + m_source = node->source(); + if (m_source.isEmpty() || Qt3DCore::QDownloadHelperService::isLocal(m_source)) + m_sceneManager->addSceneData(m_source, peerId()); + else + m_sceneManager->startSceneDownload(m_source, peerId()); } markDirty(AbstractRenderer::AllDirty); } diff --git a/src/render/io/scene_p.h b/src/render/io/scene_p.h index 631f23124..04b9bba1a 100644 --- a/src/render/io/scene_p.h +++ b/src/render/io/scene_p.h @@ -72,7 +72,7 @@ class Q_AUTOTEST_EXPORT Scene : public BackendNode public: Scene(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; QUrl source() const; void setSceneSubtree(Qt3DCore::QEntity *subTree); void setSceneManager(SceneManager *manager); @@ -81,8 +81,6 @@ public: void setStatus(QSceneLoader::Status status); private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - SceneManager *m_sceneManager; QUrl m_source; }; diff --git a/tests/auto/render/sceneloader/tst_sceneloader.cpp b/tests/auto/render/sceneloader/tst_sceneloader.cpp index 8da82b609..e5ea8b6c1 100644 --- a/tests/auto/render/sceneloader/tst_sceneloader.cpp +++ b/tests/auto/render/sceneloader/tst_sceneloader.cpp @@ -46,6 +46,7 @@ private Q_SLOTS: void checkInitialAndCleanedUpState() { // GIVEN + TestRenderer renderer; Qt3DRender::Render::Scene sceneLoader; Qt3DRender::Render::SceneManager sceneManager; @@ -61,8 +62,9 @@ private Q_SLOTS: frontendSceneLoader.setSource(newUrl); // WHEN + sceneLoader.setRenderer(&renderer); sceneLoader.setSceneManager(&sceneManager); - simulateInitialization(&frontendSceneLoader, &sceneLoader); + simulateInitializationSync(&frontendSceneLoader, &sceneLoader); // THEN QVERIFY(!sceneLoader.peerId().isNull()); @@ -78,6 +80,7 @@ private Q_SLOTS: void checkPeerPropertyMirroring() { // GIVEN + TestRenderer renderer; Qt3DRender::QSceneLoader frontendSceneLoader; frontendSceneLoader.setSource(QUrl(QStringLiteral("file:///CorvetteMuseum"))); @@ -85,8 +88,9 @@ private Q_SLOTS: Qt3DRender::Render::SceneManager sceneManager; // WHEN + sceneLoader.setRenderer(&renderer); sceneLoader.setSceneManager(&sceneManager); - simulateInitialization(&frontendSceneLoader, &sceneLoader); + simulateInitializationSync(&frontendSceneLoader, &sceneLoader); // THEN QCOMPARE(sceneLoader.peerId(), frontendSceneLoader.id()); @@ -100,29 +104,27 @@ private Q_SLOTS: TestRenderer renderer; Qt3DRender::Render::Scene sceneLoader; Qt3DRender::Render::SceneManager sceneManager; + Qt3DRender::QSceneLoader frontendSceneLoader; sceneLoader.setRenderer(&renderer); sceneLoader.setSceneManager(&sceneManager); + simulateInitializationSync(&frontendSceneLoader, &sceneLoader); // THEN QVERIFY(sceneManager.takePendingSceneLoaderJobs().isEmpty()); // WHEN - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); const QUrl newUrl(QStringLiteral("file:///Bownling_Green_KY")); - updateChange->setValue(newUrl); - updateChange->setPropertyName("source"); - sceneLoader.sceneChangeEvent(updateChange); + frontendSceneLoader.setSource(newUrl); + sceneLoader.syncFromFrontEnd(&frontendSceneLoader, false); // THEN QCOMPARE(sceneLoader.source(), newUrl); QVERIFY(!sceneManager.takePendingSceneLoaderJobs().isEmpty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(false); - updateChange->setPropertyName("enabled"); - sceneLoader.sceneChangeEvent(updateChange); + frontendSceneLoader.setEnabled(false); + sceneLoader.syncFromFrontEnd(&frontendSceneLoader, false); // THEN QCOMPARE(sceneLoader.isEnabled(), false); @@ -179,29 +181,27 @@ private Q_SLOTS: TestRenderer renderer; Qt3DRender::Render::Scene sceneLoader; Qt3DRender::Render::SceneManager sceneManager; + Qt3DRender::QSceneLoader frontendSceneLoader; sceneLoader.setRenderer(&renderer); sceneLoader.setSceneManager(&sceneManager); + simulateInitializationSync(&frontendSceneLoader, &sceneLoader); // THEN QVERIFY(sceneManager.takePendingSceneLoaderJobs().isEmpty()); // WHEN - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); const QUrl newUrl(QStringLiteral("file:///Bownling_Green_KY")); - updateChange->setValue(newUrl); - updateChange->setPropertyName("source"); - sceneLoader.sceneChangeEvent(updateChange); + frontendSceneLoader.setSource(newUrl); + sceneLoader.syncFromFrontEnd(&frontendSceneLoader, false); // THEN QCOMPARE(sceneLoader.source(), newUrl); QVERIFY(!sceneManager.takePendingSceneLoaderJobs().isEmpty()); // WHEN - updateChange.reset(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setValue(QUrl()); - updateChange->setPropertyName("source"); - sceneLoader.sceneChangeEvent(updateChange); + frontendSceneLoader.setSource(QUrl()); + sceneLoader.syncFromFrontEnd(&frontendSceneLoader, false); // THEN -> we should still have generated a job to reset the scene (immediately) QCOMPARE(sceneLoader.source(), QUrl()); |