summaryrefslogtreecommitdiffstats
path: root/src/render/geometry
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2018-01-19 11:53:41 +0100
committerPaul Lemire <paul.lemire@kdab.com>2018-01-22 06:09:00 +0000
commit32a511a667bab93d4fca2e71b38d89f8d76aa07c (patch)
tree3e16b4320b7241cb1c44a84365eacb93d9ee0851 /src/render/geometry
parentbf6d107b90b8a5e9f24da0c0f551c66952dbf57b (diff)
Mesh loading: send status update
Change-Id: Id4b73655ee30c3c225ee804f1e9244cc2b16aebf Task-number: QTBUG-60927 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/geometry')
-rw-r--r--src/render/geometry/geometryrenderer.cpp34
-rw-r--r--src/render/geometry/qmesh.cpp22
-rw-r--r--src/render/geometry/qmesh_p.h3
3 files changed, 42 insertions, 17 deletions
diff --git a/src/render/geometry/geometryrenderer.cpp b/src/render/geometry/geometryrenderer.cpp
index 00b53fd8d..ea059c6ee 100644
--- a/src/render/geometry/geometryrenderer.cpp
+++ b/src/render/geometry/geometryrenderer.cpp
@@ -221,21 +221,29 @@ void GeometryRenderer::executeFunctor()
// If the geometry is null, then we were either unable to load it (Error)
// or the mesh is located at a remote url and needs to be downloaded first (Loading)
- if (!geometry)
- return;
-
- // Move the QGeometry object to the main thread and notify the
- // corresponding QGeometryRenderer
- const auto appThread = QCoreApplication::instance()->thread();
- geometry->moveToThread(appThread);
+ if (geometry != nullptr) {
+ // Move the QGeometry object to the main thread and notify the
+ // corresponding QGeometryRenderer
+ const auto appThread = QCoreApplication::instance()->thread();
+ geometry->moveToThread(appThread);
+
+ auto e = QGeometryChangePtr::create(peerId());
+ e->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
+ e->setPropertyName("geometry");
+ e->data = std::move(geometry);
+ notifyObservers(e);
+ }
- auto e = QGeometryChangePtr::create(peerId());
- e->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
- e->setPropertyName("geometry");
- e->data = std::move(geometry);
- notifyObservers(e);
+ // Send Status
+ if (isQMeshFunctor) {
+ QSharedPointer<MeshLoaderFunctor> meshLoader = qSharedPointerCast<MeshLoaderFunctor>(m_geometryFactory);
- // TODO: Maybe we could also send a status to help troubleshoot errors
+ auto e = QPropertyUpdatedChangePtr::create(peerId());
+ e->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
+ e->setPropertyName("status");
+ e->setValue(meshLoader->status());
+ notifyObservers(e);
+ }
}
void GeometryRenderer::unsetDirty()
diff --git a/src/render/geometry/qmesh.cpp b/src/render/geometry/qmesh.cpp
index 362706204..66c4a69bc 100644
--- a/src/render/geometry/qmesh.cpp
+++ b/src/render/geometry/qmesh.cpp
@@ -296,6 +296,7 @@ MeshLoaderFunctor::MeshLoaderFunctor(QMesh *mesh, const QByteArray &sourceData)
, m_sourceData(sourceData)
, m_nodeManagers(nullptr)
, m_downloaderService(nullptr)
+ , m_status(QMesh::None)
{
}
@@ -304,8 +305,11 @@ MeshLoaderFunctor::MeshLoaderFunctor(QMesh *mesh, const QByteArray &sourceData)
*/
QGeometry *MeshLoaderFunctor::operator()()
{
+ m_status = QMesh::Loading;
+
if (m_sourcePath.isEmpty()) {
qCWarning(Render::Jobs) << Q_FUNC_INFO << "Mesh is empty, nothing to load";
+ m_status = QMesh::Error;
return nullptr;
}
@@ -317,6 +321,7 @@ QGeometry *MeshLoaderFunctor::operator()()
// in the frontend
if (m_nodeManagers == nullptr || m_downloaderService == nullptr) {
qWarning() << "Mesh source points to a remote URL. Remotes meshes can only be loaded if the geometry is processed by the Qt3DRender backend";
+ m_status = QMesh::Error;
return nullptr;
}
Qt3DCore::QDownloadRequestPtr request(new MeshDownloadRequest(m_mesh, m_sourcePath, m_nodeManagers));
@@ -352,6 +357,7 @@ QGeometry *MeshLoaderFunctor::operator()()
}
if (!loader) {
qCWarning(Render::Jobs, "unsupported format encountered (%s)", qPrintable(ext.join(QLatin1String(", "))));
+ m_status = QMesh::Error;
return nullptr;
}
@@ -360,20 +366,28 @@ QGeometry *MeshLoaderFunctor::operator()()
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
qCDebug(Render::Jobs) << "Could not open file" << filePath << "for reading";
+ m_status = QMesh::Error;
return nullptr;
}
- if (loader->load(&file, m_meshName))
- return loader->geometry();
+ if (loader->load(&file, m_meshName)) {
+ Qt3DRender::QGeometry *geometry = loader->geometry();
+ m_status = geometry != nullptr ? QMesh::Ready : QMesh::Error;
+ return geometry;
+ }
qCWarning(Render::Jobs) << Q_FUNC_INFO << "Mesh loading failure for:" << filePath;
} else {
QT_PREPEND_NAMESPACE(QBuffer) buffer(&m_sourceData);
if (!buffer.open(QIODevice::ReadOnly)) {
+ m_status = QMesh::Error;
return nullptr;
}
- if (loader->load(&buffer, m_meshName))
- return loader->geometry();
+ if (loader->load(&buffer, m_meshName)) {
+ Qt3DRender::QGeometry *geometry = loader->geometry();
+ m_status = geometry != nullptr ? QMesh::Ready : QMesh::Error;
+ return geometry;
+ }
qCWarning(Render::Jobs) << Q_FUNC_INFO << "Mesh loading failure for:" << m_sourcePath;
}
diff --git a/src/render/geometry/qmesh_p.h b/src/render/geometry/qmesh_p.h
index dfbd9016d..2d03e7862 100644
--- a/src/render/geometry/qmesh_p.h
+++ b/src/render/geometry/qmesh_p.h
@@ -116,6 +116,8 @@ public :
Qt3DCore::QNodeId mesh() const { return m_mesh; }
QString meshName() const { return m_meshName; }
+ QMesh::Status status() const { return m_status; }
+
QGeometry *operator()() override;
bool operator ==(const QGeometryFactory &other) const override;
QT3D_FUNCTOR(MeshLoaderFunctor)
@@ -127,6 +129,7 @@ private:
QByteArray m_sourceData;
Render::NodeManagers *m_nodeManagers;
Qt3DCore::QDownloadHelperService *m_downloaderService;
+ QMesh::Status m_status;
};