]> git.lizzy.rs Git - dragonblocks3d-lua.git/blobdiff - modules/WorldSystem/src/map.lua
Dynamic World System
[dragonblocks3d-lua.git] / modules / WorldSystem / src / map.lua
index 44d7490c1aafac2d70105b847906ded95fcf6c88..b253f273624c2b69745e251bb595f525f376530b 100644 (file)
@@ -1,7 +1,74 @@
 local Map = Dragonblocks.create_class()
 
+local size = 1000
+local size_squared = math.pow(size, 2)
+
+
+function Map.get_pos_hash(pos)
+       local x, y, z = pos.x, pos.y, pos.z
+       if x > 999 or y > 999 or z > 999 or x < -999 or y < -999 or z < -999 then return end
+       return x + size * y + size_squared * z
+end 
+
+function Map.get_chunk_pos(pos)
+       return glm.vec3(math.floor(pos.x / 16), math.floor(pos.y / 16), math.floor(pos.z / 16))
+end
+
+function Map.get_block_pos(pos)
+       return pos * 16
+end
+
+function Map.get_chunk_pos_and_block_pos(pos)
+       local chunk_pos = Map.get_chunk_pos(pos)
+       local block_pos = pos - Map.get_block_pos(chunk_pos)
+       return chunk_pos, block_pos
+end
+
 function Map:constructor()
-       self.chunk = WorldSystem.Chunk()
+       self.chunks = {}
+end
+
+function Map:get_block(pos)
+       local chunk, block_pos = self:get_chunk_and_block_pos(pos)
+       if chunk then return chunk:get_block(block_pos) end
+end
+
+function Map:add_block(pos, block)
+       local chunk, block_pos = self:get_chunk_and_block_pos(pos)
+       if chunk then return chunk:add_block(block_pos, block) end
+end
+
+function Map:remove_block(pos)
+       local chunk, block_pos = self:get_chunk_and_block_pos(pos)
+       if chunk then return chunk:remove_block(block_pos) end
+end
+
+function Map:create_chunk(pos, data)
+       local pos_hash = Map.get_pos_hash(pos)
+       if not pos_hash then return end
+       local minp = Map.get_block_pos(pos)
+       local maxp = minp + glm.vec3(16, 16, 16)
+       local data = data or MapGen.generate(minp, maxp)
+       local chunk = WorldSystem.Chunk(pos, data)
+       self.chunks[pos_hash] = chunk
+       Dragonblocks:add_task(function()
+               chunk:update_mesh()
+       end)
+end
+
+function Map:create_chunk_if_not_exists(pos, data)
+       if not self:get_chunk(pos) then self:create_chunk(pos, data) end
+end
+
+function Map:get_chunk(pos)
+       local pos_hash = Map.get_pos_hash(pos)
+       if pos_hash then return self.chunks[pos_hash] end
+end
+
+function Map:get_chunk_and_block_pos(pos)
+       local chunk_pos, block_pos = Map.get_chunk_pos_and_block_pos(pos)
+       local chunk = self:get_chunk(chunk_pos)
+       return chunk, block_pos
 end
 
 return Map