From b866323cf31f4714960d6e7284af7ba35d37df3e Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 27 Sep 2011 10:08:07 +0200 Subject: [PATCH] Issue #31: create new exterior cells on the fly --- apps/openmw/mwworld/cells.cpp | 22 +++++++++++++++++++--- apps/openmw/mwworld/cells.hpp | 7 ++++++- apps/openmw/mwworld/world.cpp | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwworld/cells.cpp b/apps/openmw/mwworld/cells.cpp index 7d04cfc687..143ce557b5 100644 --- a/apps/openmw/mwworld/cells.cpp +++ b/apps/openmw/mwworld/cells.cpp @@ -4,6 +4,8 @@ #include +#include "world.hpp" + MWWorld::Ptr::CellStore *MWWorld::Cells::getCellStore (const ESM::Cell *cell) { if (cell->data.flags & ESM::Cell::Interior) @@ -33,8 +35,8 @@ MWWorld::Ptr::CellStore *MWWorld::Cells::getCellStore (const ESM::Cell *cell) } } -MWWorld::Cells::Cells (const ESMS::ESMStore& store, ESM::ESMReader& reader) -: mStore (store), mReader (reader) {} +MWWorld::Cells::Cells (const ESMS::ESMStore& store, ESM::ESMReader& reader, MWWorld::World& world) +: mStore (store), mReader (reader), mWorld (world) {} MWWorld::Ptr::CellStore *MWWorld::Cells::getExterior (int x, int y) { @@ -43,7 +45,21 @@ MWWorld::Ptr::CellStore *MWWorld::Cells::getExterior (int x, int y) if (result==mExteriors.end()) { - const ESM::Cell *cell = mStore.cells.findExt (x, y); + const ESM::Cell *cell = mStore.cells.searchExt (x, y); + + if (!cell) + { + // Cell isn't predefined. Make one on the fly. + ESM::Cell record; + + record.data.flags = 0; + record.data.gridX = x; + record.data.gridY = y; + record.water = 0; + record.mapColor = 0; + + cell = mWorld.createRecord (record); + } result = mExteriors.insert (std::make_pair ( std::make_pair (x, y), Ptr::CellStore (cell))).first; diff --git a/apps/openmw/mwworld/cells.hpp b/apps/openmw/mwworld/cells.hpp index 661969881f..0ecbd02d37 100644 --- a/apps/openmw/mwworld/cells.hpp +++ b/apps/openmw/mwworld/cells.hpp @@ -18,6 +18,8 @@ namespace ESM namespace MWWorld { + class World; + /// \brief Cell container class Cells { @@ -25,6 +27,7 @@ namespace MWWorld ESM::ESMReader& mReader; std::map mInteriors; std::map, Ptr::CellStore> mExteriors; + MWWorld::World& mWorld; Cells (const Cells&); Cells& operator= (const Cells&); @@ -33,7 +36,9 @@ namespace MWWorld public: - Cells (const ESMS::ESMStore& store, ESM::ESMReader& reader); + Cells (const ESMS::ESMStore& store, ESM::ESMReader& reader, MWWorld::World& world); + ///< \todo pass the dynamic part of the ESMStore isntead (once it is written) of the whole + /// world Ptr::CellStore *getExterior (int x, int y); diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index cbc940ec79..906d92c9f1 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -214,7 +214,7 @@ namespace MWWorld const std::string& master, const boost::filesystem::path& resDir, bool newGame, Environment& environment, const std::string& encoding) : mScene (renderer,physEng), mPlayer (0), mGlobalVariables (0), - mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm) + mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) { mPhysEngine = physEng;