diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2018-01-19 10:36:58 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-01-22 06:09:16 +0000 |
commit | f91ee783c5704b0d55da0d96dacf6eca8933e748 (patch) | |
tree | b9b33a389609311e1f50f6c7b8c74c5ad9f2a5f3 /src/render/geometry/geometryrenderer.cpp | |
parent | 44aeb43834675a4d6b19bee88e267464ca7ad1f4 (diff) |
QMesh: do not rely on QAspectEngine to create QGeometryFactory
- This would prevent QMesh created without parent/scene to have a proper
geometry factory.
- This avoid passing the engine around
Change-Id: I5091970f96e87ab8b129475a1113ef84ce170388
Task-number: QTBUG-65506
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/geometry/geometryrenderer.cpp')
-rw-r--r-- | src/render/geometry/geometryrenderer.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/render/geometry/geometryrenderer.cpp b/src/render/geometry/geometryrenderer.cpp index 270380e14..00b53fd8d 100644 --- a/src/render/geometry/geometryrenderer.cpp +++ b/src/render/geometry/geometryrenderer.cpp @@ -41,11 +41,13 @@ #include <Qt3DRender/private/geometryrenderermanager_p.h> #include <Qt3DRender/private/qboundingvolume_p.h> #include <Qt3DRender/private/qgeometryrenderer_p.h> +#include <Qt3DRender/private/qmesh_p.h> #include <Qt3DCore/qpropertyupdatedchange.h> #include <Qt3DCore/qpropertynodeaddedchange.h> #include <Qt3DCore/qpropertynoderemovedchange.h> #include <Qt3DCore/private/qnode_p.h> #include <Qt3DCore/private/qtypedpropertyupdatechange_p.h> +#include <Qt3DCore/private/qservicelocator_p.h> #include <QtCore/qcoreapplication.h> #include <memory> @@ -197,7 +199,28 @@ void GeometryRenderer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) void GeometryRenderer::executeFunctor() { Q_ASSERT(m_geometryFactory); + + // What kind of functor are we dealing with? + const bool isQMeshFunctor = m_geometryFactory->id() == Qt3DRender::functorTypeId<MeshLoaderFunctor>(); + + if (isQMeshFunctor) { + QSharedPointer<MeshLoaderFunctor> meshLoader = qSharedPointerCast<MeshLoaderFunctor>(m_geometryFactory); + + // Set the aspect engine to allow remote downloads + if (meshLoader->nodeManagers() == nullptr) + meshLoader->setNodeManagers(m_renderer->nodeManagers()); + + if (meshLoader->downloaderService() == nullptr) { + Qt3DCore::QServiceLocator *services = m_renderer->services(); + meshLoader->setDownloaderService(services->service<Qt3DCore::QDownloadHelperService>(Qt3DCore::QServiceLocator::DownloadHelperService)); + }; + } + + // Load geometry std::unique_ptr<QGeometry> geometry((*m_geometryFactory)()); + + // 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; |