	Shader "Custom/FlipCard"
	{
	Properties
	{
	_FrontTexture("Front Texture", 2D) = "white" {}
	_BackTexture("Back Texture", 2D) = "white" {}
	_FlipProgress("Flip Progress", Range(0, 1)) = 0
	_FlipSpeed("Flip Speed", Range(0, 10)) = 5
	}

	SubShader
	{
		Tags { "RenderType" = "Opaque" }
		Cull Off
		Pass
		{
			
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#define pi 3.1415926
			struct appdata
			{
			float4 vertex : POSITION;
			float2 uv : TEXCOORD0;
			};

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

			sampler2D _FrontTexture;
			sampler2D _BackTexture;
			float _FlipProgress;
			float _FlipSpeed;

			float4 flip_base1(float4 vertex, float2 uv)
			{
				float scale = 1 / 0.70710679065997;
				float4 temp = vertex;
				float theta = (_FlipProgress+0.5) * 0.5 * pi;
				//temp.x = vertex.x * cos(clamp(theta, 0, pi));
				//temp.x = vertex.x * clamp(abs(uv.y <= 0.5 ? cos(clamp(theta, 0, pi)) : sin(clamp(theta, 0, pi))), 0.25, 1);

				temp.x = vertex.x * clamp(abs(uv.y <= 0.5 ? cos(theta) : sin(theta)), 0.5, 1);
				//temp.y = vertex.y * (uv.y <= 0.5 ? cos(clamp(theta, 0, pi)) : sin(clamp(theta, 0, pi)));
				temp.y = vertex.y * cos(clamp(theta, 0, pi));

				temp.x *= scale;
				temp.y *= scale;

				vertex = temp;
				return vertex;
			}

			float4 flip_base(float4 vertex, float2 uv)
			{

				float2 pos;
				float2 center = float2(0,0);
				float2 dt = (vertex.xy - center.xy) * 100;
				float len = sqrt(dot(dt, dt));
				//ݾ ת
				float theta = -len * _FlipProgress * pi;
				// ת
				float2x2 rot =
				{
					cos(theta), sin(theta),
					-sin(theta) ,cos(theta)
				};
				dt = mul(rot, dt);
				pos = dt + center;
				vertex.xy = pos;

				return vertex;
			}

			v2f vert(appdata v)
			{
				v2f o;
				
				o.uv = v.uv;
				//o.uv.y = (o.uv.y - 0.5) * 2;
				//float flipAngle = _FlipProgress * 180;
				//float sinFlipAngle = sin(flipAngle * 3.1415926 / 180);
				//float flipAxis = step(0.5, _FlipProgress) * 2 - 1;
				//float2 flipVector = float2(flipAxis * sinFlipAngle, cos(flipAngle * 3.1415926 / 180));
				//o.vertex.xy += flipVector * abs(o.uv.y) * _FlipSpeed;
				
				float4 vertex = flip_base(v.vertex, o.uv);
				//float4 vertex = v.vertex;
				o.vertex = UnityObjectToClipPos(vertex);

				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				fixed4 frontColor = tex2D(_FrontTexture, i.uv);
				//fixed4 backColor = tex2D(_BackTexture, i.uv);
				return frontColor;
			}
		ENDCG
		}
	}
	FallBack "Diffuse"
}
