Shader "Hidden/Amplify Texture/FillTable" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "" {}
	}

	CGINCLUDE
		#pragma fragmentoption ARB_precision_hint_fastest
		#pragma target 3.0
		#pragma glsl
		#include "UnityCG.cginc"

		float4 _VTTableAddrRange;		// xyz: range, w: 1

		sampler2D _MainTex;
		float4 _offsets;				// xy: halfPixel, z: table_mip

		struct appdata_fill
		{
			float4 vertex : POSITION;
			float3 value : TEXCOORD0;
		};

		struct v2f
		{
			float4 pos : POSITION;
			float4 value : TEXCOORD0;
			float4 uv : TEXCOORD1;
		};

		v2f vert( appdata_fill v )
		{
		#if SHADER_API_D3D9
			float2 texelOffset = _offsets.xy;
		#else
			float2 texelOffset = 0;
		#endif

			float2 pos = v.vertex.xy + texelOffset;

			v2f o;
			o.pos = float4( pos.xy * 2 - 1, 0, 1 );
			o.value = float4( v.value.xyz, v.vertex.z );
			o.uv = float4( v.vertex.xy, 0, _offsets.z );
		#if UNITY_UV_STARTS_AT_TOP
			o.uv.y = 1 - o.uv.y;
		#endif
			return o;
		}
	ENDCG

	SubShader {

		// ADD
		Pass {
			ZTest Always ZWrite Off Cull Off Blend Off ColorMask RGB Fog { Mode off }
			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag

				fixed4 frag( v2f i ) : COLOR0
				{
					if ( i.value.w > floor( tex2Dlod( _MainTex, i.uv ).b * _VTTableAddrRange.z + 0.5 ) )
						discard;

					return  i.value / _VTTableAddrRange;
				}
			ENDCG
		}

		// REMOVE
		Pass {
			ZTest Always ZWrite Off Cull Off Blend Off ColorMask RGB Fog { Mode off }
			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag

				fixed4 frag( v2f i ) : COLOR0
				{
					if ( i.value.w != floor( tex2Dlod( _MainTex, i.uv ).b * _VTTableAddrRange.z + 0.5 ) )
						discard;

					return i.value.xyzz / _VTTableAddrRange;
				}
			ENDCG
		}

		// CLONE
		Pass {
			ZTest Always ZWrite Off Cull Off Blend Off ColorMask RGB Fog { Mode off }
			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag

				fixed4 frag( v2f i ) : COLOR0
				{
					return tex2Dlod( _MainTex, i.uv );
				}
			ENDCG
		}
	}

	Fallback off
}
