From 9ee1007ade7f29972ab07df5e2436d8e824a58a9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 4 Dec 2021 00:03:47 +0100 Subject: [PATCH] World: Chunk: use enum to store biome data format --- src/World/Chunk.cpp | 26 ++++++++++++++++---------- src/World/Chunk.hpp | 8 +++++++- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/World/Chunk.cpp b/src/World/Chunk.cpp index fc0307e..8b4b9eb 100644 --- a/src/World/Chunk.cpp +++ b/src/World/Chunk.cpp @@ -28,14 +28,18 @@ Chunk::Chunk(const ChunkData *data) { auto biomesIntArray = level->get("Biomes"); auto biomesByteArray = level->get("Biomes"); - if (biomesIntArray && biomesIntArray->getLength() == BSIZE*BSIZE*BMAXY) + if (biomesIntArray && biomesIntArray->getLength() == BSIZE*BSIZE*BMAXY) { biomeInts = std::move(biomesIntArray); - else if (biomesIntArray && biomesIntArray->getLength() == SIZE*SIZE) - biomeIntsPre115 = std::move(biomesIntArray); - else if (biomesByteArray && biomesByteArray->getLength() == SIZE*SIZE) + biomeFormat = INT_ARRAY; + } else if (biomesIntArray && biomesIntArray->getLength() == SIZE*SIZE) { + biomeInts = std::move(biomesIntArray); + biomeFormat = INT_ARRAY_PRE1_15; + } else if (biomesByteArray && biomesByteArray->getLength() == SIZE*SIZE) { biomeBytes = std::move(biomesByteArray); - else + biomeFormat = BYTE_ARRAY; + } else { throw std::invalid_argument("corrupt biome data"); + } auto dataVersionTag = data->getRoot()->get("DataVersion"); uint32_t dataVersion = dataVersionTag ? dataVersionTag->getValue() : 0; @@ -53,14 +57,16 @@ uint8_t Chunk::getBiome(block_idx_t x, y_idx_t y, block_idx_t z) const { if (x > SIZE || y > MAXY || z > SIZE) throw std::invalid_argument("corrupt chunk data"); - if (biomeInts) + switch (biomeFormat) { + case INT_ARRAY: return biomeInts->getValue((y>>BSHIFT)*BSIZE*BSIZE + (z>>BSHIFT)*BSIZE + (x>>BSHIFT)); - else if (biomeIntsPre115) - return biomeIntsPre115->getValue(z*SIZE + x); - else if (biomeBytes) + case INT_ARRAY_PRE1_15: + return biomeInts->getValue(z*SIZE + x); + case BYTE_ARRAY: return biomeBytes->getValue(z*SIZE + x); - else + default: return 0xff; + } } Block Chunk::getBlock(block_idx_t x, Chunk::Height height, block_idx_t z) const { diff --git a/src/World/Chunk.hpp b/src/World/Chunk.hpp index cfae0f7..1a59efe 100644 --- a/src/World/Chunk.hpp +++ b/src/World/Chunk.hpp @@ -57,8 +57,14 @@ public: private: std::vector> sections; + enum BiomeFormat { + UNKNOWN = 0, + BYTE_ARRAY, + INT_ARRAY_PRE1_15, + INT_ARRAY, + } biomeFormat = UNKNOWN; + std::shared_ptr biomeBytes; - std::shared_ptr biomeIntsPre115; std::shared_ptr biomeInts; bool getHeight(