local rc = peripheral.find("raycaster") --local monitor = peripheral.wrap('left') local monitor = peripheral.find("monitor") local euler_mode = false local depth_map = false local cache = false local width_yaw_range = math.rad(45) local height_pitch_range = math.rad(45) local max_distance = 20 local vector_fov = 1 local width, height = monitor.getSize() height_pitch_range = height_pitch_range * (height/width) local char_data = {{{"\0",false},{"\9",false},{"\10",false},{"\13",false},{"\32",false},{"\128",false},{"\160",false},},{{"\46",false},{"\168",false},{"\180",false},{"\184",false},},{{"\39",false},{"\44",false},{"\96",false},},{{"\58",false},{"\183",false},},{{"\45",false},{"\59",false},{"\94",false},{"\95",false},{"\173",false},{"\175",false},},{{"\33",false},{"\34",false},{"\42",false},{"\105",false},{"\126",false},{"\161",false},{"\166",false},},{{"\28",false},{"\47",false},{"\60",false},{"\62",false},{"\92",false},{"\108",false},{"\124",false},{"\172",false},{"\178",false},{"\236",false},{"\237",false},{"\239",false},{"\247",false},},{{"\22",false},{"\176",false},{"\179",false},{"\185",false},{"\238",false},},{{"\40",false},{"\41",false},{"\43",false},{"\63",false},{"\89",false},{"\114",false},{"\116",false},{"\118",false},{"\120",false},{"\123",false},{"\125",false},{"\129",false},{"\130",false},{"\132",false},{"\136",false},{"\144",false},{"\159",true},{"\191",false},{"\215",false},{"\221",false},},{{"\29",false},{"\61",false},{"\74",false},{"\171",false},{"\187",false},},{{"\26",false},{"\27",false},{"\37",false},{"\73",false},{"\76",false},{"\84",false},{"\91",false},{"\93",false},{"\99",false},{"\102",false},{"\106",false},{"\170",false},{"\204",false},{"\205",false},{"\207",false},},{{"\7",false},{"\19",false},{"\49",false},{"\55",false},{"\107",false},{"\110",false},{"\111",false},{"\117",false},{"\186",false},{"\206",false},{"\219",false},},{{"\4",false},{"\16",false},{"\17",false},{"\24",false},{"\25",false},{"\30",false},{"\31",false},{"\67",false},{"\70",false},{"\86",false},{"\88",false},{"\109",false},{"\115",false},{"\122",false},{"\162",false},{"\189",false},{"\217",false},{"\218",false},{"\220",false},{"\231",false},{"\251",false},{"\254",false},},{{"\11",false},{"\51",false},{"\80",false},{"\97",false},{"\104",false},{"\112",false},{"\113",false},{"\119",false},{"\177",false},{"\188",false},{"\199",false},{"\222",false},{"\242",false},{"\243",false},{"\246",false},{"\249",false},{"\250",false},{"\252",false},},{{"\14",false},{"\36",false},{"\38",false},{"\52",false},{"\54",false},{"\57",false},{"\75",false},{"\83",false},{"\85",false},{"\90",false},{"\101",false},{"\121",false},{"\181",false},{"\197",false},{"\229",false},{"\240",false},{"\248",false},},{{"\50",false},{"\79",false},{"\81",false},{"\98",false},{"\100",false},{"\163",false},{"\164",false},{"\192",false},{"\193",false},{"\196",false},{"\210",false},{"\211",false},{"\213",false},{"\214",false},{"\224",false},{"\225",false},{"\228",false},{"\241",false},{"\245",false},},{{"\12",false},{"\53",false},{"\56",false},{"\69",false},{"\71",false},{"\72",false},{"\77",false},{"\78",false},{"\87",false},{"\103",false},{"\165",false},{"\190",false},{"\209",false},{"\212",false},{"\230",false},{"\232",false},{"\233",false},{"\235",false},{"\244",false},{"\253",false},{"\255",false},},{{"\6",false},{"\8",true},{"\65",false},{"\68",false},{"\82",false},{"\127",false},{"\131",false},{"\133",false},{"\134",false},{"\137",false},{"\138",false},{"\140",false},{"\143",true},{"\145",false},{"\146",false},{"\148",false},{"\151",true},{"\152",false},{"\155",true},{"\157",true},{"\158",true},{"\195",false},{"\200",false},{"\201",false},{"\203",false},{"\227",false},},{{"\1",false},{"\5",false},{"\20",false},{"\48",false},{"\182",false},{"\194",false},{"\208",false},{"\216",false},{"\223",false},{"\226",false},},{{"\18",false},{"\21",false},{"\35",false},{"\66",false},{"\167",false},{"\169",false},{"\198",false},{"\234",false},},{{"\3",false},{"\202",false},},{{"\15",false},{"\174",false},},{{"\23",false},{"\64",false},},{{"\2",false},},{{"\135",false},{"\135",true},{"\139",false},{"\139",true},{"\141",false},{"\141",true},{"\142",false},{"\142",true},{"\147",false},{"\147",true},{"\149",false},{"\149",true},{"\150",false},{"\150",true},{"\153",false},{"\153",true},{"\154",false},{"\154",true},{"\156",false},{"\156",true},},{{"\2",true},},{{"\23",true},{"\64",true},},{{"\15",true},{"\174",true},},{{"\3",true},{"\202",true},},{{"\18",true},{"\21",true},{"\35",true},{"\66",true},{"\167",true},{"\169",true},{"\198",true},{"\234",true},},{{"\1",true},{"\5",true},{"\20",true},{"\48",true},{"\182",true},{"\194",true},{"\208",true},{"\216",true},{"\223",true},{"\226",true},},{{"\6",true},{"\8",false},{"\65",true},{"\68",true},{"\82",true},{"\127",true},{"\131",true},{"\133",true},{"\134",true},{"\137",true},{"\138",true},{"\140",true},{"\143",false},{"\145",true},{"\146",true},{"\148",true},{"\151",false},{"\152",true},{"\155",false},{"\157",false},{"\158",false},{"\195",true},{"\200",true},{"\201",true},{"\203",true},{"\227",true},},{{"\12",true},{"\53",true},{"\56",true},{"\69",true},{"\71",true},{"\72",true},{"\77",true},{"\78",true},{"\87",true},{"\103",true},{"\165",true},{"\190",true},{"\209",true},{"\212",true},{"\230",true},{"\232",true},{"\233",true},{"\235",true},{"\244",true},{"\253",true},{"\255",true},},{{"\50",true},{"\79",true},{"\81",true},{"\98",true},{"\100",true},{"\163",true},{"\164",true},{"\192",true},{"\193",true},{"\196",true},{"\210",true},{"\211",true},{"\213",true},{"\214",true},{"\224",true},{"\225",true},{"\228",true},{"\241",true},{"\245",true},},{{"\14",true},{"\36",true},{"\38",true},{"\52",true},{"\54",true},{"\57",true},{"\75",true},{"\83",true},{"\85",true},{"\90",true},{"\101",true},{"\121",true},{"\181",true},{"\197",true},{"\229",true},{"\240",true},{"\248",true},},{{"\11",true},{"\51",true},{"\80",true},{"\97",true},{"\104",true},{"\112",true},{"\113",true},{"\119",true},{"\177",true},{"\188",true},{"\199",true},{"\222",true},{"\242",true},{"\243",true},{"\246",true},{"\249",true},{"\250",true},{"\252",true},},{{"\4",true},{"\16",true},{"\17",true},{"\24",true},{"\25",true},{"\30",true},{"\31",true},{"\67",true},{"\70",true},{"\86",true},{"\88",true},{"\109",true},{"\115",true},{"\122",true},{"\162",true},{"\189",true},{"\217",true},{"\218",true},{"\220",true},{"\231",true},{"\251",true},{"\254",true},},{{"\7",true},{"\19",true},{"\49",true},{"\55",true},{"\107",true},{"\110",true},{"\111",true},{"\117",true},{"\186",true},{"\206",true},{"\219",true},},{{"\26",true},{"\27",true},{"\37",true},{"\73",true},{"\76",true},{"\84",true},{"\91",true},{"\93",true},{"\99",true},{"\102",true},{"\106",true},{"\170",true},{"\204",true},{"\205",true},{"\207",true},},{{"\29",true},{"\61",true},{"\74",true},{"\171",true},{"\187",true},},{{"\40",true},{"\41",true},{"\43",true},{"\63",true},{"\89",true},{"\114",true},{"\116",true},{"\118",true},{"\120",true},{"\123",true},{"\125",true},{"\129",true},{"\130",true},{"\132",true},{"\136",true},{"\144",true},{"\159",false},{"\191",true},{"\215",true},{"\221",true},},{{"\22",true},{"\176",true},{"\179",true},{"\185",true},{"\238",true},},{{"\28",true},{"\47",true},{"\60",true},{"\62",true},{"\92",true},{"\108",true},{"\124",true},{"\172",true},{"\178",true},{"\236",true},{"\237",true},{"\239",true},{"\247",true},},{{"\33",true},{"\34",true},{"\42",true},{"\105",true},{"\126",true},{"\161",true},{"\166",true},},{{"\45",true},{"\59",true},{"\94",true},{"\95",true},{"\173",true},{"\175",true},},{{"\58",true},{"\183",true},},{{"\39",true},{"\44",true},{"\96",true},},{{"\46",true},{"\168",true},{"\180",true},{"\184",true},},{{"\0",true},{"\9",true},{"\10",true},{"\13",true},{"\32",true},{"\128",true},{"\160",true},},} local colors = {} for i = 0, 15 do colors[i] = string.format("%x", i) end monitor.setTextScale(0.5) monitor.setCursorPos(1, 1) monitor.clear() local table_insert = table.insert local function linspace(start, end_, num) local linspaced = {} if num == 0 then return linspaced end if num == 1 then table_insert(linspaced, start) return linspaced end local delta = (end_ - start) / (num - 1) for i = 0, num-2 do table_insert(linspaced, start+delta*i) end table_insert(linspaced, end_) return linspaced end local function split(inputstr, sep) if sep == nil then sep = "%s" end local t={} for str in string.gmatch(inputstr, "([^"..sep.."]+)") do table.insert(t, str) end return t end if depth_map then for i, num in ipairs(linspace(1, 0, 16)) do monitor.setPaletteColor(2^(i-1), num, num, num) end end local data = { block = { minecraft = { gold_block = "4", polished_diorite = "8", stone = "8", iron_ore = "8", gravel = "8", coal_ore = "8", emerald_ore = "8", waxed_cut_copper_slab = "1", spruce_door = "1", dirt = "1", oak_planks = "c", lectern = "c", oak_log = "c", acacia_log = "c", grass_block = "d", grass = "d", tall_grass = "d", oak_leaves = "5", acacia_leaves = "5", crimson_planks = "a", } } } local function get_pixel_normal(item) if item.is_block then local res = data for _, key in ipairs(split(item.block_type, ".")) do res = res[key] if res == nil then return {" ", "0", "b"} end end if res == nil then return {" ", "0", "b"} end return {" ", "0", res} end return {" ", "0", "e"} end local function get_pixel_depthmap(item) if (item.distance == nil or item.distance > max_distance) then return {" ", "0", colors[15]} end local rel = (item.distance / max_distance) * 15 local frel = math.floor(rel) local rel_chr_line = char_data[math.floor((1 - rel + frel) * (#char_data-1))+1] local rel_chr = rel_chr_line[math.floor(math.random()*(#rel_chr_line-1))+1] local fcolor = colors[frel] local scolor = colors[math.min(15, frel+1)] return { rel_chr[1], rel_chr[2] and scolor or fcolor, rel_chr[2] and fcolor or scolor } end local start = os.epoch("utc") local i = 0 local function yield() if (os.epoch("utc") - start > 1000) then print("pixels " .. i) i = 0 os.queueEvent("yield") os.pullEvent("yield") start = os.epoch("utc") end i = i + 1 end local x_axis = linspace(-width_yaw_range, width_yaw_range, width) local y_axis = linspace(-height_pitch_range, height_pitch_range, height) monitor.setCursorPos(1, height) for y=1, height do for x=1, width do yield() monitor.setCursorPos(x, height - y + 1) local yr = y_axis[y] local xr = x_axis[x] local item = rc.raycast(max_distance, {yr, xr, vector_fov}, euler_mode, true, cache) local pix = depth_map and get_pixel_depthmap(item) or get_pixel_normal(item) monitor.blit(pix[1], pix[2], pix[3]) end end