precision mediump float;

varying vec2 vTexCoord;

uniform sampler2D u_texture;

uniform vec2 PixelSize;
uniform float Iteration;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Developed by Masaki Kawase, Bunkasha Games
// Used in DOUBLE-S.T.E.A.L. (aka Wreckless)
// From his GDC2003 Presentation: Frame Buffer Postprocessing Effects in  DOUBLE-S.T.E.A.L (Wreckless)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
vec3 KawaseBlurFilter( sampler2D tex, vec2 texCoord, float iteration )
{
    vec2 halfPixelSize = PixelSize / 2.0;
    vec2 dUV = ( PixelSize * vec2( iteration, iteration ) ) + halfPixelSize.xy;

    // Sample top left pixel
    vec2 texCoordSample;
    texCoordSample.x = texCoord.x - dUV.x;
    texCoordSample.y = texCoord.y + dUV.y;
    
    vec3 cOut = texture2D( tex, texCoordSample ).xyz;

    // Sample top right pixel
    texCoordSample.x = texCoord.x + dUV.x;
    texCoordSample.y = texCoord.y + dUV.y;

    cOut += texture2D( tex, texCoordSample ).xyz;

    // Sample bottom right pixel
    texCoordSample.x = texCoord.x + dUV.x;
    texCoordSample.y = texCoord.y - dUV.y;

    cOut += texture2D( tex, texCoordSample ).xyz;

    // Sample bottom left pixel
    texCoordSample.x = texCoord.x - dUV.x;
    texCoordSample.y = texCoord.y - dUV.y;

    cOut += texture2D( tex, texCoordSample ).xyz;

    // Average 
    cOut *= 0.25;
    
    return cOut;
}

void main()
{
  gl_FragColor.xyz = KawaseBlurFilter( u_texture, vTexCoord.xy, Iteration );

    // // double-Kawase is also an option, but loses some quality
    // FragColor.xyz += KawaseBlurFilter( u_texture, vTexCoord.xy, Iteration*2.0 + 1.0 );
    // FragColor.xyz *= 0.5;

  gl_FragColor.a = 1.0;
}
