recently i have found this antique old 3D raycasting renderer gui made in around 2012, and somehow it still works! but its pretty laggy. If you have a good pc, the most that this thing can run at is like 15fps, but for me, it runs at like 3fps. So how would i make this less laggy and run more efficiently?
repeat wait() until player.Character
Char = player.Character
HRP = Char:WaitForChild("HumanoidRootPart")
wait(0)
Ambient = script.Parent.Ambient
Light = game.Workspace.Light --known light source
pixel = 60 --the pixels to be generated and rendered
size = 10 --pixel size
sky = 1
length = 100 --view range
debug = false --if true the script will handle with the old pixels rather than creating new ones
function tint(col,rat)
r = 1-col.r
g = 1-col.g
b = 1-col.b
return Color3.new(r*rat,g*rat,b*rat)
end
function shade(col,rat)
r = col.r
g = col.g
b = col.b
return Color3.new(r*rat,g*rat,b*rat)
end
function color3add(col,col2)
return Color3.new(col.r+col2.r,col.g+col2.g,col.b+col2.b)
end
function interpolate(col,col2,rat)
return Color3.new(col.r*(1-rat) + col2.r*rat,col.g*(1-rat) + col2.g*rat,col.b*(1-rat) + col2.b*rat)
end
function interpolateT(col,col2,rat,val)
return col*(1-rat) + col2*rat
end
function reflect(vector3,norm)
norm = norm or Vector3.new(0,1,0)
return vector3 - ( 2*norm*vector3:Dot(norm))
end
function GeneratePixels()
for x=0,pixel-1 do
wait()
for y=0,pixel-1 do
fr = Instance.new("Frame")
fr.Position = UDim2.new(0,x*size,0,y*size)
fr.Size = UDim2.new(0,size,0,size)
fr.BackgroundColor3 = Color3.new(x,y,0)
fr.BorderSizePixel = 0
fr.Name = x .."/".. y
fr.Parent = script.Parent.p
fr.ZIndex = 3
end
end
end
if not debug then
GeneratePixels()
end
while true do --start the camera loop
wait(0.1)
c = CFrame.new(game.Workspace.CurrentCamera.CoordinateFrame.p,game.Workspace.CurrentCamera.Focus.p)
for x=pixel-1,0,-1 do
for y=pixel-1,0,-1 do
dir = c*CFrame.new((pixel/2-x)*(20/pixel*.1),(pixel/2-y)*(20/pixel*.1),-1) --with default 20 pixels .1 step
ray = Ray.new(c.p,(dir.p - c.p).unit * length) --view ray
part,point = game.Workspace:FindPartOnRayWithIgnoreList(ray, {Light, Char})
r,g,b = 0,0,0 --brickcolor
rr,rg,rb = 0,0,0 --reflection color
r = 0 --reflection ratio
shade = 0
if(part)then
color = part.BrickColor.Color
if(part.Name == "Light")then
r,g,b = r+color.r,g+color.g,b+color.b
end
ray2 = Ray.new(point,(Light.Position-point).unit * Light.Range.Value) --light ray to view point
part2 = game.Workspace:FindPartOnRayWithIgnoreList(ray2, {Light, Char})
ratio = (Light.Position - point).magnitude/Light.Range.Value
if(part2~=nil)then
shade = 0
end
if(ratio>1)then
ratio = 1
elseif(ratio<0)then
ratio = 0
end
if(part.Name == "Water")then --add reflection values
ref = reflect(dir.lookVector)
ray3 = Ray.new(point,ref*length)
part3,point3 = game.Workspace:FindPartOnRayWithIgnoreList(ray3,{part})
if(part3)then
color2 = part3.BrickColor.Color
rr,rg,rb = rr+color2.r,rg+color2.g,rb+color2.b
r = part.Reflection.Value
end
end
if(shade==0)then --light wasn't blocked
if(rr~=0 and rg~=0 and rb~=0)then --add the reflection to the final color
r = interpolateT(color.r*(1-ratio),rr,r,"r")
g = interpolateT(color.g*(1-ratio),rg,r,"g")
b = interpolateT(color.b*(1-ratio),rb,r,"b")
else --no reflection
r = color.r*(1-ratio)
g = color.g*(1-ratio)
b = color.b*(1-ratio)
end
end
else
if(sky == 1)then
r = 0 --default sky
g = 153/255
b = 204/255
end
end
r = r * Ambient.Value.r
g = g * Ambient.Value.g
b = b * Ambient.Value.b
script.Parent.p[(pixel-1)-x .."/".. y].BackgroundColor3 = Color3.new(r,g,b)
end
end
Light.Position = HRP.Position
end
--Originally written by su8
--July 2012