Pioneer
Loading...
Searching...
No Matches
CityOnPlanet.h
Go to the documentation of this file.
1// Copyright © 2008-2024 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#include "JsonFwd.h"
11#include "matrix4x4.h"
12
13#include <set>
14
15class Geom;
16class Planet;
17class SpaceStation;
18class Frame;
19class SystemPath;
20class SystemBody;
21
22namespace Graphics {
23 class Renderer;
24 class Frustum;
25 class Material;
26} // namespace Graphics
27
28namespace FileSystem {
29 class FileInfo;
30} // namespace FileSystem
31
32namespace SceneGraph {
33 class Model;
34 class Animation;
35} // namespace SceneGraph
36
38public:
39 CityOnPlanet() = delete;
40 CityOnPlanet(Planet *planet, SpaceStation *station, const Uint32 seed);
41 virtual ~CityOnPlanet();
42
43 void Render(Graphics::Renderer *r, const Graphics::Frustum &camera, const SpaceStation *station, const vector3d &viewCoords, const matrix4x4d &viewTransform);
44 inline Planet *GetPlanet() const { return m_planet; }
45 float GetClipRadius() const { return m_clipRadius; }
46
47 static void Init();
48 static void Uninit();
49
50 static void SetCityModelPatterns(const SystemPath &path);
51
52 static constexpr double RADIUS = 5000.0;
53 // size of a city grid cell
54 static constexpr uint32_t CELLSIZE = 50;
55 // maximum number of cells a single building may take up
56 static constexpr uint32_t CELLMAX = 32;
57 static constexpr uint32_t CELLMASK = CELLMAX - 1;
58
59private:
60
61 // Defines which "city sector" a building should optimally be placed in
62 enum class SectorKind : uint32_t {
63 None, // no specific sector for a building
64 Storage, // warehouses and personal storage buildings
65 Industry, // industrial buildings with high pollution or power draw
66 Monument, // civic / recreational buildings
67 Habitat, // living spaces and office buildings
68 Frontier, // general buildings scattered at the edge of the city
69 };
70
71 // Building type definition
72 struct BuildingType {
73 uint8_t cellSize[2] = {1, 1};
74
75 float rarityAirless = 0;
76 float rarityAtmo = 0;
77
78 SectorKind buildingKind = SectorKind::None;
79
80 SceneGraph::Model *model;
81 SceneGraph::Animation *idleAnimation;
82 };
83
84 struct CityRadiusDef {
85 double population = 0.0; // billions of people
86 float baseSize = 0.0; // base size of the city (meters)
87 float atmoSize = 0.0; // additional size from atmosphere (meters)
88 float randomSize = 0.0; // random additional size (meters)
89 float density = 0.0; // density of buildings within the city
90 };
91
92 struct CityFlavourType {
93 std::string flavourName;
94 std::vector<CityRadiusDef> sizeDefs;
95 std::vector<BuildingType> buildingTypes;
96 };
97
98private:
99
100 void Generate(SpaceStation *station);
101 void CalcCityRadius(const SystemBody *body);
102
103 void SetGridOccupancy(uint32_t x, uint32_t y, const uint8_t size[2]);
104 bool TestGridOccupancy(uint32_t x, uint32_t y, const uint8_t size[2]);
105
106 // Quickly check if the given single grid cell is set.
107 // It is expected as a precondition that the position is valid and within
108 // the extents of the grid.
109 inline bool TestGridQuick(uint32_t x, uint32_t y) const
110 {
111 // bitset is stored in lsb order with 8 cells per byte
112 return m_gridBitset[y * m_gridPitch + x / 8] & (1 << (x & 7));
113 }
114
115 void AddStaticGeomsToCollisionSpace();
116 void RemoveStaticGeomsFromCollisionSpace();
117
118 struct BuildingInstance {
119 Uint32 instIndex;
120 float clipRadius;
121 int rotation; // 0-3
122 vector3d pos;
123 Geom *geom;
124 };
125
126 const SystemBody *m_body;
127 Planet *m_planet;
128
129 double m_cityRadius;
130 double m_cityDensity;
131 uint32_t m_citySize;
132
133 FrameId m_frame;
134 Random m_rand;
135
136 std::vector<BuildingInstance> m_buildings;
137 std::vector<BuildingInstance> m_enabledBuildings;
138 std::vector<Uint32> m_buildingCounts;
139
140 // bitmask occupancy grid for quick population of the city
141 std::unique_ptr<uint8_t[]> m_gridBitset;
142 // width of a single grid row in bytes
143 uint32_t m_gridPitch;
144 uint32_t m_gridLen;
145
146 int m_detailLevel;
147 float m_clipRadius;
148 vector3d m_realCentre;
149 vector3d m_gridOrigin;
150
151 CityFlavourType *m_cityType;
152
153 // --------------------------------------------------------
154 // statics
155private:
156
157 static std::vector<CityFlavourType> s_cityFlavours;
158
159 static std::unique_ptr<Graphics::Material> s_debugMat;
160
161 static void LoadCityFlavour(const FileSystem::FileInfo &file);
162 static void LoadBuildingType(std::string_view key, const Json &buildingDef, BuildingType &out);
163 static void GetModelSize(const Aabb &aabb, uint8_t size[2]);
164};
165
166#endif /* _CITYONPLANET_H */
nlohmann::json Json
Definition: Json.h:8
Definition: CityOnPlanet.h:37
static void Init()
Definition: CityOnPlanet.cpp:230
static constexpr double RADIUS
Definition: CityOnPlanet.h:52
static constexpr uint32_t CELLMAX
Definition: CityOnPlanet.h:56
static void Uninit()
Definition: CityOnPlanet.cpp:263
static constexpr uint32_t CELLSIZE
Definition: CityOnPlanet.h:54
float GetClipRadius() const
Definition: CityOnPlanet.h:45
static constexpr uint32_t CELLMASK
Definition: CityOnPlanet.h:57
virtual ~CityOnPlanet()
Definition: CityOnPlanet.cpp:297
static void SetCityModelPatterns(const SystemPath &path)
Definition: CityOnPlanet.cpp:273
void Render(Graphics::Renderer *r, const Graphics::Frustum &camera, const SpaceStation *station, const vector3d &viewCoords, const matrix4x4d &viewTransform)
Definition: CityOnPlanet.cpp:643
Planet * GetPlanet() const
Definition: CityOnPlanet.h:44
CityOnPlanet()=delete
Definition: FileSystem.h:78
Definition: Frame.h:28
Definition: Geom.h:16
Definition: Frustum.h:17
Definition: Renderer.h:45
Definition: Planet.h:18
Definition: Random.h:29
Definition: Animation.h:19
Definition: Model.h:87
Definition: SpaceStation.h:30
Definition: SystemBody.h:137
Definition: SystemPath.h:13
Definition: CityOnPlanet.h:28
Definition: Background.h:14
Definition: CityOnPlanet.h:32
Definition: Aabb.h:11
Definition: FrameId.h:9