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
|
// Generate tiles
|
||||||
for (int chunk_y = 0; chunk_y < chunks_per_side; ++chunk_y) {
|
for (int chunk_y = 0; chunk_y < chunks_per_side; ++chunk_y) {
|
||||||
for (int chunk_x = 0; chunk_x < chunks_per_side; ++chunk_x) {
|
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_y = 0; tile_y < tiles_per_chunk; ++tile_y) {
|
||||||
for (int tile_x = 0; tile_x < tiles_per_chunk; ++tile_x) {
|
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_x = chunk_x * tiles_per_chunk + tile_x;
|
||||||
int global_y = chunk_y * tiles_per_chunk + tile_y;
|
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[]) {
|
int main(int argc, char *argv[]) {
|
||||||
// Parse command line arguments
|
// Parse command line arguments
|
||||||
if (argc < 3 || argc > 4) {
|
if (argc > 4) {
|
||||||
std::cerr << "Usage: " << argv[0]
|
std::cerr << "Usage: " << argv[0]
|
||||||
<< " <seed> <output_file.bmp> [chunks_per_side]\n";
|
<< " <seed> <output_file.bmp> [chunks_per_side]\n";
|
||||||
std::cerr << " seed - Random seed for generation\n";
|
std::cerr << " seed - Random seed for generation\n";
|
||||||
@ -145,8 +144,9 @@ int main(int argc, char *argv[]) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::uint64_t seed = std::strtoull(argv[1], nullptr, 10);
|
std::uint64_t seed
|
||||||
std::string output_filename = argv[2];
|
= 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
|
int chunks_per_side = 4; // Default value
|
||||||
|
|
||||||
// Parse optional chunks_per_side parameter
|
// Parse optional chunks_per_side parameter
|
||||||
@ -158,7 +158,7 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
if (chunks_per_side > 20) {
|
if (chunks_per_side > 20) {
|
||||||
std::cerr << "Warning: Large chunk counts may produce very large "
|
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
|
// Configure generation parameters
|
||||||
istd::GenerationConfig config;
|
istd::GenerationConfig config;
|
||||||
config.seed = seed;
|
config.seed = seed;
|
||||||
config.temperature_scale = 0.005;
|
|
||||||
config.humidity_scale = 0.007;
|
|
||||||
config.base_scale = 0.08;
|
|
||||||
|
|
||||||
// Generate the map
|
// Generate the map
|
||||||
std::cout << "Generating terrain..." << std::endl;
|
std::cout << "Generating terrain..." << std::endl;
|
||||||
@ -194,4 +191,4 @@ int main(int argc, char *argv[]) {
|
|||||||
print_statistics(tilemap);
|
print_statistics(tilemap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -62,11 +62,9 @@ struct SubChunkPos {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Get the starting tile coordinates for a sub-chunk
|
// 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
|
const SubChunkPos &pos
|
||||||
) {
|
);
|
||||||
return {pos.sub_x * 16, pos.sub_y * 16};
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace istd
|
} // namespace istd
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "biome.h"
|
#include "biome.h"
|
||||||
|
#include "chunk.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
@ -115,4 +116,11 @@ BiomeType determine_biome(double temperature, double humidity) {
|
|||||||
return static_cast<BiomeType>(index);
|
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
|
} // 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) {
|
for (std::uint8_t chunk_x = 0; chunk_x < map_size; ++chunk_x) {
|
||||||
Chunk &chunk = tilemap.get_chunk(chunk_x, chunk_y);
|
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_y = 0; sub_y < Chunk::subchunk_count;
|
||||||
for (std::uint8_t sub_x = 0; sub_x < 4; ++sub_x) {
|
++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
|
// Calculate global position for this sub-chunk's center
|
||||||
double global_x = static_cast<double>(
|
auto [start_x, start_y]
|
||||||
chunk_x * Chunk::size + sub_x * 16 + 8
|
= subchunk_to_tile_start(SubChunkPos(sub_x, sub_y));
|
||||||
);
|
double global_x = chunk_x * Chunk::size + start_x
|
||||||
double global_y = static_cast<double>(
|
+ Chunk::subchunk_size / 2;
|
||||||
chunk_y * Chunk::size + sub_y * 16 + 8
|
|
||||||
);
|
double global_y = chunk_y * Chunk::size + start_y
|
||||||
|
+ Chunk::subchunk_size / 2;
|
||||||
|
|
||||||
// Get climate values
|
// Get climate values
|
||||||
auto [temperature, humidity]
|
auto [temperature, humidity]
|
||||||
@ -85,14 +88,13 @@ void TerrainGenerator::generate_subchunk(
|
|||||||
auto [start_x, start_y] = subchunk_to_tile_start(sub_pos);
|
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 16x16 sub-chunk
|
||||||
for (std::uint8_t local_y = start_y; local_y < start_y + 16; ++local_y) {
|
for (std::uint8_t local_y = start_y;
|
||||||
for (std::uint8_t local_x = start_x; local_x < start_x + 16;
|
local_y < start_y + Chunk::subchunk_size; ++local_y) {
|
||||||
++local_x) {
|
for (std::uint8_t local_x = start_x;
|
||||||
|
local_x < start_x + Chunk::subchunk_size; ++local_x) {
|
||||||
// Calculate global coordinates
|
// Calculate global coordinates
|
||||||
double global_x
|
double global_x = chunk_x * Chunk::size + local_x;
|
||||||
= static_cast<double>(chunk_x * Chunk::size + local_x);
|
double global_y = chunk_y * Chunk::size + local_y;
|
||||||
double global_y
|
|
||||||
= static_cast<double>(chunk_y * Chunk::size + local_y);
|
|
||||||
|
|
||||||
// Generate base terrain noise value using uniform distribution
|
// Generate base terrain noise value using uniform distribution
|
||||||
double base_noise_value
|
double base_noise_value
|
||||||
|
Loading…
x
Reference in New Issue
Block a user