function sphereGetBlockAt(x, y, z, radius, matFunc)
  -- print("x " .. x .. " y " .. y .. " z " .. z .. " r " .. radius)
  -- io.read()
  local sqrt3 = math.sqrt(3)
  local dist = math.sqrt(x*x + y*y + z*z)
  if dist >= radius then
    local offsets = {{1, 0, 0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}
    local i
    for i = 1,6 do
     local offset = offsets[i]
     local dx, dy, dz = offset[1], offset[2], offset[3] 
     local nx, ny, nz = x+dx,y+dy,z+dz
     local pdist = math.sqrt(nx*nx + ny*ny + nz*nz)
     if pdist < radius and pdist + sqrt3 >= radius then
       return matFunc(x, y, z)
     end
    end
  end
  return nil
end

function prov(radius, material, dome, numMaterials, materialFunc)
	local startX = 0 - radius
	local startY = 0 - radius
	local startZ = 0 - radius
	local sizeX = radius * 2 + 1
	local sizeY = radius * 2 + 1
	local sizeZ = radius * 2 + 1
	if numMaterials == nil then numMaterials = 1 end
	if dome ~= nil and dome then
		startY = 0
		sizeY = radius + 1
	end
	local provider = {}
	provider.startX = startX
	provider.startY = startY
	provider.startZ = startZ
	provider.sizeX = sizeX
	provider.sizeY = sizeY
	provider.sizeZ = sizeZ
	provider.numMaterials = numMaterials
	if materialFunc == nil then
		materialFunc = function()
			if material == nil then
				return 1
			else
				return material
			end
		end
	end
	provider.getBlockAt = function(x, y, z)
		return sphereGetBlockAt(x, y, z, radius, materialFunc)
	end
	return provider
end


