]> git.lizzy.rs Git - dragonblocks3d-lua.git/blob - modules/WorldSystem/src/map.lua
Dynamic World System
[dragonblocks3d-lua.git] / modules / WorldSystem / src / map.lua
1 local Map = Dragonblocks.create_class()
2
3 local size = 1000
4 local size_squared = math.pow(size, 2)
5
6
7 function Map.get_pos_hash(pos)
8         local x, y, z = pos.x, pos.y, pos.z
9         if x > 999 or y > 999 or z > 999 or x < -999 or y < -999 or z < -999 then return end
10         return x + size * y + size_squared * z
11 end 
12
13 function Map.get_chunk_pos(pos)
14         return glm.vec3(math.floor(pos.x / 16), math.floor(pos.y / 16), math.floor(pos.z / 16))
15 end
16
17 function Map.get_block_pos(pos)
18         return pos * 16
19 end
20
21 function Map.get_chunk_pos_and_block_pos(pos)
22         local chunk_pos = Map.get_chunk_pos(pos)
23         local block_pos = pos - Map.get_block_pos(chunk_pos)
24         return chunk_pos, block_pos
25 end
26
27 function Map:constructor()
28         self.chunks = {}
29 end
30
31 function Map:get_block(pos)
32         local chunk, block_pos = self:get_chunk_and_block_pos(pos)
33         if chunk then return chunk:get_block(block_pos) end
34 end
35
36 function Map:add_block(pos, block)
37         local chunk, block_pos = self:get_chunk_and_block_pos(pos)
38         if chunk then return chunk:add_block(block_pos, block) end
39 end
40
41 function Map:remove_block(pos)
42         local chunk, block_pos = self:get_chunk_and_block_pos(pos)
43         if chunk then return chunk:remove_block(block_pos) end
44 end
45
46 function Map:create_chunk(pos, data)
47         local pos_hash = Map.get_pos_hash(pos)
48         if not pos_hash then return end
49         local minp = Map.get_block_pos(pos)
50         local maxp = minp + glm.vec3(16, 16, 16)
51         local data = data or MapGen.generate(minp, maxp)
52         local chunk = WorldSystem.Chunk(pos, data)
53         self.chunks[pos_hash] = chunk
54         Dragonblocks:add_task(function()
55                 chunk:update_mesh()
56         end)
57 end
58
59 function Map:create_chunk_if_not_exists(pos, data)
60         if not self:get_chunk(pos) then self:create_chunk(pos, data) end
61 end
62
63 function Map:get_chunk(pos)
64         local pos_hash = Map.get_pos_hash(pos)
65         if pos_hash then return self.chunks[pos_hash] end
66 end
67
68 function Map:get_chunk_and_block_pos(pos)
69         local chunk_pos, block_pos = Map.get_chunk_pos_and_block_pos(pos)
70         local chunk = self:get_chunk(chunk_pos)
71         return chunk, block_pos
72 end
73
74 return Map