diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-05-21 13:37:11 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-05-22 08:03:06 +0300 |
commit | cb79f11be1c0c379a1eccea62606a58b73442f2f (patch) | |
tree | 0e8409d491897b4fc9d1929ea1e13e575c6b7198 /src/datavisualization/utils/objecthelper.cpp | |
parent | 37a82fbeb7aa59260fe5f31b62228914ee4a44a3 (diff) |
Cache ObjectHelper instances
Task-number: QTRD-2792
Change-Id: I90d83bd9b73a0f337fd26f1b92000e72b3ec0607
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/utils/objecthelper.cpp')
-rw-r--r-- | src/datavisualization/utils/objecthelper.cpp | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/src/datavisualization/utils/objecthelper.cpp b/src/datavisualization/utils/objecthelper.cpp index 97695193..8cbf2aa2 100644 --- a/src/datavisualization/utils/objecthelper.cpp +++ b/src/datavisualization/utils/objecthelper.cpp @@ -27,15 +27,87 @@ ObjectHelper::ObjectHelper(const QString &objectFile) : m_objectFile(objectFile) { m_indicesType = GL_UNSIGNED_SHORT; + load(); } +struct ObjectHelperRef { + int refCount; + ObjectHelper *obj; +}; + +// The "Abstract3DRenderer *" key identifies the renderer +static QHash<const Abstract3DRenderer *, QHash<QString, ObjectHelperRef *> *> cacheTable; + ObjectHelper::~ObjectHelper() { } -void ObjectHelper::setObjectFile(const QString &objectFile) +void ObjectHelper::resetObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj, + const QString &meshFile) +{ + Q_ASSERT(cacheId); + + if (obj) { + const QString &oldFile = obj->objectFile(); + if (meshFile == oldFile) + return; // same file, do nothing + releaseObjectHelper(cacheId, obj); + } + obj = getObjectHelper(cacheId, meshFile); +} + +void ObjectHelper::releaseObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj) +{ + Q_ASSERT(cacheId); + + if (obj) { + QHash<QString, ObjectHelperRef *> *objectTable = cacheTable.value(cacheId, 0); + if (objectTable) { + // Delete object if last reference is released + ObjectHelperRef *objRef = objectTable->value(obj->m_objectFile, 0); + if (objRef) { + objRef->refCount--; + if (objRef->refCount <= 0) { + objectTable->remove(obj->m_objectFile); + delete objRef->obj; + delete objRef; + } + } + if (objectTable->isEmpty()) { + // Remove the entire cache if last object was removed + cacheTable.remove(cacheId); + delete objectTable; + } + } else { + // Just delete the object if unknown cache + delete obj; + } + obj = 0; + } +} + +ObjectHelper *ObjectHelper::getObjectHelper(const Abstract3DRenderer *cacheId, + const QString &objectFile) { - m_objectFile = objectFile; + if (objectFile.isEmpty()) + return 0; + + QHash<QString, ObjectHelperRef *> *objectTable = cacheTable.value(cacheId, 0); + if (!objectTable) { + objectTable = new QHash<QString, ObjectHelperRef *>; + cacheTable.insert(cacheId, objectTable); + } + + // Check if object helper for this mesh already exists + ObjectHelperRef *objRef = objectTable->value(objectFile, 0); + if (!objRef) { + objRef = new ObjectHelperRef; + objRef->refCount = 0; + objRef->obj = new ObjectHelper(objectFile); + objectTable->insert(objectFile, objRef); + } + objRef->refCount++; + return objRef->obj; } void ObjectHelper::load() |