Pioneer
CityOnPlanet.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _CITYONPLANET_H
5 #define _CITYONPLANET_H
6 
7 #include "CollMesh.h"
8 #include "FrameId.h"
9 #include "Random.h"
10 
11 #include <set>
12 
13 class Geom;
14 class Planet;
15 class SpaceStation;
16 class Frame;
17 class SystemPath;
18 
19 namespace Graphics {
20  class Renderer;
21  class Frustum;
22 } // namespace Graphics
23 namespace SceneGraph {
24  class Model;
25  class Animation;
26 } // namespace SceneGraph
27 
28 class CityOnPlanet {
29 public:
30  CityOnPlanet() = delete;
31  CityOnPlanet(Planet *planet, SpaceStation *station, const Uint32 seed);
32  virtual ~CityOnPlanet();
33  void Render(Graphics::Renderer *r, const Graphics::Frustum &camera, const SpaceStation *station, const vector3d &viewCoords, const matrix4x4d &viewTransform);
34  inline Planet *GetPlanet() const { return m_planet; }
35 
36  static void Init();
37  static void Uninit();
38  static void SetCityModelPatterns(const SystemPath &path);
39 
40  static constexpr double RADIUS = 5000.0;
41 
42 private:
43  void AddStaticGeomsToCollisionSpace();
44  void RemoveStaticGeomsFromCollisionSpace();
45 
46  struct BuildingDef {
47  Uint32 instIndex;
48  float clipRadius;
49  int rotation; // 0-3
50  vector3d pos;
51  Geom *geom;
52  };
53 
54  Planet *m_planet;
55  FrameId m_frame;
56  std::vector<BuildingDef> m_buildings;
57  std::vector<BuildingDef> m_enabledBuildings;
58  std::vector<Uint32> m_buildingCounts;
59  int m_detailLevel;
60  vector3d m_realCentre;
61  float m_clipRadius;
62 
63  // --------------------------------------------------------
64  // statics
65  static const unsigned int CITYFLAVOURS = 5;
66 
67  struct citybuilding_t {
68  const char *modelname;
69  double xzradius;
70  SceneGraph::Model *resolvedModel;
72  RefCountedPtr<CollMesh> collMesh;
73  Uint32 instIndex;
74  };
75 
76  struct citybuildinglist_t {
77  const char *modelTagName;
78  double minRadius, maxRadius;
79  unsigned int numBuildings;
80  citybuilding_t *buildings;
81  };
82 
83  struct cityflavourdef_t {
84  vector3d center;
85  double size;
86  };
87 
88  static bool s_cityBuildingsInitted;
89 
90  static citybuildinglist_t s_buildingList;
91  static cityflavourdef_t cityflavour[CITYFLAVOURS];
92 
93  static void EnumerateNewBuildings(std::set<std::string> &filenames);
94  static void LookupBuildingListModels(citybuildinglist_t *list);
95 };
96 
97 #endif /* _CITYONPLANET_H */
Definition: CityOnPlanet.h:28
static void Init()
Definition: CityOnPlanet.cpp:141
Planet * GetPlanet() const
Definition: CityOnPlanet.h:34
static constexpr double RADIUS
Definition: CityOnPlanet.h:40
static void Uninit()
Definition: CityOnPlanet.cpp:148
virtual ~CityOnPlanet()
Definition: CityOnPlanet.cpp:192
static void SetCityModelPatterns(const SystemPath &path)
Definition: CityOnPlanet.cpp:165
void Render(Graphics::Renderer *r, const Graphics::Frustum &camera, const SpaceStation *station, const vector3d &viewCoords, const matrix4x4d &viewTransform)
Definition: CityOnPlanet.cpp:320
CityOnPlanet()=delete
Definition: Frame.h:28
Definition: Geom.h:16
Definition: Frustum.h:17
Definition: Renderer.h:39
Definition: Planet.h:18
Definition: Animation.h:19
Definition: Model.h:94
Definition: SpaceStation.h:30
Definition: SystemPath.h:13
Definition: Background.h:13
Definition: CityOnPlanet.h:23
Definition: FrameId.h:9