summaryrefslogtreecommitdiffstats
path: root/src/render/jobs/loadscenejob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/jobs/loadscenejob.cpp')
-rw-r--r--src/render/jobs/loadscenejob.cpp103
1 files changed, 62 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