From 344e475f52977972ded4d7702f9d6294aec4b4f6 Mon Sep 17 00:00:00 2001 From: szdytom Date: Fri, 1 Aug 2025 22:39:09 +0800 Subject: [PATCH] refactor: Simplify sub-chunk handling and improve biome management in Chunk and TerrainGenerator Signed-off-by: szdytom --- tilemap/docs/api.md | 21 ++++++++++----------- tilemap/include/biome.h | 5 ++--- tilemap/include/chunk.h | 8 ++++---- tilemap/src/generation.cpp | 6 +++--- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/tilemap/docs/api.md b/tilemap/docs/api.md index 6022c3c..cd8d6c1 100644 --- a/tilemap/docs/api.md +++ b/tilemap/docs/api.md @@ -36,16 +36,16 @@ public: ### Chunk -Each chunk contains 64×64 tiles and 4×4 sub-chunk biome information. +Each chunk contains 64×64 tiles and sub-chunk biome information. ```cpp struct Chunk { static constexpr uint8_t size = 64; // Tiles per side - static constexpr uint8_t subchunk_size = 16; // Tiles per sub-chunk side - static constexpr uint8_t subchunk_count = 4; // Sub-chunks per side + static constexpr uint8_t subchunk_size = /* certain value */; // Tiles per sub-chunk side + static constexpr uint8_t subchunk_count = size / subchunk_size; // Sub-chunks per side Tile tiles[size][size]; // 64x64 tile grid - BiomeType biome[subchunk_count][subchunk_count]; // 4x4 biome grid + BiomeType biome[subchunk_count][subchunk_count]; }; ``` @@ -200,12 +200,12 @@ BiomeType determine_biome(double temperature, double humidity); ### SubChunkPos -Position within a chunk's 4×4 sub-chunk grid. +Position within a chunk's sub-chunk grid. ```cpp struct SubChunkPos { - std::uint8_t sub_x; // 0-3 - std::uint8_t sub_y; // 0-3 + std::uint8_t sub_x; + std::uint8_t sub_y; }; constexpr std::pair subchunk_to_tile_start( @@ -235,8 +235,8 @@ config.base_scale = 0.08; istd::map_generate(tilemap, config); // Access tiles -for (int chunk_y = 0; chunk_y < 4; ++chunk_y) { - for (int chunk_x = 0; chunk_x < 4; ++chunk_x) { +for (int chunk_y = 0; chunk_y < Chunk::subchunk_count; ++chunk_y) { + for (int chunk_x = 0; chunk_x < Chunk::subchunk_count; ++chunk_x) { const auto& chunk = tilemap.get_chunk(chunk_x, chunk_y); // Process chunk tiles... } @@ -270,8 +270,7 @@ std::cout << "Biome: " << props.name << std::endl; ## Performance Notes - Each chunk contains 4,096 tiles (64×64) -- A 4×4 chunk map contains 65,536 total tiles -- Sub-chunks provide efficient biome management (16×16 tile regions) +- Sub-chunks provide efficient biome management - Tiles are packed into 1 byte each for memory efficiency - Generation uses Perlin noise with uniform distribution mapping for balanced terrain - Noise calibration is performed once during generator construction diff --git a/tilemap/include/biome.h b/tilemap/include/biome.h index df60a7d..27d3b22 100644 --- a/tilemap/include/biome.h +++ b/tilemap/include/biome.h @@ -53,10 +53,9 @@ const BiomeProperties &get_biome_properties(BiomeType biome); // Determine biome type based on temperature and humidity BiomeType determine_biome(double temperature, double humidity); -// Sub-chunk position within a chunk (4x4 grid of 16x16 sub-chunks) struct SubChunkPos { - std::uint8_t sub_x; // 0-3 - std::uint8_t sub_y; // 0-3 + std::uint8_t sub_x; + std::uint8_t sub_y; constexpr SubChunkPos(std::uint8_t x, std::uint8_t y): sub_x(x), sub_y(y) {} }; diff --git a/tilemap/include/chunk.h b/tilemap/include/chunk.h index b81b4b9..cdb0176 100644 --- a/tilemap/include/chunk.h +++ b/tilemap/include/chunk.h @@ -21,16 +21,16 @@ struct Chunk { // Size of a chunk in tiles (64 x 64) static constexpr uint8_t size = 64; - // Each sub-chunk is 16x16 tiles - static constexpr uint8_t subchunk_size = 16; + // Sub-chunk size in tiles + static constexpr uint8_t subchunk_size = 4; // Number of sub-chunks in each dimension static constexpr uint8_t subchunk_count = size / subchunk_size; - // 64x64 array of tile types + // array of tile types Tile tiles[size][size]; - // 4x4 array of biomes for sub-chunks + // array of biomes for sub-chunks BiomeType biome[subchunk_count][subchunk_count]; }; diff --git a/tilemap/src/generation.cpp b/tilemap/src/generation.cpp index 58007e4..f27fded 100644 --- a/tilemap/src/generation.cpp +++ b/tilemap/src/generation.cpp @@ -71,8 +71,8 @@ void TerrainGenerator::generate_chunk( const Chunk &chunk = tilemap.get_chunk(chunk_x, chunk_y); // Generate each sub-chunk with its corresponding biome - for (std::uint8_t sub_x = 0; sub_x < 4; ++sub_x) { - for (std::uint8_t sub_y = 0; sub_y < 4; ++sub_y) { + for (std::uint8_t sub_x = 0; sub_x < Chunk::subchunk_count; ++sub_x) { + for (std::uint8_t sub_y = 0; sub_y < Chunk::subchunk_count; ++sub_y) { SubChunkPos sub_pos(sub_x, sub_y); BiomeType biome = chunk.biome[sub_x][sub_y]; generate_subchunk(tilemap, chunk_x, chunk_y, sub_pos, biome); @@ -89,7 +89,7 @@ void TerrainGenerator::generate_subchunk( // Get starting tile coordinates for this sub-chunk auto [start_x, start_y] = subchunk_to_tile_start(sub_pos); - // Generate terrain for each tile in the 16x16 sub-chunk + // Generate terrain for each tile in the sub-chunk for (std::uint8_t local_x = start_x; local_x < start_x + Chunk::subchunk_size; ++local_x) { for (std::uint8_t local_y = start_y;