]> git.lizzy.rs Git - dragonblocks3d-lua.git/blobdiff - modules/WorldSystem/src/chunk.lua
Dynamic World System
[dragonblocks3d-lua.git] / modules / WorldSystem / src / chunk.lua
index f49390ea862f3bab60b3f0b320a417724a27c31d..96eeef49ce6aa0b91cd4794faa7e0ce653e03fc4 100644 (file)
@@ -3,31 +3,51 @@ local Chunk = Dragonblocks.create_class()
 local size = 16
 local size_squared = math.pow(size, 2)
 
-function Chunk:constructor()
-       self.blocks = {}
-       MapGen:generate(self)
-       if Client then
-               Client.graphics:create_chunk_meshes(self)
-       end
-end
-
-function Chunk:get_pos_hash(pos)
+function Chunk.get_pos_hash(pos)
        local x, y, z = pos.x, pos.y, pos.z
        if x > 15 or y > 15 or z > 15 or x < 0 or y < 0 or z < 0 then return end
        return x + size * y + size_squared * z
 end
 
+function Chunk:constructor(pos, blocks)
+       self.pos, self.blocks = pos, blocks
+end
+
 function Chunk:add_block(pos, def)
-       local block = WorldSystem.Block(def, pos)
-       self.blocks[self:get_pos_hash(pos)] = block
+       local pos_hash = Chunk.get_pos_hash(pos)
+       if pos_hash then
+               self.blocks[pos_hash] = WorldSystem.Block(pos, def)
+               self:update_mesh()
+       end
 end
 
 function Chunk:remove_block(pos)
-       self.blocks[self:get_pos_hash(pos)] = nil
+       local pos_hash = Chunk.get_pos_hash(pos)
+       if pos_hash then
+               self.blocks[pos_hash] = nil
+               self:update_mesh()
+       end
 end
 
 function Chunk:get_block(pos)
-       return self.blocks[self:get_pos_hash(pos)]
+       local pos_hash = Chunk.get_pos_hash(pos)
+       if pos_hash then return self.blocks[pos_hash] end
+end
+
+function Chunk:update_mesh()
+       if #self.blocks == 0 then return end
+       local mesh = RenderEngine.ChunkMesh()
+       mesh:set_pos(self.pos * 16 + glm.vec3(8, 8, 8))
+       mesh:set_size(glm.vec3(1, 1, 1))
+       mesh:create_faces(self.blocks)
+       if not self.mesh then
+               mesh:set_effect(RenderEngine.Mesh.EFFECT_FLYIN)
+       end
+       if self.mesh then
+               self.mesh:remove_from_scene()
+       end
+       self.mesh = mesh
+       mesh:add_to_scene()
 end
 
 return Chunk