diff --git a/components/esm/loadpgrd.cpp b/components/esm/loadpgrd.cpp index 39684c080..f04914f97 100644 --- a/components/esm/loadpgrd.cpp +++ b/components/esm/loadpgrd.cpp @@ -12,17 +12,17 @@ void Pathgrid::load(ESMReader &esm) // " " << data.s1 // << std::endl; - // Check that the sizes match up. Size = 16 * s2 (path points?) + // Check that the sizes match up. Size = 16 * s2 (path points) if (esm.isNextSub("PGRP")) { esm.getSubHeader(); int size = esm.getSubSize(); //std::cout << "PGRP size is " << size << std::endl; - if (size != 16 * data.s2) + if (size != sizeof(Point) * data.s2) esm.fail("Path grid table size mismatch"); else { - pointCount = data.s2; + int pointCount = data.s2; //std::cout << "Path grid points count is " << data.s2 << std::endl; points.reserve(pointCount); for (int i = 0; i < pointCount; ++i) @@ -41,30 +41,24 @@ void Pathgrid::load(ESMReader &esm) } } - // Size varies. Path grid chances? Connections? Multiples of 4 - // suggest either int or two shorts, or perhaps a float. Study - // it later. if (esm.isNextSub("PGRC")) { esm.getSubHeader(); - //esm.skipHSub(); int size = esm.getSubSize(); //std::cout << "PGRC size is " << size << std::endl; if (size % sizeof(int) != 0) esm.fail("PGRC size not a multiple of 8"); else { - edgeCount = size / sizeof(int) - 1; + int edgeCount = size / sizeof(int) - 1; //std::cout << "Path grid edge count is " << edgeCount << std::endl; edges.reserve(edgeCount); int prevValue; esm.getT(prevValue); - //esm.getExact(&prevValue, sizeof(int)); for (int i = 0; i < edgeCount; ++i) { int nextValue; esm.getT(nextValue); - //esm.getExact(&nextValue, sizeof(int)); Edge e; e.v0 = prevValue; e.v1 = nextValue; diff --git a/components/esm/loadpgrd.hpp b/components/esm/loadpgrd.hpp index da9fe33e3..6b01c906a 100644 --- a/components/esm/loadpgrd.hpp +++ b/components/esm/loadpgrd.hpp @@ -16,7 +16,7 @@ struct Pathgrid int x, y; // Grid location, matches cell for exterior cells short s1; // ?? Usually but not always a power of 2. Doesn't seem // to have any relation to the size of PGRC. - short s2; // Number of path points? Size of PGRP block is always 16 * s2; + short s2; // Number of path points. }; // 12 bytes struct Point // path grid point @@ -33,11 +33,11 @@ struct Pathgrid std::string cell; // Cell name DATAstruct data; - std::vector points; - int pointCount; + typedef std::vector PointList; + PointList points; - std::vector edges; - int edgeCount; + typedef std::vector EdgeList; + EdgeList edges; void load(ESMReader &esm); }; diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index eae2bb782..c4bcf84d8 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -123,8 +123,6 @@ namespace ESMS CellRefList statics; CellRefList weapons; - ESM::Pathgrid *pathgrid; - void load (const ESMStore &store, ESMReader &esm) { if (mState!=State_Loaded) @@ -136,8 +134,6 @@ namespace ESMS loadRefs (store, esm); - pathgrid = store.pathgrids.search(cell->data.gridX, cell->data.gridY, cell->name); - mState = State_Loaded; } } diff --git a/components/esm_store/reclists.hpp b/components/esm_store/reclists.hpp index 91357286d..4aacf2332 100644 --- a/components/esm_store/reclists.hpp +++ b/components/esm_store/reclists.hpp @@ -425,7 +425,7 @@ namespace ESMS count++; ESM::Pathgrid *grid = new ESM::Pathgrid; grid->load(esm); - if (grid->data.x == 0 && grid->data.y) + if (grid->data.x == 0 && grid->data.y == 0) { intGrids[grid->cell] = grid; } @@ -462,6 +462,21 @@ namespace ESMS } return result; } + + Pathgrid *search(const ESM::Cell &cell) const + { + int cellX, cellY; + if (cell.data.flags & ESM::Cell::Interior) + { + cellX = cellY = 0; + } + else + { + cellX = cell.data.gridX; + cellY = cell.data.gridY; + } + return search(cellX, cellY, cell.name); + } }; template