Merge remote-tracking branch 'scrawl/pathgrid'

moveref
Marc Zinnschlag 10 years ago
commit 19bd07648b

@ -95,7 +95,7 @@ namespace MWMechanics
* +----------------> * +---------------->
* high cost * high cost
*/ */
bool PathgridGraph::load(const ESM::Cell* cell) bool PathgridGraph::load(const MWWorld::CellStore *cell)
{ {
if(!cell) if(!cell)
return false; return false;
@ -103,10 +103,9 @@ namespace MWMechanics
if(mIsGraphConstructed) if(mIsGraphConstructed)
return true; return true;
mCell = cell; mCell = cell->getCell();
mIsExterior = cell->isExterior(); mIsExterior = cell->getCell()->isExterior();
mPathgrid = MWBase::Environment::get().getWorld()->getStore().get<ESM::Pathgrid>().search(*cell); mPathgrid = MWBase::Environment::get().getWorld()->getStore().get<ESM::Pathgrid>().search(*cell->getCell());
if(!mPathgrid) if(!mPathgrid)
return false; return false;

@ -21,7 +21,7 @@ namespace MWMechanics
public: public:
PathgridGraph(); PathgridGraph();
bool load(const ESM::Cell *cell); bool load(const MWWorld::CellStore *cell);
// returns true if end point is strongly connected (i.e. reachable // returns true if end point is strongly connected (i.e. reachable
// from start point) both start and end are pathgrid point indexes // from start point) both start and end are pathgrid point indexes

@ -231,8 +231,9 @@ void Debugging::togglePathgrid()
void Debugging::enableCellPathgrid(MWWorld::CellStore *store) void Debugging::enableCellPathgrid(MWWorld::CellStore *store)
{ {
MWBase::World* world = MWBase::Environment::get().getWorld();
const ESM::Pathgrid *pathgrid = const ESM::Pathgrid *pathgrid =
MWBase::Environment::get().getWorld()->getStore().get<ESM::Pathgrid>().search(*store->getCell()); world->getStore().get<ESM::Pathgrid>().search(*store->getCell());
if (!pathgrid) return; if (!pathgrid) return;
Vector3 cellPathGridPos(0, 0, 0); Vector3 cellPathGridPos(0, 0, 0);

@ -413,7 +413,7 @@ namespace MWWorld
// TODO: the pathgrid graph only needs to be loaded for active cells, so move this somewhere else. // TODO: the pathgrid graph only needs to be loaded for active cells, so move this somewhere else.
// In a simple test, loading the graph for all cells in MW + expansions took 200 ms // In a simple test, loading the graph for all cells in MW + expansions took 200 ms
mPathgridGraph.load(mCell); mPathgridGraph.load(this);
} }
} }

@ -141,6 +141,8 @@ namespace MWWorld
mStores[ESM::REC_SSCR] = &mStartScripts; mStores[ESM::REC_SSCR] = &mStartScripts;
mStores[ESM::REC_STAT] = &mStatics; mStores[ESM::REC_STAT] = &mStatics;
mStores[ESM::REC_WEAP] = &mWeapons; mStores[ESM::REC_WEAP] = &mWeapons;
mPathgrids.setCells(mCells);
} }
void clearDynamic () void clearDynamic ()

