]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/mapgen.cpp
Set antialiasing to 8
[dragonblocks3d.git] / src / mapgen.cpp
1 #include <iostream>
2 #include <glm/gtc/noise.hpp>
3 #include "map.hpp"
4 #include "mapgen.hpp"
5
6 using namespace glm;
7 using namespace dragonblocks;
8
9 Chunk::Data Mapgen::generate(const ivec3 &chunkp) const
10 {
11         int map_size = DRAGONBLOCKS_CHUNK_SIZE * DRAGONBLOCKS_MAP_SIZE;
12
13         Chunk::Data data;
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++) {
18                 int rx = x - minx;
19                 int ux = x + map_size;
20
21                 for (int z = minz; z < maxz; z++) {
22                         int rz = z - minz;
23                         int uz = z + map_size;
24                         int height = perlin(vec2((float)ux / 200, (float)uz / 200)) * 25 + 100;
25
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));
30                                 is_mountain = true;
31                         }
32
33                         BlockDef *blockdef = nullptr;
34
35                         for (int y = maxy - 1; y >= miny; y--) {
36                                 int ry = y - miny;
37
38                                 int by = y + 100;
39
40                                 BlockDef *new_blockdef = air_def;
41
42                                 int diff = by - height;
43
44                                 if (diff < -5)
45                                         new_blockdef = stone_def;
46                                 else if (diff < -1)
47                                         new_blockdef = is_mountain ? stone_def : dirt_def;
48                                 else if (diff < 0)
49                                         new_blockdef = is_mountain ? stone_def : grass_def;
50                                 else if (diff < 1)
51                                         new_blockdef = is_mountain && by > 150 ? snow_def : air_def;
52
53                                 if (new_blockdef == dirt_def && (! blockdef || blockdef == air_def))
54                                         new_blockdef = grass_def;
55
56                                 data.blocks[rx][ry][rz] = new_blockdef;
57                         }
58                 }
59         }
60         return data;
61 }