﻿Shader "VirtualMarket/Lookat"
{
	Properties
	{
		[PerRendererData] _MainTex ("Texture", 2D) = "white" {}
		_Color ("Color", Color) = (1,1,1,1)
	}
	SubShader
	{
		Tags {
			"RenderType" = "Transparent"
			"Queue" = "Transparent+500"
			"IgnoreProjector" = "True"
			"DisableBatching" = "True"
			"PreviewType" = "Plane"
			"CanUseSpriteAtlas" = "True"
		}
		
		Pass
		{
			Cull Off
			Blend SrcAlpha OneMinusSrcAlpha
			ZTest Always
			ZWrite Off
			Lighting Off
			
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile __ UNITY_UI_CLIP_RECT
            
			#include "UnityCG.cginc"

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

			struct v2f
			{
				float4 pos : SV_POSITION;
				float4 color : COLOR;
				float2 uv : TEXCOORD0;
				float4 worldPos : TEXCOORD1;
				UNITY_VERTEX_OUTPUT_STEREO
			};

			sampler2D _MainTex;
			fixed4 _Color;
			fixed4 _TextureSampleAdd;
            float4 _ClipRect;

			v2f vert (appdata v)
			{
				v2f o;
				UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                
				o.worldPos = v.vertex;

				#if defined(USING_STEREO_MATRICES)
					float3 cameraPos = (unity_StereoWorldSpaceCameraPos[0] + unity_StereoWorldSpaceCameraPos[1]) * .5;
				#else
					float3 cameraPos = _WorldSpaceCameraPos;
				#endif

				float4 objPos = mul(unity_ObjectToWorld, float4(0, 0, 0, 1));
				float3 direction = normalize(cameraPos - objPos.xyz);
				
				float4x4 billboardMatrix = 0;
				billboardMatrix._m02 = direction.x;
				billboardMatrix._m12 = direction.y;
				billboardMatrix._m22 = direction.z;
				float3 xAxis = normalize(float3(-direction.z, 0, direction.x));
				billboardMatrix._m00 = xAxis.x;
				billboardMatrix._m10 = 0;
				billboardMatrix._m20 = xAxis.z;
				float3 yAxis = normalize(cross(xAxis, direction));
				billboardMatrix._m01 = yAxis.x;
				billboardMatrix._m11 = yAxis.y;
				billboardMatrix._m21 = yAxis.z;
				
				float3 scale = float3(length(mul(unity_ObjectToWorld, float4(1, 0, 0, 0)).xyz), length(mul(unity_ObjectToWorld, float4(0, 1, 0, 0)).xyz), length(mul(unity_ObjectToWorld, float4(0, 0, 1, 0)).xyz));
				o.pos = mul(UNITY_MATRIX_VP, mul(billboardMatrix, v.vertex * float4(scale, 0)) + objPos);
				
                o.uv = v.uv;

                o.color = v.color * _Color;
				
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 c = (tex2D(_MainTex, i.uv) + _TextureSampleAdd) * i.color;
				
                #ifdef UNITY_UI_CLIP_RECT
					c.a *= UnityGet2DClipping(i.worldPos.xy, _ClipRect);
                #endif
				
				return c;
			}
			ENDCG
		}
	}
}
