summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2014-09-15 17:58:22 +0200
committerSean Harmer <sean.harmer@kdab.com>2014-09-30 00:23:26 +0200
commitcc8ec223beac86c23b02a19e821272a69934cf7e (patch)
treee1350e3890e87578bd394b5cc98d730ca3c02cde
parentf382993d407ae57302e3999e89783779c97716a0 (diff)
Share MeshData based mesh functor provided
Change-Id: Idbcb99780fe9dca24c105621d3129848fb8f501b Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/jobs/loadmeshdatajob.cpp33
-rw-r--r--src/render/backend/meshdatamanager.cpp14
-rw-r--r--src/render/backend/meshdatamanager_p.h3
-rw-r--r--src/render/backend/rendermesh.cpp7
4 files changed, 44 insertions, 13 deletions
diff --git a/src/render/backend/jobs/loadmeshdatajob.cpp b/src/render/backend/jobs/loadmeshdatajob.cpp
index 50bea4385..72913567e 100644
--- a/src/render/backend/jobs/loadmeshdatajob.cpp
+++ b/src/render/backend/jobs/loadmeshdatajob.cpp
@@ -69,21 +69,30 @@ void LoadMeshDataJob::run()
if (m_functor.isNull())
return ;
- // Load the mesh from disk (or wherever)
- QMeshDataPtr meshDataPtr = m_functor->operator ()().staticCast<QMeshData>();
- if (meshDataPtr.isNull()) {
- qCDebug(Jobs) << Q_FUNC_INFO << "Mesh has no raw data";
- return ;
- }
- // TO DO try to use QAbstractMeshData if possible
QMutexLocker lock(m_renderer->mutex());
- QMeshData *meshData = m_renderer->meshDataManager()->getOrCreateResource(m_meshUuid);
- *meshData = *(meshDataPtr.data());
+ HMeshData meshDataHandle = m_renderer->meshDataManager()->meshDataFromFunctor(m_functor);
+ lock.unlock();
- AttributePtr attr = meshData->attributeByName(QAbstractMeshData::defaultPositionAttributeName()).staticCast<Attribute>();
- if (!attr)
- qCWarning(Jobs) << Q_FUNC_INFO << "unknown attribute: position";
+ if (meshDataHandle.isNull()) {
+ // Load the mesh from disk (or wherever)
+ QMeshDataPtr meshDataPtr = m_functor->operator ()().staticCast<QMeshData>();
+ if (meshDataPtr.isNull()) {
+ qCDebug(Jobs) << Q_FUNC_INFO << "Mesh has no raw data";
+ return ;
+ }
+ // TO DO try to use QAbstractMeshData if possible
+ lock.relock();
+ meshDataHandle = m_renderer->meshDataManager()->acquire();
+ QMeshData *meshData = m_renderer->meshDataManager()->data(meshDataHandle);
+ *meshData = *(meshDataPtr.data());
+ m_renderer->meshDataManager()->addMeshDataForFunctor(meshDataHandle, m_functor);
+ AttributePtr attr = meshData->attributeByName(QAbstractMeshData::defaultPositionAttributeName()).staticCast<Attribute>();
+ if (!attr)
+ qCWarning(Jobs) << Q_FUNC_INFO << "unknown attribute: position";
+ }
+ lock.relock();
+ m_renderer->meshManager()->lookupResource(m_meshUuid)->setMeshData(meshDataHandle);
}
} // namespace Render
diff --git a/src/render/backend/meshdatamanager.cpp b/src/render/backend/meshdatamanager.cpp
index d47fbe1a8..199a8f53c 100644
--- a/src/render/backend/meshdatamanager.cpp
+++ b/src/render/backend/meshdatamanager.cpp
@@ -70,6 +70,20 @@ QHash<QUuid, QAbstractMeshFunctorPtr> MeshDataManager::meshesPending()
return meshFunctors;
}
+HMeshData MeshDataManager::meshDataFromFunctor(QAbstractMeshFunctorPtr functor) const
+{
+ Q_FOREACH (const QAbstractMeshFunctorPtr &ptr, m_meshFunctors.keys()) {
+ if (*ptr == *functor)
+ return m_meshFunctors.value(ptr);
+ }
+ return HMeshData();
+}
+
+void MeshDataManager::addMeshDataForFunctor(HMeshData meshDataHandle, QAbstractMeshFunctorPtr functor)
+{
+ m_meshFunctors.insert(functor, meshDataHandle);
+}
+
} // namespace Render
} // namespace Qt3D
diff --git a/src/render/backend/meshdatamanager_p.h b/src/render/backend/meshdatamanager_p.h
index 3ab1d9d13..17620cb51 100644
--- a/src/render/backend/meshdatamanager_p.h
+++ b/src/render/backend/meshdatamanager_p.h
@@ -75,12 +75,15 @@ public:
void addMeshData(QAbstractMeshFunctorPtr functor, const QUuid &meshUuid);
QHash<QUuid, QAbstractMeshFunctorPtr> meshesPending();
+ HMeshData meshDataFromFunctor(QAbstractMeshFunctorPtr functor) const;
+ void addMeshDataForFunctor(HMeshData meshDataHandle, QAbstractMeshFunctorPtr functor);
private:
// List of meshes that we need to schedule jobs to load
// and calculate bounds for.
QHash<QUuid, QAbstractMeshFunctorPtr> m_meshesPending;
+ QHash<QAbstractMeshFunctorPtr, HMeshData> m_meshFunctors;
};
} // namespace Render
diff --git a/src/render/backend/rendermesh.cpp b/src/render/backend/rendermesh.cpp
index 9add4db18..2b1d0f310 100644
--- a/src/render/backend/rendermesh.cpp
+++ b/src/render/backend/rendermesh.cpp
@@ -134,7 +134,12 @@ void RenderMesh::sceneChangeEvent(const QSceneChangePtr &e)
HMeshData RenderMesh::meshData() const
{
- return m_renderer->meshDataManager()->lookupHandle(m_meshUuid);
+ return m_meshDataHandle;
+}
+
+void RenderMesh::setMeshData(HMeshData handle)
+{
+ m_meshDataHandle = handle;
}
void RenderMesh::setMeshFunctor(QAbstractMeshFunctorPtr functor)