


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", false, false )
local pp_motionblur_drawalpha	= CreateClientConVar( "pp_motionblur_drawalpha", "0.99", false, false )
local pp_motionblur_delay		= CreateClientConVar( "pp_motionblur_delay", "0.0", false, 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:SetMaterialFloat( "$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:SetMaterialFloat( "$alpha", drawalpha )
	mat_MotionBlur:SetMaterialTexture( "$basetexture", tex_MotionBlur )
	
	if ( NextDraw < CurTime() && addalpha > 0 ) then

		NextDraw = CurTime() + delay

		mat_Screen:SetMaterialFloat( "$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 )