new post | browse code | authors | help | about

LuaBin 2.0

Viewing file root / lua / postprocess / motion_blur.lua

  1.  
  2.  
  3.  
  4. local mat_MotionBlur    = Material( "pp/motionblur" )
  5. local mat_Screen                = Material( "pp/fb" )
  6. local tex_MotionBlur    = render.GetMoBlurTex0()
  7.  
  8. /*---------------------------------------------------------
  9.    Register the convars that will control this effect
  10. ---------------------------------------------------------*/  
  11. local pp_motionblur                     = CreateClientConVar( "pp_motionblur", "0", false, false )
  12. local pp_motionblur_addalpha    = CreateClientConVar( "pp_motionblur_addalpha", "0.2", false, false )
  13. local pp_motionblur_drawalpha   = CreateClientConVar( "pp_motionblur_drawalpha", "0.99", false, false )
  14. local pp_motionblur_delay               = CreateClientConVar( "pp_motionblur_delay", "0.0", false, false )
  15.  
  16. local NextDraw = 0
  17. local LastDraw = 0
  18.  
  19. function DrawMotionBlur( addalpha, drawalpha, delay )
  20.  
  21.         if ( drawalpha == 0 ) then return end
  22.        
  23.         // Copy the backbuffer to the screen effect texture
  24.        
  25.         // If it's been a long time then the buffer is probably dirty, update it
  26.         if ( CurTime() - LastDraw > 0.5 ) then
  27.        
  28.                 mat_Screen:SetMaterialFloat( "$alpha", 1 )
  29.                
  30.                 local OldRT = render.GetRenderTarget();
  31.                 render.SetRenderTarget( tex_MotionBlur )
  32.                         render.SetMaterial( mat_Screen )
  33.                         render.DrawScreenQuad()
  34.                 render.SetRenderTarget( OldRT )
  35.        
  36.         end
  37.  
  38.         // Set up out materials
  39.         mat_MotionBlur:SetMaterialFloat( "$alpha", drawalpha )
  40.         mat_MotionBlur:SetMaterialTexture( "$basetexture", tex_MotionBlur )
  41.        
  42.         if ( NextDraw < CurTime() && addalpha > 0 ) then
  43.  
  44.                 NextDraw = CurTime() + delay
  45.  
  46.                 mat_Screen:SetMaterialFloat( "$alpha", addalpha )
  47.                 local OldRT = render.GetRenderTarget();
  48.                 render.SetRenderTarget( tex_MotionBlur )
  49.  
  50.                 render.SetMaterial( mat_Screen )
  51.                 render.DrawScreenQuad()
  52.  
  53.                 render.SetRenderTarget( OldRT )
  54.  
  55.         end
  56.  
  57.  
  58.         render.SetMaterial( mat_MotionBlur )
  59.         render.DrawScreenQuad()
  60.        
  61.         LastDraw = CurTime()
  62.        
  63. end
  64.  
  65. local function DrawInternal()
  66.  
  67.         if ( !pp_motionblur:GetBool() ) then return end
  68.         if ( !GAMEMODE:PostProcessPermitted( "motion blur" ) ) then return end
  69.  
  70.         DrawMotionBlur( pp_motionblur_addalpha:GetFloat(),
  71.                         pp_motionblur_drawalpha:GetFloat(),
  72.                         pp_motionblur_delay:GetFloat() );
  73.  
  74. end
  75.  
  76.  
  77. hook.Add( "RenderScreenspaceEffects", "RenderMotionBlur", DrawInternal )
  78.  
  79. /*
  80. // Control Panel
  81. */
  82. local function BuildControlPanel( CPanel )
  83.  
  84.         CPanel:AddControl( "Header", { Text = "#MotionBlur", Description = "#MotionBlur_Information" }  )
  85.         CPanel:AddControl( "CheckBox", { Label = "#MotionBlur_Toggle", Command = "pp_motionblur" }  )
  86.        
  87.         local params = { Options = {}, CVars = {}, Label = "#Presets", MenuButton = "1", Folder = "motionblur" }
  88.         params.Options[ "#Default" ] = { pp_motionblur_addalpha = "0.2", pp_motionblur_delay = "0.05", pp_motionblur_drawalpha = "0.99" }
  89.         params.CVars = { "pp_motionblur_addalpha", "pp_motionblur_drawalpha", "pp_motionblur_delay" }
  90.         CPanel:AddControl( "ComboBox",  params )
  91.        
  92.         CPanel:AddControl( "Slider", { Label = "#MotionBlur_Add_Alpha", Command = "pp_motionblur_addalpha", Type = "Float", Min = "0", Max = "1" }  )
  93.         CPanel:AddControl( "Slider", { Label = "#MotionBlur_DrawAlpha", Command = "pp_motionblur_drawalpha", Type = "Float", Min = "0", Max = "1" }  )
  94.         CPanel:AddControl( "Slider", { Label = "#MotionBlur_Delay", Command = "pp_motionblur_delay", Type = "Float", Min = "0", Max = "1" }  ) 
  95.  
  96. end
  97.  
  98. /*
  99. // Tool Menu
  100. */
  101. local function AddPostProcessMenu()
  102.  
  103.         spawnmenu.AddToolMenuOption( "PostProcessing", "PPSimple", "MotionBlur", "#Motion Blur", "", "", BuildControlPanel, { SwitchConVar = "pp_motionblur" } )
  104.  
  105. end
  106.  
  107. hook.Add( "PopulateToolMenu", "AddPostProcessMenu_MotionBlur", AddPostProcessMenu )
  108.  
  109.  
  110.  
  111.