local mat_Downsample
= Material( "pp/downsample" )
local mat_Bloom
= Material( "pp/bloom" )
local mat_BlurX
= Material( "pp/blurx" )
local mat_BlurY
= Material( "pp/blury" )
/*---------------------------------------------------------
Register the convars that will control this effect
---------------------------------------------------------*/
local pp_bloom_darken
= CreateClientConVar( "pp_bloom_darken",
"0.65",
false,
false ) // Decides the strength of the bloom
local pp_bloom_multiply
= CreateClientConVar( "pp_bloom_multiply",
"2.0",
false,
false ) // Decides the strength of the bloom
local pp_bloom_sizex
= CreateClientConVar( "pp_bloom_sizex",
"9.0",
false,
false ) // Horizontal blur size
local pp_bloom_sizey
= CreateClientConVar( "pp_bloom_sizey",
"9.0",
false,
false ) // Vertical blur size
/*---------------------------------------------------------
Can be called from engine or hooks using bloom.Draw
---------------------------------------------------------*/
function DrawBloom( darken, multiply, sizex, sizey, passes, color, colr, colg, colb
)
// No bloom for crappy gpus
// Todo: Does this stop it working properly when rendered to a rect?
// Copy the backbuffer to the screen effect texture
// Store the render target so we can swap back at the end
// The downsample material adjusts the contrast
// Downsample to BloomTexture0
for i=1, passes do
end
end
/*---------------------------------------------------------
The function to draw the bloom (called from the hook)
---------------------------------------------------------*/
local function DrawInternal()
// No bloom for crappy gpus
if ( !pp_bloom:
GetBool() ) then return end
if ( !GAMEMODE:PostProcessPermitted( "bloom" ) ) then return end
end
hook.Add( "RenderScreenspaceEffects",
"RenderBloom", DrawInternal
)
/*
// Control Panel
*/
local function BuildControlPanel( CPanel )
CPanel:AddControl( "Header", { Text = "#Bloom", Description = "#Bloom_Information" } )
CPanel:AddControl
( "CheckBox",
{ Label = "#Bloom_Toggle",
Command = "pp_bloom" } )
local params
= { Options
= {}, CVars
= {},
Label = "#Presets", MenuButton
= "1", Folder
= "bloom" }
params.Options[ "#Default" ] = {pp_bloom_passes = "1",
pp_bloom_darken = "0.65",
pp_bloom_multiply = "2.0",
pp_bloom_sizex = "9",
pp_bloom_sizey = "9",
pp_bloom_color = "1.0",
pp_bloom_color_r = "255",
pp_bloom_color_g = "255",
pp_bloom_color_b = "255" }
params.CVars = { "pp_bloom_passes",
"pp_bloom_darken",
"pp_bloom_multiply",
"pp_bloom_sizex",
"pp_bloom_sizey",
"pp_bloom_color",
"pp_bloom_color_r",
"pp_bloom_color_g",
"pp_bloom_color_b" }
CPanel:AddControl( "ComboBox", params )
CPanel:AddControl
( "Slider",
{ Label = "#Bloom_Passes",
Command = "pp_bloom_passes", Type
= "Integer", Min
= "0", Max
= "30" } )
CPanel:AddControl
( "Slider",
{ Label = "#Bloom_Darken",
Command = "pp_bloom_darken", Type
= "Float", Min
= "0", Max
= "1" } )
CPanel:AddControl
( "Slider",
{ Label = "#Bloom_Multiply",
Command = "pp_bloom_multiply", Type
= "Float", Min
= "0", Max
= "5" } )
CPanel:AddControl
( "Slider",
{ Label = "#Bloom_BlurX",
Command = "pp_bloom_sizex", Type
= "Float", Min
= "0", Max
= "50" } )
CPanel:AddControl
( "Slider",
{ Label = "#Bloom_BlurY",
Command = "pp_bloom_sizey", Type
= "Float", Min
= "0", Max
= "50" } )
CPanel:AddControl
( "Slider",
{ Label = "#Bloom_Color_Multiplier",
Command = "pp_bloom_color", Type
= "Float", Min
= "0", Max
= "20" } )
CPanel:AddControl
( "Color",
{ Label = "#Bloom_Color", Red
= "pp_bloom_color_r", Green
= "pp_bloom_color_g", Blue
= "pp_bloom_color_b", ShowAlpha
= "0", ShowHSV
= "1", ShowRGB
= "1" } )
end
/*
// Tool Menu
*/
local function AddPostProcessMenu()
spawnmenu.AddToolMenuOption( "PostProcessing",
"PPShader",
"Bloom",
"#Bloom",
"",
"", BuildControlPanel,
{ SwitchConVar
= "pp_bloom" } )
end
hook.Add( "PopulateToolMenu",
"AddPostProcessMenu_Bloom", AddPostProcessMenu
)