#pragma once #include "DeerCore/Voxel.h" #include "DeerRender/Mesh.h" #include "glm/glm.hpp" #include #include namespace Deer { struct VoxelVertex { VoxelVertex() = default; VoxelVertex(glm::vec3 _position) : position(_position) {} glm::vec3 position; }; struct VoxelFaceData { // Basic construction std::vector vertices; std::vector triangles; std::array, 4> connections; std::array edges; }; class VoxelBuilder { public: Resource buildCluster(int x, int y, int z); VoxelBuilder(VoxelEnvironment* env) : environment(env) {} private: struct VoxelData { int16_t vertexIndexFace[6] = {-1, -1, -1, -1, -1, -1}; }; struct VertexData { glm::vec3 position; glm::vec3 normal; glm::vec3 tangent; glm::vec2 uv; float AO; float extrussion; }; private: void addFace(VoxelFaceData& data, glm::vec3 origin, glm::vec3 up, glm::vec3 right); void calculateNormals(); void buildVertices(); void buildFaceVertices(int x, int y, int z, int face); void buildConnections(); void buildAxisConnections(int x, int y, int z); void connectVertices(VoxelFaceData& face1, int edgeIndex1, int face1VertexOffset, VoxelFaceData& face2, int edgeIndex2, int face2VertexOffset); void buildMarchingCubesCorners(); void buildMarchingVoxel(int x, int y, int z, uint8_t marchingCubeId); int getVertexIdCorner(int x, int y, int z, int edge); float getAmbientOclusion(int x, int y, int z); VoxelData& getVoxelData(int x, int y, int z); void clearVoxelData(); bool hasBlock(int x, int y, int z); std::vector vertices; std::vector indices; int voxelXOffset; int voxelYOffset; int voxelZOffset; VoxelEnvironment* environment; VoxelData voxelData[CLUSTER_SIZE + 2][CLUSTER_SIZE + 2][CLUSTER_SIZE + 2]; friend VoxelEnvironment; }; } // namespace Deer