]> git.lizzy.rs Git - dragonblocks3d-lua.git/blob - modules/MapGen/src/init.lua
Dynamic World System
[dragonblocks3d-lua.git] / modules / MapGen / src / init.lua
1 local stone = BlockSystem:get_def("game:stone")
2 local dirt = BlockSystem:get_def("game:dirt")
3 local grass = BlockSystem:get_def("game:grass")
4 local leaves = BlockSystem:get_def("game:leaves")
5 local tree = BlockSystem:get_def("game:tree")
6
7 local grass_layer_start, grass_layer_end = 0, 30
8 local grass_layer_height = grass_layer_end - grass_layer_start
9
10 function MapGen.generate(minp, maxp)
11         local data = {}
12         local minx, miny, minz, maxx, maxy, maxz = minp.x, minp.y, minp.z, maxp.x - 1, maxp.y - 1, maxp.z - 1
13         for x = minx, maxx do
14                 for z = minz, maxz do
15                         local grass_layer = math.floor(grass_layer_start + grass_layer_height * perlin:noise(x / grass_layer_height, z / grass_layer_height))
16                         for y = miny, maxy do
17                                 local pos = glm.vec3(x - minx, y - miny, z - minz)
18                                 local block
19                                 if y <= grass_layer - 5 then
20                                         block = stone
21                                 elseif y <= grass_layer - 1 then
22                                         block = dirt
23                                 elseif y <= grass_layer then
24                                         block = grass
25                                 end 
26                                 if block then
27                                         data[WorldSystem.Chunk.get_pos_hash(pos)] = WorldSystem.Block(pos, block)
28                                 end
29                         end
30                 end
31         end
32         return data
33 end
34
35 local tree_blocks = {
36         glm.vec3( 0,  0,  0),
37         glm.vec3( 0,  1,  0),
38         glm.vec3(-1,  2, -1),
39         glm.vec3(-1,  2,  0),
40         glm.vec3(-1,  2,  1),
41         glm.vec3( 0,  2, -1),
42         glm.vec3( 0,  2,  0),
43         glm.vec3( 0,  2,  1),
44         glm.vec3( 1,  2, -1),
45         glm.vec3( 1,  2,  0),
46         glm.vec3( 1,  2,  1),
47         glm.vec3(-1,  3, -1),
48         glm.vec3(-1,  3,  0),
49         glm.vec3(-1,  3,  1),
50         glm.vec3( 0,  3, -1),
51         glm.vec3( 0,  3,  0),
52         glm.vec3( 0,  3,  1),
53         glm.vec3( 1,  3, -1),
54         glm.vec3( 1,  3,  0),
55         glm.vec3( 1,  3,  1),
56         glm.vec3(-1,  4, -1),
57         glm.vec3(-1,  4,  0),
58         glm.vec3(-1,  4,  1),
59         glm.vec3( 0,  4, -1),
60         glm.vec3( 0,  4,  0),
61         glm.vec3( 0,  4,  1),
62         glm.vec3( 1,  4, -1),
63         glm.vec3( 1,  4,  0),
64         glm.vec3( 1,  4,  1),
65 }
66
67 function MapGen:add_tree(chunk, tree_pos)
68         for i, p in ipairs(tree_blocks) do
69                 local block = leaves
70                 if i < 3 then
71                         block = tree
72                 end
73                 local pos = tree_pos + p
74                 if chunk:get_pos_hash(pos) then
75                         chunk:add_block(pos, block)
76                 end
77         end
78 end