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;
38 /// Get the tile at given surface and coordinates.
39 Tile &TileAt(int surface, int x, int y) {
40 return tiles[IndexOf(surface, x, y)];
42 const Tile &TileAt(int surface, int x, int y) const {
43 return tiles[IndexOf(surface, x, y)];
46 const TileType &TypeAt(int surface, int x, int y) const;
48 /// Convert coordinates into a tile index.
49 int IndexOf(int surface, int x, int y) const {
50 assert(0 <= surface && surface <= 5);
51 assert(0 <= x && x < sidelength);
52 assert(0 <= y && y < sidelength);
53 return surface * TilesPerSurface() + y * SideLength() + x;
55 /// The length of the side of each surface.
56 int SideLength() const {
59 /// The number of tiles of one surface.
60 int TilesPerSurface() const {
61 return SideLength() * SideLength();
63 /// Total number of tiles of all surfaces combined.
64 int TilesTotal() const {
65 return 6 * TilesPerSurface();
68 double TileToPosition(int t) const noexcept { return double(t) - Radius(); }
69 int PositionToTile(double p) const noexcept { return int(p + Radius()); }
71 // tile coordinates of position on surface
72 glm::ivec2 SurfacePosition(int surface, const glm::dvec3 &) const noexcept;
73 // height of point over surface
74 double SurfaceElevation(int surface, const glm::dvec3 &) const noexcept;
75 // center point of tile on surface at elevation
76 glm::dvec3 TileCenter(int surface, int x, int y, double elevation = 0.0) const noexcept;
78 static glm::dvec3 SurfaceNormal(int srf) noexcept {
80 nrm[(srf + 2) % 3] = srf < 3 ? 1.0 : -1.0;
83 static glm::dmat3 SurfaceOrientation(int srf) noexcept {
85 mat[(srf + 0) % 3][0] = 1.0;
86 mat[(srf + 2) % 3][1] = srf < 3 ? -1.0 : 1.0;
87 mat[(srf + 1) % 3][2] = srf < 3 ? 1.0 : -1.0;
91 void BuildVAO(const Set<TileType> &);
92 void Draw(app::Assets &, graphics::Viewport &) override;
96 std::vector<Tile> tiles;
102 std::unique_ptr<graphics::SimpleVAO<Attributes, unsigned int>> vao;
106 void GenerateEarthlike(const Set<TileType> &, Planet &) noexcept;
107 void GenerateTest(const Set<TileType> &, Planet &) noexcept;