diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2018-01-25 10:10:22 +0100 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2018-02-01 22:22:45 +0000 |
commit | 30abe028f9a95fa32fbb77cb60063d062e13f7ff (patch) | |
tree | ced6cd5cae144c9784900f8d0636154a872367ed /src | |
parent | 959db7d038544803fe4cf2601523ea3af224652e (diff) |
LoadSceneJob: refactored to minimize code duplication
Also improve error output
Change-Id: Ibf4a4340c83dadd507f4f356682cc861930fe2fd
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/render/jobs/loadscenejob.cpp | 103 | ||||
-rw-r--r-- | src/render/jobs/loadscenejob_p.h | 8 | ||||
-rw-r--r-- | src/render/renderlogging.cpp | 1 | ||||
-rw-r--r-- | src/render/renderlogging_p.h | 1 |
4 files changed, 72 insertions, 41 deletions
diff --git a/src/render/jobs/loadscenejob.cpp b/src/render/jobs/loadscenejob.cpp index 5be733a4d..f767fe720 100644 --- a/src/render/jobs/loadscenejob.cpp +++ b/src/render/jobs/loadscenejob.cpp @@ -46,7 +46,7 @@ #include <Qt3DRender/private/qsceneimporter_p.h> #include <Qt3DRender/private/qurlhelper_p.h> #include <Qt3DRender/qsceneloader.h> - +#include <Qt3DRender/private/renderlogging_p.h> #include <QFileInfo> #include <QMimeDatabase> @@ -93,7 +93,6 @@ 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); @@ -107,52 +106,37 @@ void LoadSceneJob::run() if (m_data.isEmpty()) { const QString path = QUrlHelper::urlToLocalFileOrQrc(m_source); - QFileInfo finfo(path); + const QFileInfo finfo(path); + qCDebug(SceneLoaders) << Q_FUNC_INFO << "Attempting to load" << finfo.filePath(); if (finfo.exists()) { - QStringList extensions(finfo.suffix()); - - for (QSceneImporter *sceneImporter : qAsConst(m_sceneImporters)) { - if (!sceneImporter->areFileTypesSupported(extensions)) - continue; - - // If the file type is supported -> enter Loading status - scene->setStatus(QSceneLoader::Loading); - - // File type is supported, try to load it - sceneImporter->setSource(m_source); - sceneSubTree = sceneImporter->scene(); - if (sceneSubTree != nullptr) { - // Successfully built a subtree - finalStatus = QSceneLoader::Ready; - break; - } - } + const QStringList extensions(finfo.suffix()); + sceneSubTree = tryLoadScene(scene, + finalStatus, + extensions, + [this] (QSceneImporter *importer) { + importer->setSource(m_source); + }); + } else { + qCWarning(SceneLoaders) << Q_FUNC_INFO << finfo.filePath() << "doesn't exist"; } } else { QStringList extensions; QMimeDatabase db; - QMimeType mtype = db.mimeTypeForData(m_data); - if (mtype.isValid()) { + const QMimeType mtype = db.mimeTypeForData(m_data); + + if (mtype.isValid()) extensions = mtype.suffixes(); - } + else + qCWarning(SceneLoaders) << Q_FUNC_INFO << "Invalid mime type" << mtype; - QString basePath = m_source.adjusted(QUrl::RemoveFilename).toString(); - for (QSceneImporter *sceneImporter : qAsConst(m_sceneImporters)) { - if (!sceneImporter->areFileTypesSupported(extensions)) - continue; - - // If the file type is supported -> enter Loading status - scene->setStatus(QSceneLoader::Loading); - - // File type is supported, try to load it - sceneImporter->setData(m_data, basePath); - sceneSubTree = sceneImporter->scene(); - if (sceneSubTree != nullptr) { - // Successfully built a subtree - finalStatus = QSceneLoader::Ready; - break; - } - } + const QString basePath = m_source.adjusted(QUrl::RemoveFilename).toString(); + + sceneSubTree = tryLoadScene(scene, + finalStatus, + extensions, + [this, basePath] (QSceneImporter *importer) { + importer->setData(m_data, basePath); + }); } } @@ -167,6 +151,43 @@ void LoadSceneJob::run() scene->setStatus(finalStatus); } +Qt3DCore::QEntity *LoadSceneJob::tryLoadScene(Scene *scene, + QSceneLoader::Status &finalStatus, + const QStringList &extensions, + const std::function<void (QSceneImporter *)> &importerSetupFunc) +{ + Qt3DCore::QEntity *sceneSubTree = nullptr; + bool foundSuitableLoggerPlugin = false; + + for (QSceneImporter *sceneImporter : qAsConst(m_sceneImporters)) { + if (!sceneImporter->areFileTypesSupported(extensions)) + continue; + + foundSuitableLoggerPlugin = true; + + // If the file type is supported -> enter Loading status + scene->setStatus(QSceneLoader::Loading); + + // Set source file or data on importer + importerSetupFunc(sceneImporter); + + // File type is supported, try to load it + sceneSubTree = sceneImporter->scene(); + if (sceneSubTree != nullptr) { + // Successfully built a subtree + finalStatus = QSceneLoader::Ready; + break; + } + + qCWarning(SceneLoaders) << Q_FUNC_INFO << "Failed to import" << m_source << "with errors" << sceneImporter->errors(); + } + + if (!foundSuitableLoggerPlugin) + qCWarning(SceneLoaders) << Q_FUNC_INFO << "Found not suitable importer plugin for" << m_source; + + return sceneSubTree; +} + } // namespace Render } // namespace Qt3DRender diff --git a/src/render/jobs/loadscenejob_p.h b/src/render/jobs/loadscenejob_p.h index 5217c6f43..e3e947700 100644 --- a/src/render/jobs/loadscenejob_p.h +++ b/src/render/jobs/loadscenejob_p.h @@ -53,8 +53,10 @@ #include <Qt3DCore/qaspectjob.h> #include <Qt3DCore/qnodeid.h> +#include <Qt3DRender/qsceneloader.h> #include <QSharedPointer> #include <QUrl> +#include <functional> QT_BEGIN_NAMESPACE @@ -64,6 +66,7 @@ class QSceneImporter; namespace Render { +class Scene; class NodeManagers; class Q_AUTOTEST_EXPORT LoadSceneJob : public Qt3DCore::QAspectJob @@ -87,6 +90,11 @@ private: Qt3DCore::QNodeId m_sceneComponent; NodeManagers *m_managers; QList<QSceneImporter *> m_sceneImporters; + + Qt3DCore::QEntity *tryLoadScene(Scene *scene, + QSceneLoader::Status &finalStatus, + const QStringList &extensions, + const std::function<void (QSceneImporter *)> &importerSetupFunc); }; typedef QSharedPointer<LoadSceneJob> LoadSceneJobPtr; diff --git a/src/render/renderlogging.cpp b/src/render/renderlogging.cpp index b9d423163..2eb1835e6 100644 --- a/src/render/renderlogging.cpp +++ b/src/render/renderlogging.cpp @@ -49,6 +49,7 @@ Q_LOGGING_CATEGORY(Backend, "Qt3D.Renderer.Backend", QtWarningMsg) Q_LOGGING_CATEGORY(Frontend, "Qt3D.Renderer.Frontend", QtWarningMsg) Q_LOGGING_CATEGORY(Io, "Qt3D.Renderer.IO", QtWarningMsg) Q_LOGGING_CATEGORY(Jobs, "Qt3D.Renderer.Jobs", QtWarningMsg) +Q_LOGGING_CATEGORY(SceneLoaders, "Qt3D.Renderer.SceneLoaders", QtWarningMsg) Q_LOGGING_CATEGORY(Framegraph, "Qt3D.Renderer.Framegraph", QtWarningMsg) Q_LOGGING_CATEGORY(RenderNodes, "Qt3D.Renderer.RenderNodes", QtWarningMsg) Q_LOGGING_CATEGORY(Rendering, "Qt3D.Renderer.Rendering", QtWarningMsg) diff --git a/src/render/renderlogging_p.h b/src/render/renderlogging_p.h index dfa761e46..00ae572f4 100644 --- a/src/render/renderlogging_p.h +++ b/src/render/renderlogging_p.h @@ -63,6 +63,7 @@ Q_DECLARE_LOGGING_CATEGORY(Backend) Q_DECLARE_LOGGING_CATEGORY(Frontend) Q_DECLARE_LOGGING_CATEGORY(Io) Q_DECLARE_LOGGING_CATEGORY(Jobs) +Q_DECLARE_LOGGING_CATEGORY(SceneLoaders) Q_DECLARE_LOGGING_CATEGORY(Framegraph) Q_DECLARE_LOGGING_CATEGORY(RenderNodes) Q_DECLARE_LOGGING_CATEGORY(Rendering) |