#pragma parameter K "Blurring Param" 0.8 0.0 1.0 0.01
#ifdef PARAMETER_UNIFORM
uniform float K;
#else
#define K  0.8
#endif
// END PARAMETERS //

/* COMPATIBILITY
   - HLSL compilers
   - Cg   compilers
*/

/*
   Hyllian's biquad Shader
   
   Copyright (C) 2011-2015 Hyllian/Jararaca - sergiogdb@gmail.com

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; either version 2
   of the License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/


// Calculates the distance between two points
float d(float2 pt1, float2 pt2)
{
  float2 v = pt2 - pt1;
  return sqrt(dot(v,v));
}


     
    struct input
    {
        float2 video_size;
        float2 texture_size;
        float2 output_size;
            float  frame_count;
            float  frame_direction;
        float frame_rotation;
    };
     
     
    struct out_vertex {
        float4 position : POSITION;
        float4 color    : COLOR;
        float2 texCoord : TEXCOORD0;
    };
     
    /*    VERTEX_SHADER    */
    out_vertex main_vertex
    (
        float4 position    : POSITION,
        float4 color    : COLOR,
        float2 texCoord1   : TEXCOORD0,
     
           uniform float4x4 modelViewProj,
        uniform input IN
    )
    {

	// This line fix a bug in ATI cards.
	float2 tex = texCoord1;

        out_vertex OUT = {
            mul(modelViewProj, position),
            color,
            tex
        };
     
        return OUT;
    }
     
    float3 resampler(float3 x)
    {
      float3 res;

      res = (x<=float3(0.5, 0.5, 0.5)) ?  (-2*K*x*x + 0.5*(K+1))  :  ((x<=float3(1.5, 1.5, 1.5))  ?  (K*x*x + (-2*K - 0.5)*x + 0.75*(K+1))  :  float3(0.0, 0.0, 0.0));

      return res;
    }
     
    float4 main_fragment(in out_vertex VAR, uniform sampler2D s_p : TEXUNIT0, uniform input IN) : COLOR
    {
      float3 color;
      float3x3 weights;

      float2 dx = float2(1.0, 0.0);
      float2 dy = float2(0.0, 1.0);

      float2 pc = VAR.texCoord*IN.texture_size;

      float2 tc = (floor(pc)+float2(0.5,0.5));
     
      weights[0] = resampler(float3(d(pc, tc    -dx    -dy), d(pc, tc           -dy), d(pc, tc    +dx    -dy)));
      weights[1] = resampler(float3(d(pc, tc    -dx       ), d(pc, tc              ), d(pc, tc    +dx       )));
      weights[2] = resampler(float3(d(pc, tc    -dx    +dy), d(pc, tc           +dy), d(pc, tc    +dx    +dy)));

      dx = dx/IN.texture_size;
      dy = dy/IN.texture_size;
      tc = tc/IN.texture_size;
     
     // reading the texels
     
      float3 c00 = tex2D(s_p, tc    -dx    -dy).xyz;
      float3 c10 = tex2D(s_p, tc           -dy).xyz;
      float3 c20 = tex2D(s_p, tc    +dx    -dy).xyz;
      float3 c01 = tex2D(s_p, tc    -dx       ).xyz;
      float3 c11 = tex2D(s_p, tc              ).xyz;
      float3 c21 = tex2D(s_p, tc    +dx       ).xyz;
      float3 c02 = tex2D(s_p, tc    -dx    +dy).xyz;
      float3 c12 = tex2D(s_p, tc           +dy).xyz;
      float3 c22 = tex2D(s_p, tc    +dx    +dy).xyz;

      color = mul(weights[0], float3x3(c00, c10, c20));
      color+= mul(weights[1], float3x3(c01, c11, c21));
      color+= mul(weights[2], float3x3(c02, c12, c22));
      color = color/(dot(mul(weights, float3(1)), 1));

      // final sum and weight normalization
      return float4(color, 1);
    }

