diff --git a/apps/openmw/mwworld/cellpreloader.cpp b/apps/openmw/mwworld/cellpreloader.cpp index 7524fefd80..f767c6254b 100644 --- a/apps/openmw/mwworld/cellpreloader.cpp +++ b/apps/openmw/mwworld/cellpreloader.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "../mwbase/environment.hpp" #include "../mwbase/world.hpp" @@ -240,7 +241,15 @@ namespace MWWorld void CellPreloader::notifyLoaded(CellStore *cell) { - mPreloadCells.erase(cell); + PreloadMap::iterator found = mPreloadCells.find(cell); + if (found != mPreloadCells.end()) + { + // do the deletion in the background thread + if (found->second.mWorkItem) + mUnrefQueue->push(mPreloadCells[cell].mWorkItem); + + mPreloadCells.erase(found); + } } void CellPreloader::updateCache(double timestamp) @@ -291,4 +300,9 @@ namespace MWWorld mWorkQueue = workQueue; } + void CellPreloader::setUnrefQueue(SceneUtil::UnrefQueue* unrefQueue) + { + mUnrefQueue = unrefQueue; + } + } diff --git a/apps/openmw/mwworld/cellpreloader.hpp b/apps/openmw/mwworld/cellpreloader.hpp index e45f927355..3836b68696 100644 --- a/apps/openmw/mwworld/cellpreloader.hpp +++ b/apps/openmw/mwworld/cellpreloader.hpp @@ -16,6 +16,11 @@ namespace Terrain class World; } +namespace SceneUtil +{ + class UnrefQueue; +} + namespace MWWorld { class CellStore; @@ -51,11 +56,14 @@ namespace MWWorld void setWorkQueue(osg::ref_ptr workQueue); + void setUnrefQueue(SceneUtil::UnrefQueue* unrefQueue); + private: Resource::ResourceSystem* mResourceSystem; Resource::BulletShapeManager* mBulletShapeManager; Terrain::World* mTerrain; osg::ref_ptr mWorkQueue; + osg::ref_ptr mUnrefQueue; double mExpiryDelay; unsigned int mMinCacheSize; unsigned int mMaxCacheSize; diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 7061e4418f..0cf47163eb 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -471,6 +471,7 @@ namespace MWWorld mPreloader.reset(new CellPreloader(rendering.getResourceSystem(), physics->getShapeManager(), rendering.getTerrain())); mPreloader->setWorkQueue(mRendering.getWorkQueue()); + mPreloader->setUnrefQueue(rendering.getUnrefQueue()); mPhysics->setUnrefQueue(rendering.getUnrefQueue()); rendering.getResourceSystem()->setExpiryDelay(Settings::Manager::getFloat("cache expiry delay", "Cells"));