diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2018-01-19 11:53:41 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-01-22 06:09:00 +0000 |
commit | 32a511a667bab93d4fca2e71b38d89f8d76aa07c (patch) | |
tree | 3e16b4320b7241cb1c44a84365eacb93d9ee0851 /src/render/geometry | |
parent | bf6d107b90b8a5e9f24da0c0f551c66952dbf57b (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.cpp | 34 | ||||
-rw-r--r-- | src/render/geometry/qmesh.cpp | 22 | ||||
-rw-r--r-- | src/render/geometry/qmesh_p.h | 3 |
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; }; |