81 lines
1.9 KiB
C++
81 lines
1.9 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;
|
|
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<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
|