diff options
Diffstat (limited to 'src/chunk.cpp')
-rw-r--r-- | src/chunk.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/chunk.cpp b/src/chunk.cpp index f9ddb54..e830c57 100644 --- a/src/chunk.cpp +++ b/src/chunk.cpp @@ -16,14 +16,14 @@ Chunk::Chunk(int32_t gridX, int32_t gridZ, uint32_t world_seed) } Chunk::~Chunk() { - if(chunkMesh != nullptr) - delete chunkMesh; if(worker.joinable()) worker.join(); + if(chunkMesh != nullptr) + delete chunkMesh; } // -// CHUNK CREATION AND DELETION +// CHUNK CREATION, DELETION, AND RETREVAL // static std::map<std::pair<int32_t, int32_t>, Chunk*> chunks{}; @@ -38,10 +38,17 @@ Chunk* Chunk::getChunk(int32_t gridX, int32_t gridZ) { if(chunks.count({gridX, gridZ})) { return chunks[{gridX, gridZ}]; } else { - return NULL; + return nullptr; } } +void Chunk::deleteChunk(int32_t gridX, int32_t gridZ) { + Chunk* chunk = getChunk(gridX, gridZ); + if(chunk == nullptr) return; // Chunk does not exist or is already deleted + delete chunk; + chunks.erase({gridX, gridZ}); +} + // // CHUNK TEXTURE AND BLOCK LOADING // @@ -51,7 +58,7 @@ static std::map<std::string, uint32_t> texturesIds{}; static std::vector<xe::Image*> textures{}; void loadTexture(const std::string& filePath) { - xe::Image* image = xe::Engine::getInstance()->loadImageFromFile(filePath, false); + xe::Image* image = new xe::Image(filePath, false); texturesIds[filePath] = static_cast<uint32_t>(textures.size()); textures.push_back(image); } @@ -88,12 +95,15 @@ void Chunk::unload() { // void Chunk::createMeshAsync(Chunk* c) { + if(c == nullptr) return; if(c->working) return; + if(c->worker.joinable()) + c->worker.join(); c->worker = std::thread(createMesh, c); } void Chunk::createMesh(Chunk* c) { - c->working = true; + if(c == nullptr) return; c->vertexData.data.clear(); for(int32_t x=0;x<16;x++) { for(int32_t y=0; y<256; y++) { @@ -152,7 +162,7 @@ xe::Model* Chunk::getMesh() { xe::Model::Builder builder{}; builder.vertexData = vertexData; builder.vertexSize = 36; - chunkMesh = new xe::Model(xe::Engine::getInstance()->getDevice(), builder); + chunkMesh = new xe::Model(builder); reloadRequired = false; } return chunkMesh; |