- Add support for multiple esm contexts in cell store. This will allow to generate references from multiple esX files. Currently, only the first context is used.

- Add many TODOs to mark points where more work is required to fully implement this feature.
actorid
Mark Siewert 12 years ago
parent 64c08eada4
commit 7f77bf76c7

@ -45,10 +45,16 @@ namespace MWWorld
{
assert (cell);
if (cell->mContext.filename.empty())
if (cell->mContextList.size() == 0)
return; // this is a dynamically generated cell -> skipping.
// Load references from all plugins that do something with this cell.
// HACK: only use first entry for now, full support requires some more work
//for (int i = 0; i < cell->mContextList.size(); i++)
for (int i = 0; i < 1; i++)
{
// Reopen the ESM reader and seek to the right position.
// TODO: we will need to intoduce separate "esm"s, one per plugin!
cell->restore (esm);
ESM::CellRef ref;
@ -61,8 +67,11 @@ namespace MWWorld
std::transform (ref.mRefID.begin(), ref.mRefID.end(), std::back_inserter (lowerCase),
(int(*)(int)) std::tolower);
// TODO: support deletion / moving references out of the cell. no simple "push_back",
// but see what the plugin wants to do.
mIds.push_back (lowerCase);
}
}
std::sort (mIds.begin(), mIds.end());
}
@ -71,10 +80,16 @@ namespace MWWorld
{
assert (cell);
if (cell->mContext.filename.empty())
if (cell->mContextList.size() == 0)
return; // this is a dynamically generated cell -> skipping.
// Load references from all plugins that do something with this cell.
// HACK: only use first entry for now, full support requires some more work
//for (int i = 0; i < cell->mContextList.size(); i++)
for (int i = 0; i < 1; i++)
{
// Reopen the ESM reader and seek to the right position.
// TODO: we will need to intoduce separate "esm"s, one per plugin!
cell->restore(esm);
ESM::CellRef ref;
@ -126,3 +141,4 @@ namespace MWWorld
}
}
}
}

@ -62,6 +62,10 @@ namespace MWWorld
if(obj == NULL)
throw std::runtime_error("Error resolving cell reference " + ref.mRefID);
// TODO: this line must be modified for multiple plugins and moved references.
// This means: no simple "push back", but search for an existing reference with
// this ID first! If it exists, merge data into this list instead of just adding it.
// I'll probably generate a separate method jist for this.
list.push_back(LiveRef(ref, obj));
}

@ -2,6 +2,7 @@
#include <string>
#include <sstream>
#include <c++/4.6/list>
#include "esmreader.hpp"
#include "esmwriter.hpp"
@ -111,7 +112,7 @@ void Cell::load(ESMReader &esm)
}
// Save position of the cell references and move on
mContext = esm.getContext();
mContextList.push_back(esm.getContext());
esm.skipRecord();
}
@ -148,7 +149,8 @@ void Cell::save(ESMWriter &esm)
void Cell::restore(ESMReader &esm) const
{
esm.restoreContext(mContext);
// TODO: support all contexts in the list!
esm.restoreContext(mContextList[0]);
}
std::string Cell::getDescription() const
@ -167,6 +169,12 @@ std::string Cell::getDescription() const
bool Cell::getNextRef(ESMReader &esm, CellRef &ref)
{
// TODO: Add support for moved references. References moved without crossing a cell boundary simply
// overwrite old data. References moved across cell boundaries are using a different set of keywords,
// and I'll have to think more about how this can be done.
// TODO: Add support for multiple plugins. This requires a tricky renaming scheme for "ref.mRefnum".
// I'll probably add something to "ESMReader", we will need one per plugin anyway.
// TODO: Try and document reference numbering, I don't think this has been done anywhere else.
if (!esm.hasMoreSubs())
return false;

@ -2,6 +2,7 @@
#define OPENMW_ESM_CELL_H
#include <string>
#include <vector>
#include "esmcommon.hpp"
#include "defs.hpp"
@ -120,7 +121,7 @@ struct Cell
// Optional region name for exterior and quasi-exterior cells.
std::string mRegion;
ESM_Context mContext; // File position
std::vector<ESM_Context> mContextList; // File position; multiple positions for multiple plugin support
DATAstruct mData;
AMBIstruct mAmbi;
float mWater; // Water level

2
extern/shiny vendored

@ -1 +1 @@
Subproject commit f17c4ebab0e7a1f3bbb25fd9b3dbef2bd742536a
Subproject commit 4750676ac46a7aaa86bca53dc68c5a1ba11f3bc1
Loading…
Cancel
Save