Pioneer
Terrain.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _TERRAIN_H
5 #define _TERRAIN_H
6 
7 #include "FracDef.h"
8 #include "../Random.h"
9 #include "../RefCounted.h"
10 #include "../vector3.h"
11 #include "../galaxy/SystemPath.h"
12 
13 #include <memory>
14 #include <string>
15 
16 #ifdef _MSC_VER
17 #pragma warning(disable : 4250) // workaround for MSVC 2008 multiple inheritance bug
18 #endif
19 
20 class SystemBody;
21 
22 template <typename, typename>
23 class TerrainGenerator;
24 
25 class Terrain : public RefCounted {
26 public:
27  // location and intensity of effects are controlled by the colour fractals;
28  // it's possible for a Terrain to have a flag set but not actually to exhibit any of that effect
30  EFFECT_LAVA = 1 << 0,
31  EFFECT_WATER = 2
32  // can add other effect flags here (e.g., water, snow, ice)
33  };
34 
35  static Terrain *InstanceTerrain(const SystemBody *body);
36 
37  virtual ~Terrain();
38 
39  void SetFracDef(const unsigned int index, const double featureHeightMeters, const double featureWidthMeters, const double smallestOctaveMeters = 20.0);
40  inline const fracdef_t &GetFracDef(const unsigned int index) const
41  {
42  assert(index < MAX_FRACDEFS);
43  return m_fracdef[index];
44  }
45 
46  virtual double GetHeight(const vector3d &p) const = 0;
47  virtual vector3d GetColor(const vector3d &p, double height, const vector3d &norm) const = 0;
48 
49  virtual const char *GetHeightFractalName() const = 0;
50  virtual const char *GetColorFractalName() const = 0;
51 
52  double GetMaxHeight() const { return m_maxHeight; }
53 
54  Uint32 GetSurfaceEffects() const { return m_surfaceEffects; }
55 
56  double BiCubicInterpolation(const vector3d &p) const;
57 
58  void DebugDump() const;
59 
60 private:
61  template <typename HeightFractal, typename ColorFractal>
62  static Terrain *InstanceGenerator(const SystemBody *body) { return new TerrainGenerator<HeightFractal, ColorFractal>(body); }
63 
64  typedef Terrain *(*GeneratorInstancer)(const SystemBody *);
65 
66 protected:
67  Terrain(const SystemBody *body);
68 
69  Uint32 m_seed;
71 
72  double m_sealevel; // 0 - no water, 1 - 100% coverage
73  double m_icyness; // 0 - 1 (0% to 100% cover)
74  double m_volcanic;
75 
77 
78  // heightmap stuff
79  // XXX unify heightmap types
80  std::unique_ptr<double[]> m_heightMap;
82 
85 
87  double m_maxHeight;
93 
94  double m_entropy[12];
95 
107 
108  /* XXX you probably shouldn't increase this. If you are
109  using more than 10 then things will be slow as hell */
110  static const Uint32 MAX_FRACDEFS = 10;
112 
113  struct MinBodyData {
114  MinBodyData(const SystemBody *body);
115  double m_radius;
118  std::string m_name;
119  };
121 };
122 
123 template <typename HeightFractal>
124 class TerrainHeightFractal : virtual public Terrain {
125 public:
127  virtual double GetHeight(const vector3d &p) const;
128  virtual const char *GetHeightFractalName() const;
129 
130 protected:
132 
133 private:
134 };
135 
136 template <typename ColorFractal>
137 class TerrainColorFractal : virtual public Terrain {
138 public:
140  virtual vector3d GetColor(const vector3d &p, double height, const vector3d &norm) const;
141  virtual const char *GetColorFractalName() const;
142 
143 protected:
145 
146 private:
147 };
148 
149 template <typename HeightFractal, typename ColorFractal>
150 class TerrainGenerator : public TerrainHeightFractal<HeightFractal>, public TerrainColorFractal<ColorFractal> {
151 public:
152  TerrainGenerator() = delete;
154  Terrain(body),
155  TerrainHeightFractal<HeightFractal>(body),
156  TerrainColorFractal<ColorFractal>(body) {}
157 
158 private:
159 };
160 
161 //This is the most complex and insanely crazy terrain you will ever see :
162 class TerrainHeightFlat;
163 
164 //New terrains with less noise :
165 class TerrainHeightAsteroid;
166 class TerrainHeightAsteroid2;
167 class TerrainHeightAsteroid3;
168 class TerrainHeightAsteroid4;
169 class TerrainHeightBarrenRock;
170 class TerrainHeightBarrenRock2;
171 class TerrainHeightBarrenRock3;
172 /* Pictures of the above terrains:
173  http://i.imgur.com/cJO4E.jpg
174  http://i.imgur.com/BtB0g.png
175  http://i.imgur.com/qeEuS.png
176  */
177 
178 class TerrainHeightEllipsoid;
179 
180 // Newish terrains, 6 months or so :
181 class TerrainHeightHillsCraters2;
182 class TerrainHeightHillsCraters;
183 class TerrainHeightHillsDunes;
184 // This terrain or the following one should have terragen style ridged mountains :
185 // (As seen in an ancient clip of Mars http://www.youtube.com/watch?v=WeO28VBTWxs )
186 class TerrainHeightHillsNormal;
187 class TerrainHeightHillsRidged;
188 class TerrainHeightHillsRivers;
189 
190 class TerrainHeightMapped;
191 class TerrainHeightMapped2;
192 class TerrainHeightMountainsCraters2;
193 class TerrainHeightMountainsCraters;
194 
195 //Probably the best looking terrain due to variety, but among the most costly too :
196 //(It was also used for mars at some point : http://www.youtube.com/watch?feature=player_embedded&v=4-DcyQm0zE4 )
198 class TerrainHeightMountainsNormal;
199 // Based on TerrainHeightMountainsNormal :
200 class TerrainHeightMountainsRivers;
201 /*Pictures from the above two terrains generating Earth-like worlds:
202  http://www.spacesimcentral.com/forum/download/file.php?id=1533&mode=view
203  http://www.spacesimcentral.com/forum/download/file.php?id=1544&mode=view
204  http://www.spacesimcentral.com/forum/download/file.php?id=1550&mode=view
205  http://www.spacesimcentral.com/forum/download/file.php?id=1540&mode=view
206  */
207 
208 // Older terrains:
209 class TerrainHeightMountainsRidged;
210 class TerrainHeightMountainsRiversVolcano;
211 // Used to be used for mars since it has a megavolcano:
212 class TerrainHeightMountainsVolcano;
213 
214 //Oldest terrains, from before fracdefs :
215 class TerrainHeightRuggedDesert;
216 // lava terrain should look like this http://www.spacesimcentral.com/forum/download/file.php?id=1778&mode=view
217 class TerrainHeightRuggedLava;
218 
219 /*Terrains used for Iceworlds,
220 only terrain to use the much neglected impact crater function
221 (basically I forgot about it;) ) **It makes cool looking sunken craters** */
222 class TerrainHeightWaterSolidCanyons;
223 class TerrainHeightWaterSolid;
224 
225 class TerrainColorAsteroid;
226 class TerrainColorBandedRock;
227 class TerrainColorBlack;
228 class TerrainColorDeadWithWater;
229 class TerrainColorDesert;
230 /*ColorEarthlike uses features not yet included in all terrain colours
231  such as better poles : http://www.spacesimcentral.com/forum/download/file.php?id=1884&mode=view
232  http://www.spacesimcentral.com/forum/download/file.php?id=1885&mode=view
233 and better distribution of snow : http://www.spacesimcentral.com/forum/download/file.php?id=1879&mode=view */
234 class TerrainColorEarthLike;
235 class TerrainColorEarthLikeHeightmapped;
236 class TerrainColorGGJupiter;
237 class TerrainColorGGNeptune2;
238 class TerrainColorGGNeptune;
239 class TerrainColorGGSaturn2;
240 class TerrainColorGGSaturn;
241 class TerrainColorGGUranus;
242 class TerrainColorIce;
243 class TerrainColorMethane;
244 class TerrainColorRock2;
245 class TerrainColorRock;
246 class TerrainColorWhite;
247 class TerrainColorStarBrownDwarf;
248 class TerrainColorStarG;
249 class TerrainColorStarK;
250 class TerrainColorStarM;
251 class TerrainColorStarWhiteDwarf;
252 class TerrainColorTFGood;
253 class TerrainColorTFPoor;
254 class TerrainColorVolcanic;
255 
256 #ifdef _MSC_VER
257 #pragma warning(default : 4250)
258 #endif
259 
260 #endif /* TERRAIN_H */
Definition: Random.h:27
Definition: RefCounted.h:11
Definition: SystemBody.h:19
Definition: SystemPath.h:13
Definition: Terrain.h:137
TerrainColorFractal()=delete
TerrainColorFractal(const SystemBody *body)
virtual vector3d GetColor(const vector3d &p, double height, const vector3d &norm) const
virtual const char * GetColorFractalName() const
Definition: Terrain.h:150
TerrainGenerator(const SystemBody *body)
Definition: Terrain.h:153
TerrainGenerator()=delete
Definition: Terrain.h:124
virtual double GetHeight(const vector3d &p) const
virtual const char * GetHeightFractalName() const
TerrainHeightFractal(const SystemBody *body)
TerrainHeightFractal()=delete
Definition: Terrain.h:25
vector3d m_darkplantColor[8]
Definition: Terrain.h:100
SurfaceEffectFlags
Definition: Terrain.h:29
@ EFFECT_LAVA
Definition: Terrain.h:30
@ EFFECT_WATER
Definition: Terrain.h:31
double m_maxHeightInMeters
Definition: Terrain.h:88
double m_invPlanetRadius
Definition: Terrain.h:91
double m_planetEarthRadii
Definition: Terrain.h:92
Terrain(const SystemBody *body)
Definition: Terrain.cpp:383
Uint32 GetSurfaceEffects() const
Definition: Terrain.h:54
vector3d m_gglightColor[8]
Definition: Terrain.h:105
double m_maxHeight
Definition: Terrain.h:87
double m_sealevel
Definition: Terrain.h:72
virtual ~Terrain()
Definition: Terrain.cpp:627
vector3d m_dirtColor[8]
Definition: Terrain.h:103
vector3d m_darkrockColor[8]
Definition: Terrain.h:97
int m_heightMapSizeX
Definition: Terrain.h:83
virtual const char * GetHeightFractalName() const =0
vector3d m_rockColor[8]
Definition: Terrain.h:96
double m_invMaxHeight
Definition: Terrain.h:89
vector3d m_darkdirtColor[8]
Definition: Terrain.h:104
double m_heightScaling
Definition: Terrain.h:81
const fracdef_t & GetFracDef(const unsigned int index) const
Definition: Terrain.h:40
Uint32 m_surfaceEffects
Definition: Terrain.h:76
double m_volcanic
Definition: Terrain.h:74
std::unique_ptr< double[]> m_heightMap
Definition: Terrain.h:80
double m_minh
Definition: Terrain.h:81
Uint32 m_seed
Definition: Terrain.h:69
virtual const char * GetColorFractalName() const =0
Random m_rand
Definition: Terrain.h:70
double m_icyness
Definition: Terrain.h:73
virtual vector3d GetColor(const vector3d &p, double height, const vector3d &norm) const =0
vector3d m_ggdarkColor[8]
Definition: Terrain.h:106
vector3d m_sandColor[8]
Definition: Terrain.h:101
vector3d m_greyrockColor[8]
Definition: Terrain.h:98
virtual double GetHeight(const vector3d &p) const =0
double m_entropy[12]
Definition: Terrain.h:94
static Terrain * InstanceTerrain(const SystemBody *body)
Definition: Terrain.cpp:14
vector3d m_darksandColor[8]
Definition: Terrain.h:102
void SetFracDef(const unsigned int index, const double featureHeightMeters, const double featureWidthMeters, const double smallestOctaveMeters=20.0)
Definition: Terrain.cpp:635
double GetMaxHeight() const
Definition: Terrain.h:52
int m_heightMapSizeY
Definition: Terrain.h:84
vector3d m_plantColor[8]
Definition: Terrain.h:99
static const Uint32 MAX_FRACDEFS
Definition: Terrain.h:110
MinBodyData m_minBody
Definition: Terrain.h:120
double m_planetRadius
Definition: Terrain.h:90
void DebugDump() const
Definition: TerrainDbg.cpp:10
fracdef_t m_fracdef[MAX_FRACDEFS]
Definition: Terrain.h:111
double BiCubicInterpolation(const vector3d &p) const
Definition: Terrain.cpp:646
Definition: Terrain.h:113
double m_radius
Definition: Terrain.h:115
std::string m_name
Definition: Terrain.h:118
SystemPath m_path
Definition: Terrain.h:117
double m_aspectRatio
Definition: Terrain.h:116
MinBodyData(const SystemBody *body)
Definition: Terrain.cpp:699
Definition: FracDef.h:4