Pioneer
Loading...
Searching...
No Matches
SystemBody.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 SYSTEMBODY_H
5#define SYSTEMBODY_H
6
7#include "Color.h"
8#include "IterationProxy.h"
9#include "Orbit.h"
10#include "RefCounted.h"
11#include "galaxy/RingStyle.h"
12#include "galaxy/SystemPath.h"
13#include "gameconsts.h"
14
15class StarSystem;
16
18
19class SystemBody : public RefCounted {
20public:
21 SystemBody(const SystemPath &path, StarSystem *system);
22
23 enum BodyType { // <enum scope='SystemBody' prefix=TYPE_ public>
25 TYPE_BROWN_DWARF = 1, // L+T Class Brown Dwarfs
27 TYPE_STAR_M = 3, //red
28 TYPE_STAR_K = 4, //orange
29 TYPE_STAR_G = 5, //yellow
30 TYPE_STAR_F = 6, //white
31 TYPE_STAR_A = 7, //blue/white
32 TYPE_STAR_B = 8, //blue
33 TYPE_STAR_O = 9, //blue/purple/white
54 TYPE_STAR_O_HYPER_GIANT = 30, // these various stars do exist = they are transitional states and are rare
55 TYPE_STAR_M_WF = 31, //Wolf-Rayet star
56 TYPE_STAR_B_WF = 32, // while you do not specifically get class M,B or O WF stars,
57 TYPE_STAR_O_WF = 33, // you do get red = blue and purple from the colour of the gasses = so spectral class is an easy way to define them.
58 TYPE_STAR_S_BH = 34, //stellar blackhole
59 TYPE_STAR_IM_BH = 35, //Intermediate-mass blackhole
60 TYPE_STAR_SM_BH = 36, //Supermassive blackhole
66 TYPE_MIN = TYPE_BROWN_DWARF, // <enum skip>
70 // XXX need larger atmosphereless thing
71 };
72
73 enum BodySuperType { // <enum scope='SystemBody' prefix=SUPERTYPE_ public>
79 };
80
81 const SystemPath &GetPath() const { return m_path; }
82 SystemBody *GetParent() const { return m_parent; }
83
84 bool IsPlanet() const;
85 bool IsMoon() const { return GetSuperType() == SUPERTYPE_ROCKY_PLANET && !IsPlanet(); }
86 // We allow hyperjump to any star of the system
87 bool IsJumpable() const { return GetSuperType() == SUPERTYPE_STAR; }
89
90 bool HasChildren() const { return !m_children.empty(); }
91 Uint32 GetNumChildren() const { return static_cast<Uint32>(m_children.size()); }
94
95 const std::vector<SystemBody *> CollectAllChildren();
96
97 inline const std::string &GetName() const { return m_name; }
98 std::string GetAstroDescription() const;
99 const char *GetIcon() const;
100 BodyType GetType() const { return m_type; }
102 bool IsCustomBody() const { return m_isCustomBody; }
103 bool IsCoOrbitalWith(const SystemBody *other) const; //this and other form a binary pair
104 bool IsCoOrbital() const; //is part of any binary pair
105 fixed GetRadiusAsFixed() const { return m_radius; }
106
107 // the aspect ratio adjustment is converting from equatorial to polar radius to account for ellipsoid bodies, used for calculating terrains etc
108 inline double GetRadius() const
109 {
110 if (GetSuperType() <= SUPERTYPE_STAR) // polar radius
111 return (m_radius.ToDouble() / m_aspectRatio.ToDouble()) * SOL_RADIUS;
112 else
113 return m_radius.ToDouble() * EARTH_RADIUS;
114 }
115
116 // the un-adjusted equatorial radius is necessary for calculating the radius of frames, see Space.cpp `MakeFrameFor`
117 inline double GetEquatorialRadius() const
118 {
119 if (GetSuperType() <= SUPERTYPE_STAR) // equatorial radius
120 return m_radius.ToDouble() * SOL_RADIUS;
121 else
122 return m_radius.ToDouble() * EARTH_RADIUS;
123 }
124
125 double GetAspectRatio() const { return m_aspectRatio.ToDouble(); }
126 fixed GetMassAsFixed() const { return m_mass; }
127 double GetMass() const
128 {
130 return m_mass.ToDouble() * SOL_MASS;
131 else
132 return m_mass.ToDouble() * EARTH_MASS;
133 }
135 {
137 return m_mass * 332998;
138 else
139 return m_mass;
140 }
141 bool IsRotating() const { return m_rotationPeriod != fixed(0); }
142 // returned in seconds
143 double GetRotationPeriodInDays() const { return m_rotationPeriod.ToDouble(); }
144 fixed GetRotationPeriodAsFixed() const { return m_rotationPeriod; }
145 double GetRotationPeriod() const
146 {
147 return m_rotationPeriod.ToDouble() * 60 * 60 * 24;
148 }
149 bool HasRotationPhase() const { return m_rotationalPhaseAtStart != fixed(0); }
150 double GetRotationPhaseAtStart() const { return m_rotationalPhaseAtStart.ToDouble(); }
151 double GetAxialTilt() const { return m_axialTilt.ToDouble(); }
152 fixed GetAxialTiltAsFixed() const { return m_axialTilt; }
153
154 const Orbit &GetOrbit() const { return m_orbit; }
155 double GetEccentricity() const { return m_eccentricity.ToDouble(); }
156 fixed GetEccentricityAsFixed() const { return m_eccentricity; }
157 double GetOrbMin() const { return m_orbMin.ToDouble(); }
158 double GetOrbMax() const { return m_orbMax.ToDouble(); }
159 fixed GetOrbMinAsFixed() const { return m_orbMin; }
160 fixed GetOrbMaxAsFixed() const { return m_orbMax; }
161 double GetSemiMajorAxis() const { return m_semiMajorAxis.ToDouble(); }
162 fixed GetSemiMajorAxisAsFixed() const { return m_semiMajorAxis; }
163 fixed GetInclinationAsFixed() const { return m_inclination; }
164 void SetOrbitPlane(const matrix3x3d &orient) { m_orbit.SetPlane(orient); }
165
166 int GetAverageTemp() const { return m_averageTemp; }
167 inline const std::string &GetHeightMapFilename() const { return m_heightMapFilename; }
168 unsigned int GetHeightMapFractal() const { return m_heightMapFractal; }
169
170 Uint32 GetSeed() const { return m_seed; }
171
172 fixed GetMetallicityAsFixed() const { return m_metallicity; }
173 double GetMetallicity() const { return m_metallicity.ToDouble(); }
174 fixed GetVolatileGasAsFixed() const { return m_volatileGas; }
175 double GetVolatileGas() const { return m_volatileGas.ToDouble(); }
176 fixed GetVolatileLiquidAsFixed() const { return m_volatileLiquid; }
177 double GetVolatileLiquid() const { return m_volatileLiquid.ToDouble(); }
178 fixed GetVolatileIcesAsFixed() const { return m_volatileIces; }
179 double GetVolatileIces() const { return m_volatileIces.ToDouble(); }
180 fixed GetVolcanicityAsFixed() const { return m_volcanicity; }
181 double GetVolcanicity() const { return m_volcanicity.ToDouble(); }
182 double GetAtmosOxidizing() const { return m_atmosOxidizing.ToDouble(); }
183 fixed GetLifeAsFixed() const { return m_life; }
184 double GetLife() const { return m_life.ToDouble(); }
185
186 fixed GetAgriculturalAsFixed() const { return m_agricultural; }
187 double GetAgricultural() const { return m_agricultural.ToDouble(); }
188 fixed GetPopulationAsFixed() const { return m_population; }
189 double GetPopulation() const { return m_population.ToDouble(); }
190
191 double CalcSurfaceGravity() const;
192
193 double GetMaxChildOrbitalDistance() const;
194
195 bool HasRings() const { return bool(m_rings.maxRadius.v); }
196 const RingStyle &GetRings() const { return m_rings; }
197
198 // XXX merge all this atmosphere stuff
199 bool HasAtmosphere() const;
200
202 {
203 // XXX suggestions about how to determine a sensible albedo colour would be welcome
204 // Currently (2014-03-24) this is just used as the colour for the body billboard
205 // which is rendered when the body has a small screen size
206 return Color(200, 200, 200, 255);
207 }
208
209 void GetAtmosphereFlavor(Color *outColor, double *outDensity) const
210 {
211 *outColor = m_atmosColor;
212 *outDensity = m_atmosDensity;
213 }
214
216
217 bool IsScoopable() const;
218
219 void Dump(FILE *file, const char *indent = "") const;
220
221 StarSystem *GetStarSystem() const { return m_system; }
222
223 const std::string &GetSpaceStationType() const { return m_space_station_type; }
224
225private:
226 friend class StarSystem;
227 friend class ObjectViewerView;
232
233 void ClearParentAndChildPointers();
234
235 SystemBody *m_parent; // these are only valid if the StarSystem
236 std::vector<SystemBody *> m_children; // that create them still exists
237
238 SystemPath m_path;
239 Orbit m_orbit;
240 Uint32 m_seed; // Planet.cpp can use to generate terrain
241 std::string m_name;
242 fixed m_radius; // in earth radii for planets, sol radii for stars. equatorial radius in case of bodies which are flattened at the poles
243 fixed m_aspectRatio; // ratio between equatorial and polar radius for bodies with eqatorial bulges
244 fixed m_mass; // earth masses if planet, solar masses if star
245 fixed m_orbMin, m_orbMax; // periapsism, apoapsis in AUs
246 fixed m_rotationPeriod; // in days
247 fixed m_rotationalPhaseAtStart; // 0 to 2 pi
248 fixed m_humanActivity; // 0 - 1
249 fixed m_semiMajorAxis; // in AUs
250 fixed m_eccentricity;
251 fixed m_orbitalOffset;
252 fixed m_orbitalPhaseAtStart; // 0 to 2 pi
253 fixed m_axialTilt; // in radians
254 fixed m_inclination; // in radians, for surface bodies = latitude
255 int m_averageTemp;
256 BodyType m_type;
257 bool m_isCustomBody;
258
259 /* composition */
260 fixed m_metallicity; // (crust) 0.0 = light (Al, SiO2, etc), 1.0 = heavy (Fe, heavy metals)
261 fixed m_volatileGas; // 1.0 = earth atmosphere density
262 fixed m_volatileLiquid; // 1.0 = 100% ocean cover (earth = 70%)
263 fixed m_volatileIces; // 1.0 = 100% ice cover (earth = 3%)
264 fixed m_volcanicity; // 0 = none, 1.0 = fucking volcanic
265 fixed m_atmosOxidizing; // 0.0 = reducing (H2, NH3, etc), 1.0 = oxidising (CO2, O2, etc)
266 fixed m_life; // 0.0 = dead, 1.0 = teeming
267
268 RingStyle m_rings;
269
270 /* economy type stuff */
271 fixed m_population;
272 fixed m_agricultural;
273
274 std::string m_heightMapFilename;
275 unsigned int m_heightMapFractal;
276
277 Color m_atmosColor;
278 double m_atmosDensity;
279
280 StarSystem *m_system;
281
282 std::string m_space_station_type;
283};
284
285#endif // SYSTEMBODY_H
Color4ub Color
Definition Color.h:212
IterationProxy< Container > MakeIterationProxy(Container &container)
Definition IterationProxy.h:51
Definition IterationProxy.h:13
Definition ObjectViewerView.h:14
Definition Orbit.h:11
void SetPlane(const matrix3x3d &orient)
Definition Orbit.h:31
Definition StarSystemGenerator.h:54
Definition RefCounted.h:11
Definition StarSystemGenerator.h:30
Definition StarSystemGenerator.h:15
Definition StarSystemGenerator.h:38
Definition StarSystem.h:27
Definition SystemBody.h:19
double GetEccentricity() const
Definition SystemBody.h:155
const std::vector< SystemBody * > CollectAllChildren()
Definition SystemBody.cpp:554
double GetAtmosOxidizing() const
Definition SystemBody.h:182
const IterationProxy< const std::vector< SystemBody * > > GetChildren() const
Definition SystemBody.h:93
bool IsJumpable() const
Definition SystemBody.h:87
const Orbit & GetOrbit() const
Definition SystemBody.h:154
double GetEquatorialRadius() const
Definition SystemBody.h:117
fixed GetMassInEarths() const
Definition SystemBody.h:134
fixed GetOrbMinAsFixed() const
Definition SystemBody.h:159
double GetVolcanicity() const
Definition SystemBody.h:181
double GetMetallicity() const
Definition SystemBody.h:173
fixed GetVolcanicityAsFixed() const
Definition SystemBody.h:180
Uint32 GetSeed() const
Definition SystemBody.h:170
fixed GetMetallicityAsFixed() const
Definition SystemBody.h:172
bool HasAtmosphere() const
Definition SystemBody.cpp:36
void SetOrbitPlane(const matrix3x3d &orient)
Definition SystemBody.h:164
BodyType GetType() const
Definition SystemBody.h:100
double GetVolatileLiquid() const
Definition SystemBody.h:177
fixed GetInclinationAsFixed() const
Definition SystemBody.h:163
fixed GetAxialTiltAsFixed() const
Definition SystemBody.h:152
bool IsCoOrbital() const
Definition SystemBody.cpp:586
BodyType
Definition SystemBody.h:23
@ TYPE_STAR_O_GIANT
Definition SystemBody.h:40
@ TYPE_STAR_B_SUPER_GIANT
Definition SystemBody.h:46
@ TYPE_STAR_O_WF
Definition SystemBody.h:57
@ TYPE_STAR_F_HYPER_GIANT
Definition SystemBody.h:51
@ TYPE_STAR_IM_BH
Definition SystemBody.h:59
@ TYPE_STAR_B_HYPER_GIANT
Definition SystemBody.h:53
@ TYPE_GRAVPOINT
Definition SystemBody.h:24
@ TYPE_STAR_F
Definition SystemBody.h:30
@ TYPE_STAR_A_SUPER_GIANT
Definition SystemBody.h:45
@ TYPE_STAR_SM_BH
Definition SystemBody.h:60
@ TYPE_STAR_F_GIANT
Definition SystemBody.h:37
@ TYPE_STAR_M_SUPER_GIANT
Definition SystemBody.h:41
@ TYPE_STAR_M_GIANT
Definition SystemBody.h:34
@ TYPE_STAR_MIN
Definition SystemBody.h:68
@ TYPE_STAR_K_GIANT
Definition SystemBody.h:35
@ TYPE_BROWN_DWARF
Definition SystemBody.h:25
@ TYPE_STAR_B_WF
Definition SystemBody.h:56
@ TYPE_STAR_O_HYPER_GIANT
Definition SystemBody.h:54
@ TYPE_STAR_A_GIANT
Definition SystemBody.h:38
@ TYPE_STAR_K_SUPER_GIANT
Definition SystemBody.h:42
@ TYPE_STAR_G_GIANT
Definition SystemBody.h:36
@ TYPE_STAR_G_SUPER_GIANT
Definition SystemBody.h:43
@ TYPE_STARPORT_ORBITAL
Definition SystemBody.h:64
@ TYPE_STAR_F_SUPER_GIANT
Definition SystemBody.h:44
@ TYPE_PLANET_TERRESTRIAL
Definition SystemBody.h:63
@ TYPE_STAR_O_SUPER_GIANT
Definition SystemBody.h:47
@ TYPE_MAX
Definition SystemBody.h:67
@ TYPE_STAR_B_GIANT
Definition SystemBody.h:39
@ TYPE_WHITE_DWARF
Definition SystemBody.h:26
@ TYPE_STAR_K_HYPER_GIANT
Definition SystemBody.h:49
@ TYPE_STARPORT_SURFACE
Definition SystemBody.h:65
@ TYPE_STAR_M
Definition SystemBody.h:27
@ TYPE_PLANET_GAS_GIANT
Definition SystemBody.h:61
@ TYPE_STAR_B
Definition SystemBody.h:32
@ TYPE_MIN
Definition SystemBody.h:66
@ TYPE_STAR_A
Definition SystemBody.h:31
@ TYPE_STAR_M_HYPER_GIANT
Definition SystemBody.h:48
@ TYPE_STAR_A_HYPER_GIANT
Definition SystemBody.h:52
@ TYPE_STAR_G_HYPER_GIANT
Definition SystemBody.h:50
@ TYPE_STAR_G
Definition SystemBody.h:29
@ TYPE_STAR_MAX
Definition SystemBody.h:69
@ TYPE_STAR_M_WF
Definition SystemBody.h:55
@ TYPE_PLANET_ASTEROID
Definition SystemBody.h:62
@ TYPE_STAR_S_BH
Definition SystemBody.h:58
@ TYPE_STAR_O
Definition SystemBody.h:33
@ TYPE_STAR_K
Definition SystemBody.h:28
AtmosphereParameters CalcAtmosphereParams() const
Definition SystemBody.cpp:54
bool IsCoOrbitalWith(const SystemBody *other) const
Definition SystemBody.cpp:579
const RingStyle & GetRings() const
Definition SystemBody.h:196
bool IsMoon() const
Definition SystemBody.h:85
BodySuperType
Definition SystemBody.h:73
@ SUPERTYPE_ROCKY_PLANET
Definition SystemBody.h:76
@ SUPERTYPE_STAR
Definition SystemBody.h:75
@ SUPERTYPE_NONE
Definition SystemBody.h:74
@ SUPERTYPE_GAS_GIANT
Definition SystemBody.h:77
@ SUPERTYPE_STARPORT
Definition SystemBody.h:78
const SystemPath & GetPath() const
Definition SystemBody.h:81
double GetRotationPeriodInDays() const
Definition SystemBody.h:143
fixed GetMassAsFixed() const
Definition SystemBody.h:126
fixed GetSemiMajorAxisAsFixed() const
Definition SystemBody.h:162
double GetAspectRatio() const
Definition SystemBody.h:125
double GetLife() const
Definition SystemBody.h:184
double GetSemiMajorAxis() const
Definition SystemBody.h:161
fixed GetVolatileGasAsFixed() const
Definition SystemBody.h:174
void GetAtmosphereFlavor(Color *outColor, double *outDensity) const
Definition SystemBody.h:209
BodySuperType GetSuperType() const
Definition SystemBody.cpp:114
fixed GetPopulationAsFixed() const
Definition SystemBody.h:188
double CalcSurfaceGravity() const
Definition SystemBody.cpp:593
double GetOrbMin() const
Definition SystemBody.h:157
fixed GetVolatileIcesAsFixed() const
Definition SystemBody.h:178
fixed GetEccentricityAsFixed() const
Definition SystemBody.h:156
double GetAxialTilt() const
Definition SystemBody.h:151
Color GetAlbedo() const
Definition SystemBody.h:201
bool IsScoopable() const
Definition SystemBody.cpp:41
double GetVolatileGas() const
Definition SystemBody.h:175
fixed GetLifeAsFixed() const
Definition SystemBody.h:183
SystemBody * GetParent() const
Definition SystemBody.h:82
SystemBody * GetNearestJumpable()
Definition SystemBody.cpp:654
bool IsRotating() const
Definition SystemBody.h:141
const std::string & GetName() const
Definition SystemBody.h:97
double GetRotationPeriod() const
Definition SystemBody.h:145
double GetRotationPhaseAtStart() const
Definition SystemBody.h:150
bool HasChildren() const
Definition SystemBody.h:90
unsigned int GetHeightMapFractal() const
Definition SystemBody.h:168
fixed GetRadiusAsFixed() const
Definition SystemBody.h:105
IterationProxy< std::vector< SystemBody * > > GetChildren()
Definition SystemBody.h:92
double GetMaxChildOrbitalDistance() const
Definition SystemBody.cpp:567
const char * GetIcon() const
Definition SystemBody.cpp:389
fixed GetRotationPeriodAsFixed() const
Definition SystemBody.h:144
std::string GetAstroDescription() const
Definition SystemBody.cpp:170
bool IsPlanet() const
Definition SystemBody.cpp:533
double GetPopulation() const
Definition SystemBody.h:189
Uint32 GetNumChildren() const
Definition SystemBody.h:91
bool HasRings() const
Definition SystemBody.h:195
fixed GetOrbMaxAsFixed() const
Definition SystemBody.h:160
double GetMass() const
Definition SystemBody.h:127
void Dump(FILE *file, const char *indent="") const
Definition SystemBody.cpp:603
bool IsCustomBody() const
Definition SystemBody.h:102
const std::string & GetSpaceStationType() const
Definition SystemBody.h:223
const std::string & GetHeightMapFilename() const
Definition SystemBody.h:167
StarSystem * GetStarSystem() const
Definition SystemBody.h:221
double GetVolatileIces() const
Definition SystemBody.h:179
double GetOrbMax() const
Definition SystemBody.h:158
int GetAverageTemp() const
Definition SystemBody.h:166
bool HasRotationPhase() const
Definition SystemBody.h:149
fixed GetVolatileLiquidAsFixed() const
Definition SystemBody.h:176
fixed GetAgriculturalAsFixed() const
Definition SystemBody.h:186
double GetRadius() const
Definition SystemBody.h:108
double GetAgricultural() const
Definition SystemBody.h:187
Definition SystemPath.h:13
Sint64 v
Definition fixed.h:239
double ToDouble() const
Definition fixed.h:192
fixedf< 32 > fixed
Definition fixed.h:242
Definition AtmosphereParameters.h:7
Definition Color.h:66
Definition RingStyle.h:7
fixed maxRadius
Definition RingStyle.h:11