Added method of getting cube's index
This commit is contained in:
parent
bb349e9994
commit
01121fe526
2 changed files with 39 additions and 0 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
#include "MarchingCubeChunkRenderer.h"
|
#include "MarchingCubeChunkRenderer.h"
|
||||||
|
|
||||||
|
const float MarchingCubeChunkRenderer::noiseCutOff = 0.2f;
|
||||||
|
|
||||||
MarchingCubeChunkRenderer::MarchingCubeChunkRenderer(
|
MarchingCubeChunkRenderer::MarchingCubeChunkRenderer(
|
||||||
std::vector<Chunk> &chunks, std::vector<Model *> models) {
|
std::vector<Chunk> &chunks, std::vector<Model *> models) {
|
||||||
this->chunks = &chunks;
|
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 y = ti.yRange[0]; y < ti.yRange[1]; y++) {
|
||||||
for (int z = ti.zRange[0]; z < ti.zRange[1]; z++) {
|
for (int z = ti.zRange[0]; z < ti.zRange[1]; z++) {
|
||||||
if (chunk->getNoise(x, y, z) > 0.2f) {
|
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)->setPosition(glm::vec3(x, y, z));
|
||||||
models.at(0)->draw(shader);
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,9 @@ class MarchingCubeChunkRenderer {
|
||||||
private:
|
private:
|
||||||
Error error = Error("MarchingCubeChunkRenderer");
|
Error error = Error("MarchingCubeChunkRenderer");
|
||||||
|
|
||||||
|
// Noise cut off value.
|
||||||
|
const static float noiseCutOff;
|
||||||
|
|
||||||
// Chunks to render
|
// Chunks to render
|
||||||
std::vector<Chunk> *chunks;
|
std::vector<Chunk> *chunks;
|
||||||
|
|
||||||
|
|
@ -18,6 +21,9 @@ private:
|
||||||
// https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.545.613
|
// https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.545.613
|
||||||
std::vector<Model *> models;
|
std::vector<Model *> models;
|
||||||
|
|
||||||
|
// Determine Cubes Model and translation.
|
||||||
|
Model *genCubeModel(int x, int y, int z, Chunk &chunk);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MarchingCubeChunkRenderer(std::vector<Chunk> &chunks,
|
MarchingCubeChunkRenderer(std::vector<Chunk> &chunks,
|
||||||
std::vector<Model *> models);
|
std::vector<Model *> models);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue