diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2014-09-15 17:58:22 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2014-09-30 00:23:26 +0200 |
commit | cc8ec223beac86c23b02a19e821272a69934cf7e (patch) | |
tree | e1350e3890e87578bd394b5cc98d730ca3c02cde | |
parent | f382993d407ae57302e3999e89783779c97716a0 (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.cpp | 33 | ||||
-rw-r--r-- | src/render/backend/meshdatamanager.cpp | 14 | ||||
-rw-r--r-- | src/render/backend/meshdatamanager_p.h | 3 | ||||
-rw-r--r-- | src/render/backend/rendermesh.cpp | 7 |
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) |