1 #ifndef BLOBS_WORLD_PLANET_HPP_
2 #define BLOBS_WORLD_PLANET_HPP_
8 #include "../graphics/SimpleVAO.hpp"
9 #include "../math/glm.hpp"
22 /// A planet has six surfaces, numbered 0 to 5, each filled with
23 /// sidelength² tiles.
28 explicit Planet(int sidelength);
31 Planet(const Planet &) = delete;
32 Planet &operator =(const Planet &) = delete;
34 Planet(Planet &&) = delete;
35 Planet &operator =(Planet &&) = delete;
39 glm::dvec3 NormalAt(const glm::dvec3 &p) const noexcept { return glm::normalize(p); }
40 /// height over surface
41 double ElevationAt(const glm::dvec3 &p) const noexcept { return glm::length(p) - Radius(); }
42 /// distance to planet center
43 double DistanceAt(const glm::dvec3 &p) const noexcept { return glm::length(p); }
44 /// acceleration due to gravity at given point
45 glm::dvec3 GravityAt(const glm::dvec3 &p) const noexcept { return NormalAt(p) * (-GravitationalParameter() / glm::length2(p)); }
48 Tile &TileAt(const glm::dvec3 &) noexcept;
49 const Tile &TileAt(const glm::dvec3 &) const noexcept;
50 const TileType &TileTypeAt(const glm::dvec3 &) const noexcept;
52 /// Get the tile at given surface and coordinates.
53 Tile &TileAt(int surface, int x, int y) noexcept;
54 const Tile &TileAt(int surface, int x, int y) const noexcept;
55 const TileType &TypeAt(int surface, int x, int y) const noexcept;
57 /// The length in tiles of the side of each surface.
58 int SideLength() const { return sidelength; }
60 // center point of tile on surface at elevation
61 glm::dvec3 TileCenter(int surface, int x, int y, double elevation = 0.0) const noexcept;
64 void Draw(app::Assets &, graphics::Viewport &) override;
67 /// Convert coordinates into a tile index.
68 int IndexOf(int surface, int x, int y) const {
69 assert(0 <= surface && surface <= 5);
70 assert(0 <= x && x < sidelength);
71 assert(0 <= y && y < sidelength);
72 return surface * TilesPerSurface() + y * SideLength() + x;
74 /// The number of tiles of one surface.
75 int TilesPerSurface() const {
76 return SideLength() * SideLength();
78 /// Total number of tiles of all surfaces combined.
79 int TilesTotal() const {
80 return 6 * TilesPerSurface();
85 std::vector<Tile> tiles;
95 std::unique_ptr<graphics::SimpleVAO<Attributes, unsigned int>> vao;
99 void GenerateEarthlike(const Set<TileType> &, Planet &) noexcept;
100 void GenerateTest(const Set<TileType> &, Planet &) noexcept;