summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2014-07-02 12:54:47 +0200
committerSean Harmer <sean.harmer@kdab.com>2014-07-05 16:03:19 +0200
commit3c37d50d0e526959223b8c51dd75cde7a2527d9d (patch)
treebad3c01af4e28e27d660726b460a09650a4b2a31 /src
parenta20f272b2fe5179d95e397afc6aa3ed80afb7188 (diff)
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 <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/core-components/qabstractmesh.cpp25
-rw-r--r--src/core/core-components/qabstractmesh.h9
-rw-r--r--src/core/core-components/qabstractmesh_p.h8
-rw-r--r--src/quick3d/imports/render/qt3dquick3drenderplugin.cpp7
-rw-r--r--src/render/backend/jobs/loadmeshdatajob.cpp45
-rw-r--r--src/render/backend/jobs/loadmeshdatajob.h6
-rw-r--r--src/render/backend/meshdatamanager.cpp2
-rw-r--r--src/render/backend/meshdatamanager.h10
-rw-r--r--src/render/backend/rendereraspect.cpp4
-rw-r--r--src/render/backend/rendermesh.cpp14
-rw-r--r--src/render/backend/rendermesh.h8
-rw-r--r--src/render/backend/rendernode.cpp4
-rw-r--r--src/render/backend/renderscenebuilder.cpp2
-rw-r--r--src/render/frontend/qabstractshapemesh.cpp17
-rw-r--r--src/render/frontend/qabstractshapemesh.h6
-rw-r--r--src/render/frontend/qabstractshapemesh_p.h6
-rw-r--r--src/render/frontend/qmesh.cpp28
-rw-r--r--src/render/frontend/qmesh.h5
-rw-r--r--src/render/io/assimpparser.cpp19
-rw-r--r--src/render/io/assimpparser.h13
-rw-r--r--src/render/io/gltfparser.cpp23
-rw-r--r--src/render/io/gltfparser.h13
22 files changed, 181 insertions, 93 deletions
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 <Qt3DCore/qt3dcore_global.h>
#include <private/component_p.h>
-#include <QtCore/qstring.h>
-#include <QtCore/quuid.h>
+#include <QString>
+#include <QUuid>
+#include <QSharedPointer>
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<QAbstractMeshData> 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<Qt3D::Tag>(uri, 2, 0, "Tag");
qmlRegisterType<Qt3D::Parameter>(uri, 2, 0, "Parameter");
qmlRegisterType<Qt3D::ParameterMapper>(uri, 2, 0, "ParameterMapper");
- qmlRegisterType<Qt3D::QMesh>(uri, 2, 0, "Mesh");
qmlRegisterExtendedType<Qt3D::QMaterial, Qt3D::Render::Quick::Quick3DMaterial>(uri, 2, 0, "Material");
qmlRegisterExtendedType<Qt3D::QRenderPass, Qt3D::Render::Quick::Quick3DRenderPass>(uri, 2, 0, "RenderPass");
qmlRegisterType<Qt3D::ShaderProgram>(uri, 2, 0, "ShaderProgram");
- qmlRegisterUncreatableType<Qt3D::QAbstractShapeMesh>(uri, 2, 0, "Shape", QStringLiteral("Shape is an abstract base class"));
+
+ qmlRegisterUncreatableType<Qt3D::QAbstractMesh>(uri, 2, 0, "QAbstractMesh", QString("QAbstractMesh is abstract"));
+ qmlRegisterType<Qt3D::QMesh>(uri, 2, 0, "Mesh");
+ qmlRegisterUncreatableType<Qt3D::QAbstractShapeMesh>(uri, 2, 0, "QAbstractShapeMesh", QStringLiteral("Shape is an abstract base class"));
qmlRegisterType<Qt3D::QTorusMesh>(uri, 2, 0, "TorusMesh");
qmlRegisterType<Qt3D::QSphereMesh>(uri, 2, 0, "SphereMesh");
+
qmlRegisterExtendedType<Qt3D::Texture, Qt3D::Render::Quick::Quick3DTexture>(uri, 2, 0, "Texture");
// Framegraph components - TODO RenderTarget, RenderTargetSelector
qmlRegisterExtendedType<Qt3D::QCameraSelector, Qt3D::Quick::Quick3DNode>(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<MeshData>().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<Attribute>();
- 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<MeshData>();
+ 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<Attribute>();
+ 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<MeshData, 16> 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 <Qt3DRenderer/qmesh.h>
-#include <Qt3DRenderer/meshdata.h>
+#include <Qt3DCore/qabstractmesh.h>
#include <Qt3DCore/qresourcesmanager.h>
+#include <Qt3DRenderer/meshdata.h>
#include <QHash>
#include <QPair>
@@ -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<QMesh *> meshesPending() const { return m_meshesPending; }
+ QList<QAbstractMesh *> 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<QMesh *> m_meshesPending;
+ QList<QAbstractMesh *> 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<QJobPtr> RendererAspect::jobsToExecute()
// Create jobs to load in any meshes that are pending
if (m_renderThread->renderer() != Q_NULLPTR) {
- QList<QMesh *> meshSources = m_renderThread->renderer()->meshDataManager()->meshesPending();
+ QList<QAbstractMesh *> meshSources = m_renderThread->renderer()->meshDataManager()->meshesPending();
QVector<QJobPtr> 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<QScenePropertyChange>(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<QMesh*>(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<CameraLens *>(component));
- } else if (qobject_cast<QMesh *>(component)) {
+ } else if (qobject_cast<QAbstractMesh *>(component)) {
RenderMesh *mesh = m_renderer->meshManager()->lookupResource(m_frontEndPeer->asEntity()->uuid());
if (mesh != Q_NULLPTR) {
mesh->setPeer(qobject_cast<QMesh *>(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<QMesh *>(component)) {
+ } else if (qobject_cast<QAbstractMesh *>(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<QMesh *> meshes = entity->componentsOfType<QMesh>();
+ QList<QAbstractMesh *> meshes = entity->componentsOfType<QAbstractMesh>();
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<QAbstractMeshData>());
+ 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 <private/component_p.h>
-#include <private/qmesh_p.h>
+#include <private/qabstractmesh_p.h>
#include <Qt3DRenderer/qt3drenderer_global.h>
+#include <Qt3DRenderer/meshdata.h>
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 <objloader.h>
#include <Qt3DCore/qscenepropertychange.h>
+#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<MeshData>();
+
+ 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<QAbstractMeshData>());
+}
+
} // 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 <assimp/scene.h>
#include <assimp/postprocess.h>
#include <assimp/DefaultLogger.hpp>
+#include <Qt3DCore/qabstractmesh.h>
#include <Qt3DRenderer/meshdata.h>
#include <Qt3DRenderer/assimphelpers.h>
#include <Qt3DRenderer/abstractsceneparser.h>
@@ -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<uint, QMesh *> m_meshes;
+ QMap<uint, AssimpMesh *> m_meshes;
QMap<uint, QMaterial*> m_materials;
QMap<uint, QEffect *> m_effects;
QMap<uint, Texture*> 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<QMesh*> MeshList;
+ typedef QList<GLTFParserMesh *> MeshList;
QMap<QString, MeshList> 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<QAbstractMeshData>());
+}
+
} // 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 <Qt3DRenderer/qbuffer.h>
#include <QJsonDocument>
#include <QMultiHash>
+#include <Qt3DCore/qabstractmesh.h>
#include <QImage>
#include <Qt3DRenderer/abstractsceneparser.h>
@@ -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 );