From 3c37d50d0e526959223b8c51dd75cde7a2527d9d Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Wed, 2 Jul 2014 12:54:47 +0200 Subject: Refactored QAbstractMesh, QMesh and QAbstractShapeMesh The Backend now monitors QAbstractMesh elements instead of QMesh. QAbstractMesh subclasses have to implement a load method. For QMesh it uses the ObjLoader to create MeshData from a source file while QAbstractShapeMesh loads MeshData created by code. Each scene parser can then implement its own QAbstractMesh subclass. The loadmeshdatajobs has been corrected and works with QAbstractMesh. Change-Id: I5caae63a153f18eaae3b2f1bdbfa8995c63a2d23 Reviewed-by: Sean Harmer --- examples/cpp_example/main.cpp | 5 +-- src/core/core-components/qabstractmesh.cpp | 25 ++++++++++++ src/core/core-components/qabstractmesh.h | 9 ++++- src/core/core-components/qabstractmesh_p.h | 8 +++- .../imports/render/qt3dquick3drenderplugin.cpp | 7 +++- src/render/backend/jobs/loadmeshdatajob.cpp | 45 ++++++++-------------- src/render/backend/jobs/loadmeshdatajob.h | 6 +-- src/render/backend/meshdatamanager.cpp | 2 +- src/render/backend/meshdatamanager.h | 10 ++--- src/render/backend/rendereraspect.cpp | 4 +- src/render/backend/rendermesh.cpp | 14 ++++--- src/render/backend/rendermesh.h | 8 ++-- src/render/backend/rendernode.cpp | 4 +- src/render/backend/renderscenebuilder.cpp | 2 +- src/render/frontend/qabstractshapemesh.cpp | 17 +++----- src/render/frontend/qabstractshapemesh.h | 6 ++- src/render/frontend/qabstractshapemesh_p.h | 6 +-- src/render/frontend/qmesh.cpp | 28 ++++++++++---- src/render/frontend/qmesh.h | 5 +-- src/render/io/assimpparser.cpp | 19 ++++++++- src/render/io/assimpparser.h | 13 ++++++- src/render/io/gltfparser.cpp | 23 +++++++++-- src/render/io/gltfparser.h | 13 +++++++ 23 files changed, 182 insertions(+), 97 deletions(-) diff --git a/examples/cpp_example/main.cpp b/examples/cpp_example/main.cpp index 4ea59c23c..72aeef828 100644 --- a/examples/cpp_example/main.cpp +++ b/examples/cpp_example/main.cpp @@ -90,10 +90,7 @@ int main(int ac, char **av) torus->setRadius(40); torus->setMinorRadius(15); - // Torus mesh holding the shape's data - Qt3D::QMesh *torusMesh = new Qt3D::QMesh(); - torusMesh->setData(torus->data()); - torusEntity->addComponent(torusMesh); + torusEntity->addComponent(torus); // TorusMesh Transform Qt3D::TranslateTransform *torusTranslation = new Qt3D::TranslateTransform(); diff --git a/src/core/core-components/qabstractmesh.cpp b/src/core/core-components/qabstractmesh.cpp index 63c740749..9923abd8d 100644 --- a/src/core/core-components/qabstractmesh.cpp +++ b/src/core/core-components/qabstractmesh.cpp @@ -62,6 +62,7 @@ namespace Qt3D { QAbstractMeshPrivate::QAbstractMeshPrivate(QAbstractMesh *qq) : ComponentPrivate(qq) , m_uuid(QUuid::createUuid()) + , m_dirty(true) { } @@ -76,6 +77,12 @@ QAbstractMesh::QAbstractMesh(QAbstractMeshPrivate &dd, Node *parent) { } +void QAbstractMesh::setData(QAbstractMeshDataPtr data) +{ + Q_D(QAbstractMesh); + d->m_data = data; +} + /*! * Returns a QUuid uniquely identifying the mesh. */ @@ -85,6 +92,24 @@ const QUuid QAbstractMesh::uuid() const return d->m_uuid; } +bool QAbstractMesh::isDirty() const +{ + Q_D(const QAbstractMesh); + return d->m_dirty; +} + +void QAbstractMesh::setDirty(bool dirty) +{ + Q_D(QAbstractMesh); + d->m_dirty = dirty; +} + +QAbstractMeshDataPtr QAbstractMesh::data() const +{ + Q_D(const QAbstractMesh); + return d->m_data; +} + } // Qt3D QT_END_NAMESPACE diff --git a/src/core/core-components/qabstractmesh.h b/src/core/core-components/qabstractmesh.h index ad5a3fe47..56d29e25d 100644 --- a/src/core/core-components/qabstractmesh.h +++ b/src/core/core-components/qabstractmesh.h @@ -63,8 +63,11 @@ public: const QUuid uuid() const; - virtual QAbstractMeshDataPtr data() = 0; - virtual void setData(QAbstractMeshDataPtr data) = 0; + bool isDirty() const; + void setDirty(bool dirty); + + virtual bool load() = 0; + virtual QAbstractMeshDataPtr data() const; Q_SIGNALS: void sourceChanged(); @@ -72,6 +75,8 @@ Q_SIGNALS: protected: Q_DECLARE_PRIVATE(QAbstractMesh) QAbstractMesh(QAbstractMeshPrivate &dd, Node *parent = 0); + + void setData(QAbstractMeshDataPtr data); }; } // Qt3D diff --git a/src/core/core-components/qabstractmesh_p.h b/src/core/core-components/qabstractmesh_p.h index 75f04839e..8816afd06 100644 --- a/src/core/core-components/qabstractmesh_p.h +++ b/src/core/core-components/qabstractmesh_p.h @@ -45,14 +45,16 @@ #include #include -#include -#include +#include +#include +#include QT_BEGIN_NAMESPACE namespace Qt3D { class QAbstractMesh; +class QAbstractMeshData; class QT3DCORESHARED_EXPORT QAbstractMeshPrivate : public ComponentPrivate { @@ -62,6 +64,8 @@ public: Q_DECLARE_PUBLIC(QAbstractMesh) const QUuid m_uuid; + bool m_dirty; + QSharedPointer m_data; }; } diff --git a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp index f6e6c92c3..a6a895adc 100644 --- a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp +++ b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp @@ -88,13 +88,16 @@ void Qt3DQuick3DRenderPlugin::registerTypes(const char *uri) qmlRegisterType(uri, 2, 0, "Tag"); qmlRegisterType(uri, 2, 0, "Parameter"); qmlRegisterType(uri, 2, 0, "ParameterMapper"); - qmlRegisterType(uri, 2, 0, "Mesh"); qmlRegisterExtendedType(uri, 2, 0, "Material"); qmlRegisterExtendedType(uri, 2, 0, "RenderPass"); qmlRegisterType(uri, 2, 0, "ShaderProgram"); - qmlRegisterUncreatableType(uri, 2, 0, "Shape", QStringLiteral("Shape is an abstract base class")); + + qmlRegisterUncreatableType(uri, 2, 0, "QAbstractMesh", QString("QAbstractMesh is abstract")); + qmlRegisterType(uri, 2, 0, "Mesh"); + qmlRegisterUncreatableType(uri, 2, 0, "QAbstractShapeMesh", QStringLiteral("Shape is an abstract base class")); qmlRegisterType(uri, 2, 0, "TorusMesh"); qmlRegisterType(uri, 2, 0, "SphereMesh"); + qmlRegisterExtendedType(uri, 2, 0, "Texture"); // Framegraph components - TODO RenderTarget, RenderTargetSelector qmlRegisterExtendedType(uri, 2, 0, "CameraSelector"); diff --git a/src/render/backend/jobs/loadmeshdatajob.cpp b/src/render/backend/jobs/loadmeshdatajob.cpp index a042ce90d..08192178c 100644 --- a/src/render/backend/jobs/loadmeshdatajob.cpp +++ b/src/render/backend/jobs/loadmeshdatajob.cpp @@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE namespace Qt3D { namespace Render { -LoadMeshDataJob::LoadMeshDataJob(QMesh *mesh) +LoadMeshDataJob::LoadMeshDataJob(QAbstractMesh *mesh) : QJob() , m_meshSource(mesh) { @@ -68,38 +68,25 @@ void LoadMeshDataJob::run() // Load the mesh from disk (or wherever) - if (m_meshSource->source().isEmpty()) { - if (m_meshSource->data().isNull()) - qCWarning(Jobs) << Q_FUNC_INFO << "Mesh is empty, no source nor data set"; - else { - qCDebug(Jobs) << Q_FUNC_INFO << "Mesh has raw data"; - MeshData *meshData = m_renderer->meshDataManager()->getOrCreateResource(m_meshSource->uuid()); - MeshDataManager::WriteLocker(m_renderer->meshDataManager()); - *meshData = *(m_meshSource->data().staticCast().data()); - } + if (!m_meshSource->load()) { + qCDebug(Jobs) << Q_FUNC_INFO << "Mesh failed to load"; + return ; } - else { - ObjLoader loader; - loader.setLoadTextureCoordinatesEnabled(true); - qCDebug(Jobs) << Q_FUNC_INFO << "Loading mesh from" << m_meshSource->source(); - if (loader.load(m_meshSource->source())) { - qCDebug(Jobs) << Q_FUNC_INFO << "Loaded OBJ ok"; - MeshData *meshData = m_renderer->meshDataManager()->getOrCreateResource(m_meshSource->uuid()); - MeshDataManager::WriteLocker(m_renderer->meshDataManager()); - *meshData = *loader.mesh(); - AttributePtr attr = meshData->attributeByName(QStringLiteral("position")).staticCast(); - if (!attr) { - qCWarning(Jobs) << Q_FUNC_INFO << "unknown attribute: position"; - return; - } - } else { - qCWarning(Jobs) << Q_FUNC_INFO << "OBJ load failure for:" << m_meshSource->source(); - } + + MeshDataPtr meshDataPtr = m_meshSource->data().staticCast(); + if (meshDataPtr.isNull()) { + qCDebug(Jobs) << Q_FUNC_INFO << "Mesh has no raw data"; + return ; } - //Qt3D::Sphere sphere = Qt3D::Sphere::fromPoints(loader.vertices()); + // TO DO try to use QAbstractMeshData if possible + MeshData *meshData = m_renderer->meshDataManager()->getOrCreateResource(m_meshSource->uuid()); + MeshDataManager::WriteLocker(m_renderer->meshDataManager()); + *meshData = *meshDataPtr.data(); - qCDebug(Jobs) << "Exiting" << Q_FUNC_INFO << QThread::currentThread(); + AttributePtr attr = meshData->attributeByName(QStringLiteral("position")).staticCast(); + if (!attr) + qCWarning(Jobs) << Q_FUNC_INFO << "unknown attribute: position"; } } // namespace Render diff --git a/src/render/backend/jobs/loadmeshdatajob.h b/src/render/backend/jobs/loadmeshdatajob.h index ea36918a2..800bc1812 100644 --- a/src/render/backend/jobs/loadmeshdatajob.h +++ b/src/render/backend/jobs/loadmeshdatajob.h @@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE namespace Qt3D { -class QMesh; +class QAbstractMesh; typedef QHandle HMeshData; namespace Render { @@ -62,14 +62,14 @@ class Renderer; class LoadMeshDataJob : public Qt3D::QJob { public: - LoadMeshDataJob(QMesh *mesh); + LoadMeshDataJob(QAbstractMesh *mesh); void setRenderer(Renderer *renderer) { m_renderer = renderer; } protected: void run() Q_DECL_OVERRIDE; private: - QMesh *m_meshSource; + QAbstractMesh *m_meshSource; Renderer *m_renderer; }; diff --git a/src/render/backend/meshdatamanager.cpp b/src/render/backend/meshdatamanager.cpp index 30e8b6241..f475ad4ed 100644 --- a/src/render/backend/meshdatamanager.cpp +++ b/src/render/backend/meshdatamanager.cpp @@ -55,7 +55,7 @@ MeshDataManager::MeshDataManager() { } -void MeshDataManager::addMeshData(QMesh *mesh) +void MeshDataManager::addMeshData(QAbstractMesh *mesh) { if (!contains(mesh->uuid()) && !m_meshesPending.contains(mesh)) m_meshesPending.append(mesh); diff --git a/src/render/backend/meshdatamanager.h b/src/render/backend/meshdatamanager.h index 2a4f6dbb0..00e57d50b 100644 --- a/src/render/backend/meshdatamanager.h +++ b/src/render/backend/meshdatamanager.h @@ -42,9 +42,9 @@ #ifndef QT3D_RENDER_MESHDATAMANAGER_H #define QT3D_RENDER_MESHDATAMANAGER_H -#include -#include +#include #include +#include #include #include @@ -70,15 +70,15 @@ public: inline bool hasMeshData(const QUuid &id) { return contains(id); } inline MeshData* getOrCreateMeshData(const QUuid &id) { return getOrCreateResource(id); } inline MeshData* meshData(const QUuid &id) { return lookupResource(id); } - void addMeshData(QMesh *mesh); + void addMeshData(QAbstractMesh *mesh); - QList meshesPending() const { return m_meshesPending; } + QList meshesPending() const { return m_meshesPending; } void clearMeshesPending() { m_meshesPending.clear(); } private: // List of meshes that we need to schedule jobs to load // and calculate bounds for. - QList m_meshesPending; + QList m_meshesPending; }; } // namespace Render diff --git a/src/render/backend/rendereraspect.cpp b/src/render/backend/rendereraspect.cpp index 6b3fb5061..f7459188b 100644 --- a/src/render/backend/rendereraspect.cpp +++ b/src/render/backend/rendereraspect.cpp @@ -86,9 +86,9 @@ QVector RendererAspect::jobsToExecute() // Create jobs to load in any meshes that are pending if (m_renderThread->renderer() != Q_NULLPTR) { - QList meshSources = m_renderThread->renderer()->meshDataManager()->meshesPending(); + QList meshSources = m_renderThread->renderer()->meshDataManager()->meshesPending(); QVector meshesJobs; - Q_FOREACH (QMesh *meshSource, meshSources) { + Q_FOREACH (QAbstractMesh *meshSource, meshSources) { Render::LoadMeshDataJobPtr loadMeshJob(new Render::LoadMeshDataJob(meshSource)); loadMeshJob->setRenderer(m_renderThread->renderer()); meshesJobs.append(loadMeshJob); diff --git a/src/render/backend/rendermesh.cpp b/src/render/backend/rendermesh.cpp index 2b92e3755..6f707484c 100644 --- a/src/render/backend/rendermesh.cpp +++ b/src/render/backend/rendermesh.cpp @@ -81,7 +81,7 @@ RenderMesh::RenderMesh() : { } -void RenderMesh::setPeer(QMesh *peer) +void RenderMesh::setPeer(QAbstractMesh *peer) { if (m_peer != peer) { QChangeArbiter *arbiter = m_rendererAspect->aspectManager()->changeArbiter(); @@ -104,10 +104,14 @@ void RenderMesh::sceneChangeEvent(const QSceneChangePtr &e) switch (e->m_type) { case ComponentUpdated: { QScenePropertyChangePtr propertyChange = qSharedPointerCast(e); - // QString propertyName = QString::fromLatin1(propertyChange->m_propertyName); - QVariant propertyValue = propertyChange->m_value; - m_source = propertyValue.toString(); - m_meshDirty = true; + if (propertyChange->m_propertyName == QByteArrayLiteral("source") && qobject_cast(m_peer)) // Mesh with source + { + QVariant propertyValue = propertyChange->m_value; + m_source = propertyValue.toString(); + m_meshDirty = true; + // TO DO Try to use and monitor for changes the peer dirty property to check if a mesh has to be reloaded + m_peer->setDirty(true); + } break; } diff --git a/src/render/backend/rendermesh.h b/src/render/backend/rendermesh.h index b7cb99fb4..530fb0175 100644 --- a/src/render/backend/rendermesh.h +++ b/src/render/backend/rendermesh.h @@ -52,7 +52,7 @@ class QReadWriteLock; namespace Qt3D { -class QMesh; +class QAbstractMesh; class QRenderPass; class RendererAspect; class MeshData; @@ -70,9 +70,9 @@ class RenderMesh : public QObserverInterface public: RenderMesh(); - void setPeer(QMesh *peer); + void setPeer(QAbstractMesh *peer); void setRendererAspect(RendererAspect *rendererAspect); - QMesh *peer() const { return m_peer; } + QAbstractMesh *peer() const { return m_peer; } void sceneChangeEvent(const QSceneChangePtr &e); bool meshDirty() const; @@ -91,7 +91,7 @@ protected: private: RendererAspect *m_rendererAspect; - QMesh* m_peer; + QAbstractMesh* m_peer; QString m_source; bool m_meshDirty; diff --git a/src/render/backend/rendernode.cpp b/src/render/backend/rendernode.cpp index 3383db45f..71cb87e3e 100644 --- a/src/render/backend/rendernode.cpp +++ b/src/render/backend/rendernode.cpp @@ -179,7 +179,7 @@ void RenderNode::sceneChangeEvent(const QSceneChangePtr &e) RenderCamera *cam = m_renderer->cameraManager()->lookupResource(m_frontEndPeer->asEntity()->uuid()); if (cam != Q_NULLPTR) cam->setPeer(qobject_cast(component)); - } else if (qobject_cast(component)) { + } else if (qobject_cast(component)) { RenderMesh *mesh = m_renderer->meshManager()->lookupResource(m_frontEndPeer->asEntity()->uuid()); if (mesh != Q_NULLPTR) { mesh->setPeer(qobject_cast(component)); @@ -201,7 +201,7 @@ void RenderNode::sceneChangeEvent(const QSceneChangePtr &e) RenderCamera *cam = m_renderer->cameraManager()->lookupResource(m_frontEndPeer->asEntity()->uuid()); if (cam != Q_NULLPTR) cam->setPeer(Q_NULLPTR); - } else if (qobject_cast(component)) { + } else if (qobject_cast(component)) { RenderMesh *mesh = m_renderer->meshManager()->lookupResource(m_frontEndPeer->asEntity()->uuid()); if (mesh != Q_NULLPTR) mesh->setPeer(Q_NULLPTR); diff --git a/src/render/backend/renderscenebuilder.cpp b/src/render/backend/renderscenebuilder.cpp index 20853e86e..f255dfb44 100644 --- a/src/render/backend/renderscenebuilder.cpp +++ b/src/render/backend/renderscenebuilder.cpp @@ -263,7 +263,7 @@ void RenderSceneBuilder::createRenderCamera(Entity *entity) void RenderSceneBuilder::createRenderMesh(Entity *entity) { - QList meshes = entity->componentsOfType(); + QList meshes = entity->componentsOfType(); if (!meshes.isEmpty()) { HMesh meshHandle = m_renderer->meshManager()->getOrAcquireHandle(entity->uuid()); RenderMesh *renderMesh = m_renderer->meshManager()->data(meshHandle); diff --git a/src/render/frontend/qabstractshapemesh.cpp b/src/render/frontend/qabstractshapemesh.cpp index 5066c89c8..e485c76dc 100644 --- a/src/render/frontend/qabstractshapemesh.cpp +++ b/src/render/frontend/qabstractshapemesh.cpp @@ -50,29 +50,24 @@ QT_BEGIN_NAMESPACE namespace Qt3D { QAbstractShapeMeshPrivate::QAbstractShapeMeshPrivate(QAbstractShapeMesh *qq) - : QMeshPrivate(qq) - , m_loaded(false) + : QAbstractMeshPrivate(qq) { } QAbstractShapeMesh::QAbstractShapeMesh(Node *parent) : - QMesh(*new QAbstractShapeMeshPrivate(this), parent) + QAbstractMesh(*new QAbstractShapeMeshPrivate(this), parent) { } QAbstractShapeMesh::QAbstractShapeMesh(QAbstractShapeMeshPrivate &dd, Node *parent) - : QMesh(dd, parent) + : QAbstractMesh(dd, parent) { } -QAbstractMeshDataPtr QAbstractShapeMesh::data() +bool QAbstractShapeMesh::load() { - Q_D(const QAbstractShapeMesh); - if (!d->m_loaded) { - QMesh::setData(buildMeshdata()); - d->m_loaded = true; - } - return QMesh::data(); + QAbstractMesh::setData(buildMeshdata().staticCast()); + return true; } } // namespace Qt3D diff --git a/src/render/frontend/qabstractshapemesh.h b/src/render/frontend/qabstractshapemesh.h index 915daf337..83a8c0c5d 100644 --- a/src/render/frontend/qabstractshapemesh.h +++ b/src/render/frontend/qabstractshapemesh.h @@ -54,19 +54,21 @@ class QMesh; class QAbstractShapeMeshPrivate; -class QT3DRENDERERSHARED_EXPORT QAbstractShapeMesh : public QMesh +class QT3DRENDERERSHARED_EXPORT QAbstractShapeMesh : public QAbstractMesh { Q_OBJECT public: explicit QAbstractShapeMesh(Node *parent = 0); - virtual QAbstractMeshDataPtr data() Q_DECL_OVERRIDE; + bool load() Q_DECL_OVERRIDE; + virtual QAbstractMeshDataPtr buildMeshdata() const = 0; protected: Q_DECLARE_PRIVATE(QAbstractShapeMesh) QAbstractShapeMesh(QAbstractShapeMeshPrivate &dd, Node* parent = 0); + }; } // namespace Qt3D diff --git a/src/render/frontend/qabstractshapemesh_p.h b/src/render/frontend/qabstractshapemesh_p.h index 32331360b..18f5fdf0a 100644 --- a/src/render/frontend/qabstractshapemesh_p.h +++ b/src/render/frontend/qabstractshapemesh_p.h @@ -43,8 +43,9 @@ #define QT3D_QABSTRACTSHAPEMESH_P_H #include -#include +#include #include +#include QT_BEGIN_NAMESPACE @@ -52,14 +53,13 @@ namespace Qt3D { class QAbstractShapeMesh; -class QT3DRENDERERSHARED_EXPORT QAbstractShapeMeshPrivate : public QMeshPrivate +class QT3DRENDERERSHARED_EXPORT QAbstractShapeMeshPrivate : public QAbstractMeshPrivate { public : QAbstractShapeMeshPrivate(QAbstractShapeMesh *qq); Q_DECLARE_PUBLIC(QAbstractShapeMesh) - mutable bool m_loaded; }; } // Qt3D diff --git a/src/render/frontend/qmesh.cpp b/src/render/frontend/qmesh.cpp index fcf33ecdf..d335cba40 100644 --- a/src/render/frontend/qmesh.cpp +++ b/src/render/frontend/qmesh.cpp @@ -49,6 +49,7 @@ #include #include +#include "renderlogging.h" QT_BEGIN_NAMESPACE @@ -88,16 +89,27 @@ QString QMesh::source() const return d->m_source; } -QAbstractMeshDataPtr QMesh::data() -{ - Q_D(const QMesh); - return d->m_data; -} - -void QMesh::setData(QAbstractMeshDataPtr data) +bool QMesh::load() { Q_D(QMesh); - d->m_data = data.staticCast(); + + if (d->m_source.isEmpty()) { + qCWarning(Render::Jobs) << Q_FUNC_INFO << "Mesh is empty, nothing to load"; + return false; + } + + // TO DO : Maybe use Assimp instead of ObjLoader to handle more sources + ObjLoader loader; + loader.setLoadTextureCoordinatesEnabled(true); + qCDebug(Render::Jobs) << Q_FUNC_INFO << "Loading mesh from" << d->m_source; + + if (loader.load(d->m_source)) { + QAbstractMesh::setData(QAbstractMeshDataPtr(loader.mesh())); + return true; + } + + qCWarning(Render::Jobs) << Q_FUNC_INFO << "OBJ load failure for:" << d->m_source; + return false; } } // namespace Qt3D diff --git a/src/render/frontend/qmesh.h b/src/render/frontend/qmesh.h index a28152aa0..f6a6d08c3 100644 --- a/src/render/frontend/qmesh.h +++ b/src/render/frontend/qmesh.h @@ -69,10 +69,7 @@ public: void setSource(const QString &source); QString source() const; - // Not const because subclasses may want to perform - // more than just returning a MeshData straight away - virtual QAbstractMeshDataPtr data() Q_DECL_OVERRIDE; - void setData(QAbstractMeshDataPtr d) Q_DECL_OVERRIDE; + bool load() Q_DECL_OVERRIDE; Q_SIGNALS: void sourceChanged(); diff --git a/src/render/io/assimpparser.cpp b/src/render/io/assimpparser.cpp index 8f8f3b10a..6b4dcdacd 100644 --- a/src/render/io/assimpparser.cpp +++ b/src/render/io/assimpparser.cpp @@ -294,7 +294,7 @@ Entity *AssimpParser::node(aiNode *node) // Add Meshes to the node for (uint i = 0; i < node->mNumMeshes; i++) { uint meshIdx = node->mMeshes[i]; - QMesh * mesh = m_meshes[meshIdx]; + AssimpMesh * mesh = m_meshes[meshIdx]; // mesh material if (m_materials.contains(meshIdx)) entityNode->addComponent(m_materials[meshIdx]); @@ -538,7 +538,7 @@ void AssimpParser::loadMesh(uint meshIndex) meshData->computeBoundsFromAttribute(VERTICES_ATTRIBUTE_NAME); - QMesh *storedMesh = new QMesh(); + AssimpMesh *storedMesh = new AssimpMesh(); storedMesh->setData(meshData); m_meshes[meshIndex] = storedMesh; @@ -771,6 +771,21 @@ void AssimpParser::copyMaterialFloatProperties(QMaterial *material, aiMaterial * material->addParameter(new Parameter(material, ASSIMP_MATERIAL_REFLECTIVITY, value)); } +AssimpParser::AssimpMesh::AssimpMesh(Node *parent) + : QAbstractMesh(parent) +{ +} + +bool AssimpParser::AssimpMesh::load() +{ + return true; +} + +void AssimpParser::AssimpMesh::setData(MeshDataPtr data) +{ + QAbstractMesh::setData(data.staticCast()); +} + } // Qt3D QT_END_NAMESPACE diff --git a/src/render/io/assimpparser.h b/src/render/io/assimpparser.h index d1676ea22..6e6b80286 100644 --- a/src/render/io/assimpparser.h +++ b/src/render/io/assimpparser.h @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -88,6 +89,16 @@ public: Camera *camera(QString id); private : + + class AssimpMesh : public QAbstractMesh + { + public : + AssimpMesh(Node *parent = 0); + + bool load() Q_DECL_OVERRIDE; + void setData(MeshDataPtr data); + }; + static QStringList assimpSupportedFormats(); static QMatrix4x4 aiMatrix4x4ToQMatrix4x4(const aiMatrix4x4 &matrix); @@ -118,7 +129,7 @@ private : bool m_sceneParsed; static QStringList assimpSupportedFormatsList; - QMap m_meshes; + QMap m_meshes; QMap m_materials; QMap m_effects; QMap m_embeddedTextures; diff --git a/src/render/io/gltfparser.cpp b/src/render/io/gltfparser.cpp index b4a32addd..4db8928ea 100644 --- a/src/render/io/gltfparser.cpp +++ b/src/render/io/gltfparser.cpp @@ -339,7 +339,7 @@ Entity* GLTFParser::node(QString id) if ( jsonObj.contains(KEY_MESHES) ) { - typedef QList MeshList; + typedef QList MeshList; QMap materialDict; foreach (QJsonValue m, jsonObj.value(KEY_MESHES).toArray()) @@ -351,7 +351,7 @@ Entity* GLTFParser::node(QString id) foreach (MeshDataPtr md, m_meshDict.values(m.toString())) { QString matId = m_meshMaterialDict[md.data()]; - QMesh* meshComp = new QMesh; + GLTFParserMesh* meshComp = new GLTFParserMesh; meshComp->setData(md); materialDict[matId].append(meshComp); } @@ -360,7 +360,7 @@ Entity* GLTFParser::node(QString id) if (materialDict.size() == 1) { // common case result->addComponent(material(materialDict.firstKey())); - foreach (QMesh* m, materialDict.first()) + foreach (GLTFParserMesh* m, materialDict.first()) result->addComponent(m); } else { // need to make a child entity per material @@ -369,7 +369,7 @@ Entity* GLTFParser::node(QString id) result->addChild(subEntity); subEntity->addComponent(material(matId)); - foreach (QMesh* m, materialDict.value(matId)) + foreach (GLTFParserMesh* m, materialDict.value(matId)) subEntity->addComponent(m); } // of distinct material iteration } // of multiple materials case @@ -960,6 +960,21 @@ QVariant GLTFParser::parameterValueFromJSON(Parameter* p, QJsonValue val) return QVariant(); } +GLTFParser::GLTFParserMesh::GLTFParserMesh(Node *parent) + : QAbstractMesh(parent) +{ +} + +bool GLTFParser::GLTFParserMesh::load() +{ + return true; +} + +void GLTFParser::GLTFParserMesh::setData(MeshDataPtr data) +{ + QAbstractMesh::setData(data.staticCast()); +} + } // of namespace Qt3D QT_END_NAMESPACE diff --git a/src/render/io/gltfparser.h b/src/render/io/gltfparser.h index 7182c2e48..098e0b80a 100644 --- a/src/render/io/gltfparser.h +++ b/src/render/io/gltfparser.h @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -69,6 +70,7 @@ class Texture; class GLTFParser : public AbstractSceneParser { Q_OBJECT + public: GLTFParser(); @@ -94,6 +96,17 @@ public: CameraLens *camera(QString id); private: + + + class GLTFParserMesh : public QAbstractMesh + { + public: + GLTFParserMesh(Node *parent = 0); + + bool load() Q_DECL_OVERRIDE; + void setData(MeshDataPtr data); + }; + void parse(); void processJSONMesh( QString id, QJsonObject jsonObj ); -- cgit v1.2.3