Merge remote-tracking branch 'scrawl/terrain'
commit
c85735abed
@ -0,0 +1,28 @@
|
|||||||
|
#include "land.hpp"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
|
||||||
|
Land::Land()
|
||||||
|
{
|
||||||
|
mLand.reset(new ESM::Land());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Land::load(ESM::ESMReader &esm)
|
||||||
|
{
|
||||||
|
mLand->load(esm);
|
||||||
|
|
||||||
|
std::ostringstream stream;
|
||||||
|
stream << "#" << mLand->mX << " " << mLand->mY;
|
||||||
|
|
||||||
|
mId = stream.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Land::blank()
|
||||||
|
{
|
||||||
|
/// \todo
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef CSM_WORLD_LAND_H
|
||||||
|
#define CSM_WORLD_LAND_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include <components/esm/loadland.hpp>
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
/// \brief Wrapper for Land record. Encodes X and Y cell index in the ID.
|
||||||
|
///
|
||||||
|
/// \todo Add worldspace support to the Land record.
|
||||||
|
/// \todo Add a proper copy constructor (currently worked around using shared_ptr)
|
||||||
|
struct Land
|
||||||
|
{
|
||||||
|
Land();
|
||||||
|
|
||||||
|
boost::shared_ptr<ESM::Land> mLand;
|
||||||
|
|
||||||
|
std::string mId;
|
||||||
|
|
||||||
|
/// Loads the metadata and ID
|
||||||
|
void load (ESM::ESMReader &esm);
|
||||||
|
|
||||||
|
void blank();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,21 @@
|
|||||||
|
#include "landtexture.hpp"
|
||||||
|
|
||||||
|
#include <components/esm/esmreader.hpp>
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
|
||||||
|
void LandTexture::load(ESM::ESMReader &esm)
|
||||||
|
{
|
||||||
|
ESM::LandTexture::load(esm);
|
||||||
|
|
||||||
|
int plugin = esm.getIndex();
|
||||||
|
|
||||||
|
std::ostringstream stream;
|
||||||
|
|
||||||
|
stream << mIndex << "_" << plugin;
|
||||||
|
|
||||||
|
mId = stream.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef CSM_WORLD_LANDTEXTURE_H
|
||||||
|
#define CSM_WORLD_LANDTEXTURE_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <components/esm/loadltex.hpp>
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
/// \brief Wrapper for LandTexture record. Encodes mIndex and the plugin index (obtained from ESMReader)
|
||||||
|
/// in the ID.
|
||||||
|
///
|
||||||
|
/// \attention The mId field of the ESM::LandTexture struct is not used.
|
||||||
|
struct LandTexture : public ESM::LandTexture
|
||||||
|
{
|
||||||
|
std::string mId;
|
||||||
|
|
||||||
|
void load (ESM::ESMReader &esm);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,43 @@
|
|||||||
|
#include "terrainstorage.hpp"
|
||||||
|
|
||||||
|
namespace CSVRender
|
||||||
|
{
|
||||||
|
|
||||||
|
TerrainStorage::TerrainStorage(const CSMWorld::Data &data)
|
||||||
|
: mData(data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ESM::Land* TerrainStorage::getLand(int cellX, int cellY)
|
||||||
|
{
|
||||||
|
std::ostringstream stream;
|
||||||
|
stream << "#" << cellX << " " << cellY;
|
||||||
|
|
||||||
|
// The cell isn't guaranteed to have Land. This is because the terrain implementation
|
||||||
|
// has to wrap the vertices of the last row and column to the next cell, which may be a nonexisting cell
|
||||||
|
int index = mData.getLand().searchId(stream.str());
|
||||||
|
if (index == -1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ESM::Land* land = mData.getLand().getRecord(index).get().mLand.get();
|
||||||
|
int mask = ESM::Land::DATA_VHGT | ESM::Land::DATA_VNML | ESM::Land::DATA_VCLR | ESM::Land::DATA_VTEX;
|
||||||
|
if (!land->isDataLoaded(mask))
|
||||||
|
land->loadData(mask);
|
||||||
|
return land;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ESM::LandTexture* TerrainStorage::getLandTexture(int index, short plugin)
|
||||||
|
{
|
||||||
|
std::ostringstream stream;
|
||||||
|
stream << index << "_" << plugin;
|
||||||
|
|
||||||
|
return &mData.getLandTextures().getRecord(stream.str()).get();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TerrainStorage::getBounds(float &minX, float &maxX, float &minY, float &maxY)
|
||||||
|
{
|
||||||
|
// not needed at the moment - this returns the bounds of the whole world, but we only edit individual cells
|
||||||
|
throw std::runtime_error("getBounds not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef OPENCS_RENDER_TERRAINSTORAGE_H
|
||||||
|
#define OPENCS_RENDER_TERRAINSTORAGE_H
|
||||||
|
|
||||||
|
#include <components/esmterrain/storage.hpp>
|
||||||
|
|
||||||
|
#include "../../model/world/data.hpp"
|
||||||
|
|
||||||
|
namespace CSVRender
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A bridge between the terrain component and OpenCS's terrain data storage.
|
||||||
|
*/
|
||||||
|
class TerrainStorage : public ESMTerrain::Storage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TerrainStorage(const CSMWorld::Data& data);
|
||||||
|
private:
|
||||||
|
const CSMWorld::Data& mData;
|
||||||
|
|
||||||
|
virtual ESM::Land* getLand (int cellX, int cellY);
|
||||||
|
virtual const ESM::LandTexture* getLandTexture(int index, short plugin);
|
||||||
|
|
||||||
|
virtual void getBounds(float& minX, float& maxX, float& minY, float& maxY);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue