2026-02-18 09:39:05 +01:00

76 lines
1.8 KiB
C++

#pragma once
#include "DeerCore/Voxel.h"
#include "DeerRender/Mesh.h"
#include "glm/glm.hpp"
#include <array>
#include <vector>
namespace Deer {
struct VoxelVertex {
VoxelVertex() = default;
VoxelVertex(glm::vec3 _position) : position(_position) {}
glm::vec3 position;
};
struct VoxelFaceData {
// Basic construction
std::vector<VoxelVertex> vertices;
std::vector<uint32_t> triangles;
std::array<std::vector<uint32_t>, 4> connections;
std::array<uint32_t, 4> edges;
};
class VoxelBuilder {
public:
Resource<GPUMesh> 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;
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);
VoxelData& getVoxelData(int x, int y, int z);
void clearVoxelData();
bool hasBlock(int x, int y, int z);
std::vector<VertexData> vertices;
std::vector<u_int32_t> indices;
int voxelXOffset;
int voxelYOffset;
int voxelZOffset;
VoxelEnvironment* environment;
VoxelData voxelData[CLUSTER_SIZE + 2][CLUSTER_SIZE + 2][CLUSTER_SIZE + 2];
friend VoxelEnvironment;
};
} // namespace Deer