Pioneer
Loading...
Searching...
No Matches
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
20class SystemBody;
21
22template <typename, typename>
24
25class Terrain : public RefCounted {
26public:
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
60private:
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
66protected:
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
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
123template <typename HeightFractal>
124class TerrainHeightFractal : virtual public Terrain {
125public:
127 virtual double GetHeight(const vector3d &p) const;
128 virtual const char *GetHeightFractalName() const;
129
130protected:
132
133private:
134};
135
136template <typename ColorFractal>
137class TerrainColorFractal : virtual public Terrain {
138public:
140 virtual vector3d GetColor(const vector3d &p, double height, const vector3d &norm) const;
141 virtual const char *GetColorFractalName() const;
142
143protected:
145
146private:
147};
148
149template <typename HeightFractal, typename ColorFractal>
150class TerrainGenerator : public TerrainHeightFractal<HeightFractal>, public TerrainColorFractal<ColorFractal> {
151public:
154 Terrain(body),
155 TerrainHeightFractal<HeightFractal>(body),
156 TerrainColorFractal<ColorFractal>(body) {}
157
158private:
159};
160
161//This is the most complex and insanely crazy terrain you will ever see :
162class TerrainHeightFlat;
163
164//New terrains with less noise :
165class TerrainHeightAsteroid;
166class TerrainHeightAsteroid2;
167class TerrainHeightAsteroid3;
168class TerrainHeightAsteroid4;
169class TerrainHeightBarrenRock;
170class TerrainHeightBarrenRock2;
171class 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
178class TerrainHeightEllipsoid;
179
180// Newish terrains, 6 months or so :
181class TerrainHeightHillsCraters2;
182class TerrainHeightHillsCraters;
183class 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 )
186class TerrainHeightHillsNormal;
187class TerrainHeightHillsRidged;
188class TerrainHeightHillsRivers;
189
190class TerrainHeightMapped;
191class TerrainHeightMapped2;
192class TerrainHeightMountainsCraters2;
193class 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 )
198class TerrainHeightMountainsNormal;
199// Based on TerrainHeightMountainsNormal :
200class 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:
209class TerrainHeightMountainsRidged;
210class TerrainHeightMountainsRiversVolcano;
211// Used to be used for mars since it has a megavolcano:
212class TerrainHeightMountainsVolcano;
213
214//Oldest terrains, from before fracdefs :
215class TerrainHeightRuggedDesert;
216// lava terrain should look like this http://www.spacesimcentral.com/forum/download/file.php?id=1778&mode=view
217class TerrainHeightRuggedLava;
218
219/*Terrains used for Iceworlds,
220only terrain to use the much neglected impact crater function
221(basically I forgot about it;) ) **It makes cool looking sunken craters** */
222class TerrainHeightWaterSolidCanyons;
223class TerrainHeightWaterSolid;
224
225class TerrainColorAsteroid;
226class TerrainColorBandedRock;
227class TerrainColorBlack;
228class TerrainColorDeadWithWater;
229class 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
233and better distribution of snow : http://www.spacesimcentral.com/forum/download/file.php?id=1879&mode=view */
234class TerrainColorEarthLike;
235class TerrainColorEarthLikeHeightmapped;
236class TerrainColorGGJupiter;
237class TerrainColorGGNeptune2;
238class TerrainColorGGNeptune;
239class TerrainColorGGSaturn2;
240class TerrainColorGGSaturn;
241class TerrainColorGGUranus;
242class TerrainColorIce;
243class TerrainColorMethane;
244class TerrainColorRock2;
245class TerrainColorRock;
246class TerrainColorWhite;
247class TerrainColorStarBrownDwarf;
248class TerrainColorStarG;
249class TerrainColorStarK;
250class TerrainColorStarM;
251class TerrainColorStarWhiteDwarf;
252class TerrainColorTFGood;
253class TerrainColorTFPoor;
254class 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
TerrainHeightFractal(const SystemBody *body)
TerrainHeightFractal()=delete
virtual const char * GetHeightFractalName() const
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
const fracdef_t & GetFracDef(const unsigned int index) const
Definition Terrain.h:40
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
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
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
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
virtual const char * GetHeightFractalName() const =0
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
virtual const char * GetColorFractalName() const =0
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
Definition FracDef.h:4