Umasoft
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
HeightField.h
1 //
2 // vtHeightField.h
3 //
4 // Copyright (c) 2002-2008 Virtual Terrain Project
5 // Free for all uses, see license.txt for details.
6 //
7 
8 #ifndef HEIGHTFIELDH
9 #define HEIGHTFIELDH
10 
11 #include <limits.h> // for SHRT_MIN
12 #include "LocalConversion.h"
13 
14 class vtBitmapBase;
15 #define INVALID_ELEVATION SHRT_MIN
16 
21 class ColorMap
22 {
23 public:
24  ColorMap();
25  bool Save(const char *fname) const;
26  bool Load(const char *fname);
27  void Add(float elev, const RGBi &color);
28  void RemoveAt(int num);
29  void Clear();
30  int Num() const;
31  void GenerateColors(std::vector<RGBi> &table, int iTableSize, float fMin, float fMax) const;
32 
33  bool m_bBlend;
34  bool m_bRelative;
35  std::vector<float> m_elev;
36  std::vector<RGBi> m_color;
37 };
38 
39 
45 {
46 public:
47  vtHeightField();
48  virtual ~vtHeightField() {}
49 
50  // Initialize the vtHeightField
51  void Initialize(const DRECT &extents, float fMinHeight, float fMaxHeight);
52 
53  virtual bool FindAltitudeOnEarth(const DPoint2 &p, float &fAltitude, bool bTrue = false) const = 0;
54 
56  bool ContainsEarthPoint(const DPoint2 &p, bool bInclusive = false) const
57  {
58  return m_EarthExtents.ContainsPoint(p, bInclusive);
59  }
60 
62  DRECT &GetEarthExtents() { return m_EarthExtents; }
63  const DRECT &GetEarthExtents() const { return m_EarthExtents; }
64 
66  virtual void SetEarthExtents(const DRECT &ext);
67  void GetHeightExtents(float &fMinHeight, float &fMaxHeight) const;
68 
69 protected:
70  // minimum and maximum height values for the whole heightfield
71  float m_fMinHeight, m_fMaxHeight;
72 
73  DRECT m_EarthExtents; // raw extents (geographic or projected)
74 };
75 
76 
77 // Culture flags: one bit for each kind of culture one could test for
78 // using CultureExtension.
79 #define CE_STRUCTURES 1
80 #define CE_ROADS 2
81 #define CE_ALL (CE_STRUCTURES|CE_ROADS)
82 
84 {
85 public:
86  virtual bool FindAltitudeOnCulture(const FPoint3 &p3, float &fAltitude,
87  bool bTrue, int iCultureFlags) const = 0;
88 };
89 
97 {
98 public:
100  virtual ~vtHeightField3d() {}
101 
102  void Initialize(const LinearUnits units, const DRECT &earthextents,
103  float fMinHeight, float fMaxHeight);
104 
105  // override heightfield method
106  virtual void SetEarthExtents(const DRECT &ext);
107 
128  virtual bool FindAltitudeAtPoint(const FPoint3 &p3, float &fAltitude,
129  bool bTrue = false, int iCultureFlags = 0,
130  FPoint3 *vNormal = NULL) const = 0;
131 
133  virtual bool CastRayToSurface(const FPoint3 &point, const FPoint3 &dir,
134  FPoint3 &result) const = 0;
135 
136  int PointIsAboveTerrain(const FPoint3 &p) const;
137 
138  bool ConvertEarthToSurfacePoint(const DPoint2 &epos, FPoint3 &p3,
139  int iCultureFlags = 0, bool bTrue = false);
140 
141  bool ContainsWorldPoint(float x, float z);
142  void GetCenter(FPoint3 &center);
143 
144  void SetCulture(CultureExtension *ext) { m_pCulture = ext; }
145 
146  FRECT m_WorldExtents; // cooked (OpenGL) extents (in the XZ plane)
147  vtLocalConversion m_Conversion;
148 
149 protected:
150  void UpdateWorldExtents();
151 
152  float m_fDiagonalLength;
153  CultureExtension *m_pCulture;
154 };
155 
156 
162 {
163 public:
165  virtual ~vtHeightFieldGrid3d() {}
166 
167  void Initialize(const LinearUnits units, const DRECT &earthextents,
168  float fMinHeight, float fMaxHeight, int cols, int rows);
169 
170  // override heightfield method
171  virtual void SetEarthExtents(const DRECT &ext);
172 
173  bool CastRayToSurface(const FPoint3 &point, const FPoint3 &dir,
174  FPoint3 &result) const;
175  bool LineOfSight(const FPoint3 &point1, const FPoint3 &point2) const;
176  DPoint2 GetSpacing() const;
177  FPoint2 GetWorldSpacing() const;
178  void GetDimensions(int &nColumns, int &nRows) const;
179  int NumColumns() { return m_iColumns; }
180  int NumRows() { return m_iRows; }
181  void EarthToGrid(const DPoint2 &epos, IPoint2 &ipos);
182  void WorldToGrid(const FPoint3 &pos, IPoint2 &ipos);
183 
184  float GetInterpolatedElevation(double findex_x, double findex_y) const;
185  int FindNumUnknown();
186 
187  // all grids must be able to return the elevation at a grid point
188  virtual float GetElevation(int iX, int iZ, bool bTrue = false) const = 0;
189  virtual void GetWorldLocation(int i, int j, FPoint3 &loc, bool bTrue = false) const = 0;
190 
191  bool ColorDibFromElevation(vtBitmapBase *pBM, const ColorMap *cmap,
192  int iGranularity, const RGBAi &nodata, bool progress_callback(int) = NULL);
193  bool ColorDibFromTable(vtBitmapBase *pBM, std::vector<RGBi> &table,
194  float fMin, float fMax, const RGBAi &nodata, bool progress_callback(int) = NULL);
195 
196  void ShadeDibFromElevation(vtBitmapBase *pBM, const FPoint3 &light_dir,
197  float fLightFactor, float fAmbient = 0.1f, float fGamma = 1.0f,
198  bool bTrue = false, bool progress_callback(int) = NULL);
199  void ShadeQuick(vtBitmapBase *pBM, float light_factor, bool bTrue = false,
200  bool progress_callback(int) = NULL);
201  void ShadowCastDib(vtBitmapBase *pBM, const FPoint3 &ight_dir,
202  float fLightFactor, float fAmbient, bool progress_callback(int) = NULL);
203 
204 protected:
205  int m_iColumns, m_iRows;
206  float m_fXStep, m_fZStep; // step size between the World grid points
207  double m_dXStep, m_dYStep; // step size between the Earth grid points
208 };
209 
210 #endif // HEIGHTFIELDH
211 
212