#pragma once #include "ZLMath.h" #include "Renderer.h" #include "TextureManager.h" #include #include #include #include #include #include #include #include #include #include namespace ZL { using VertexID = std::string; using V2TMap = std::map>; VertexID generateEdgeID(const VertexID& id1, const VertexID& id2); struct Triangle { std::array data; std::array ids; Triangle(Vector3f p1, Vector3f p2, Vector3f p3) : data{ p1, p2, p3 } { } Triangle(std::array idata, std::array iids) : data{ idata } , ids{ iids } { } }; struct LodLevel { VertexDataStruct vertexData; std::vector VertexIDs; V2TMap v2tMap; }; 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, float noiseCoeff); }; class PlanetObject { private: PerlinNoise perlin; PerlinNoise colorPerlin; void prepareDrawData(); std::array planetMeshLods; VertexRenderStruct planetRenderStruct; VertexRenderStruct planetRenderRedStruct; VertexRenderStruct planetRenderYellowStruct; LodLevel planetAtmosphereLod; VertexRenderStruct planetAtmosphere; std::shared_ptr sandTexture; std::map initialVertexMap = { {{ 0.0f, 1.0f, 0.0f}, "A"}, {{ 0.0f, -1.0f, 0.0f}, "B"}, {{ 1.0f, 0.0f, 0.0f}, "C"}, {{-1.0f, 0.0f, 0.0f}, "D"}, {{ 0.0f, 0.0f, 1.0f}, "E"}, {{ 0.0f, 0.0f, -1.0f}, "F"} }; public: PlanetObject(); void init(); void update(float deltaTimeMs); void draw(Renderer& renderer); void drawAtmosphere(Renderer& renderer); bool planetIsFar(); float distanceToPlanetSurface(); private: bool drawDataDirty = true; int currentLod = planetMeshLods.size()-1; std::vector subdivideTriangles(const std::vector& inputTriangles); Vector3f calculateSurfaceNormal(Vector3f p_sphere, float noiseCoeff); LodLevel trianglesToVertices(const std::vector& triangles); LodLevel generateSphere(int subdivisions, float noiseCoeff); std::pair calculateZRange(const Vector3f& shipPosition); std::vector triangleUnderCamera(int lod); std::vector findNeighbors(int index, int lod); }; } // namespace ZL