Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local gpu = component.gpu
- local unicode = require("unicode")
- local bit32 = require("bit32")
- local math = require("math")
- local os = require("os")
- local w, h = gpu.getResolution()
- local pixelWidth, pixelHeight = w * 2, h * 4
- -- Double buffer to store previous frame characters and colors
- local backbuffer = {}
- local function clearBuffer()
- for i = 1, w * h do
- backbuffer[i] = {char = ' ', fg = -1, bg = -1}
- end
- end
- clearBuffer()
- local function plasma(x, y, t)
- local value = math.sin(x * 0.15 + t) +
- math.sin(y * 0.15 + t * 1.2) +
- math.sin((x + y) * 0.1 + t * 1.5)
- local normalized = (value + 3) / 6 -- 0..1
- return math.floor(normalized * 255)
- end
- local function getBraille(pixels)
- local brailleBase = 0x2800
- local dotBits = {1,2,4,64,8,16,32,128}
- local avgB = 0
- for i=1,8 do avgB = avgB + pixels[i] end
- avgB = avgB / 8
- local pattern = 0
- for i=1,8 do
- if pixels[i] > avgB then
- pattern = pattern + dotBits[i]
- end
- end
- return unicode.char(brailleBase + pattern)
- end
- local function avgBrightness(list)
- local s = 0
- for _,v in ipairs(list) do s = s + v end
- return s / (#list > 0 and #list or 1)
- end
- local function colorFromBrightness(bright)
- return bright
- end
- local t = 0
- while true do
- for cy = 0, h - 1 do
- for cx = 0, w - 1 do
- local pixels = {}
- for dy = 0, 3 do
- for dx = 0, 1 do
- local px = cx * 2 + dx
- local py = cy * 4 + dy
- pixels[#pixels + 1] = plasma(px, py, t)
- end
- end
- local brailleChar = getBraille(pixels)
- local code = utf8.codepoint(brailleChar)
- local dotBits = {1,2,4,64,8,16,32,128}
- local fgPixels, bgPixels = {}, {}
- local patternBits = code - 0x2800
- for i = 1, 8 do
- if bit32.band(patternBits, dotBits[i]) ~= 0 then
- fgPixels[#fgPixels + 1] = pixels[i]
- else
- bgPixels[#bgPixels + 1] = pixels[i]
- end
- end
- local fgBrightness = avgBrightness(fgPixels)
- local bgBrightness = avgBrightness(bgPixels)
- local fgColor = colorFromBrightness(fgBrightness)
- local bgColor = colorFromBrightness(bgBrightness)
- local index = cy * w + cx + 1
- local prev = backbuffer[index]
- -- Only update if changed to reduce GPU calls
- if prev.char ~= brailleChar or prev.fg ~= fgColor or prev.bg ~= bgColor then
- gpu.setForeground(fgColor)
- gpu.setBackground(bgColor)
- gpu.set(cx + 1, cy + 1, brailleChar)
- backbuffer[index] = {char = brailleChar, fg = fgColor, bg = bgColor}
- end
- end
- end
- t = t + 0.1
- os.sleep(0) -- Yield for other processes
- end
Advertisement
Add Comment
Please, Sign In to add comment