diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-08-25 14:57:09 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-08-25 14:57:09 +0100 |
commit | b8372b52809378f860dfb0a9a9a97b30b5ad1a08 (patch) | |
tree | 271b70645f97f7fbb97c04c2d8337b781d042bcd /src/render | |
parent | 7a3db1facaac54053af5c8956ec04fcd8762a311 (diff) | |
parent | 150af04197682ccdbab509a95758fcdf957f63b2 (diff) |
Merge branch '5.7' into 5.8
Conflicts:
tests/auto/input/input.pro
Change-Id: Ic89c7d9093c95bc1c5ca50f04ed34c00b5f261f4
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 1 | ||||
-rw-r--r-- | src/render/io/qsceneloader.cpp | 9 | ||||
-rw-r--r-- | src/render/io/qsceneloader_p.h | 3 | ||||
-rw-r--r-- | src/render/io/scene.cpp | 10 | ||||
-rw-r--r-- | src/render/io/scene_p.h | 2 | ||||
-rw-r--r-- | src/render/io/scenemanager.cpp | 7 | ||||
-rw-r--r-- | src/render/jobs/loadscenejob.cpp | 23 | ||||
-rw-r--r-- | src/render/jobs/loadtexturedatajob.cpp | 3 |
8 files changed, 43 insertions, 15 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 5a8195b64..f6d26fb22 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -174,6 +174,7 @@ void QRenderAspectPrivate::registerBackendTypes() qRegisterMetaType<Qt3DRender::QBuffer*>(); qRegisterMetaType<Qt3DRender::QEffect*>(); + qRegisterMetaType<Qt3DRender::QFrameGraphNode *>(); q->registerBackendType<Qt3DCore::QEntity>(QSharedPointer<Render::RenderEntityFunctor>::create(m_renderer, m_nodeManagers)); q->registerBackendType<Qt3DCore::QTransform>(QSharedPointer<Render::NodeFunctor<Render::Transform, Render::TransformManager> >::create(m_renderer, m_nodeManagers->transformManager())); diff --git a/src/render/io/qsceneloader.cpp b/src/render/io/qsceneloader.cpp index 2d0c3311c..69bd8528b 100644 --- a/src/render/io/qsceneloader.cpp +++ b/src/render/io/qsceneloader.cpp @@ -53,7 +53,7 @@ namespace Qt3DRender { QSceneLoaderPrivate::QSceneLoaderPrivate() : QComponentPrivate() - , m_status(QSceneLoader::Loading) + , m_status(QSceneLoader::None) , m_subTreeRoot(nullptr) { m_shareable = false; @@ -178,9 +178,8 @@ void QSceneLoader::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) subTreeRoot->setParent(parentEntity); d->m_subTreeRoot = subTreeRoot; } - - // Update status property - setStatus(subTreeRoot ? QSceneLoader::Ready : QSceneLoader::Error); + } else if (e->propertyName() == QByteArrayLiteral("status")) { + setStatus(e->value().value<QSceneLoader::Status>()); } } } @@ -230,7 +229,9 @@ void QSceneLoader::setStatus(QSceneLoader::Status status) Q_D(QSceneLoader); if (d->m_status != status) { d->m_status = status; + const bool wasBlocked = blockNotifications(true); emit statusChanged(status); + blockNotifications(wasBlocked); } } diff --git a/src/render/io/qsceneloader_p.h b/src/render/io/qsceneloader_p.h index 740e9dce8..b002957b2 100644 --- a/src/render/io/qsceneloader_p.h +++ b/src/render/io/qsceneloader_p.h @@ -53,6 +53,7 @@ #include <private/qcomponent_p.h> #include <Qt3DRender/qsceneloader.h> +#include <Qt3DRender/private/qt3drender_global_p.h> QT_BEGIN_NAMESPACE @@ -60,7 +61,7 @@ namespace Qt3DRender { class QSceneIOHandler; -class QSceneLoaderPrivate : public Qt3DCore::QComponentPrivate +class QT3DRENDERSHARED_PRIVATE_EXPORT QSceneLoaderPrivate : public Qt3DCore::QComponentPrivate { public: QSceneLoaderPrivate(); diff --git a/src/render/io/scene.cpp b/src/render/io/scene.cpp index bfb5e4571..cf1ca4736 100644 --- a/src/render/io/scene.cpp +++ b/src/render/io/scene.cpp @@ -65,6 +65,16 @@ 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::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) { const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QSceneLoaderData>>(change); diff --git a/src/render/io/scene_p.h b/src/render/io/scene_p.h index fc3494489..42e3121c9 100644 --- a/src/render/io/scene_p.h +++ b/src/render/io/scene_p.h @@ -52,6 +52,7 @@ // #include <Qt3DRender/private/backendnode_p.h> +#include <Qt3DRender/qsceneloader.h> #include <QtGlobal> #include <QUrl> @@ -77,6 +78,7 @@ public: void setSceneManager(SceneManager *manager); void cleanup(); + void setStatus(QSceneLoader::Status status); private: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; diff --git a/src/render/io/scenemanager.cpp b/src/render/io/scenemanager.cpp index b46616689..d59391a87 100644 --- a/src/render/io/scenemanager.cpp +++ b/src/render/io/scenemanager.cpp @@ -61,14 +61,13 @@ void SceneManager::addSceneData(const QUrl &source, Qt3DCore::QNodeId sceneUuid) if (!m_pendingJobs.isEmpty()) newJob->addDependency(m_pendingJobs.last()); - m_pendingJobs.append(newJob); + m_pendingJobs.push_back(newJob); } QVector<LoadSceneJobPtr> SceneManager::pendingSceneLoaderJobs() { - QVector<LoadSceneJobPtr> copy = m_pendingJobs; - m_pendingJobs.clear(); - return copy; + // Explicitly use std::move to clear the m_pendingJobs vector + return std::move(m_pendingJobs); } } // namespace Render diff --git a/src/render/jobs/loadscenejob.cpp b/src/render/jobs/loadscenejob.cpp index 758e0b135..3111e1ba3 100644 --- a/src/render/jobs/loadscenejob.cpp +++ b/src/render/jobs/loadscenejob.cpp @@ -44,6 +44,7 @@ #include <Qt3DCore/qentity.h> #include <Qt3DRender/private/job_common_p.h> #include <Qt3DRender/private/qsceneiohandler_p.h> +#include <Qt3DRender/qsceneloader.h> QT_BEGIN_NAMESPACE @@ -64,29 +65,41 @@ void LoadSceneJob::run() // Iterate scene IO handlers until we find one that can handle this file type Qt3DCore::QEntity *sceneSubTree = nullptr; + Scene *scene = m_managers->sceneManager()->lookupResource(m_sceneComponent); + Q_ASSERT(scene); + + // Reset status + scene->setStatus(QSceneLoader::None); + // Perform the loading only if the source wasn't explicitly set to empty if (!m_source.isEmpty()) { for (QSceneIOHandler *sceneIOHandler : qAsConst(m_sceneIOHandlers)) { if (!sceneIOHandler->isFileTypeSupported(m_source)) continue; + // If the file type is supported -> enter Loading status + scene->setStatus(QSceneLoader::Loading); + // File type is supported, try to load it sceneIOHandler->setSource(m_source); Qt3DCore::QEntity *sub = sceneIOHandler->scene(); if (sub) { sceneSubTree = sub; + // Successfully built a subtree + scene->setStatus(QSceneLoader::Ready); break; + } else { + // Tree wasn't build so something went wrong obviously + scene->setStatus(QSceneLoader::Error); } } } - // Set clone of sceneTree in sceneComponent. This will move the sceneSubTree - // to the QCoreApplication thread which is where the frontend object tree lives. - Scene *scene = m_managers->sceneManager()->lookupResource(m_sceneComponent); // If the sceneSubTree is null it will trigger the frontend to unload // any subtree it may hold - if (scene) - scene->setSceneSubtree(sceneSubTree); + // 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); } } // namespace Render diff --git a/src/render/jobs/loadtexturedatajob.cpp b/src/render/jobs/loadtexturedatajob.cpp index e68717062..b8663e4a7 100644 --- a/src/render/jobs/loadtexturedatajob.cpp +++ b/src/render/jobs/loadtexturedatajob.cpp @@ -204,7 +204,8 @@ void LoadTextureDataJob::run() // Set the textureDataHandle on the texture image // Note: this internally updates the DNA of the TextureImage texImg->setTextureDataHandle(textureDataHandle); - texImg->updateDNA(::qHash(QTextureImageDataPrivate::get(data)->m_data)); + if (data) + texImg->updateDNA(::qHash(QTextureImageDataPrivate::get(data)->m_data)); } } // Tell the renderer to reload/upload to GPU the TextureImage for the Texture |