1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-04-07 13:20:25 +00:00

Nothing can be loaded yet. Just foundations.

This commit is contained in:
florent.teppe 2023-01-22 12:18:20 +01:00
parent 0f9bb71534
commit cddf6f29d6
5 changed files with 66 additions and 1 deletions

View File

@ -51,10 +51,17 @@ namespace ESM
struct BodyPart; struct BodyPart;
} }
namespace ESM4
{
class Reader;
struct Cell;
}
namespace MWWorld namespace MWWorld
{ {
class ESMStore; class ESMStore;
struct CellStoreImp; struct CellStoreImp;
typedef std::variant<const ESM4::Cell*, const ESM::Cell*> CellVariant;
using CellStoreTuple = std::tuple<CellRefList<ESM::Activator>, CellRefList<ESM::Potion>, using CellStoreTuple = std::tuple<CellRefList<ESM::Activator>, CellRefList<ESM::Potion>,
CellRefList<ESM::Apparatus>, CellRefList<ESM::Armor>, CellRefList<ESM::Book>, CellRefList<ESM::Clothing>, CellRefList<ESM::Apparatus>, CellRefList<ESM::Armor>, CellRefList<ESM::Book>, CellRefList<ESM::Clothing>,
@ -86,6 +93,7 @@ namespace MWWorld
std::unique_ptr<ESM::FogState> mFogState; std::unique_ptr<ESM::FogState> mFogState;
const ESM::Cell* mCell; const ESM::Cell* mCell;
CellVariant mCellVariant;
State mState; State mState;
bool mHasState; bool mHasState;
std::vector<ESM::RefId> mIds; std::vector<ESM::RefId> mIds;

View File

@ -1183,6 +1183,31 @@ namespace MWWorld
} }
return name; return name;
} }
// ESM4 Cell
//=========================================================================
const ESM4::Cell* Store<ESM4::Cell>::searchCellName(std::string_view cellName) const
{
const auto foundCell = mCellNameIndex.find(cellName);
if (foundCell == mCellNameIndex.end())
return nullptr;
return foundCell->second;
}
ESM4::Cell* Store<ESM4::Cell>::insert(const ESM4::Cell& item, bool overrideOnly)
{
auto cellPtr = TypedDynamicStore<ESM4::Cell>::insert(item, overrideOnly);
mCellNameIndex[cellPtr->mEditorId] = cellPtr;
return cellPtr;
}
ESM4::Cell* Store<ESM4::Cell>::insertStatic(const ESM4::Cell& item)
{
auto cellPtr = TypedDynamicStore<ESM4::Cell>::insertStatic(item);
mCellNameIndex[cellPtr->mEditorId] = cellPtr;
return cellPtr;
}
} }
template class MWWorld::TypedDynamicStore<ESM::Activator>; template class MWWorld::TypedDynamicStore<ESM::Activator>;

View File

@ -15,6 +15,7 @@
#include <components/esm3/loadgmst.hpp> #include <components/esm3/loadgmst.hpp>
#include <components/esm3/loadland.hpp> #include <components/esm3/loadland.hpp>
#include <components/esm3/loadpgrd.hpp> #include <components/esm3/loadpgrd.hpp>
#include <components/esm4/loadcell.hpp>
#include <components/misc/rng.hpp> #include <components/misc/rng.hpp>
#include <components/misc/strings/algorithm.hpp> #include <components/misc/strings/algorithm.hpp>
@ -268,6 +269,19 @@ namespace MWWorld
const ESM::GameSetting* find(const std::string_view id) const; const ESM::GameSetting* find(const std::string_view id) const;
const ESM::GameSetting* search(const std::string_view id) const; const ESM::GameSetting* search(const std::string_view id) const;
}; };
template <>
class Store<ESM4::Cell> : public TypedDynamicStore<ESM4::Cell>
{
std::unordered_map<std::string, ESM4::Cell*, Misc::StringUtils::CiHash, Misc::StringUtils::CiEqual>
mCellNameIndex;
public:
const ESM4::Cell* searchCellName(std::string_view) const;
ESM4::Cell* insert(const ESM4::Cell& item, bool overrideOnly = false);
ESM4::Cell* insertStatic(const ESM4::Cell& item);
};
template <> template <>
class Store<ESM::Land> : public DynamicStore class Store<ESM::Land> : public DynamicStore
{ {

View File

@ -253,6 +253,17 @@ const ESM::Cell* MWWorld::WorldModel::getESMCellByName(std::string_view name)
return cell; return cell;
} }
MWWorld::CellVariant MWWorld::WorldModel::getCellByName(std::string_view name)
{
const ESM::Cell* cellEsm3 = getESMCellByName(name);
return cellEsm3;
if (!cellEsm3)
{
const ESM4::Cell* cellESM4 = mStore.get<ESM4::Cell>().searchCellName(name);
return cellESM4;
}
}
MWWorld::CellStore* MWWorld::WorldModel::getCell(std::string_view name) MWWorld::CellStore* MWWorld::WorldModel::getCell(std::string_view name)
{ {
const ESM::Cell* cell = getESMCellByName(name); const ESM::Cell* cell = getESMCellByName(name);

View File

@ -5,6 +5,7 @@
#include <map> #include <map>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include <variant>
#include <components/misc/algorithm.hpp> #include <components/misc/algorithm.hpp>
@ -21,6 +22,11 @@ namespace ESM
struct RefNum; struct RefNum;
} }
namespace ESM4
{
struct Cell;
}
namespace Loading namespace Loading
{ {
class Listener; class Listener;
@ -45,8 +51,9 @@ namespace MWWorld
WorldModel& operator=(const WorldModel&); WorldModel& operator=(const WorldModel&);
const ESM::Cell* getESMCellByName(std::string_view name); const ESM::Cell* getESMCellByName(std::string_view name);
CellStore* getCellStore(const ESM::Cell* cell); CellVariant getCellByName(std::string_view name);
CellStore* getCellStore(const ESM::Cell* cell);
Ptr getPtrAndCache(const ESM::RefId& name, CellStore& cellStore); Ptr getPtrAndCache(const ESM::RefId& name, CellStore& cellStore);
Ptr getPtr(CellStore& cellStore, const ESM::RefId& id, const ESM::RefNum& refNum); Ptr getPtr(CellStore& cellStore, const ESM::RefId& id, const ESM::RefNum& refNum);