forked from 0ad/0ad
Matei
0ed2815c8b
LOS issues still outstanding: - LOS looks ugly because of quad tesselation into 2 triangles - Quad tesselation is unspecified by OpenGL (in fact using GL_QUADS on LOS quads seemed to give different tesselations than it did for the underlying terrain quads, but terrain rendering also used GL_QUADS). This should be fixed once we decide on the quad tesselation issue. - Units with traits.vision.permanent set are visible through FOW even if you havent seen them before; this should only be true when you have seen them before. But it gets even more complicated - if a permanent unit seen through FOW dies or gets upgraded or something, perhaps you should remember the old version. I'm not completely sure how to do this (probably involves cloning its actor somehow). This was SVN commit r2876.
94 lines
3.3 KiB
C++
Executable File
94 lines
3.3 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();
|
|
|
|
bool Initialize(u32 size,const u16* ptr);
|
|
|
|
// return number of vertices along edge of the terrain
|
|
u32 GetVerticesPerSide() { return m_MapSize; }
|
|
// return number of patches along edge of the terrain
|
|
u32 GetPatchesPerSide() { return m_MapSizePatches; }
|
|
|
|
inline bool isOnMap( float x, float y ) const
|
|
{
|
|
return( ( x >= 0.0f ) && ( x <= (float)( m_MapSize * CELL_SIZE ) ) && ( y >= 0.0f ) && ( y <= (float)( m_MapSize * CELL_SIZE ) ) );
|
|
}
|
|
inline bool isOnMap( const CVector2D& v ) const
|
|
{
|
|
return( ( v.x >= 0.0f ) && ( v.x <= (float)( m_MapSize * CELL_SIZE ) ) && ( v.y >= 0.0f ) && ( v.y <= (float)( m_MapSize * CELL_SIZE ) ) );
|
|
}
|
|
float getVertexGroundLevel( int x, int y ) const ;
|
|
float getExactGroundLevel( float x, float y ) const ;
|
|
inline float getExactGroundLevel( const CVector2D& v ) const { return( getExactGroundLevel( v.x, v.y ) ); }
|
|
|
|
// 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 x, i32 z);
|
|
// get tile at given coordinates, expressed in tile-space; return 0 if
|
|
// coordinates represent tile off the edge of the map
|
|
CMiniPatch* GetTile(i32 x, i32 z);
|
|
|
|
// calculate the position of a given vertex
|
|
void CalcPosition(i32 i, i32 j, CVector3D& pos);
|
|
// calculate the vertex under a given position (rounding down coordinates)
|
|
void CalcFromPosition(const CVector3D& pos, i32& i, i32& j);
|
|
// calculate the normal at a given vertex
|
|
void CalcNormal(u32 i, u32 j, CVector3D& normal);
|
|
|
|
// 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);
|
|
|
|
// raise a given vertex, clamped to min/max height; ignored if out of bounds
|
|
void RaiseVertex(int x, int y, int amount);
|
|
|
|
// mark a specific square of tiles as dirty - use this after modifying the heightmap
|
|
void MakeDirty(int x0, int z0, int x1, int z1);
|
|
|
|
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
|