diff options
Diffstat (limited to 'src/render/jobs')
-rw-r--r-- | src/render/jobs/filtercompatibletechniquejob.cpp | 13 | ||||
-rw-r--r-- | src/render/jobs/loadscenejob.cpp | 103 | ||||
-rw-r--r-- | src/render/jobs/loadscenejob_p.h | 8 |
3 files changed, 76 insertions, 48 deletions
diff --git a/src/render/jobs/filtercompatibletechniquejob.cpp b/src/render/jobs/filtercompatibletechniquejob.cpp index 362e4088f..080ccd306 100644 --- a/src/render/jobs/filtercompatibletechniquejob.cpp +++ b/src/render/jobs/filtercompatibletechniquejob.cpp @@ -79,14 +79,13 @@ Renderer *FilterCompatibleTechniqueJob::renderer() const void FilterCompatibleTechniqueJob::run() { Q_ASSERT(m_manager != nullptr && m_renderer != nullptr); + Q_ASSERT(m_renderer->isRunning() && m_renderer->graphicsContext()->isInitialized()); - if (m_renderer->isRunning() && m_renderer->graphicsContext()->isInitialized()) { - const QVector<Qt3DCore::QNodeId> dirtyTechniqueIds = m_manager->takeDirtyTechniques(); - for (const Qt3DCore::QNodeId techniqueId : dirtyTechniqueIds) { - Technique *technique = m_manager->lookupResource(techniqueId); - if (Q_LIKELY(technique != nullptr)) - technique->setCompatibleWithRenderer((*m_renderer->contextInfo() == *technique->graphicsApiFilter())); - } + const QVector<Qt3DCore::QNodeId> dirtyTechniqueIds = m_manager->takeDirtyTechniques(); + for (const Qt3DCore::QNodeId techniqueId : dirtyTechniqueIds) { + Technique *technique = m_manager->lookupResource(techniqueId); + if (Q_LIKELY(technique != nullptr)) + technique->setCompatibleWithRenderer((*m_renderer->contextInfo() == *technique->graphicsApiFilter())); } } 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 b33637985..0c77dc6e8 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; |