#pragma once #include "ZLMath.h" #include "Renderer.h" #include "TextureManager.h" #include #include #include #include #include #include #include #include namespace ZL { struct Triangle { std::array data; Triangle(Vector3f p1, Vector3f p2, Vector3f p3) : data{ p1, p2, p3 } { } }; class PerlinNoise { std::vector p; public: PerlinNoise(); PerlinNoise(uint64_t seed); float fade(float t); float lerp(float t, float a, float b); float grad(int hash, float x, float y, float z); float noise(float x, float y, float z); float getSurfaceHeight(Vector3f pos); }; class PlanetObject { private: PerlinNoise perlin; PerlinNoise colorPerlin; void prepareDrawData(); VertexDataStruct planetMesh; VertexRenderStruct planetRenderStruct; std::shared_ptr sandTexture; public: PlanetObject(); void init(); void update(float deltaTimeMs); void draw(Renderer& renderer); bool planetIsFar(const Vector3f& shipPosition); private: bool drawDataDirty = true; std::vector subdivideTriangles(const std::vector& inputTriangles); Vector3f calculateSurfaceNormal(Vector3f p_sphere); VertexDataStruct trianglesToVertices(const std::vector& triangles); VertexDataStruct generateSphere(int subdivisions); }; } // namespace ZL