diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index f61ec1c851..0f0691bbe0 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -745,6 +745,7 @@ namespace MWRender if (store->getCell()->isExterior()) { + enableTerrain(true, store->getCell()->getWorldSpace()); mTerrain->loadCell(store->getCell()->getGridX(), store->getCell()->getGridY()); } } @@ -756,7 +757,8 @@ namespace MWRender if (store->getCell()->isExterior()) { - mTerrain->unloadCell(store->getCell()->getGridX(), store->getCell()->getGridY()); + getWorldspaceTerrain(store->getCell()->getWorldSpace()) + ->unloadCell(store->getCell()->getGridX(), store->getCell()->getGridY()); } mWater->removeCell(store); diff --git a/apps/openmw/mwworld/cellpreloader.cpp b/apps/openmw/mwworld/cellpreloader.cpp index 0b6738e3ef..2d6a4e2736 100644 --- a/apps/openmw/mwworld/cellpreloader.cpp +++ b/apps/openmw/mwworld/cellpreloader.cpp @@ -238,26 +238,7 @@ namespace MWWorld CellPreloader::~CellPreloader() { - if (mTerrainPreloadItem) - { - mTerrainPreloadItem->abort(); - mTerrainPreloadItem->waitTillDone(); - mTerrainPreloadItem = nullptr; - } - - if (mUpdateCacheItem) - { - mUpdateCacheItem->waitTillDone(); - mUpdateCacheItem = nullptr; - } - - for (PreloadMap::iterator it = mPreloadCells.begin(); it != mPreloadCells.end(); ++it) - it->second.mWorkItem->abort(); - - for (PreloadMap::iterator it = mPreloadCells.begin(); it != mPreloadCells.end(); ++it) - it->second.mWorkItem->waitTillDone(); - - mPreloadCells.clear(); + clearAllTasks(); } void CellPreloader::preload(CellStore& cell, double timestamp) @@ -458,4 +439,37 @@ namespace MWWorld && contains(mLoadedTerrainPositions, std::array{ position }, ESM::Land::REAL_SIZE); } + void CellPreloader::setTerrain(Terrain::World* terrain) + { + if (terrain != mTerrain) + { + clearAllTasks(); + mTerrain = terrain; + } + } + + void CellPreloader::clearAllTasks() + { + if (mTerrainPreloadItem) + { + mTerrainPreloadItem->abort(); + mTerrainPreloadItem->waitTillDone(); + mTerrainPreloadItem = nullptr; + } + + if (mUpdateCacheItem) + { + mUpdateCacheItem->waitTillDone(); + mUpdateCacheItem = nullptr; + } + + for (PreloadMap::iterator it = mPreloadCells.begin(); it != mPreloadCells.end(); ++it) + it->second.mWorkItem->abort(); + + for (PreloadMap::iterator it = mPreloadCells.begin(); it != mPreloadCells.end(); ++it) + it->second.mWorkItem->waitTillDone(); + + mPreloadCells.clear(); + } + } diff --git a/apps/openmw/mwworld/cellpreloader.hpp b/apps/openmw/mwworld/cellpreloader.hpp index 4f25e31430..15146b45b9 100644 --- a/apps/openmw/mwworld/cellpreloader.hpp +++ b/apps/openmw/mwworld/cellpreloader.hpp @@ -74,8 +74,11 @@ namespace MWWorld void syncTerrainLoad(Loading::Listener& listener); void abortTerrainPreloadExcept(const PositionCellGrid* exceptPos); bool isTerrainLoaded(const CellPreloader::PositionCellGrid& position, double referenceTime) const; + void setTerrain(Terrain::World* terrain); private: + void clearAllTasks(); + Resource::ResourceSystem* mResourceSystem; Resource::BulletShapeManager* mBulletShapeManager; Terrain::World* mTerrain; diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 7bebcaa5a2..6f6745bc08 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -571,7 +571,8 @@ namespace MWWorld mCurrentGridCenter = osg::Vec2i(playerCellX, playerCellY); osg::Vec4i newGrid = gridCenterToBounds(mCurrentGridCenter); mRendering.setActiveGrid(newGrid); - + mRendering.enableTerrain(true, playerCellIndex.mWorldspace); + mPreloader->setTerrain(mRendering.getTerrain()); if (mRendering.pagingUnlockCache()) mPreloader->abortTerrainPreloadExcept(nullptr); if (!mPreloader->isTerrainLoaded(std::make_pair(pos, newGrid), mRendering.getReferenceTime())) diff --git a/components/terrain/quadtreeworld.cpp b/components/terrain/quadtreeworld.cpp index 7e4befcba4..9d559ecc22 100644 --- a/components/terrain/quadtreeworld.cpp +++ b/components/terrain/quadtreeworld.cpp @@ -284,7 +284,7 @@ namespace Terrain , mLodFactor(lodFactor) , mVertexLodMod(vertexLodMod) , mViewDistance(std::numeric_limits::max()) - , mMinSize(1 / 8.f) + , mMinSize(ESM::isEsm4Ext(worldspace) ? 1 / 4.f : 1 / 8.f) , mDebugTerrainChunks(debugChunks) { mChunkManager->setCompositeMapSize(compMapResolution);