1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-07-05 16:11:35 +00:00

disablesupprort

Signed-off-by: Bret Curtis <psi29a@gmail.com>
This commit is contained in:
bzzt 2019-08-03 13:37:00 +00:00 committed by Bret Curtis
parent d684f1a78f
commit c0f128bcb3
6 changed files with 84 additions and 36 deletions

View file

@ -171,7 +171,7 @@ namespace MWRender
osg::Vec3f worldCenter = osg::Vec3f(center.x(), center.y(), 0)*ESM::Land::REAL_SIZE; osg::Vec3f worldCenter = osg::Vec3f(center.x(), center.y(), 0)*ESM::Land::REAL_SIZE;
osg::Vec3f relativeViewPoint = viewPoint - worldCenter; osg::Vec3f relativeViewPoint = viewPoint - worldCenter;
std::vector<ESM::CellRef> refs; std::map<ESM::RefNum, ESM::CellRef> refs;
std::vector<ESM::ESMReader> esm; std::vector<ESM::ESMReader> esm;
const MWWorld::ESMStore& store = MWBase::Environment::get().getWorld()->getStore(); const MWWorld::ESMStore& store = MWBase::Environment::get().getWorld()->getStore();
@ -197,8 +197,8 @@ namespace MWRender
if (std::find(cell->mMovedRefs.begin(), cell->mMovedRefs.end(), ref.mRefNum) != cell->mMovedRefs.end()) continue; if (std::find(cell->mMovedRefs.begin(), cell->mMovedRefs.end(), ref.mRefNum) != cell->mMovedRefs.end()) continue;
int type = store.findStatic(Misc::StringUtils::lowerCase(ref.mRefID)); int type = store.findStatic(Misc::StringUtils::lowerCase(ref.mRefID));
if (!typeFilter(type,size>=2)) continue; if (!typeFilter(type,size>=2)) continue;
if (deleted) continue; if (deleted) { refs.erase(ref.mRefNum); continue; }
refs.push_back(ref); refs[ref.mRefNum] = ref;
} }
} }
catch (std::exception& e) catch (std::exception& e)
@ -210,18 +210,25 @@ namespace MWRender
{ {
ESM::CellRef ref = it->first; ESM::CellRef ref = it->first;
bool deleted = it->second; bool deleted = it->second;
if (deleted) continue; if (deleted) { refs.erase(ref.mRefNum); continue; }
int type = store.findStatic(Misc::StringUtils::lowerCase(ref.mRefID)); int type = store.findStatic(Misc::StringUtils::lowerCase(ref.mRefID));
if (!typeFilter(type,size>=2)) continue; if (!typeFilter(type,size>=2)) continue;
refs.push_back(ref); refs[ref.mRefNum] = ref;
} }
} }
} }
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mDisabledMutex);
for (auto disabled : mDisabled)
refs.erase(disabled);
}
osg::Vec2f minBound = (center - osg::Vec2f(size/2.f, size/2.f)); osg::Vec2f minBound = (center - osg::Vec2f(size/2.f, size/2.f));
osg::Vec2f maxBound = (center + osg::Vec2f(size/2.f, size/2.f)); osg::Vec2f maxBound = (center + osg::Vec2f(size/2.f, size/2.f));
for (const ESM::CellRef& ref : refs) for (const auto& pair : refs)
{ {
const ESM::CellRef& ref = pair.second;
std::string id = Misc::StringUtils::lowerCase(ref.mRefID); std::string id = Misc::StringUtils::lowerCase(ref.mRefID);
if (id == "prisonmarker" || id == "divinemarker" || id == "templemarker" || id == "northmarker") if (id == "prisonmarker" || id == "divinemarker" || id == "templemarker" || id == "northmarker")
continue; // marker objects that have a hardcoded function in the game logic, should be hidden from the player continue; // marker objects that have a hardcoded function in the game logic, should be hidden from the player
@ -299,4 +306,16 @@ namespace MWRender
return Mask_Static; return Mask_Static;
} }
void ObjectPaging::enableObject(const ESM::RefNum & refnum, bool enabled)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mDisabledMutex);
if (enabled) mDisabled.erase(refnum);
else mDisabled.insert(refnum);
}
void ObjectPaging::clear()
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mDisabledMutex);
mDisabled.clear();
}
} }

View file

