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