]> git.lizzy.rs Git - dragonblocks3d-lua.git/blob - modules/WorldSystem/src/chunk.lua
Dynamic World System
[dragonblocks3d-lua.git] / modules / WorldSystem / src / chunk.lua
1 local Chunk = Dragonblocks.create_class()
2
3 local size = 16
4 local size_squared = math.pow(size, 2)
5
6 function Chunk.get_pos_hash(pos)
7         local x, y, z = pos.x, pos.y, pos.z
8         if x > 15 or y > 15 or z > 15 or x < 0 or y < 0 or z < 0 then return end
9         return x + size * y + size_squared * z
10 end
11
12 function Chunk:constructor(pos, blocks)
13         self.pos, self.blocks = pos, blocks
14 end
15
16 function Chunk:add_block(pos, def)
17         local pos_hash = Chunk.get_pos_hash(pos)
18         if pos_hash then
19                 self.blocks[pos_hash] = WorldSystem.Block(pos, def)
20                 self:update_mesh()
21         end
22 end
23
24 function Chunk:remove_block(pos)
25         local pos_hash = Chunk.get_pos_hash(pos)
26         if pos_hash then
27                 self.blocks[pos_hash] = nil
28                 self:update_mesh()
29         end
30 end
31
32 function Chunk:get_block(pos)
33         local pos_hash = Chunk.get_pos_hash(pos)
34         if pos_hash then return self.blocks[pos_hash] end
35 end
36
37 function Chunk:update_mesh()
38         if #self.blocks == 0 then return end
39         local mesh = RenderEngine.ChunkMesh()
40         mesh:set_pos(self.pos * 16 + glm.vec3(8, 8, 8))
41         mesh:set_size(glm.vec3(1, 1, 1))
42         mesh:create_faces(self.blocks)
43         if not self.mesh then
44                 mesh:set_effect(RenderEngine.Mesh.EFFECT_FLYIN)
45         end
46         if self.mesh then
47                 self.mesh:remove_from_scene()
48         end
49         self.mesh = mesh
50         mesh:add_to_scene()
51 end
52
53 return Chunk