I’m currently coding a ‘shader’ for visualizing with ASCII characters, however it runs extremely poorly and I wanted a second opinion on what might be possible to implement
Here is the entire code line for anyone who wants it, I’ll release it more officially if I ever figure out this optimization crisis
local run_service = game:GetService("RunService")
local template = script.Template
local value_table = string.split("@&%QWNM0gB$#DR8mHXKAUbGOpV4d9h6PkqwSE2]ayjxY5Zoen[ult13If}C{iF|(7J)vTLs?z/*cr!+<>;=^,_:'-.` ","")
local screen_gui = script.Parent
local frame = screen_gui.Frame
local ui_grid = frame.UIGridLayout
local viewport = frame.AbsoluteSize
local pixel_size_x = ui_grid.CellSize.X.Offset
local pixel_size_y = ui_grid.CellSize.Y.Offset
local resolution = Vector2.new(viewport.X/pixel_size_x,viewport.Y/pixel_size_y)
local wait_time = 0
local create_pixels = function(resolution)
for i = 1,resolution.y do
for v = 1,resolution.x do
local pixel = template:Clone()
pixel.Parent = frame
pixel.Name = "row "..i.." pixel "..v
pixel.LayoutOrder = v + ((i-1)*resolution.x)
end
end
return "finished"
end
local clear_pixels = function()
for i,child in pairs(frame:GetChildren()) do
if child:IsA("TextLabel") then
game.Debris:AddItem(child, 0)
end
end
end
print(create_pixels(resolution))
task.wait(2)
workspace.CurrentCamera:GetPropertyChangedSignal("ViewportSize"):Connect(function()
local new_resolution = Vector2.new(viewport.X/pixel_size_x,viewport.Y/pixel_size_y)
clear_pixels()
create_pixels(new_resolution)
end)
local get_ray_from_pixel = function(pixel)
local ray = workspace.CurrentCamera:ScreenPointToRay(pixel.AbsolutePosition.X, pixel.AbsolutePosition.Y, 0)
local result = workspace:Raycast(ray.Origin, ray.Direction*#value_table)
if result then
return math.floor(result.Distance), result.Instance
else
return #value_table
end
end
local translate_distance_to_ascii = function(distance)
if value_table[distance] ~= nil then
return value_table[distance]
else
return value_table[#value_table]
end
end
local t = tick()
run_service.RenderStepped:Connect(function()
if (tick() - t) >= (1/20) then
t = tick()
for i,pixel in pairs(frame:GetChildren()) do
if pixel:IsA("TextLabel") then
local distance, instance = get_ray_from_pixel(pixel)
local new_value = translate_distance_to_ascii(distance)
pixel.Text = new_value
local intensity = 1 - (distance / #value_table)
intensity = math.clamp(intensity, 0, 1)
if instance ~= nil then
if instance.Parent:FindFirstChild("Humanoid") or instance.Parent:IsA("Accessory") then
pixel.TextColor3 = Color3.new(intensity, 0, 0)
else
pixel.TextColor3 = Color3.new(intensity, intensity, intensity)
end
else
pixel.TextColor3 = Color3.new(intensity, intensity, intensity)
end
end
end
end
end)