Super-Nostalgia-Zone/Client/LensFlare.client.lua

134 lines
4.0 KiB
Lua

local RunService = game:GetService("RunService")
local Lighting = game:GetService("Lighting")
local TeleportService = game:GetService("TeleportService")
local c = workspace.CurrentCamera
local lensFlareNode = c:FindFirstChild("LensFlareNode")
if not lensFlareNode then
lensFlareNode = Instance.new("Part")
lensFlareNode.Name = "LensFlareNode"
lensFlareNode.Transparency = 1
lensFlareNode.Anchored = true
lensFlareNode.CanCollide = false
lensFlareNode.Locked = true
lensFlareNode.Parent = c
end
local lenses =
{
{ Color = Color3.fromRGB(200, 255, 200), Radius = 1.20, Distance = 0.100 };
{ Color = Color3.fromRGB( 0, 255, 0), Radius = 0.50, Distance = 0.200 };
{ Color = Color3.fromRGB(255, 0, 0), Radius = 0.30, Distance = 0.225 };
{ Color = Color3.fromRGB(255, 170, 0), Radius = 1.50, Distance = 0.250 };
{ Color = Color3.fromRGB(255, 170, 0), Radius = 3.00, Distance = 0.250 };
{ Color = Color3.fromRGB( 0, 255, 0), Radius = 0.50, Distance = 0.300 };
{ Color = Color3.fromRGB( 0, 255, 0), Radius = 0.20, Distance = 0.600 };
{ Color = Color3.fromRGB( 0, 255, 0), Radius = 0.40, Distance = 0.650 };
{ Color = Color3.fromRGB(255, 0, 0), Radius = 0.20, Distance = 0.780 };
{ Color = Color3.fromRGB( 0, 255, 0), Radius = 0.25, Distance = 0.900 };
{ Color = Color3.fromRGB( 23, 17, 0), Radius = 0.15, Distance = 1.200 };
{ Color = Color3.fromRGB( 23, 17, 0), Radius = 0.15, Distance = 1.500 };
}
local function projectRay(ray,length)
local origin = ray.Origin
local direction = ray.Direction
return Ray.new(origin,direction.Unit * length)
end
local function computeSunOcclusion()
local sunPos = Lighting:GetSunDirection()
local cf = c.CFrame
if sunPos:Dot(cf.lookVector) > 0 then
local sunView = c:WorldToViewportPoint(cf.p + sunPos)
local visibility = 0
local total = 0
for dx = -1,1 do
for dy = -1,1 do
local posX = math.floor(sunView.X + dx * 15)
local posY = math.floor(sunView.Y + dy * 15)
local sunRay = c:ViewportPointToRay(posX, posY)
sunRay = projectRay(sunRay,5000)
local hit,pos = workspace:FindPartOnRay(sunRay,c)
if not hit then
visibility = visibility + 1
end
total = total + 1
end
end
visibility = visibility / total
return (1-visibility),sunView
end
return 0
end
local function asVector2(v3,...)
return Vector2.new(v3.X,v3.Y),...
end
local function update()
if TeleportService:GetTeleportSetting("ClassicSky") then
local vpSize = c.ViewportSize
local sunDir = Lighting:GetSunDirection()
local sunWP = sunDir * 10e6
local sunSP,inView = asVector2(c:WorldToViewportPoint(sunWP))
local occlusion = inView and computeSunOcclusion() or 1
if occlusion < 1 then
local invSunSP = vpSize - sunSP
local enabled = (inView and occlusion < 1)
local flareBrightness = math.sqrt(math.max(0,sunDir.y*4))
for i,lense in ipairs(lenses) do
local radius = lense.Radius / 12
if not lense.Beam then
local a0 = Instance.new("Attachment")
lense.A0 = a0
a0.Name = i .. "_A0"
a0.Parent = lensFlareNode
local a1 = Instance.new("Attachment")
lense.A1 = a1
a1.Name = i .. "_A1"
a1.Parent = lensFlareNode
local beam = Instance.new("Beam")
lense.Beam = beam
beam.Name = i
beam.Color = ColorSequence.new(lense.Color)
beam.Width0 = radius
beam.Width1 = radius
beam.TextureSpeed = 0
beam.Transparency = NumberSequence.new(0.9)
beam.LightEmission = 1
beam.Texture = "rbxasset://sky/lensflare.jpg"
beam.Attachment0 = a0
beam.Attachment1 = a1
beam.Parent = lensFlareNode
end
local lenseSP = invSunSP:lerp(sunSP,lense.Distance)
local lenseWP = c:ViewportPointToRay(lenseSP.X,lenseSP.Y,1).Origin
local lenseCF = CFrame.new(lenseWP,lenseWP - sunDir)
lense.A0.CFrame = lenseCF * CFrame.new(-radius/2,0,0)
lense.A1.CFrame = lenseCF * CFrame.new(radius/2,0,0)
end
lensFlareNode.Parent = c
return
end
end
lensFlareNode.Parent = nil
end
return function (script)
RunService:BindToRenderStep("LensFlareUpdate",201,update)
end