summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-09-18 12:12:18 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-09-25 11:39:45 +0200
commit26ae3af8b1bcadf608b24160601eb0d772bd20ce (patch)
tree16d687d1cdb50cd2746664456a4f47b31891f785
parent56f50210f5eaf603cbb4def1b012a793cf6cc01d (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.cpp2
-rw-r--r--src/render/io/scene.cpp42
-rw-r--r--src/render/io/scene_p.h4
-rw-r--r--tests/auto/render/sceneloader/tst_sceneloader.cpp36
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());