Shader "Hidden/ScreenPosInputsNode"
{
	SubShader
	{
		CGINCLUDE
			#include "UnityCG.cginc"
			#include "Preview.cginc"
			#pragma vertex vert_img
			#pragma fragment frag

			uniform float4 _ASEPreviewSize;

			inline float4 CalculateScreenPos( float2 uv, bool norm = true, float z = 0.01 )
			{
				float2 xy = 2 * uv - 1;
				float3 vertexPos = float3( xy, z );
				float4x4 P = float4x4( 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); //UNITY_MATRIX_P
				float4x4 V = UNITY_MATRIX_V; //float4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1); //UNITY_MATRIX_V
				float4x4 M = unity_ObjectToWorld; //float4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1); //unity_ObjectToWorld
				float4x4 VPmatrix = mul( P, V );
				float4 clipPos = mul( VPmatrix, mul( M, float4( vertexPos, 1.0 ) ) ); //same as object to clip pos
				float4 screenPos = ComputeScreenPos( clipPos );
				screenPos = norm ? screenPos / screenPos.w : screenPos;
				return screenPos;
			}
		ENDCG

		// Normalized
		Pass
		{
			CGPROGRAM
				float4 frag( v2f_img i ) : SV_Target
				{
					return CalculateScreenPos( i.uv );
				}
			ENDCG
		}

		// Raw
		Pass
		{
			CGPROGRAM
				float4 frag( v2f_img i ) : SV_Target
				{
					return CalculateScreenPos( i.uv, false, 0.99 );
				}
			ENDCG
		}

		// Center
		Pass
		{
			CGPROGRAM
				float4 frag( v2f_img i ) : SV_Target
				{
					float4 screenPos = CalculateScreenPos( i.uv );
					return float4( screenPos.xy * 2 - 1, 0, 0 );
				}
			ENDCG
		}

		// Tiled
		Pass
		{
			CGPROGRAM
				float4 frag( v2f_img i ) : SV_Target
				{
					float4 screenPos = CalculateScreenPos( i.uv );
					return frac( float4( ( screenPos.x * 2 - 1 ) * _ASEPreviewSize.x / _ASEPreviewSize.y, screenPos.y * 2 - 1, 0, 0 ) );
				}
			ENDCG
		}

		// Screen
		Pass
		{
			CGPROGRAM
				float4 frag( v2f_img i ) : SV_Target
				{
					float4 screenPos = CalculateScreenPos( i.uv );
					screenPos.xy *= _ASEPreviewSize.xy;
				#if UNITY_UV_STARTS_AT_TOP
					screenPos.xy = float2( screenPos.x, ( _ProjectionParams.x < 0 ) ? _ASEPreviewSize.y - screenPos.y : screenPos.y );
				#else
					screenPos.xy = float2( screenPos.x, ( _ProjectionParams.x > 0 ) ? _ASEPreviewSize.y - screenPos.y : screenPos.y );
				#endif
					return float4( screenPos.xy, 0, 0 );
				}
			ENDCG
		}
	}
}