#include "terrain_generator.h" #include #include "noiseutils/noiseutils.h" using namespace noise; TerrainGenerator::TerrainGenerator(int seed, fs::path root) : TerrainLoader(root) { this->seed = seed; } float *TerrainGenerator::generate_heights(int64_t x, int64_t y, unsigned int width, unsigned int height) { const double scale_factor = 0.004; module::Perlin mod; mod.SetSeed(seed); utils::NoiseMap heightmap; utils::NoiseMapBuilderPlane heightmap_builder; heightmap_builder.SetSourceModule(mod); heightmap_builder.SetDestNoiseMap(heightmap); heightmap_builder.SetDestSize(width, height); // subtract by one due to chunk overlapping heightmap_builder.SetBounds((double)(x-1) * scale_factor, (double)(x-1+width) * scale_factor, (double)(y-1) * scale_factor, (double)(y-1+height) * scale_factor); heightmap_builder.Build(); float *heights = new float[width*height]; for(unsigned int i = 0; i < width; i++) { for(unsigned int j = 0; j < height; j++) { heights[i*height + j] = 50*(1+heightmap.GetValue(i, j)); } } save_chunk(heights, x, y, width, height); return heights; } float *TerrainGenerator::get_chunk(int64_t x, int64_t y, unsigned int width, unsigned int height) { float *h; if(has_chunk(x, y)) h = load_chunk(x, y, width, height); else h = generate_heights(x, y, width, height); return h; }