2 #include <glm/gtc/noise.hpp>
7 using namespace dragonblocks;
9 Chunk::Data Mapgen::generate(const ivec3 &chunkp) const
11 int map_size = DRAGONBLOCKS_CHUNK_SIZE * DRAGONBLOCKS_MAP_SIZE;
14 vec3 minp = chunkp * ivec3(DRAGONBLOCKS_CHUNK_SIZE);
15 vec3 maxp = minp + vec3(DRAGONBLOCKS_CHUNK_SIZE);
16 int minx = minp.x, miny = minp.y, minz = minp.z, maxx = maxp.x, maxy = maxp.y, maxz = maxp.z;
17 for (int x = minx; x < maxx; x++) {
19 int ux = x + map_size;
21 for (int z = minz; z < maxz; z++) {
23 int uz = z + map_size;
24 int height = perlin(vec2((float)ux / 200, (float)uz / 200)) * 25 + 100;
26 bool is_mountain = false;
27 float mountain_factor = pow((perlin(vec2((float)ux / 1000.0f, (float)uz / 1000.0f)) - 0.3f) * 5.0f, 1.0f);
28 if (mountain_factor > 0) {
29 height = pow(height * pow(((perlin(vec2((float)ux / 50.0f, (float)uz / 50.0f)) + 1.0f) * 200.0f + 100.0f), mountain_factor), 1.0f / (mountain_factor + 1.0f));
33 BlockDef *blockdef = nullptr;
35 for (int y = maxy - 1; y >= miny; y--) {
40 BlockDef *new_blockdef = air_def;
42 int diff = by - height;
45 new_blockdef = stone_def;
47 new_blockdef = is_mountain ? stone_def : dirt_def;
49 new_blockdef = is_mountain ? stone_def : grass_def;
51 new_blockdef = is_mountain && by > 150 ? snow_def : air_def;
53 if (new_blockdef == dirt_def && (! blockdef || blockdef == air_def))
54 new_blockdef = grass_def;
56 data.blocks[rx][ry][rz] = new_blockdef;