fix: biome demo
Signed-off-by: szdytom <szdytom@qq.com>
This commit is contained in:
parent
720d1a1c69
commit
6be8869568
@ -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]
|
||||
<< " <seed> <output_file.bmp> [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;
|
||||
}
|
||||
}
|
||||
|
@ -62,11 +62,9 @@ struct SubChunkPos {
|
||||
};
|
||||
|
||||
// Get the starting tile coordinates for a sub-chunk
|
||||
constexpr std::pair<std::uint8_t, std::uint8_t> subchunk_to_tile_start(
|
||||
std::pair<std::uint8_t, std::uint8_t> subchunk_to_tile_start(
|
||||
const SubChunkPos &pos
|
||||
) {
|
||||
return {pos.sub_x * 16, pos.sub_y * 16};
|
||||
}
|
||||
);
|
||||
|
||||
} // namespace istd
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "biome.h"
|
||||
#include "chunk.h"
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
@ -115,4 +116,11 @@ BiomeType determine_biome(double temperature, double humidity) {
|
||||
return static_cast<BiomeType>(index);
|
||||
}
|
||||
|
||||
std::pair<std::uint8_t, std::uint8_t> 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
|
||||
|
@ -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<double>(
|
||||
chunk_x * Chunk::size + sub_x * 16 + 8
|
||||
);
|
||||
double global_y = static_cast<double>(
|
||||
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<double>(chunk_x * Chunk::size + local_x);
|
||||
double global_y
|
||||
= static_cast<double>(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
|
||||
|
Loading…
x
Reference in New Issue
Block a user