X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FPlanet.hpp;h=7ac6b570256f7b256679b067ca8887489a4c3c59;hb=b9af958c3f80a966bd31c622a45d0f3375bf2c3a;hp=efc804dae6a88e91cbbacafcbfd2c3cd38798bab;hpb=592c7e6d616f2cfacfd4948e17a4bb72f6444488;p=blobs.git diff --git a/src/world/Planet.hpp b/src/world/Planet.hpp index efc804d..7ac6b57 100644 --- a/src/world/Planet.hpp +++ b/src/world/Planet.hpp @@ -3,19 +3,21 @@ #include "Body.hpp" +#include "Set.hpp" #include "Tile.hpp" -#include "../graphics/glm.hpp" #include "../graphics/SimpleVAO.hpp" +#include "../math/glm.hpp" #include #include +#include #include namespace blobs { namespace world { -struct Tile; +class TileType; /// A planet has six surfaces, numbered 0 to 5, each filled with /// sidelength² tiles. @@ -41,11 +43,13 @@ public: return tiles[IndexOf(surface, x, y)]; } + const TileType &TypeAt(int surface, int x, int y) const; + /// Convert coordinates into a tile index. int IndexOf(int surface, int x, int y) const { assert(0 <= surface && surface <= 5); - assert(0 <= x && x <= sidelength); - assert(0 <= y && y <= sidelength); + assert(0 <= x && x < sidelength); + assert(0 <= y && y < sidelength); return surface * TilesPerSurface() + y * SideLength() + x; } /// The length of the side of each surface. @@ -61,25 +65,46 @@ public: return 6 * TilesPerSurface(); } - glm::dvec3 TileCenter(int surface, int x, int y) const noexcept; + double TileToPosition(int t) const noexcept { return double(t) - Radius(); } + int PositionToTile(double p) const noexcept { return int(p + Radius()); } + + // tile coordinates of position on surface + glm::ivec2 SurfacePosition(int surface, const glm::dvec3 &) const noexcept; + // height of point over surface + double SurfaceElevation(int surface, const glm::dvec3 &) const noexcept; + // center point of tile on surface at elevation + glm::dvec3 TileCenter(int surface, int x, int y, double elevation = 0.0) const noexcept; + + static glm::dvec3 SurfaceNormal(int srf) noexcept { + glm::dvec3 nrm(0.0); + nrm[(srf + 2) % 3] = srf < 3 ? 1.0 : -1.0; + return nrm; + } + static glm::dmat3 SurfaceOrientation(int srf) noexcept { + glm::dmat3 mat(0.0); + mat[(srf + 0) % 3][0] = 1.0; + mat[(srf + 2) % 3][1] = srf < 3 ? -1.0 : 1.0; + mat[(srf + 1) % 3][2] = srf < 3 ? 1.0 : -1.0; + return mat; + } - void BuildVAOs(); + void BuildVAO(const Set &); void Draw(app::Assets &, graphics::Viewport &) override; private: int sidelength; - std::unique_ptr tiles; + std::vector tiles; struct Attributes { glm::vec3 position; glm::vec3 tex_coord; }; - graphics::SimpleVAO vao; + std::unique_ptr> vao; }; -void GenerateEarthlike(Planet &) noexcept; -void GenerateTest(Planet &) noexcept; +void GenerateEarthlike(const Set &, Planet &) noexcept; +void GenerateTest(const Set &, Planet &) noexcept; } }