Umasoft
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
Public Member Functions | Static Public Member Functions | Protected Member Functions | List of all members
SMTerrain Class Reference

#include <SMTerrain.h>

Inheritance diagram for SMTerrain:
vtDynTerrainGeom vtDynGeom vtHeightFieldGrid3d vtGeode vtHeightField3d NodeExtension vtHeightField

Public Member Functions

DTErr Init (const vtElevationGrid *pGrid, float fZScale)
 initialization
 
void DoRender ()
 
void DoCulling (const vtCamera *pCam)
 
float GetElevation (int iX, int iZ, bool bTrue=false) const
 
void GetWorldLocation (int iX, int iZ, FPoint3 &p, bool bTrue=false) const
 
void SetVerticalExag (float fExag)
 
float GetVerticalExag () const
 
float GetQualityConstant () const
 
- Public Member Functions inherited from vtDynTerrainGeom
DTErr BasicInit (const vtElevationGrid *pGrid)
 
virtual void SetPolygonTarget (int iPolygonCount)
 
int GetPolygonTarget ()
 
int GetNumDrawnTriangles ()
 
void SetDetailMaterial (vtMaterial *pApp, float fTiling, float fDistance)
 
void EnableDetail (bool bOn)
 
bool GetDetail ()
 
void SetupTexGen (float fTiling)
 
void DisableTexGen ()
 
void DoCalcBoundBox (FBox3 &box)
 
void DoCull (const vtCamera *pCam)
 
bool FindAltitudeOnEarth (const DPoint2 &p, float &fAltitude, bool bTrue=false) const
 
bool FindAltitudeAtPoint (const FPoint3 &p3, float &fAltitude, bool bTrue=false, int iCultureFlags=0, FPoint3 *vNormal=NULL) const
 
virtual void SetElevation (int i, int j, float fValue, bool bTrue=false)
 
void SetCull (bool bOnOff)
 
void CullOnce ()
 
void PreRender () const
 
void PostRender () const
 
- Public Member Functions inherited from vtDynGeom
int IsVisible (const FSphere &sphere) const
 
int IsVisible (const FPoint3 &point0, const FPoint3 &point1, const FPoint3 &point2, const float fTolerance=0.0f) const
 
int IsVisible (const FPoint3 &point, float radius)
 
bool IsVisible (const FPoint3 &point) const
 
void ApplyMaterial (vtMaterial *mat)
 
- Public Member Functions inherited from vtGeode
vtGeodeCloneGeode ()
 
void CloneFromGeode (const vtGeode *rhs)
 
void AddMesh (vtMesh *pMesh, int iMatIdx)
 
void RemoveMesh (vtMesh *pMesh)
 
void AddTextMesh (vtTextMesh *pMesh, int iMatIdx)
 
uint GetNumMeshes () const
 
vtMeshGetMesh (int i) const
 
vtTextMeshGetTextMesh (int i) const
 
virtual void SetMaterials (const class vtMaterialArray *mats)
 
const vtMaterialArrayGetMaterials () const
 
vtMaterialGetMaterial (int idx)
 
void SetMeshMatIndex (vtMesh *pMesh, int iMatIdx)
 
- Public Member Functions inherited from NodeExtension
void SetEnabled (bool bOn)
 
bool GetEnabled () const
 
void SetCastShadow (bool b)
 Set this node to cast a shadow, if it is under a vtShadow node. Default is false.
 
bool GetCastShadow ()
 Get whether this node casts a shadow.
 
void GetBoundSphere (FSphere &sphere, bool bGlobal=false)
 Get the Bounding Sphere of the node.
 
void SetOsgNode (osg::Node *n)
 
- Public Member Functions inherited from vtHeightFieldGrid3d
void Initialize (const LinearUnits units, const DRECT &earthextents, float fMinHeight, float fMaxHeight, int cols, int rows)
 
virtual void SetEarthExtents (const DRECT &ext)
 
bool CastRayToSurface (const FPoint3 &point, const FPoint3 &dir, FPoint3 &result) const
 
bool LineOfSight (const FPoint3 &point1, const FPoint3 &point2) const
 
DPoint2 GetSpacing () const
 
FPoint2 GetWorldSpacing () const
 
void GetDimensions (int &nColumns, int &nRows) const
 
int NumColumns ()
 
int NumRows ()
 
void EarthToGrid (const DPoint2 &epos, IPoint2 &ipos)
 
void WorldToGrid (const FPoint3 &pos, IPoint2 &ipos)
 
float GetInterpolatedElevation (double findex_x, double findex_y) const
 
