new post | browse code | authors | help | about

LuaBin 2.0

Viewing file root / lua / postprocess / bloom.lua

  1.  
  2.  
  3. local mat_Downsample    = Material( "pp/downsample" )
  4. local mat_Bloom                 = Material( "pp/bloom" )
  5. local mat_BlurX                 = Material( "pp/blurx" )
  6. local mat_BlurY                 = Material( "pp/blury" )
  7.  
  8. local tex_Bloom0                = render.GetBloomTex0()
  9. local tex_Bloom1                = render.GetBloomTex1()
  10.  
  11. mat_Downsample:SetMaterialTexture( "$fbtexture", render.GetScreenEffectTexture() )
  12.  
  13. /*---------------------------------------------------------
  14.    Register the convars that will control this effect
  15. ---------------------------------------------------------*/  
  16. local pp_bloom                  = CreateClientConVar( "pp_bloom",                       "0",    true,   false )                         // On/Off
  17. local pp_bloom_darken   = CreateClientConVar( "pp_bloom_darken",        "0.65", false,  false )         // Decides the strength of the bloom
  18. local pp_bloom_multiply = CreateClientConVar( "pp_bloom_multiply",      "2.0",  false,  false ) // Decides the strength of the bloom
  19. local pp_bloom_sizex    = CreateClientConVar( "pp_bloom_sizex",         "9.0",  false,  false )         // Horizontal blur size
  20. local pp_bloom_sizey    = CreateClientConVar( "pp_bloom_sizey",         "9.0",  false,  false )         // Vertical blur size
  21. local pp_bloom_color    = CreateClientConVar( "pp_bloom_color",         "1.0",  false,  false )
  22. local pp_bloom_color_r  = CreateClientConVar( "pp_bloom_color_r",       "255",  false,  false )
  23. local pp_bloom_color_g  = CreateClientConVar( "pp_bloom_color_g",       "255",  false,  false )
  24. local pp_bloom_color_b  = CreateClientConVar( "pp_bloom_color_b",       "255",  false,  false )
  25. local pp_bloom_passes   = CreateClientConVar( "pp_bloom_passes",        "1",    false,  false )
  26.  
  27. /*---------------------------------------------------------
  28.    Can be called from engine or hooks using bloom.Draw
  29. ---------------------------------------------------------*/
  30. function DrawBloom( darken, multiply, sizex, sizey, passes, color, colr, colg, colb )
  31.  
  32.         // No bloom for crappy gpus
  33.         if ( !render.SupportsPixelShaders_2_0() ) then return end
  34.        
  35.         // Todo: Does this stop it working properly when rendered to a rect?
  36.         local w = ScrW()
  37.         local h = ScrH()
  38.        
  39.         // Copy the backbuffer to the screen effect texture
  40.        
  41.         // Store the render target so we can swap back at the end
  42.         local OldRT = render.GetRenderTarget();
  43.        
  44.         // The downsample material adjusts the contrast
  45.         mat_Downsample:SetMaterialFloat( "$darken", darken )
  46.         mat_Downsample:SetMaterialFloat( "$multiply", multiply  )
  47.        
  48.                
  49.         // Downsample to BloomTexture0
  50.         render.SetRenderTarget( tex_Bloom0 )
  51.        
  52.         render.SetMaterial( mat_Downsample )
  53.         render.DrawScreenQuad()                  
  54.                                          
  55.         mat_BlurX:SetMaterialTexture( "$basetexture", tex_Bloom0 )
  56.         mat_BlurY:SetMaterialTexture( "$basetexture", tex_Bloom1  )
  57.         mat_BlurX:SetMaterialFloat( "$size", sizex )
  58.         mat_BlurY:SetMaterialFloat( "$size", sizey )
  59.        
  60.         for i=1, passes do
  61.  
  62.                 render.SetRenderTarget( tex_Bloom1 )
  63.                 render.SetMaterial( mat_BlurX )
  64.                 render.DrawScreenQuad()
  65.  
  66.                 render.SetRenderTarget( tex_Bloom0 )
  67.                 render.SetMaterial( mat_BlurY )
  68.                 render.DrawScreenQuad()
  69.  
  70.         end
  71.                          
  72.         render.SetRenderTarget( OldRT );
  73.        
  74.         mat_Bloom:SetMaterialFloat( "$levelr", colr )
  75.         mat_Bloom:SetMaterialFloat( "$levelg", colg )
  76.         mat_Bloom:SetMaterialFloat( "$levelb", colb )
  77.         mat_Bloom:SetMaterialFloat( "$colormul", color )
  78.         mat_Bloom:SetMaterialTexture( "$basetexture", tex_Bloom0 )
  79.        
  80.         render.SetMaterial( mat_Bloom )
  81.         render.DrawScreenQuad()
  82.        
  83. end
  84.  
  85.  
  86. /*---------------------------------------------------------
  87.    The function to draw the bloom (called from the hook)
  88. ---------------------------------------------------------*/
  89. local function DrawInternal()
  90.  
  91.         // No bloom for crappy gpus
  92.        
  93.         if ( !render.SupportsPixelShaders_2_0() ) then return end      
  94.         if ( !pp_bloom:GetBool() ) then return end
  95.         if ( !GAMEMODE:PostProcessPermitted( "bloom" ) ) then return end
  96.        
  97.         DrawBloom( pp_bloom_darken:GetFloat(),
  98.                                 pp_bloom_multiply:GetFloat(),
  99.                                 pp_bloom_sizex:GetFloat(),
  100.                                 pp_bloom_sizey:GetFloat(),
  101.                                 pp_bloom_passes:GetFloat(),
  102.                                 pp_bloom_color:GetFloat(),
  103.                                 pp_bloom_color_r:GetFloat()/255,
  104.                                 pp_bloom_color_g:GetFloat()/255,
  105.                                 pp_bloom_color_b:GetFloat()/255 )
  106.        
  107.  
  108. end
  109.  
  110.  
  111.  
  112. hook.Add( "RenderScreenspaceEffects", "RenderBloom", DrawInternal )
  113.  
  114.  
  115.  
  116. /*
  117. // Control Panel
  118. */
  119. local function BuildControlPanel( CPanel )
  120.  
  121.         CPanel:AddControl( "Header", { Text = "#Bloom", Description = "#Bloom_Information" }  )
  122.         CPanel:AddControl( "CheckBox", { Label = "#Bloom_Toggle", Command = "pp_bloom" }  )
  123.        
  124.         local params = { Options = {}, CVars = {}, Label = "#Presets", MenuButton = "1", Folder = "bloom" }
  125.         params.Options[ "#Default" ] = {pp_bloom_passes =               "1",
  126.                                                                         pp_bloom_darken =               "0.65",
  127.                                                                         pp_bloom_multiply =             "2.0",
  128.                                                                         pp_bloom_sizex =                "9",
  129.                                                                         pp_bloom_sizey =                "9",
  130.                                                                         pp_bloom_color =                "1.0",
  131.                                                                         pp_bloom_color_r =              "255",
  132.                                                                         pp_bloom_color_g =              "255",
  133.                                                                         pp_bloom_color_b =              "255" }
  134.                                                                        
  135.         params.CVars = { "pp_bloom_passes",
  136.                                                 "pp_bloom_darken",
  137.                                                 "pp_bloom_multiply",
  138.                                                 "pp_bloom_sizex",
  139.                                                 "pp_bloom_sizey",
  140.                                                 "pp_bloom_color",
  141.                                                 "pp_bloom_color_r",
  142.                                                 "pp_bloom_color_g",
  143.                                                 "pp_bloom_color_b" }
  144.                                                
  145.         CPanel:AddControl( "ComboBox",  params )
  146.        
  147.         CPanel:AddControl( "Slider", { Label = "#Bloom_Passes", Command = "pp_bloom_passes", Type = "Integer", Min = "0", Max = "30" }  )
  148.         CPanel:AddControl( "Slider", { Label = "#Bloom_Darken", Command = "pp_bloom_darken", Type = "Float", Min = "0", Max = "1" }  )
  149.         CPanel:AddControl( "Slider", { Label = "#Bloom_Multiply", Command = "pp_bloom_multiply", Type = "Float", Min = "0", Max = "5" }  )     
  150.         CPanel:AddControl( "Slider", { Label = "#Bloom_BlurX", Command = "pp_bloom_sizex", Type = "Float", Min = "0", Max = "50" }  )  
  151.         CPanel:AddControl( "Slider", { Label = "#Bloom_BlurY", Command = "pp_bloom_sizey", Type = "Float", Min = "0", Max = "50" }  )  
  152.         CPanel:AddControl( "Slider", { Label = "#Bloom_Color_Multiplier", Command = "pp_bloom_color", Type = "Float", Min = "0", Max = "20" }  )       
  153.  
  154.         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" }  )                      
  155.        
  156. end
  157.  
  158. /*
  159. // Tool Menu
  160. */
  161. local function AddPostProcessMenu()
  162.  
  163.         spawnmenu.AddToolMenuOption( "PostProcessing", "PPShader", "Bloom", "#Bloom", "", "", BuildControlPanel, { SwitchConVar = "pp_bloom" } )
  164.  
  165. end
  166.  
  167. hook.Add( "PopulateToolMenu", "AddPostProcessMenu_Bloom", AddPostProcessMenu )
  168.