From 28cd790e312deb948bfe70ed971ffee64face08f Mon Sep 17 00:00:00 2001 From: Warwick Date: Wed, 10 Aug 2022 16:13:32 +0100 Subject: [PATCH] Added the OOP infastructure to work on rendering chunks. --- src/Chunk.cpp | 24 ++++++++++++++++++------ src/Chunk.h | 11 ++++++++++- src/MarchingCubeChunkRenderer.cpp | 13 +++++++++++++ src/MarchingCubeChunkRenderer.h | 24 ++++++++++++++++++++++++ src/Terrain.cpp | 23 ++++++++++++++++++++++- src/Terrain.h | 10 ++++++++++ 6 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 src/MarchingCubeChunkRenderer.cpp create mode 100644 src/MarchingCubeChunkRenderer.h diff --git a/src/Chunk.cpp b/src/Chunk.cpp index 2e04fe4..bbb5874 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -1,8 +1,10 @@ #include "Chunk.h" Chunk::Chunk(FastNoise::SmartNode<> &noiseGenerator, TerrainInfo ti) { + this->terrainInfo = ti; this->fnGenerator = &noiseGenerator; - // Create location to store noise values. + + // Create location to store noise values temporarily. std::vector noiseOutput((ti.xRange[1] - ti.xRange[0]) * (ti.yRange[1] - ti.yRange[0]) * (ti.zRange[1] - ti.zRange[0])); @@ -13,15 +15,25 @@ Chunk::Chunk(FastNoise::SmartNode<> &noiseGenerator, TerrainInfo ti) { ti.xRange[1] - ti.xRange[0], ti.yRange[1] - ti.yRange[0], ti.zRange[1] - ti.zRange[0], ti.frequency, ti.seed); - // do stuff with values + // Place noise into 3D vector array for easy access. int index = 0; - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 16; y++) { - for (int x = 0; x < 16; x++) { + std::vector> yArray; + std::vector xArray; + for (int z = 0; z < ti.zRange[1] - ti.zRange[0]; z++) { + for (int y = 0; y < ti.yRange[1] - ti.yRange[0]; y++) { + for (int x = 0; x < ti.xRange[1] - ti.xRange[0]; x++) { error.log(std::to_string(x) + " " + std::to_string(y) + " " + std::to_string(z) + ": " + - std::to_string(noiseOutput[index++])); + std::to_string(noiseOutput[index])); + xArray.push_back(noiseOutput[index++]); } + yArray.push_back(xArray); + xArray.clear(); } + this->noise.push_back(yArray); + yArray.clear(); } } + +float Chunk::getNoise(int x, int y, int z) { return this->noise[x][y][z]; } +TerrainInfo Chunk::getTerrainInfo() { return this->terrainInfo; } diff --git a/src/Chunk.h b/src/Chunk.h index 8d467b6..e7b6182 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -15,9 +15,18 @@ class Chunk { private: Error error = Error("Chunk"); - // Favourite noise generated values using the NoiseTool for now: + // Pointer to the noise generator that generated this chunk FastNoise::SmartNode<> *fnGenerator; + // Values that initialised the chunk + TerrainInfo terrainInfo; + + // 3D vector of noise values + std::vector>> noise; + public: Chunk(FastNoise::SmartNode<> &noiseGenerator, TerrainInfo ti); + + float getNoise(int x, int y, int z); + TerrainInfo getTerrainInfo(); }; diff --git a/src/MarchingCubeChunkRenderer.cpp b/src/MarchingCubeChunkRenderer.cpp new file mode 100644 index 0000000..ac75e0f --- /dev/null +++ b/src/MarchingCubeChunkRenderer.cpp @@ -0,0 +1,13 @@ +#include "MarchingCubeChunkRenderer.h" + +MarchingCubeChunkRenderer::MarchingCubeChunkRenderer( + std::vector &chunks, std::vector models) { + this->chunks = &chunks; + this->models = models; +} + +void MarchingCubeChunkRenderer::draw(ShaderLoader &shader) { + for (int i = 0; i < chunks->size(); i++) { + // Render Chunk + } +} diff --git a/src/MarchingCubeChunkRenderer.h b/src/MarchingCubeChunkRenderer.h new file mode 100644 index 0000000..aa98192 --- /dev/null +++ b/src/MarchingCubeChunkRenderer.h @@ -0,0 +1,24 @@ +#pragma once +#include "Chunk.h" +#include "Error.h" +#include "Model.h" +#include + +class MarchingCubeChunkRenderer { + +private: + Error error = Error("MarchingCubeChunkRenderer"); + + // Chunks to render + std::vector *chunks; + + // Here we will store a model corresponding to ease polygon of the marching + // cubes algorithm plus maybe more if models become orientation specific: + // https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.545.613 + std::vector models; + +public: + MarchingCubeChunkRenderer(std::vector &chunks, + std::vector models); + void draw(ShaderLoader &shader); +}; diff --git a/src/Terrain.cpp b/src/Terrain.cpp index 32a6294..0611c79 100644 --- a/src/Terrain.cpp +++ b/src/Terrain.cpp @@ -1,6 +1,7 @@ #include "Terrain.h" -Terrain::Terrain() { +Terrain::Terrain() : renderer(nullptr) { + // Create chunk TerrainInfo ti; ti.xRange[0] = 0; ti.xRange[1] = 16; @@ -12,4 +13,24 @@ Terrain::Terrain() { ti.seed = 0; chunks.push_back(Chunk(fnGenerator, ti)); + + // Create chunks renderer. + std::vector models = { + Model(ROOT_DIR "data/models/wooden_boxbarrel/wooden_box_and_barrel.obj")}; + + renderer = new MarchingCubeChunkRenderer(this->chunks, models); +} + +Terrain::~Terrain() { + // Since we created our renderer member in our constructer it has to be a + // nullptr before being updated to the created object, which means it's + // lifecycle needs to be managed by this class. + delete renderer; +} + +void Terrain::draw(ShaderLoader &shader) { + if (renderer != nullptr) + renderer->draw(shader); + else + error.warn("Terrain attempted to draw with no chunk renderer!"); } diff --git a/src/Terrain.h b/src/Terrain.h index 183b600..f1c1905 100644 --- a/src/Terrain.h +++ b/src/Terrain.h @@ -1,6 +1,10 @@ #pragma once #include "Chunk.h" #include "Error.h" +#include "MarchingCubeChunkRenderer.h" +#include "Model.h" +#include "ShaderLoader.h" +#include "helpers/RootDir.h" #include #include @@ -15,6 +19,12 @@ private: // Currently used chunks std::vector chunks; + MarchingCubeChunkRenderer *renderer; + public: Terrain(); + + void draw(ShaderLoader &shader); + + ~Terrain(); };