int FindNumUnknown ()
 
bool ColorDibFromElevation (vtBitmapBase *pBM, const ColorMap *cmap, int iGranularity, const RGBAi &nodata, bool progress_callback(int)=NULL)
 
bool ColorDibFromTable (vtBitmapBase *pBM, std::vector< RGBi > &table, float fMin, float fMax, const RGBAi &nodata, bool progress_callback(int)=NULL)
 
void ShadeDibFromElevation (vtBitmapBase *pBM, const FPoint3 &light_dir, float fLightFactor, float fAmbient=0.1f, float fGamma=1.0f, bool bTrue=false, bool progress_callback(int)=NULL)
 
void ShadeQuick (vtBitmapBase *pBM, float light_factor, bool bTrue=false, bool progress_callback(int)=NULL)
 
void ShadowCastDib (vtBitmapBase *pBM, const FPoint3 &ight_dir, float fLightFactor, float fAmbient, bool progress_callback(int)=NULL)
 
- Public Member Functions inherited from vtHeightField3d
void Initialize (const LinearUnits units, const DRECT &earthextents, float fMinHeight, float fMaxHeight)
 
int PointIsAboveTerrain (const FPoint3 &p) const
 
bool ConvertEarthToSurfacePoint (const DPoint2 &epos, FPoint3 &p3, int iCultureFlags=0, bool bTrue=false)
 
bool ContainsWorldPoint (float x, float z)
 
void GetCenter (FPoint3 &center)
 
void SetCulture (CultureExtension *ext)
 
- Public Member Functions inherited from vtHeightField
void Initialize (const DRECT &extents, float fMinHeight, float fMaxHeight)
 
bool ContainsEarthPoint (const DPoint2 &p, bool bInclusive=false) const
 
DRECTGetEarthExtents ()
 
const DRECTGetEarthExtents () const
 
void GetHeightExtents (float &fMinHeight, float &fMaxHeight) const
 

Static Public Member Functions

static int MemoryRequired (int iDimension)
 

Protected Member Functions

void Init2 ()
 
void AllocatePool ()
 
void ComputeVariances ()
 
MathType ComputeTriangleVariance (int num, int v0, int v1, int va, int level)
 
void SetupBlocks ()
 
void AdjustQualityConstant ()
 
void SplitToBlocks (int num, BinTri *tri, int v0, int v1, int va)
 
void SplitIfNeeded (int num, BinTri *tri, int v0, int v1, int va, bool bEntirelyInFrustum, int level)
 
void Split (BinTri *tri)
 
void Split2 (BinTri *tri)
 
BinTriAllocateBinTri ()
 
void RenderSurface ()
 
void RenderBlock (BlockPtr block, bool bFans)
 
bool BlockIsVisible (BlockPtr block)
 
void LoadSingleMaterial ()
 
void render_triangle_as_fan (BinTri *pTri, int v0, int v1, int va, bool even, bool right)
 
void render_triangle_single (BinTri *pTri, int v0, int v1, int va)
 
void flush_buffer (int type)
 
float DistanceToTriangle (int num)
 

Additional Inherited Members

- Public Attributes inherited from vtDynTerrainGeom
int m_iTotalTriangles
 
int m_iDrawnTriangles
 
- Protected Attributes inherited from vtDynTerrainGeom
float * m_fXLookup
 
float * m_fZLookup
 
int m_iPolygonTarget
 
bool m_bCulleveryframe
 
bool m_bCullonce
 
float m_fDetailTiling
 
float m_fDetailDistance
 
bool m_bDetailTexture
 
vtMaterialm_pDetailMat
 

Detailed Description

The SMTerrain class implements Seumas McNally's algorithm for regular-grid terrain LOD. It was implemented directly from correspondence from the dearly missed Seumas, and is highly similar to the implementation in his game Treadmarks.
This implementation requires that the input heightfield is a square regular grid of dimension 2^n+1, e.g.. 1025, 2049, or 4097. Storage requirements are around 3-5 bytes/vertex. The data is represented in memory by a regular grid of height values, an implicit binary tree of variance values, and an explicit binary tree of visible faces.
This is the fastest and most memory-efficient algorithm currently known for terrain rendering with a long viewing distance and an unconstrained viewpoint.

Usage

  1. Create a new SMTerrain object
  2. Initialize it with a LocalGrid to provide height values
  3. add it to your scene graph
  4. set the desired level detail with SetPolygonTarget()
  5. for a detail texture, call SetDetailMaterial()
  6. let the scene graph API render the terrain for you each frame

    Performance Issues


The documentation for this class was generated from the following files: