mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-26 14:56:39 +00:00 
			
		
		
		
	Merge branch 'farcells'
This commit is contained in:
		
						commit
						f6249c39d5
					
				
					 6 changed files with 71 additions and 8 deletions
				
			
		|  | @ -4,6 +4,8 @@ | |||
| 
 | ||||
| #include <algorithm> | ||||
| 
 | ||||
| #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; | ||||
|  |  | |||
|  | @ -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<std::string, Ptr::CellStore> mInteriors; | ||||
|             std::map<std::pair<int, int>, 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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  | @ -722,4 +722,27 @@ namespace MWWorld | |||
| 
 | ||||
|         return std::make_pair (stream.str(), created); | ||||
|     } | ||||
| 
 | ||||
|     const ESM::Cell *World::createRecord (const ESM::Cell& record) | ||||
|     { | ||||
|         if (record.data.flags & ESM::Cell::Interior) | ||||
|         { | ||||
|             if (mStore.cells.searchInt (record.name)) | ||||
|                 throw std::runtime_error ("failed creating interior cell"); | ||||
| 
 | ||||
|             ESM::Cell *cell = new ESM::Cell (record); | ||||
|             mStore.cells.intCells.insert (std::make_pair (record.name, cell)); | ||||
|             return cell; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             if (mStore.cells.searchExt (record.data.gridX, record.data.gridY)) | ||||
|                 throw std::runtime_error ("failed creating exterior cell"); | ||||
| 
 | ||||
|             ESM::Cell *cell = new ESM::Cell (record); | ||||
|             mStore.cells.extCells.insert ( | ||||
|                 std::make_pair (std::make_pair (record.data.gridX, record.data.gridY), cell)); | ||||
|             return cell; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -207,6 +207,10 @@ namespace MWWorld | |||
|             std::pair<std::string, const ESM::Class *> createRecord (const ESM::Class& record); | ||||
|             ///< Create a new recrod (of type class) in the ESM store.
 | ||||
|             /// \return ID, pointer to created record
 | ||||
| 
 | ||||
|             const ESM::Cell *createRecord (const ESM::Cell& record); | ||||
|             ///< Create a new recrod (of type cell) in the ESM store.
 | ||||
|             /// \return ID, pointer to created record
 | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -189,6 +189,9 @@ namespace ESMS | |||
|     { | ||||
|         assert (cell); | ||||
| 
 | ||||
|         if (cell->context.filename.empty()) | ||||
|             return; // this is a dynamically generated cell -> skipping.
 | ||||
| 
 | ||||
|         // Reopen the ESM reader and seek to the right position.
 | ||||
|         cell->restore (esm); | ||||
| 
 | ||||
|  | @ -212,6 +215,9 @@ namespace ESMS | |||
|     { | ||||
|       assert (cell); | ||||
| 
 | ||||
|         if (cell->context.filename.empty()) | ||||
|             return; // this is a dynamically generated cell -> skipping.
 | ||||
| 
 | ||||
|       // Reopen the ESM reader and seek to the right position.
 | ||||
|       cell->restore(esm); | ||||
| 
 | ||||
|  |  | |||
|  | @ -305,15 +305,24 @@ namespace ESMS | |||
|           delete it->second; | ||||
|     } | ||||
| 
 | ||||
|     const ESM::Cell* searchInt(const std::string &id) const | ||||
|     { | ||||
|       IntCells::const_iterator iter = intCells.find(id); | ||||
| 
 | ||||
|       if (iter!=intCells.end()) | ||||
|         return iter->second; | ||||
| 
 | ||||
|       return 0; | ||||
|     } | ||||
| 
 | ||||
|     const ESM::Cell* findInt(const std::string &id) const | ||||
|     { | ||||
|       IntCells::const_iterator it = intCells.find(id); | ||||
|       const ESM::Cell *cell = searchInt (id); | ||||
| 
 | ||||
|       if(it == intCells.end()) | ||||
|       if (!cell) | ||||
|          throw std::runtime_error ("Interior cell not found - " + id); | ||||
| 
 | ||||
|       return it->second; | ||||
|       return cell; | ||||
|     } | ||||
| 
 | ||||
|     const ESM::Cell *searchExt (int x, int y) const | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue