
local mat_MotionBlur	= Material( "pp/motionblur" )
local mat_Screen		= Material( "pp/fb" )
local tex_MotionBlur	= render.GetMoBlurTex0()

--[[---------------------------------------------------------
   Register the convars that will control this effect
-----------------------------------------------------------]]
local pp_motionblur 			= CreateClientConVar( "pp_motionblur", "0", false, false )
local pp_motionblur_addalpha 	= CreateClientConVar( "pp_motionblur_addalpha", "0.2", true, false )
local pp_motionblur_drawalpha	= CreateClientConVar( "pp_motionblur_drawalpha", "0.99", true, false )
local pp_motionblur_delay		= CreateClientConVar( "pp_motionblur_delay", "0.05", true, false )

local NextDraw = 0
local LastDraw = 0

function DrawMotionBlur( addalpha, drawalpha, delay )

	if ( drawalpha == 0 ) then return end
	
	-- Copy the backbuffer to the screen effect texture
	render.UpdateScreenEffectTexture()
	
	-- If it's been a long time then the buffer is probably dirty, update it
	if ( CurTime() - LastDraw > 0.5 ) then
	
		mat_Screen:SetFloat( "$alpha", 1 )
		
		local OldRT = render.GetRenderTarget()
		render.SetRenderTarget( tex_MotionBlur )
			render.SetMaterial( mat_Screen )
			render.DrawScreenQuad()
		render.SetRenderTarget( OldRT )	
	
	end

	-- Set up out materials
	mat_MotionBlur:SetFloat( "$alpha", drawalpha )
	mat_MotionBlur:SetTexture( "$basetexture", tex_MotionBlur )
	
	if ( NextDraw < CurTime() && addalpha > 0 ) then

		NextDraw = CurTime() + delay

		mat_Screen:SetFloat( "$alpha", addalpha )
		local OldRT = render.GetRenderTarget()
		render.SetRenderTarget( tex_MotionBlur )

		render.SetMaterial( mat_Screen )
		render.DrawScreenQuad()

		render.SetRenderTarget( OldRT )

	end

	render.SetMaterial( mat_MotionBlur )
	render.DrawScreenQuad()
	
	LastDraw = CurTime()
	
end

local function DrawInternal()

	if ( !pp_motionblur:GetBool() ) then return end
	if ( !GAMEMODE:PostProcessPermitted( "motion blur" ) ) then return end

	DrawMotionBlur( pp_motionblur_addalpha:GetFloat(),
			pp_motionblur_drawalpha:GetFloat(),
			pp_motionblur_delay:GetFloat() )

end
hook.Add( "RenderScreenspaceEffects", "RenderMotionBlur", DrawInternal )

list.Set( "PostProcess", "#motion_blur_pp", {

	icon		= "gui/postprocess/accummotionblur.png",
	convar		= "pp_motionblur",
	category	= "#effects_pp",
	
	cpanel		= function( CPanel )

		CPanel:AddControl( "Header", { Description = "#motion_blur_pp.desc" } )
		CPanel:AddControl( "CheckBox", { Label = "#motion_blur_pp.enable", Command = "pp_motionblur" } )
		
		local params = { Options = {}, CVars = {}, MenuButton = "1", Folder = "motionblur" }
		params.Options[ "#preset.default" ] = { pp_motionblur_addalpha = "0.2", pp_motionblur_delay = "0.05", pp_motionblur_drawalpha = "0.99" }
		params.CVars = table.GetKeys( params.Options[ "#preset.default" ] )
		CPanel:AddControl( "ComboBox", params )
		
		CPanel:AddControl( "Slider", { Label = "#motion_blur_pp.add_alpha", Command = "pp_motionblur_addalpha", Type = "Float", Min = "0", Max = "1" } )
		CPanel:AddControl( "Slider", { Label = "#motion_blur_pp.draw_alpha", Command = "pp_motionblur_drawalpha", Type = "Float", Min = "0", Max = "1" } )
		CPanel:AddControl( "Slider", { Label = "#motion_blur_pp.delay", Command = "pp_motionblur_delay", Type = "Float", Min = "0", Max = "1" } )

	end

} )
