pagerebuild on disable

Signed-off-by: Bret Curtis <psi29a@gmail.com>
pull/578/head
bzzt lost a hitlab login 5 years ago committed by Bret Curtis
parent c1ebd9474b
commit 17637c6575

@ -576,17 +576,52 @@ namespace MWRender
return Mask_Static; return Mask_Static;
} }
void ObjectPaging::enableObject(const ESM::RefNum & refnum, bool enabled) struct ClearCacheFunctor
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mDisabledMutex); void operator()(MWRender::ChunkId id, osg::Object* obj)
if (enabled) mDisabled.erase(refnum); {
else mDisabled.insert(refnum); if (intersects(id, mPosition))
mToClear.insert(id);
}
bool intersects(ChunkId id, osg::Vec3f pos)
{
pos /= ESM::Land::REAL_SIZE;
osg::Vec2f center = std::get<0>(id);
float halfSize = std::get<1>(id)/2;
return pos.x() >= center.x()-halfSize && pos.y() >= center.y()-halfSize && pos.x() <= center.x()+halfSize && pos.y() <= center.y()+halfSize;
}
osg::Vec3f mPosition;
std::set<MWRender::ChunkId> mToClear;
};
bool ObjectPaging::enableObject(int type, const ESM::RefNum & refnum, const osg::Vec3f& pos, bool enabled)
{
if (!typeFilter(type, false))
return false;
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mDisabledMutex);
if (enabled && !mDisabled.erase(refnum)) return false;
if (!enabled && !mDisabled.insert(refnum).second) return false;
}
ClearCacheFunctor ccf;
ccf.mPosition = pos;
mCache->call(ccf);
for (auto chunk : ccf.mToClear)
mCache->removeFromObjectCache(chunk);
return true;
} }
void ObjectPaging::clear() void ObjectPaging::clear()
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mDisabledMutex); {
mDisabled.clear(); OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mDisabledMutex);
if (mDisabled.empty())
return;
mDisabled.clear();
}
mCache->clear();
} }
void ObjectPaging::reportStats(unsigned int frameNumber, osg::Stats *stats) const void ObjectPaging::reportStats(unsigned int frameNumber, osg::Stats *stats) const

@ -33,7 +33,9 @@ namespace MWRender
virtual unsigned int getNodeMask() override; virtual unsigned int getNodeMask() override;
void enableObject(const ESM::RefNum & refnum, bool enabled); /// @return true if something changed
bool enableObject(int type, const ESM::RefNum & refnum, const osg::Vec3f& pos, bool enabled);
void clear(); void clear();
void reportStats(unsigned int frameNumber, osg::Stats* stats) const override; void reportStats(unsigned int frameNumber, osg::Stats* stats) const override;

@ -1481,9 +1481,9 @@ namespace MWRender
{ {
mTerrain->setActiveGrid(grid); mTerrain->setActiveGrid(grid);
} }
void RenderingManager::pagingEnableObject(const ESM::RefNum & refnum, bool enabled) void RenderingManager::pagingEnableObject(int type, const MWWorld::ConstPtr& ptr, bool enabled)
{ {
if (mObjectPaging) if (mObjectPaging && mObjectPaging->enableObject(type, ptr.getCellRef().getRefNum(), ptr.getRefData().getPosition().asVec3(), enabled))
mObjectPaging->enableObject(refnum, enabled); mTerrain->clearCachedViews(ptr.getRefData().getPosition().asVec3());
} }
} }

@ -241,7 +241,7 @@ namespace MWRender
void setActiveGrid(const osg::Vec4i &grid); void setActiveGrid(const osg::Vec4i &grid);
void pagingEnableObject(const ESM::RefNum & refnum, bool enabled); void pagingEnableObject(int type, const MWWorld::ConstPtr& ptr, bool enabled);
private: private:
void updateProjectionMatrix(); void updateProjectionMatrix();

@ -815,7 +815,10 @@ namespace MWWorld
mWorldScene->addObjectToScene (reference); mWorldScene->addObjectToScene (reference);
if (reference.getCellRef().getRefNum().hasContentFile()) if (reference.getCellRef().getRefNum().hasContentFile())
mRendering->pagingEnableObject(reference.getCellRef().getRefNum(), true); {
int type = mStore.find(Misc::StringUtils::lowerCase(reference.getCellRef().getRefId()));
mRendering->pagingEnableObject(type, reference, true);
}
} }
} }
@ -853,7 +856,10 @@ namespace MWWorld
reference.getRefData().disable(); reference.getRefData().disable();
if (reference.getCellRef().getRefNum().hasContentFile()) if (reference.getCellRef().getRefNum().hasContentFile())
mRendering->pagingEnableObject(reference.getCellRef().getRefNum(), false); {
int type = mStore.find(Misc::StringUtils::lowerCase(reference.getCellRef().getRefId()));
mRendering->pagingEnableObject(type, reference, false);
}
if(mWorldScene->getActiveCells().find (reference.getCell())!=mWorldScene->getActiveCells().end() && reference.getRefData().getCount()) if(mWorldScene->getActiveCells().find (reference.getCell())!=mWorldScene->getActiveCells().end() && reference.getRefData().getCount())
mWorldScene->removeObjectFromScene (reference); mWorldScene->removeObjectFromScene (reference);

