Shader "ubu/processing/pix_resample"
{
   Properties
   {
      [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
      _Density ( "Density", Vector ) = (1,1,0,0)
      _src_rect ( "src rect", Vector ) = (256,256,1000,1000)
   }
   SubShader
   {
      // No culling or depth
      Cull Off ZWrite Off ZTest Always

      Pass
      {
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag

         #include "UnityCG.cginc"

         struct appdata
         {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
         };

         struct v2f
         {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
         };

         v2f vert (appdata v)
         {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = v.uv;
            return o;
         }

         sampler2D _MainTex;
         half4 _MainTex_TexelSize;
         float4 _src_rect;
         float2 _Density;

         fixed4 frag (v2f i) : SV_Target
         {
            float2 dst_co = floor(i.uv * _src_rect.xy);
            float2 cell_size = _src_rect.zw / _src_rect.xy;
            float2 cell_origin = dst_co * cell_size;
            float2 actual_size = _MainTex_TexelSize.zw;

            float4 avg = float4(0,0,0,0);
            float t = 0.0;
            for( int y=0; y<_Density.y; y ++ )
            {
               for( int x=0; x<_Density.x; x ++ )
               {
                  float2 offset = float2( float(x), float(y) ) / _Density.xy;
                  float2 co = cell_origin + offset*cell_size;
                  avg += tex2Dgrad( _MainTex, co / actual_size, 0.0, 0.0 );
                  t += 1.0;
               }
            }
            return avg / t;
         }
         ENDCG
      }
   }
}
