summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-08-25 14:57:09 +0100
committerSean Harmer <sean.harmer@kdab.com>2016-08-25 14:57:09 +0100
commitb8372b52809378f860dfb0a9a9a97b30b5ad1a08 (patch)
tree271b70645f97f7fbb97c04c2d8337b781d042bcd /src/render
parent7a3db1facaac54053af5c8956ec04fcd8762a311 (diff)
parent150af04197682ccdbab509a95758fcdf957f63b2 (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.cpp1
-rw-r--r--src/render/io/qsceneloader.cpp9
-rw-r--r--src/render/io/qsceneloader_p.h3
-rw-r--r--src/render/io/scene.cpp10
-rw-r--r--src/render/io/scene_p.h2
-rw-r--r--src/render/io/scenemanager.cpp7
-rw-r--r--src/render/jobs/loadscenejob.cpp23
-rw-r--r--src/render/jobs/loadtexturedatajob.cpp3
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