struct outtype {float4 color : COLOR;};

uniform float4 srctexsize;

outtype blur1(float2 uv : TEXCOORD0, uniform sampler2D sampler_blur : TEX0)
{
float2 uv2 = uv.xy + srctexsize.zw*float2(1,1);

float d=.00175;

float3 val =  tex2D(sampler_blur, float2(uv.x-d, uv.y)).xyz;
val += tex2D(sampler_blur, float2(uv.x+d, uv.y)).xyz;
val += tex2D(sampler_blur, float2(uv.x, uv.y + d)).xyz;
val += tex2D(sampler_blur, float2(uv.x, uv.y - d)).xyz;

float3 val2 =  tex2D(sampler_blur, float2(uv.x-d, uv.y -d)).xyz;
val += tex2D(sampler_blur, float2(uv.x-d, uv.y +d)).xyz;
val += tex2D(sampler_blur, float2(uv.x+d, uv.y + d)).xyz;
val += tex2D(sampler_blur, float2(uv.x +d, uv.y - d)).xyz;

outtype OUT;
val *= 0.65;
val2 *= 0.35;

OUT.color.xyz = val* 0.25 + val2 * 0.25;
OUT.color.w = 1;
return OUT;
}

outtype blur2(float2 uv : TEXCOORD0, uniform sampler2D sampler_blur : TEX0)
{
float2 uv2 = uv.xy + srctexsize.zw*float2(1,0);

float d = srctexsize.z;
d=.0015;

float3 val =  tex2D(sampler_blur, float2(uv.x-d, uv.y)).xyz;
val += tex2D(sampler_blur, float2(uv.x+d, uv.y)).xyz;
val += tex2D(sampler_blur, float2(uv.x, uv.y + d)).xyz;
val += tex2D(sampler_blur, float2(uv.x, uv.y - d)).xyz;

val *= 0.25;

float t = min( min(uv.x, uv.y), 1-max(uv.x,uv.y) );
t = sqrt(t);

float minimum = 0.5;
float variance = 0.5;
float size = 50;

t = minimum + variance*saturate(t*size);
t = 1;
val.xyz *= t;

outtype OUT;
OUT.color.xyz = val;
OUT.color.w = 1;
return OUT;
}

outtype blurHoriz(float2 uv : TEXCOORD0, uniform sampler2D sampler_blur : TEX0)
{

	 // LONG HORIZ. PASS 1:
	    const float w[8] = { 4.0, 3.8, 3.5, 2.9, 1.9, 1.2, 0.7, 0.3 };
	    const float w1 = w[0] + w[1];
	    const float w2 = w[2] + w[3];
	    const float w3 = w[4] + w[5];
	    const float w4 = w[6] + w[7];
	    const float d1 = 0 + 2*w[1]/w1;
	    const float d2 = 2 + 2*w[3]/w2;
	    const float d3 = 4 + 2*w[5]/w3;
	    const float d4 = 6 + 2*w[7]/w4;
	    const float w_div = 0.5/(w1+w2+w3+w4);

float  fscale = 1;
float  fbias = 0;


	    // note: if you just take one sample at exactly uv.xy, you get an avg of 4 pixels.
	    //float2 uv2 = uv.xy;// + srctexsize.zw*float2(0.5,0.5);
	    float2 uv2 = uv.xy + srctexsize.zw*float2(1,1);     // + moves blur UP, LEFT by 1-pixel increments

	    float3 blur =
	            ( tex2D( sampler_blur, uv2 + float2( d1*srctexsize.z,0) ).xyz
	            + tex2D( sampler_blur, uv2 + float2(-d1*srctexsize.z,0) ).xyz)*w1 +
	            ( tex2D( sampler_blur, uv2 + float2( d2*srctexsize.z,0) ).xyz
	            + tex2D( sampler_blur, uv2 + float2(-d2*srctexsize.z,0) ).xyz)*w2 +
	            ( tex2D( sampler_blur, uv2 + float2( d3*srctexsize.z,0) ).xyz
	            + tex2D( sampler_blur, uv2 + float2(-d3*srctexsize.z,0) ).xyz)*w3 +
	            ( tex2D( sampler_blur, uv2 + float2( d4*srctexsize.z,0) ).xyz
	            + tex2D( sampler_blur, uv2 + float2(-d4*srctexsize.z,0) ).xyz)*w4
	            ;
	    blur.xyz *= w_div;

	    blur.xyz = blur.xyz*fscale + fbias;

	    outtype OUT;
	    OUT.color.xyz = blur;
	    OUT.color.w   = 1;

return OUT;
}

outtype blurVert(float2 uv : TEXCOORD0, uniform sampler2D sampler_blur : TEX0)
{
	 //SHORT VERTICAL PASS 2:


	const float w[8] = { 4.0, 3.8, 3.5, 2.9, 1.9, 1.2, 0.7, 0.3 };

	 const float w1 = w[0]+w[1] + w[2]+w[3];
		    const float w2 = w[4]+w[5] + w[6]+w[7];
		    const float d1 = 0 + 2*((w[2]+w[3])/w1);
		    const float d2 = 2 + 2*((w[6]+w[7])/w2);
		  const float w_div = 1.0/((w1+w2)*2);



	    // note: if you just take one sample at exactly uv.xy, you get an avg of 4 pixels.
	    //float2 uv2 = uv.xy;// + srctexsize.zw*float2(-0.5,-0.5);
	    float2 uv2 = uv.xy + srctexsize.zw*float2(1,0);     // + moves blur UP, LEFT by TWO-pixel increments! (since texture is 1/2 the size of blur1_ps)

	    float3 blur =
	            ( tex2D( sampler_blur, uv2 + float2(0, d1*srctexsize.w) ).xyz
	            + tex2D( sampler_blur, uv2 + float2(0,-d1*srctexsize.w) ).xyz)*w1 +
	            ( tex2D( sampler_blur, uv2 + float2(0, d2*srctexsize.w) ).xyz
	            + tex2D( sampler_blur, uv2 + float2(0,-d2*srctexsize.w) ).xyz)*w2
	            ;
	    blur.xyz *= w_div;

	    // tone it down at the edges:  (only happens on 1st X pass!)
	    float t = min( min(uv.x, uv.y), 1-max(uv.x,uv.y) );

	    float minimum = 0.5;
	    float variance = 0.5;
	    float size = 50;


	    blur.xyz *= t;

	    t = sqrt(t);
	    t = minimum + variance*saturate(t*size);
	    t=1;
	    blur.xyz *= t;

outtype OUT;
OUT.color.xyz = blur;
OUT.color.w = 1;
return OUT;
}
