diff --git a/tilemap/examples/biome_demo.cpp b/tilemap/examples/biome_demo.cpp index bce53ba..ad277bb 100644 --- a/tilemap/examples/biome_demo.cpp +++ b/tilemap/examples/biome_demo.cpp @@ -38,11 +38,10 @@ void generate_bmp(const istd::TileMap &tilemap, const std::string &filename) { // Generate tiles for (int chunk_y = 0; chunk_y < chunks_per_side; ++chunk_y) { for (int chunk_x = 0; chunk_x < chunks_per_side; ++chunk_x) { - const auto &chunk = tilemap.get_chunk(chunk_x, chunk_y); - for (int tile_y = 0; tile_y < tiles_per_chunk; ++tile_y) { for (int tile_x = 0; tile_x < tiles_per_chunk; ++tile_x) { - const auto &tile = chunk.tiles[tile_x][tile_y]; + istd::TilePos pos(chunk_x, chunk_y, tile_x, tile_y); + const auto &tile = tilemap.get_tile(pos); int global_x = chunk_x * tiles_per_chunk + tile_x; int global_y = chunk_y * tiles_per_chunk + tile_y; @@ -134,7 +133,7 @@ void print_statistics(const istd::TileMap &tilemap) { int main(int argc, char *argv[]) { // Parse command line arguments - if (argc < 3 || argc > 4) { + if (argc > 4) { std::cerr << "Usage: " << argv[0] << " [chunks_per_side]\n"; std::cerr << " seed - Random seed for generation\n"; @@ -145,8 +144,9 @@ int main(int argc, char *argv[]) { return 1; } - std::uint64_t seed = std::strtoull(argv[1], nullptr, 10); - std::string output_filename = argv[2]; + std::uint64_t seed + = argc >= 2 ? std::strtoull(argv[1], nullptr, 10) : 541234; + std::string output_filename = argc >= 3 ? argv[2] : "output.bmp"; int chunks_per_side = 4; // Default value // Parse optional chunks_per_side parameter @@ -158,7 +158,7 @@ int main(int argc, char *argv[]) { } if (chunks_per_side > 20) { std::cerr << "Warning: Large chunk counts may produce very large " - "images\n"; + "images\n"; } } @@ -178,9 +178,6 @@ int main(int argc, char *argv[]) { // Configure generation parameters istd::GenerationConfig config; config.seed = seed; - config.temperature_scale = 0.005; - config.humidity_scale = 0.007; - config.base_scale = 0.08; // Generate the map std::cout << "Generating terrain..." << std::endl; @@ -194,4 +191,4 @@ int main(int argc, char *argv[]) { print_statistics(tilemap); return 0; -} \ No newline at end of file +} diff --git a/tilemap/include/biome.h b/tilemap/include/biome.h index bb880ac..df60a7d 100644 --- a/tilemap/include/biome.h +++ b/tilemap/include/biome.h @@ -62,11 +62,9 @@ struct SubChunkPos { }; // Get the starting tile coordinates for a sub-chunk -constexpr std::pair subchunk_to_tile_start( +std::pair subchunk_to_tile_start( const SubChunkPos &pos -) { - return {pos.sub_x * 16, pos.sub_y * 16}; -} +); } // namespace istd diff --git a/tilemap/src/biome.cpp b/tilemap/src/biome.cpp index 7ef9339..13e5d27 100644 --- a/tilemap/src/biome.cpp +++ b/tilemap/src/biome.cpp @@ -1,4 +1,5 @@ #include "biome.h" +#include "chunk.h" #include #include #include @@ -115,4 +116,11 @@ BiomeType determine_biome(double temperature, double humidity) { return static_cast(index); } +std::pair subchunk_to_tile_start( + const SubChunkPos &pos +) { + // Convert sub-chunk position to tile start coordinates + return {pos.sub_x * Chunk::subchunk_size, pos.sub_y * Chunk::subchunk_size}; +} + } // namespace istd diff --git a/tilemap/src/generation.cpp b/tilemap/src/generation.cpp index 3d647a0..beb5492 100644 --- a/tilemap/src/generation.cpp +++ b/tilemap/src/generation.cpp @@ -37,15 +37,18 @@ void TerrainGenerator::generate_biomes(TileMap &tilemap) { for (std::uint8_t chunk_x = 0; chunk_x < map_size; ++chunk_x) { Chunk &chunk = tilemap.get_chunk(chunk_x, chunk_y); - for (std::uint8_t sub_y = 0; sub_y < 4; ++sub_y) { - for (std::uint8_t sub_x = 0; sub_x < 4; ++sub_x) { + for (std::uint8_t sub_y = 0; sub_y < Chunk::subchunk_count; + ++sub_y) { + for (std::uint8_t sub_x = 0; sub_x < Chunk::subchunk_count; + ++sub_x) { // Calculate global position for this sub-chunk's center - double global_x = static_cast( - chunk_x * Chunk::size + sub_x * 16 + 8 - ); - double global_y = static_cast( - chunk_y * Chunk::size + sub_y * 16 + 8 - ); + auto [start_x, start_y] + = subchunk_to_tile_start(SubChunkPos(sub_x, sub_y)); + double global_x = chunk_x * Chunk::size + start_x + + Chunk::subchunk_size / 2; + + double global_y = chunk_y * Chunk::size + start_y + + Chunk::subchunk_size / 2; // Get climate values auto [temperature, humidity] @@ -85,14 +88,13 @@ void TerrainGenerator::generate_subchunk( auto [start_x, start_y] = subchunk_to_tile_start(sub_pos); // Generate terrain for each tile in the 16x16 sub-chunk - for (std::uint8_t local_y = start_y; local_y < start_y + 16; ++local_y) { - for (std::uint8_t local_x = start_x; local_x < start_x + 16; - ++local_x) { + for (std::uint8_t local_y = start_y; + local_y < start_y + Chunk::subchunk_size; ++local_y) { + for (std::uint8_t local_x = start_x; + local_x < start_x + Chunk::subchunk_size; ++local_x) { // Calculate global coordinates - double global_x - = static_cast(chunk_x * Chunk::size + local_x); - double global_y - = static_cast(chunk_y * Chunk::size + local_y); + double global_x = chunk_x * Chunk::size + local_x; + double global_y = chunk_y * Chunk::size + local_y; // Generate base terrain noise value using uniform distribution double base_noise_value