1
0
forked from 0ad/0ad
0ad/source/graphics/Terrain.h
pyrolink b5d9da29c1 #When appropriate (i.e. wheeled units), units will align with the slope of the terrain. *JS documentation
*added CTerrain::getSlopeAngle[Face]() which returns the angle in
radians of the slope of the terrain.  getSlopeAngleFace should be used
for entities because it takes into account which way the entity is
facing, which allows for negative angles.
*the max and min graphical rotation for the slope is under traits.pitch.
This is used so that you can have certain units such as infantry that
don't rotate very far go down steep slopes but not rotate too much.
*JS documentation in docs/JSReg.rtf -- I put in most of the relevant
global functions; still needs entity functions.

This was SVN commit r3794.
2006-04-22 05:52:23 +00:00

109 lines
3.9 KiB
C++
Executable File

///////////////////////////////////////////////////////////////////////////////
//
// Name: Terrain.h
// Author: Rich Cross
// Contact: rich@wildfiregames.com
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _TERRAIN_H
#define _TERRAIN_H
#include "Patch.h"
#include "Vector3D.h"
#include "Vector2D.h"
///////////////////////////////////////////////////////////////////////////////
// CTerrain: main terrain class; contains the heightmap describing elevation
// data, and the smaller subpatches that form the terrain
class CTerrain
{
public:
CTerrain();
~CTerrain();
// Coordinate naming convention: world-space coordinates are float x,z;
// tile-space coordinates are int i,j.
bool Initialize(u32 size, const u16* ptr);
// return number of vertices along edge of the terrain
u32 GetVerticesPerSide() const { return m_MapSize; }
// return number of tiles along edge of the terrain
u32 GetTilesPerSide() const { return GetVerticesPerSide()-1; }
// return number of patches along edge of the terrain
u32 GetPatchesPerSide() const { return m_MapSizePatches; }
inline bool isOnMap(float x, float z) const
{
return ((x >= 0.0f) && (x < (float)((m_MapSize-1) * CELL_SIZE)) && (z >= 0.0f) && (z < (float)((m_MapSize-1) * CELL_SIZE)));
}
inline bool isOnMap(const CVector2D& v) const { return isOnMap(v.x, v.y); }
float getVertexGroundLevel(int i, int j) const;
float getExactGroundLevel(float x, float z) const;
inline float getExactGroundLevel(const CVector2D& v) const { return getExactGroundLevel(v.x, v.y); }
float getSlope(float x, float z) const ;
float getSlopeAngle( float x, float y) const; //In radians
//Same as above, but picks the two vertices that the unit is facing (front+back) for slope
float getSlopeAngleFace(float x, float y, float orientation) const;
// resize this terrain such that each side has given number of patches
void Resize(u32 size);
// set up a new heightmap from 16 bit data; assumes heightmap matches current terrain size
void SetHeightMap(u16* heightmap);
// return a pointer to the heightmap
u16* GetHeightMap() const { return m_Heightmap; }
// get patch at given coordinates, expressed in patch-space; return 0 if
// coordinates represent patch off the edge of the map
CPatch* GetPatch(i32 i, i32 j) const;
// get tile at given coordinates, expressed in tile-space; return 0 if
// coordinates represent tile off the edge of the map
CMiniPatch* GetTile(i32 i, i32 j) const;
// calculate the position of a given vertex
void CalcPosition(i32 i, i32 j, CVector3D& pos) const;
// calculate the vertex under a given position (rounding down coordinates)
static void CalcFromPosition(const CVector3D& pos, i32& i, i32& j)
{
i = i32_from_float(pos.X/CELL_SIZE);
j = i32_from_float(pos.Z/CELL_SIZE);
}
// calculate the vertex under a given position (rounding down coordinates)
static void CalcFromPosition(float x, float z, i32& i, i32& j)
{
i = i32_from_float(x/CELL_SIZE);
j = i32_from_float(z/CELL_SIZE);
}
// calculate the normal at a given vertex
void CalcNormal(u32 i, u32 j, CVector3D& normal) const;
// flatten out an area of terrain (specified in world space coords); return
// the average height of the flattened area
float FlattenArea(float x0, float x1, float z0, float z1);
// mark a specific square of tiles as dirty - use this after modifying the heightmap
void MakeDirty(int i0, int j0, int i1, int j1, int dirtyFlags);
// mark the entire map as dirty
void MakeDirty(int dirtyFlags);
private:
// delete any data allocated by this terrain
void ReleaseData();
// setup patch pointers etc
void InitialisePatches();
// size of this map in each direction, in vertices; ie. total tiles = sqr(m_MapSize-1)
u32 m_MapSize;
// size of this map in each direction, in patches; total patches = sqr(m_MapSizePatches)
u32 m_MapSizePatches;
// the patches comprising this terrain
CPatch* m_Patches;
// 16-bit heightmap data
u16* m_Heightmap;
};
#endif