@ -849,15 +849,28 @@ namespace MWWorld
Interior mInt; Interior mInt;
Exterior mExt; Exterior mExt;
Store<ESM::Cell>* mCells;
public: public:
void load(ESM::ESMReader &esm, const std::string &id) { void setCells(Store<ESM::Cell>& cells)
{
mCells = &cells;
}
void load(ESM::ESMReader &esm, const std::string &id) {
ESM::Pathgrid pathgrid; ESM::Pathgrid pathgrid;
pathgrid.load(esm); pathgrid.load(esm);
// Unfortunately the Pathgrid record model does not specify whether the pathgrid belongs to an interior or exterior cell.
// For interior cells, mCell is the cell name, but for exterior cells it is either the cell name or if that doesn't exist, the cell's region name.
// mX and mY will be (0,0) for interior cells, but there is also an exterior cell with the coordinates of (0,0), so that doesn't help.
// Check whether mCell is an interior cell. This isn't perfect, will break if a Region with the same name as an interior cell is created.
// A proper fix should be made for future versions of the file format.
bool interior = mCells->search(pathgrid.mCell) != NULL;
// Try to overwrite existing record // Try to overwrite existing record
if (!pathgrid.mCell.empty()) if (interior)
{ {
std::pair<Interior::iterator, bool> ret = mInt.insert(std::make_pair(pathgrid.mCell, pathgrid)); std::pair<Interior::iterator, bool> ret = mInt.insert(std::make_pair(pathgrid.mCell, pathgrid));
if (!ret.second) if (!ret.second)
@ -865,8 +878,7 @@ namespace MWWorld
} }
else else
{ {
std::pair<Exterior::iterator, bool> ret = mExt.insert(std::make_pair(std::make_pair(pathgrid.mData.mX, pathgrid.mData.mY), std::pair<Exterior::iterator, bool> ret = mExt.insert(std::make_pair(std::make_pair(pathgrid.mData.mX, pathgrid.mData.mY), pathgrid));
pathgrid));
if (!ret.second) if (!ret.second)
ret.first->second = pathgrid; ret.first->second = pathgrid;
} }
@ -886,45 +898,47 @@ namespace MWWorld
return NULL; return NULL;
} }
const ESM::Pathgrid *find(int x, int y) const { const ESM::Pathgrid *search(const std::string& name) const {
const ESM::Pathgrid *ptr = search(x, y);
if (ptr == 0) {
std::ostringstream msg;
msg << "Pathgrid at (" << x << ", " << y << ") not found";
throw std::runtime_error(msg.str());
}
return ptr;
}
const ESM::Pathgrid *search(const std::string &name) const {
Interior::const_iterator it = mInt.find(name); Interior::const_iterator it = mInt.find(name);
if (it != mInt.end()) if (it != mInt.end())
return &(it->second); return &(it->second);
return NULL; return NULL;
} }
const ESM::Pathgrid *find(const std::string &name) const { const ESM::Pathgrid *find(int x, int y) const {
const ESM::Pathgrid *ptr = search(name); const ESM::Pathgrid* pathgrid = search(x,y);
if (ptr == 0) { if (!pathgrid)
{
std::ostringstream msg;
msg << "Pathgrid in cell '" << x << " " << y << "' not found";
throw std::runtime_error(msg.str());
}
return pathgrid;
}
const ESM::Pathgrid* find(const std::string& name) const {
const ESM::Pathgrid* pathgrid = search(name);
if (!pathgrid)
{
std::ostringstream msg; std::ostringstream msg;
msg << "Pathgrid in cell '" << name << "' not found"; msg << "Pathgrid in cell '" << name << "' not found";
throw std::runtime_error(msg.str()); throw std::runtime_error(msg.str());
} }
return ptr; return pathgrid;
} }
const ESM::Pathgrid *search(const ESM::Cell &cell) const { const ESM::Pathgrid *search(const ESM::Cell &cell) const {
if (cell.mData.mFlags & ESM::Cell::Interior) { if (!(cell.mData.mFlags & ESM::Cell::Interior))
return search(cell.mData.mX, cell.mData.mY);
else
return search(cell.mName); return search(cell.mName);
}
return search(cell.mData.mX, cell.mData.mY);
} }
const ESM::Pathgrid *find(const ESM::Cell &cell) const { const ESM::Pathgrid *find(const ESM::Cell &cell) const {
if (cell.mData.mFlags & ESM::Cell::Interior) { if (!(cell.mData.mFlags & ESM::Cell::Interior))
return find(cell.mData.mX, cell.mData.mY);
else
return find(cell.mName); return find(cell.mName);
}
return find(cell.mData.mX, cell.mData.mY);
} }
}; };

Loading…
Cancel
Save