OpenMW
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
loadland.hpp
Go to the documentation of this file.
1 #ifndef OPENMW_ESM_LAND_H
2 #define OPENMW_ESM_LAND_H
3 
4 #include <stdint.h>
5 
7 
8 #include "esmcommon.hpp"
9 
10 namespace ESM
11 {
12 
13 class ESMReader;
14 class ESMWriter;
15 
16 /*
17  * Landscape data.
18  */
19 
20 struct Land
21 {
22  static unsigned int sRecordId;
24  static std::string getRecordType() { return "Land"; }
25 
26  Land();
27  ~Land();
28 
29  int mFlags; // Only first four bits seem to be used, don't know what
30  // they mean.
31  int mX, mY; // Map coordinates.
32  int mPlugin; // Plugin index, used to reference the correct material palette.
33 
34  // File context. This allows the ESM reader to be 'reset' to this
35  // location later when we are ready to load the full data set.
36  // In the editor, there may not be a file associated with the Land,
37  // in which case the filename will be empty.
39 
41 
42  enum
43  {
44  DATA_VNML = 1,
45  DATA_VHGT = 2,
46  DATA_WNAM = 4,
47  DATA_VCLR = 8,
48  DATA_VTEX = 16
49  };
50 
51  // default height to use in case there is no Land record
52  static const int DEFAULT_HEIGHT = -2048;
53 
54  // number of vertices per side
55  static const int LAND_SIZE = 65;
56 
57  // cell terrain size in world coords
59 
60  // total number of vertices
61  static const int LAND_NUM_VERTS = LAND_SIZE * LAND_SIZE;
62 
63  static const int HEIGHT_SCALE = 8;
64 
65  //number of textures per side of land
66  static const int LAND_TEXTURE_SIZE = 16;
67 
68  //total number of textures per land
70 
71  static const int LAND_GLOBAL_MAP_LOD_SIZE = 81;
72 
73 #pragma pack(push,1)
74  struct VHGT
75  {
78  short mUnk1;
79  char mUnk2;
80  };
81 #pragma pack(pop)
82 
83  typedef signed char VNML;
84 
85  struct LandData
86  {
88  : mHeightOffset(0)
89  , mMinHeight(0)
90  , mMaxHeight(0)
91  , mUnk1(0)
92  , mUnk2(0)
93  , mDataLoaded(0)
94  {
95  }
96 
97  // Initial reference height for the first vertex, only needed for filling mHeights
99  // Height in world space for each vertex
101  float mMinHeight;
102  float mMaxHeight;
103 
104  // 24-bit normals, these aren't always correct though. Edge and corner normals may be garbage.
106 
107  // 2D array of texture indices. An index can be used to look up an ESM::LandTexture,
108  // but to do so you must subtract 1 from the index first!
109  // An index of 0 indicates the default texture.
111 
112  // 24-bit RGB color for each vertex
113  unsigned char mColours[3 * LAND_NUM_VERTS];
114 
115  // ???
116  short mUnk1;
117  uint8_t mUnk2;
118 
120  };
121 
122  // low-LOD heightmap (used for rendering the global map)
124 
125  void load(ESMReader &esm, bool &isDeleted);
126  void save(ESMWriter &esm, bool isDeleted = false) const;
127 
128  void blank();
129 
134  void loadData(int flags, LandData* target = NULL) const;
135 
139  void unloadData() const;
140 
142  bool isDataLoaded(int flags) const;
143 
145  void setDataLoaded(int flags);
146 
147  Land (const Land& land);
148 
149  Land& operator= (Land land);
150 
151  void swap (Land& land);
152 
156  const LandData *getLandData (int flags) const;
157 
159  const LandData *getLandData() const;
160 
163 
167  void add (int flags);
168 
170  void remove (int flags);
171 
172  private:
173 
177  bool condLoad(ESM::ESMReader& reader, int flags, int& targetFlags, int dataFlag, void *ptr, unsigned int size) const;
178 
179  mutable LandData *mLandData;
180 };
181 
182 }
183 #endif
static const int LAND_NUM_TEXTURES
Definition: loadland.hpp:69
static const int LAND_NUM_VERTS
Definition: loadland.hpp:61
static unsigned int sRecordId
Definition: loadland.hpp:22
static const int LAND_GLOBAL_MAP_LOD_SIZE
Definition: loadland.hpp:71
Definition: esmreader.hpp:21
Definition: loadland.hpp:45
LandData * mLandData
Definition: loadland.hpp:179
short mUnk1
Definition: loadland.hpp:78
Land & operator=(Land land)
Definition: loadland.cpp:327
void save(ESMWriter &esm, bool isDeleted=false) const
Definition: loadland.cpp:111
Definition: loadland.hpp:20
static std::string getRecordType()
Return a string descriptor for this record type. Currently used for debugging / error logs only...
Definition: loadland.hpp:24
void unloadData() const
Definition: loadland.cpp:296
int mFlags
Definition: loadland.hpp:29
static const int HEIGHT_SCALE
Definition: loadland.hpp:63
Definition: esmwriter.hpp:17
int mX
Definition: loadland.hpp:31
void swap(Land &land)
Definition: loadland.cpp:333
int mY
Definition: loadland.hpp:31
static const int LAND_TEXTURE_SIZE
Definition: loadland.hpp:66
Land()
Definition: loadland.cpp:13
ESM_Context mContext
Definition: loadland.hpp:38
const int CellSizeInUnits
Definition: constants.hpp:23
Definition: loadland.hpp:74
uint16_t mTextures[LAND_NUM_TEXTURES]
Definition: loadland.hpp:110
Definition: loadland.hpp:48
Definition: esmcommon.hpp:116
char mUnk2
Definition: loadland.hpp:79
void loadData(int flags, LandData *target=NULL) const
Definition: loadland.cpp:217
Definition: loadland.hpp:44
static const int LAND_SIZE
Definition: loadland.hpp:55
Definition: loadland.hpp:47
LandData()
Definition: loadland.hpp:87
short mUnk1
Definition: loadland.hpp:116
bool isDataLoaded(int flags) const
Check if given data type is loaded.
Definition: loadland.cpp:316
float mMaxHeight
Definition: loadland.hpp:102
float mHeightOffset
Definition: loadland.hpp:98
static const int DEFAULT_HEIGHT
Definition: loadland.hpp:52
void load(ESMReader &esm, bool &isDeleted)
Definition: loadland.cpp:38
static const int REAL_SIZE
Definition: loadland.hpp:58
int mDataLoaded
Definition: loadland.hpp:119
uint8_t mUnk2
Definition: loadland.hpp:117
VNML mNormals[LAND_NUM_VERTS *3]
Definition: loadland.hpp:105
float mHeights[LAND_NUM_VERTS]
Definition: loadland.hpp:100
int mDataTypes
Definition: loadland.hpp:40
void blank()
Definition: loadland.cpp:178
bool condLoad(ESM::ESMReader &reader, int flags, int &targetFlags, int dataFlag, void *ptr, unsigned int size) const
Definition: loadland.cpp:305
Definition: loadland.hpp:46
signed char VNML
Definition: loadland.hpp:83
void add(int flags)
Definition: loadland.cpp:363
signed char mWnam[LAND_GLOBAL_MAP_LOD_SIZE]
Definition: loadland.hpp:123
int8_t mHeightData[LAND_NUM_VERTS]
Definition: loadland.hpp:77
unsigned char mColours[3 *LAND_NUM_VERTS]
Definition: loadland.hpp:113
const LandData * getLandData() const
Return land data without loading first anything. Can return a 0-pointer.
Definition: loadland.cpp:353
void setDataLoaded(int flags)
Sets the flags and creates a LandData if needed.
float mMinHeight
Definition: loadland.hpp:101
Definition: loadland.hpp:85
int mPlugin
Definition: loadland.hpp:32
float mHeightOffset
Definition: loadland.hpp:76
~Land()
Definition: loadland.cpp:33