summaryrefslogtreecommitdiff
path: root/src/chunk.cpp
diff options
context:
space:
mode:
authorTyler Murphy <tylermurphy534@gmail.com>2022-09-26 11:03:27 -0400
committerTyler Murphy <tylermurphy534@gmail.com>2022-09-26 11:03:27 -0400
commitb579882324b6f20e04220f6cea735481abf18d47 (patch)
treeaf2670c05b49d9ba95cbc8769e781c091bba94db /src/chunk.cpp
parentMSAA (diff)
downloadminecraftvulkan-b579882324b6f20e04220f6cea735481abf18d47.tar.gz
minecraftvulkan-b579882324b6f20e04220f6cea735481abf18d47.tar.bz2
minecraftvulkan-b579882324b6f20e04220f6cea735481abf18d47.zip
multichunk meshing
Diffstat (limited to 'src/chunk.cpp')
-rw-r--r--src/chunk.cpp71
1 files changed, 37 insertions, 34 deletions
diff --git a/src/chunk.cpp b/src/chunk.cpp
index 9d646f8..3a71031 100644
--- a/src/chunk.cpp
+++ b/src/chunk.cpp
@@ -3,7 +3,7 @@
namespace app {
-static std::map<std::string, std::unique_ptr<Chunk>> chunks{};
+static std::map<std::pair<uint32_t, uint32_t>, Chunk*> chunks{};
Chunk::Chunk(uint32_t gridX, uint32_t gridZ, uint32_t world_seed)
: world_seed{world_seed},
@@ -14,70 +14,73 @@ Chunk::Chunk(uint32_t gridX, uint32_t gridZ, uint32_t world_seed)
}
Chunk* Chunk::newChunk(uint32_t gridX, uint32_t gridZ, uint32_t world_seed) {
- std::unique_ptr<Chunk> chunk = std::make_unique<Chunk>(gridX, gridZ, world_seed);
- std::string key = gridX + "." + gridZ;
- chunks[key] = std::move(chunk);
- return chunks[key].get();
+ Chunk* chunk = new Chunk(gridX, gridZ, world_seed);
+ chunks[{gridX, gridZ}] = std::move(chunk);
+ return chunks[{gridX, gridZ}];
}
-void Chunk::reset() {
- chunks.clear();
-}
-
-std::shared_ptr<xe::Model> Chunk::getMesh() {
- if(reloadRequired) {
- delete chunkMesh.get();
- xe::Model::Builder builder{};
- builder.vertexData = vertexData;
- builder.vertexSize = 32;
- chunkMesh = std::make_shared<xe::Model>(xe::Engine::getInstance()->getDevice(), builder);
+Chunk* Chunk::getChunk(uint32_t gridX, uint32_t gridZ) {
+ if(chunks.count({gridX, gridZ})) {
+ return chunks[{gridX, gridZ}];
+ } else {
+ return NULL;
}
- return chunkMesh;
}
uint8_t Chunk::getBlock(uint32_t x, uint32_t y, uint32_t z) {
- if(y < 0 || y > 256) return AIR;
+ if(y > 256) return AIR;
+ if(y < 0) return INVALID;
int chunkX = gridX;
int chunkZ = gridZ;
if(x < 0) {
chunkX--;
x = 15;
- } else if(x > 16) {
- chunkX ++;
+ } else if(x > 15) {
+ chunkX++;
x = 0;
}
if(z < 0) {
chunkZ--;
z = 15;
- } else if(z > 16) {
- chunkZ ++;
+ } else if(z > 15) {
+ chunkZ++;
z = 0;
}
if(chunkX == gridX && chunkZ == gridZ) {
- int index = (z * 16 * 256) + (y * 16) + x;
+ int index = x + (z * 16) + (y * 256);
return blocks[index];
} else {
Chunk* chunk = getChunk(chunkX, chunkZ);
if(chunk == nullptr) {
- return AIR;
+ return INVALID;
} else {
- int index = (z * 16 * 256) + (y * 16) + x;
+ int index = x + (z * 16) + (y * 256);
return chunk->blocks[index];
}
}
}
void Chunk::setBlock(uint32_t x, uint32_t y, uint32_t z, uint8_t block) {
- int index = (z * 16 * 256) + (y * 16) + x;
+ int index = x + (z * 16) + (y * 256);
blocks[index] = block;
}
-Chunk* Chunk::getChunk(uint32_t x, uint32_t z) {
- std::string key = x + "." + z;
- if(chunks.count(key))
- return chunks[key].get();
- else
- return nullptr;
+void Chunk::reset() {
+ for(const auto &[key, chunk]: chunks) {
+ delete chunk;
+ }
+ chunks.clear();
+}
+
+std::shared_ptr<xe::Model> Chunk::getMesh() {
+ if(reloadRequired) {
+ delete chunkMesh.get();
+ xe::Model::Builder builder{};
+ builder.vertexData = vertexData;
+ builder.vertexSize = 32;
+ chunkMesh = std::make_shared<xe::Model>(xe::Engine::getInstance()->getDevice(), builder);
+ }
+ return chunkMesh;
}
void Chunk::createMeshAsync() {
@@ -134,11 +137,11 @@ void Chunk::addVerticies(uint32_t side, uint32_t x, uint32_t y, uint32_t z) {
void Chunk::generate() {
blocks.resize(16*16*256);
- const PerlinNoise perlin{123};
+ const PerlinNoise perlin{world_seed};
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
- int height = perlin.octave2D_01((x * 0.01), (z * 0.01), 4) * 5;
+ int height = perlin.octave2D_01((( x + gridX * 16) * 0.01), ((z + gridZ * 16) * 0.01), 4) * 10;
for(int y = 0; y < 256; y++) {
if(y <= height)
setBlock(x, y, z, DIRT);