Pioneer
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 
15 class StarSystem;
16 
18 
19 class SystemBody : public RefCounted {
20 public:
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>
67  TYPE_MAX = TYPE_STARPORT_SURFACE, // <enum skip>
68  TYPE_STAR_MIN = TYPE_BROWN_DWARF, // <enum skip>
69  TYPE_STAR_MAX = TYPE_STAR_SM_BH, // <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; }
101  BodySuperType GetSuperType() const;
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  {
129  if (GetSuperType() <= SUPERTYPE_STAR)
130  return m_mass.ToDouble() * SOL_MASS;
131  else
132  return m_mass.ToDouble() * EARTH_MASS;
133  }
135  {
136  if (GetSuperType() <= SUPERTYPE_STAR)
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 
201  Color GetAlbedo() const
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 
225 private:
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
StarSystem * GetStarSystem() const
Definition: SystemBody.h:221
IterationProxy< std::vector< SystemBody * > > GetChildren()
Definition: SystemBody.h:92
SystemBody(const SystemPath &path, StarSystem *system)
Definition: SystemBody.cpp:14
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
const std::string & GetSpaceStationType() const
Definition: SystemBody.h:223
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
const IterationProxy< const std::vector< SystemBody * > > GetChildren() const
Definition: SystemBody.h:93
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 SystemPath & GetPath() const
Definition: SystemBody.h:81
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
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
const std::string & GetName() const
Definition: SystemBody.h:97
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
const RingStyle & GetRings() const
Definition: SystemBody.h:196
SystemBody * GetNearestJumpable()
Definition: SystemBody.cpp:654
bool IsRotating() const
Definition: SystemBody.h:141
double GetRotationPeriod() const
Definition: SystemBody.h:145
double GetRotationPhaseAtStart() const
Definition: SystemBody.h:150
bool HasChildren() const
Definition: SystemBody.h:90
SystemBody * GetParent() const
Definition: SystemBody.h:82
unsigned int GetHeightMapFractal() const
Definition: SystemBody.h:168
fixed GetRadiusAsFixed() const
Definition: SystemBody.h:105
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
double GetVolatileIces() const
Definition: SystemBody.h:179
double GetOrbMax() const
Definition: SystemBody.h:158
int GetAverageTemp() const
Definition: SystemBody.h:166
const std::string & GetHeightMapFilename() const
Definition: SystemBody.h:167
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