79 lines
2.0 KiB
Lua
79 lines
2.0 KiB
Lua
local Lighting = game:GetService("Lighting")
|
|
local RunService = game:GetService("RunService")
|
|
local TeleportService = game:GetService("TeleportService")
|
|
|
|
local adorn = script:WaitForChild("Rays")
|
|
local sunRays = adorn:WaitForChild("SunRays")
|
|
|
|
local function getCamera()
|
|
return workspace.CurrentCamera
|
|
end
|
|
|
|
local function projectRay(ray,length)
|
|
local origin = ray.Origin
|
|
local direction = ray.Direction
|
|
return Ray.new(origin,direction.Unit * length)
|
|
end
|
|
|
|
local function computeSunVisibility()
|
|
local sunPos = Lighting:GetSunDirection()
|
|
local camera = getCamera()
|
|
local cf = camera.CFrame
|
|
|
|
if sunPos:Dot(cf.lookVector) > 0 then
|
|
local sunView = camera: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 = camera:ViewportPointToRay(posX, posY)
|
|
sunRay = projectRay(sunRay,5000)
|
|
|
|
local hit,pos = workspace:FindPartOnRay(sunRay,camera)
|
|
if not hit then
|
|
visibility = visibility + 1
|
|
end
|
|
total = total + 1
|
|
end
|
|
end
|
|
|
|
visibility = visibility / total
|
|
return visibility,sunView
|
|
end
|
|
|
|
return 0
|
|
end
|
|
|
|
local function update()
|
|
if TeleportService:GetTeleportSetting("ClassicSky") then
|
|
local sunPos = Lighting:GetSunDirection()
|
|
if sunPos.Y >= -.1 then
|
|
local visibility,sunView = computeSunVisibility()
|
|
if visibility > 0.001 then
|
|
local attenuation = (1 - (2*visibility - 1)*(2*visibility - 1))
|
|
local strength = math.clamp((((1 - sunPos.Y)*2) / math.sqrt(2)), 0, 1)
|
|
local opacity = attenuation * 0.4 * strength
|
|
|
|
local camera = getCamera()
|
|
local rayPos = camera:ViewportPointToRay(sunView.X,sunView.Y,1).Origin
|
|
local rayLook = camera.CFrame.p
|
|
|
|
adorn.Parent = camera
|
|
adorn.CFrame = CFrame.new(rayPos,rayLook)
|
|
sunRays.Transparency = NumberSequence.new(1-opacity)
|
|
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
adorn.Parent = nil
|
|
end
|
|
|
|
return function ()
|
|
RunService:BindToRenderStep("SunRays",201,update)
|
|
end |