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:
parent
d684f1a78f
commit
c0f128bcb3
6 changed files with 84 additions and 36 deletions
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue