diff options
author | Mike Krus <mike.krus@kdab.com> | 2017-04-11 11:26:32 +0100 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2017-05-21 11:40:05 +0000 |
commit | ab0f38728cda3a5c819de6172febb0908c101967 (patch) | |
tree | 8cdb78e6c03c473d1d4e851b09719c5af16ac927 /src/render/jobs/loadscenejob.cpp | |
parent | b3302278a1e6094b17d4c7bd353e7717ee050bb5 (diff) |
Add support for remote content in SceneLoader
Task-number: QTBUG-57614
Change-Id: I687a9620865f5849aaba2aadb5a9c3746afb0b53
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/jobs/loadscenejob.cpp')
-rw-r--r-- | src/render/jobs/loadscenejob.cpp | 68 |
1 files changed, 54 insertions, 14 deletions
diff --git a/src/render/jobs/loadscenejob.cpp b/src/render/jobs/loadscenejob.cpp index 9b3374627..3d6326e93 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/qsceneimporter_p.h> +#include <Qt3DRender/private/qurlhelper_p.h> #include <Qt3DRender/qsceneloader.h> QT_BEGIN_NAMESPACE @@ -60,6 +61,11 @@ LoadSceneJob::LoadSceneJob(const QUrl &source, Qt3DCore::QNodeId m_sceneComponen SET_JOB_RUN_STAT_TYPE(this, JobTypes::LoadScene, 0); } +void LoadSceneJob::setData(const QByteArray &data) +{ + m_data = data; +} + NodeManagers *LoadSceneJob::nodeManagers() const { return m_managers; @@ -95,20 +101,54 @@ void LoadSceneJob::run() // Perform the loading only if the source wasn't explicitly set to empty if (!m_source.isEmpty()) { finalStatus = QSceneLoader::Error; - for (QSceneImporter *sceneImporter : qAsConst(m_sceneImporters)) { - if (!sceneImporter->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 - sceneImporter->setSource(m_source); - sceneSubTree = sceneImporter->scene(); - if (sceneSubTree != nullptr) { - // Successfully built a subtree - finalStatus = QSceneLoader::Ready; - break; + + if (m_data.isEmpty()) { + const QString path = QUrlHelper::urlToLocalFileOrQrc(m_source); + QFileInfo finfo(path); + 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; + } + } + } + } else { + QStringList extensions; + QMimeDatabase db; + QMimeType mtype = db.mimeTypeForData(m_data); + if (mtype.isValid()) { + extensions = mtype.suffixes(); + } + + 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; + } } } } |