@ -161,13 +161,13 @@ class GenericObjectCache : public osg::Referenced
} }
} }
/** call operator()(osg::Object*) for each object in the cache. */ /** call operator()(KeyType, osg::Object*) for each object in the cache. */
template <class Functor> template <class Functor>
void call(Functor& f) void call(Functor& f)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_objectCacheMutex); OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_objectCacheMutex);
for (typename ObjectCacheMap::iterator it = _objectCache.begin(); it != _objectCache.end(); ++it) for (typename ObjectCacheMap::iterator it = _objectCache.begin(); it != _objectCache.end(); ++it)
f(it->second.first.get()); f(it->first, it->second.first.get());
} }
/** Get the number of objects in the cache. */ /** Get the number of objects in the cache. */

@ -574,4 +574,11 @@ void QuadTreeWorld::addChunkManager(QuadTreeWorld::ChunkManager* m)
mTerrainRoot->setNodeMask(mTerrainRoot->getNodeMask()|m->getNodeMask()); mTerrainRoot->setNodeMask(mTerrainRoot->getNodeMask()|m->getNodeMask());
} }
void QuadTreeWorld::clearCachedViews(const osg::Vec3f &pos)
{
//mViewDataMap->clear();
osg::Vec3 pos_ = pos / mStorage->getCellWorldSize();
mViewDataMap->clearCachedViews(pos_);
}
} }

@ -40,6 +40,7 @@ namespace Terrain
View* createView(); View* createView();
void preload(View* view, const osg::Vec3f& eyePoint, const osg::Vec4i &cellgrid, std::atomic<bool>& abort, std::atomic<int>& progress, int& progressRange); void preload(View* view, const osg::Vec3f& eyePoint, const osg::Vec4i &cellgrid, std::atomic<bool>& abort, std::atomic<int>& progress, int& progressRange);
void storeView(const View* view, double referenceTime); void storeView(const View* view, double referenceTime);
void clearCachedViews(const osg::Vec3f& pos) override;
void reportStats(unsigned int frameNumber, osg::Stats* stats); void reportStats(unsigned int frameNumber, osg::Stats* stats);

@ -25,7 +25,7 @@ struct UpdateTextureFilteringFunctor
} }
Resource::SceneManager* mSceneManager; Resource::SceneManager* mSceneManager;
void operator()(osg::Object* obj) void operator()(std::string, osg::Object* obj)
{ {
mSceneManager->applyFilterSettings(static_cast<osg::Texture2D*>(obj)); mSceneManager->applyFilterSettings(static_cast<osg::Texture2D*>(obj));
} }

@ -1,5 +1,7 @@
#include "viewdata.hpp" #include "viewdata.hpp"
#include "quadtreenode.hpp"
namespace Terrain namespace Terrain
{ {
@ -99,6 +101,18 @@ bool ViewData::contains(QuadTreeNode *node)
return false; return false;
} }
bool intersects(const osg::Vec2f& center, float halfSize, osg::Vec3f pos)
{
return (pos.x() >= center.x()-halfSize && pos.y() >= center.y()-halfSize && pos.x() <= center.x()+halfSize && pos.y() <= center.y()+halfSize);
}
void ViewData::clearCache(const osg::Vec3f &cellPos)
{
for (Entry& entry : mEntries)
if (entry.mNode && intersects(entry.mNode->getCenter(), entry.mNode->getSize()/2.f, cellPos))
entry.mRenderingNode = nullptr;
}
ViewData::Entry::Entry() ViewData::Entry::Entry()
: mNode(nullptr) : mNode(nullptr)
, mLodFlags(0) , mLodFlags(0)
@ -188,6 +202,12 @@ void ViewDataMap::clearUnusedViews(double referenceTime)
} }
} }
void ViewDataMap::clearCachedViews(const osg::Vec3f &cellPos)
{
for (auto pair : mViews)
pair.second->clearCache(cellPos);
}
void ViewDataMap::clear() void ViewDataMap::clear()
{ {
mViews.clear(); mViews.clear();

@ -24,6 +24,7 @@ namespace Terrain
void reset(); void reset();
void clear(); void clear();
void clearCache(const osg::Vec3f &cellPos);
bool contains(QuadTreeNode* node); bool contains(QuadTreeNode* node);
@ -84,6 +85,7 @@ namespace Terrain
ViewData* createOrReuseView(); ViewData* createOrReuseView();
void clearUnusedViews(double referenceTime); void clearUnusedViews(double referenceTime);
void clearCachedViews(const osg::Vec3f &cellPos);
void clear(); void clear();

@ -153,6 +153,8 @@ namespace Terrain
/// @note Not thread safe. /// @note Not thread safe.
virtual void storeView(const View* view, double referenceTime) {} virtual void storeView(const View* view, double referenceTime) {}
virtual void clearCachedViews(const osg::Vec3f& pos) {}
virtual void reportStats(unsigned int frameNumber, osg::Stats* stats) {} virtual void reportStats(unsigned int frameNumber, osg::Stats* stats) {}
virtual void setViewDistance(float distance) {} virtual void setViewDistance(float distance) {}

Loading…
Cancel
Save