--by pavetr.top/ds --[[ Credits:Akabenko - Restoring the shader, adapting to the color of the sun Mee - Initial implementation ]] steamworks.DownloadUGC( "3453386337", function( path ) game.MountGMA( path ) end) RunConsoleCommand("spawnmenu_reload") local shaderName = "VolumetricClouds" local r_clouds = CreateClientConVar( "r_clouds", "0", false, false, "Enable/Disable Volumetric Clouds.", 0, 1 ) local r_clouds_sunfactor = CreateClientConVar( "r_clouds_sunfactor", "5.5", true, false, "Sun color strange.", 0, 50 ) local r_clouds_speed = CreateClientConVar( "r_clouds_speed", "0.5", true, false, "Volumetric clouds speed.", -5, 5 ) local r_clouds_volume = CreateClientConVar( "r_clouds_volume", "30000", true, false, "Volume of clouds.", 15000, 50000 ) local r_clouds_farz = CreateClientConVar( "r_clouds_farz", "1000", true, false, "Volumetric clouds speed.", 0, 2500 ) local r_clouds_brightness = CreateClientConVar( "r_clouds_brightness", "4", true, false, "Volumetric clouds speed.", 0, 20 ) local r_clouds_boxmaxz = CreateClientConVar( "r_clouds_boxmaxz", "356.125000", true, false, "Volumetric clouds speed.", 0, 600 ) local r_clouds_skyz = CreateClientConVar( "r_clouds_skyz", "950", true, false, "Volumetric clouds speed.", 500, 1000 ) list.Set( "PostProcess", "#r_clouds.name", { ["icon"] = "gui/postprocess/volumetric_clouds.jpg", ["convar"] = r_clouds:GetName(), ["category"] = "#shaders_pp", ["cpanel"] = function( panel ) panel:AddControl( "ComboBox", { ["MenuButton"] = 1, ["Folder"] = "ssao", ["Options"] = { [ "#preset.default" ] = { [ r_clouds:GetName() ] = r_clouds:GetDefault(), [ r_clouds_sunfactor:GetName() ] = r_clouds_sunfactor:GetDefault(), [ r_clouds_speed:GetName() ] = r_clouds_speed:GetDefault(), [ r_clouds_volume:GetName() ] = r_clouds_volume:GetDefault(), [ r_clouds_farz:GetName() ] = r_clouds_farz:GetDefault(), [ r_clouds_brightness:GetName() ] = r_clouds_brightness:GetDefault(), [ r_clouds_boxmaxz:GetName() ] = r_clouds_boxmaxz:GetDefault(), [ r_clouds_skyz:GetName() ] = r_clouds_skyz:GetDefault(), } }, ["CVars"] = { r_clouds:GetName(), r_clouds_sunfactor:GetName(), r_clouds_speed:GetName(), r_clouds_volume:GetName(), r_clouds_farz:GetName(), r_clouds_brightness:GetName(), r_clouds_boxmaxz:GetName(), r_clouds_skyz:GetName(), } } ) panel:AddControl( "CheckBox", { ["Label"] = "#r_clouds.enable", ["Command"] = r_clouds:GetName() } ) panel:AddControl( "Slider", { ["Label"] = "#r_clouds.sunfactor", ["Command"] = r_clouds_sunfactor:GetName(), ["Min"] = tostring( r_clouds_sunfactor:GetMin() ), ["Max"] = tostring( r_clouds_sunfactor:GetMax() ), ["Type"] = "Float", ["Help"] = true } ) panel:AddControl( "Slider", { ["Label"] = "#r_clouds.speed", ["Command"] = r_clouds_speed:GetName(), ["Min"] = tostring( r_clouds_speed:GetMin() ), ["Max"] = tostring( r_clouds_speed:GetMax() ), ["Type"] = "Float", ["Help"] = true } ) panel:AddControl( "Slider", { ["Label"] = "#r_clouds.volume", ["Command"] = r_clouds_volume:GetName(), ["Min"] = tostring( r_clouds_volume:GetMin() ), ["Max"] = tostring( r_clouds_volume:GetMax() ), ["Type"] = "Float", ["Help"] = true } ) panel:AddControl( "Slider", { ["Label"] = "#r_clouds.farz", ["Command"] = r_clouds_farz:GetName(), ["Min"] = tostring( r_clouds_farz:GetMin() ), ["Max"] = tostring( r_clouds_farz:GetMax() ), ["Type"] = "Float", ["Help"] = true } ) panel:AddControl( "Slider", { ["Label"] = "#r_clouds.brightness", ["Command"] = r_clouds_brightness:GetName(), ["Min"] = tostring( r_clouds_brightness:GetMin() ), ["Max"] = tostring( r_clouds_brightness:GetMax() ), ["Type"] = "Float", ["Help"] = true } ) panel:Help( "#r_clouds.positions" ) panel:AddControl( "Slider", { ["Label"] = "#r_clouds.boxmaxz", ["Command"] = r_clouds_boxmaxz:GetName(), ["Min"] = tostring( r_clouds_boxmaxz:GetMin() ), ["Max"] = tostring( r_clouds_boxmaxz:GetMax() ), ["Type"] = "Float", ["Help"] = true } ) panel:AddControl( "Slider", { ["Label"] = "#r_clouds.skyz", ["Command"] = r_clouds_skyz:GetName(), ["Min"] = tostring( r_clouds_skyz:GetMin() ), ["Max"] = tostring( r_clouds_skyz:GetMax() ), ["Type"] = "Float", ["Help"] = true } ) end } ) local volume_mat = Material("pp/volumetric_clouds") local sky_pos = Vector(0,0,950) local world_size = 32768 local function RenderVolumetricClouds() render.UpdateScreenEffectTexture(1) render.OverrideDepthEnable( true, false ) cam.Start3D( vector_origin, EyeAngles() ) render.SetMaterial( volume_mat ) render.DrawQuadEasy( sky_pos, vector_up, world_size, world_size, color_white, 0 ) cam.End3D() render.OverrideDepthEnable( false, false ) end local IsValid = IsValid local function ThinkVolumetricClouds() local Sun = ents.FindByClass("class C_Sun")[1] local sun = util.GetSunInfo() --if !sun then return end local sun_angle = sun.direction:Angle() volume_mat:SetFloat("$c1_w", sun.direction.x) volume_mat:SetFloat("$c2_x", sun.direction.y) volume_mat:SetFloat("$c2_y", sun.direction.z) if IsValid(Sun) then local sun_color = Sun:GetColor() volume_mat:SetFloat("$c2_z", sun_color.r/255) volume_mat:SetFloat("$c2_w", sun_color.g/255) volume_mat:SetFloat("$c3_x", sun_color.b/255) end end cvars.AddChangeCallback( r_clouds:GetName(), function( convar_name, _, identifier ) local enabled = identifier == "1" if enabled then hook.Add("PostDraw2DSkyBox", shaderName, RenderVolumetricClouds) local sun = util.GetSunInfo() if !sun then return end hook.Add("Think", shaderName, ThinkVolumetricClouds) else hook.Remove("PostDraw2DSkyBox",shaderName) hook.Remove("Think", shaderName) end end, shaderName ) cvars.AddChangeCallback( r_clouds_sunfactor:GetName(), function( convar_name, _, identifier ) volume_mat:SetFloat("$c3_y", identifier) end, shaderName ) cvars.AddChangeCallback( r_clouds_speed:GetName(), function( convar_name, _, identifier ) volume_mat:SetFloat("$c3_z", identifier) end, shaderName ) cvars.AddChangeCallback( r_clouds_volume:GetName(), function( convar_name, _, identifier ) volume_mat:SetFloat("$c3_w", identifier) end, shaderName ) cvars.AddChangeCallback( r_clouds_farz:GetName(), function( convar_name, _, identifier ) volume_mat:SetFloat("$c1_y", identifier) end, shaderName ) cvars.AddChangeCallback( r_clouds_brightness:GetName(), function( convar_name, _, identifier ) volume_mat:SetFloat("$c1_x", identifier) end, shaderName ) cvars.AddChangeCallback( r_clouds_brightness:GetName(), function( convar_name, _, identifier ) volume_mat:SetFloat("$c1_x", identifier) end, shaderName ) local s = Vector(world_size,world_size,12.7) cvars.AddChangeCallback( r_clouds_boxmaxz:GetName(), function( convar_name, _, identifier ) volume_mat:SetFloat("$c1_z", tonumber(identifier) * s.z) end, shaderName ) cvars.AddChangeCallback( r_clouds_skyz:GetName(), function( convar_name, _, identifier ) sky_pos.z = tonumber(identifier) hook.Add("PostDraw2DSkyBox", shaderName, RenderVolumetricClouds) end, shaderName ) --local box_min = Vector(-1, -1, 0) --local box_max = Vector(1, 1, 356.125000) --volume_mat:SetFloat("$c0_y", box_min.x * s.x) --volume_mat:SetFloat("$c0_z", box_min.y * s.y) --volume_mat:SetFloat("$c1_z", box_max.z * s.z)