﻿Shader "Unlit/pointer"
{
	Properties
	{
		_Color ("Color", Color) = (1,1,1)
		_Width ("Width", Float) = 0.002
		_Owner ("Owner", 2D) = "transparent" {}
	}
	SubShader
	{
		Tags { "RenderType"="Transparent" "Queue"="Transparent" }
		LOD 100
		Cull Off
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma geometry geom
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
			};

			struct v2g
			{
				float4 vertex : TEXCOORD0;
			};

			struct g2f
			{
				float4 vertex : SV_POSITION;
				float u : TEXCOORD1;
			};

			float4 _Color;
			float _Width;
			sampler2D _Owner;
			
			v2g vert (appdata v)
			{
				v2g o;
				o.vertex = v.vertex;
				return o;
			}

			[maxvertexcount(4)]
			void geom (triangle v2g IN[3], inout TriangleStream<g2f> stream) {
				float owner = tex2Dlod(_Owner, float4(0.5,0.5,0,0)).a;
				if(owner < 0.5) return;
				float4x4 P = UNITY_MATRIX_P;
				if(abs(P[1][1] / P[0][0] * 9 + 16) < 0.01) return;
				
				float4 p0 = float4(0,0,0,1);
				float4 p1 = float4(0,1,0,1);
				p0 = mul(UNITY_MATRIX_MV, p0);
				p1 = mul(UNITY_MATRIX_MV, p1);
				float3 axis = normalize((p1-p0).xyz);
				float4 d = float4(normalize(cross(axis,float3(0,0,1))),0) * _Width;
				g2f o;
				o.vertex = mul(UNITY_MATRIX_P, p0-d);
				o.u = -1;
				stream.Append(o);
				o.vertex = mul(UNITY_MATRIX_P, p0+d);
				o.u = 1;
				stream.Append(o);
				o.vertex = mul(UNITY_MATRIX_P, p1-d);
				o.u = -1;
				stream.Append(o);
				o.vertex = mul(UNITY_MATRIX_P, p1+d);
				o.u = 1;
				stream.Append(o);
				stream.RestartStrip();
			}
			
			fixed4 frag (g2f i) : SV_Target
			{
				float d = pow(1-abs(i.u),2);
				return _Color * float4(1,1,1,d);
			}
			ENDCG
		}
	}
}
