diff --git a/src/MarchingCubeChunkRenderer.cpp b/src/MarchingCubeChunkRenderer.cpp index 34bd5af..0164411 100644 --- a/src/MarchingCubeChunkRenderer.cpp +++ b/src/MarchingCubeChunkRenderer.cpp @@ -1,5 +1,7 @@ #include "MarchingCubeChunkRenderer.h" +const float MarchingCubeChunkRenderer::noiseCutOff = 0.2f; + MarchingCubeChunkRenderer::MarchingCubeChunkRenderer( std::vector &chunks, std::vector models) { this->chunks = &chunks; @@ -16,6 +18,7 @@ void MarchingCubeChunkRenderer::draw(ShaderLoader &shader) { for (int y = ti.yRange[0]; y < ti.yRange[1]; y++) { for (int z = ti.zRange[0]; z < ti.zRange[1]; z++) { if (chunk->getNoise(x, y, z) > 0.2f) { + this->genCubeModel(x, y, z, *chunk); models.at(0)->setPosition(glm::vec3(x, y, z)); models.at(0)->draw(shader); } @@ -24,3 +27,33 @@ void MarchingCubeChunkRenderer::draw(ShaderLoader &shader) { } } } + +Model *MarchingCubeChunkRenderer::genCubeModel(int x, int y, int z, + Chunk &chunk) { + // Gen cube index. Based on figure 4 from: + // https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.545.613 + bool bIndex[8] = {false}; + + if (chunk.getNoise(x, y, z) > noiseCutOff) + bIndex[7] = true; + if (chunk.getNoise(x + 1, y, z) > noiseCutOff) + bIndex[6] = true; + if (chunk.getNoise(x + 1, y + 1, z) > noiseCutOff) + bIndex[5] = true; + if (chunk.getNoise(x, y + 1, z) > noiseCutOff) + bIndex[4] = true; + if (chunk.getNoise(x, y, z + 1) > noiseCutOff) + bIndex[3] = true; + if (chunk.getNoise(x + 1, y, z + 1) > noiseCutOff) + bIndex[2] = true; + if (chunk.getNoise(x + 1, y + 1, z + 1) > noiseCutOff) + bIndex[1] = true; + if (chunk.getNoise(x, y + 1, z + 1) > noiseCutOff) + bIndex[0] = true; + + uint8_t index; + for (int i = 0; i < 8; i++) + index = index + (bIndex[i] * (pow(2, i))); + + return models.at(0); +} diff --git a/src/MarchingCubeChunkRenderer.h b/src/MarchingCubeChunkRenderer.h index 9af5768..7f8f7f8 100644 --- a/src/MarchingCubeChunkRenderer.h +++ b/src/MarchingCubeChunkRenderer.h @@ -10,6 +10,9 @@ class MarchingCubeChunkRenderer { private: Error error = Error("MarchingCubeChunkRenderer"); + // Noise cut off value. + const static float noiseCutOff; + // Chunks to render std::vector *chunks; @@ -18,6 +21,9 @@ private: // https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.545.613 std::vector models; + // Determine Cubes Model and translation. + Model *genCubeModel(int x, int y, int z, Chunk &chunk); + public: MarchingCubeChunkRenderer(std::vector &chunks, std::vector models);