@ -5,6 +5,8 @@
#include <components/resource/resourcemanager.hpp> #include <components/resource/resourcemanager.hpp>
#include <components/esm/loadcell.hpp> #include <components/esm/loadcell.hpp>
#include <OpenThreads/Mutex>
namespace Resource namespace Resource
{ {
class SceneManager; class SceneManager;
@ -33,10 +35,16 @@ namespace MWRender
virtual unsigned int getNodeMask() override; virtual unsigned int getNodeMask() override;
void enableObject(const ESM::RefNum & refnum, bool enabled);
void clear();
private: private:
Resource::SceneManager* mSceneManager; Resource::SceneManager* mSceneManager;
bool mMergeGeometry; bool mMergeGeometry;
float mMinSize; float mMinSize;
OpenThreads::Mutex mDisabledMutex;
std::set<ESM::RefNum> mDisabled;
}; };
} }

View file

@ -1119,6 +1119,8 @@ namespace MWRender
mSky->setMoonColour(false); mSky->setMoonColour(false);
notifyWorldSpaceChanged(); notifyWorldSpaceChanged();
if (mObjectPaging)
mObjectPaging->clear();
} }
MWRender::Animation* RenderingManager::getAnimation(const MWWorld::Ptr &ptr) MWRender::Animation* RenderingManager::getAnimation(const MWWorld::Ptr &ptr)
@ -1480,4 +1482,9 @@ namespace MWRender
{ {
mTerrain->setActiveGrid(grid); mTerrain->setActiveGrid(grid);
} }
void RenderingManager::pagingEnableObject(const ESM::RefNum & refnum, bool enabled)
{
if (mObjectPaging)
mObjectPaging->enableObject(refnum, enabled);
}
} }

View file

@ -42,6 +42,7 @@ namespace osgViewer
namespace ESM namespace ESM
{ {
struct Cell; struct Cell;
struct RefNum;
} }
namespace Terrain namespace Terrain
@ -240,6 +241,8 @@ namespace MWRender
void setActiveGrid(const osg::Vec4i &grid); void setActiveGrid(const osg::Vec4i &grid);
void pagingEnableObject(const ESM::RefNum & refnum, bool enabled);
private: private:
void updateProjectionMatrix(); void updateProjectionMatrix();
void updateTextureFiltering(); void updateTextureFiltering();

View file

@ -106,7 +106,7 @@ namespace
template<typename RecordType, typename T> template<typename RecordType, typename T>
void readReferenceCollection (ESM::ESMReader& reader, void readReferenceCollection (ESM::ESMReader& reader,
MWWorld::CellRefList<T>& collection, const ESM::CellRef& cref, const std::map<int, int>& contentFileMap) MWWorld::CellRefList<T>& collection, const ESM::CellRef& cref, const std::map<int, int>& contentFileMap, MWWorld::CellStore* cellstore)
{ {
const MWWorld::ESMStore& esmStore = MWBase::Environment::get().getWorld()->getStore(); const MWWorld::ESMStore& esmStore = MWBase::Environment::get().getWorld()->getStore();
@ -142,6 +142,11 @@ namespace
{ {
// overwrite existing reference // overwrite existing reference
iter->load (state); iter->load (state);
if (!iter->mData.isEnabled())
{
iter->mData.enable();
MWBase::Environment::get().getWorld()->disable(MWWorld::Ptr(&*iter, cellstore));
}
return; return;
} }
@ -809,107 +814,107 @@ namespace MWWorld
{ {
case ESM::REC_ACTI: case ESM::REC_ACTI:
readReferenceCollection<ESM::ObjectState> (reader, mActivators, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mActivators, cref, contentFileMap, this);
break; break;
case ESM::REC_ALCH: case ESM::REC_ALCH:
readReferenceCollection<ESM::ObjectState> (reader, mPotions, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mPotions, cref, contentFileMap, this);
break; break;
case ESM::REC_APPA: case ESM::REC_APPA:
readReferenceCollection<ESM::ObjectState> (reader, mAppas, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mAppas, cref, contentFileMap, this);
break; break;
case ESM::REC_ARMO: case ESM::REC_ARMO:
readReferenceCollection<ESM::ObjectState> (reader, mArmors, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mArmors, cref, contentFileMap, this);
break; break;
case ESM::REC_BOOK: case ESM::REC_BOOK:
readReferenceCollection<ESM::ObjectState> (reader, mBooks, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mBooks, cref, contentFileMap, this);
break; break;
case ESM::REC_CLOT: case ESM::REC_CLOT:
readReferenceCollection<ESM::ObjectState> (reader, mClothes, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mClothes, cref, contentFileMap, this);
break; break;
case ESM::REC_CONT: case ESM::REC_CONT:
readReferenceCollection<ESM::ContainerState> (reader, mContainers, cref, contentFileMap); readReferenceCollection<ESM::ContainerState> (reader, mContainers, cref, contentFileMap, this);
break; break;
case ESM::REC_CREA: case ESM::REC_CREA:
readReferenceCollection<ESM::CreatureState> (reader, mCreatures, cref, contentFileMap); readReferenceCollection<ESM::CreatureState> (reader, mCreatures, cref, contentFileMap, this);
break; break;
case ESM::REC_DOOR: case ESM::REC_DOOR:
readReferenceCollection<ESM::DoorState> (reader, mDoors, cref, contentFileMap); readReferenceCollection<ESM::DoorState> (reader, mDoors, cref, contentFileMap, this);
break; break;
case ESM::REC_INGR: case ESM::REC_INGR:
readReferenceCollection<ESM::ObjectState> (reader, mIngreds, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mIngreds, cref, contentFileMap, this);
break; break;
case ESM::REC_LEVC: case ESM::REC_LEVC:
readReferenceCollection<ESM::CreatureLevListState> (reader, mCreatureLists, cref, contentFileMap); readReferenceCollection<ESM::CreatureLevListState> (reader, mCreatureLists, cref, contentFileMap, this);
break; break;
case ESM::REC_LEVI: case ESM::REC_LEVI:
readReferenceCollection<ESM::ObjectState> (reader, mItemLists, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mItemLists, cref, contentFileMap, this);
break; break;
case ESM::REC_LIGH: case ESM::REC_LIGH:
readReferenceCollection<ESM::ObjectState> (reader, mLights, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mLights, cref, contentFileMap, this);
break; break;
case ESM::REC_LOCK: case ESM::REC_LOCK:
readReferenceCollection<ESM::ObjectState> (reader, mLockpicks, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mLockpicks, cref, contentFileMap, this);
break; break;
case ESM::REC_MISC: case ESM::REC_MISC:
readReferenceCollection<ESM::ObjectState> (reader, mMiscItems, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mMiscItems, cref, contentFileMap, this);
break; break;
case ESM::REC_NPC_: case ESM::REC_NPC_:
readReferenceCollection<ESM::NpcState> (reader, mNpcs, cref, contentFileMap); readReferenceCollection<ESM::NpcState> (reader, mNpcs, cref, contentFileMap, this);
break; break;
case ESM::REC_PROB: case ESM::REC_PROB:
readReferenceCollection<ESM::ObjectState> (reader, mProbes, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mProbes, cref, contentFileMap, this);
break; break;
case ESM::REC_REPA: case ESM::REC_REPA:
readReferenceCollection<ESM::ObjectState> (reader, mRepairs, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mRepairs, cref, contentFileMap, this);
break; break;
case ESM::REC_STAT: case ESM::REC_STAT:
readReferenceCollection<ESM::ObjectState> (reader, mStatics, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mStatics, cref, contentFileMap, this);
break; break;
case ESM::REC_WEAP: case ESM::REC_WEAP:
readReferenceCollection<ESM::ObjectState> (reader, mWeapons, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mWeapons, cref, contentFileMap, this);
break; break;
case ESM::REC_BODY: case ESM::REC_BODY:
readReferenceCollection<ESM::ObjectState> (reader, mBodyParts, cref, contentFileMap); readReferenceCollection<ESM::ObjectState> (reader, mBodyParts, cref, contentFileMap, this);
break; break;
default: default:

View file

@ -814,6 +814,9 @@ namespace MWWorld
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->addObjectToScene (reference); mWorldScene->addObjectToScene (reference);
if (reference.getCellRef().getRefNum().hasContentFile())
mRendering->pagingEnableObject(reference.getCellRef().getRefNum(), true);
} }
} }
@ -838,20 +841,23 @@ namespace MWWorld
void World::disable (const Ptr& reference) void World::disable (const Ptr& reference)
{ {
if (!reference.getRefData().isEnabled())
return;
// disable is a no-op for items in containers // disable is a no-op for items in containers
if (!reference.isInCell()) if (!reference.isInCell())
return; return;
if (reference.getRefData().isEnabled()) if (reference == getPlayerPtr())
{ throw std::runtime_error("can not disable player object");
if (reference == getPlayerPtr())
throw std::runtime_error("can not disable player object");
reference.getRefData().disable(); reference.getRefData().disable();
if(mWorldScene->getActiveCells().find (reference.getCell())!=mWorldScene->getActiveCells().end() && reference.getRefData().getCount()) if (reference.getCellRef().getRefNum().hasContentFile())
mWorldScene->removeObjectFromScene (reference); mRendering->pagingEnableObject(reference.getCellRef().getRefNum(), false);
}
if(mWorldScene->getActiveCells().find (reference.getCell())!=mWorldScene->getActiveCells().end() && reference.getRefData().getCount())
mWorldScene->removeObjectFromScene (reference);
} }
void World::advanceTime (double hours, bool incremental) void World::advanceTime (double hours, bool incremental)