﻿Shader "Toman800/Pixel/Outline/Unlit"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_Color("Color", Color) = (1, 1, 1, 1)

		[Header(Outline)]
		[Space]
		_OutlineThickness("Thickness", Range(0, .05)) = .01
		_OutlineColor("Color", Color) = (.12, .35, .29, 1)

		[Header(Pixelation)]
		[Space]
		_Pixelation("Pixelation", Float) = 60
		_PixelOffset("Pixelation Offset", Float) = 0.015
    }

    SubShader
    {

			Tags { "Queue" = "Geometry" "RenderType" = "Opaque" "VRCFallback" = "Toon" }

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			#include "UnityCG.cginc"

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

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

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float4 _Color;

			v2f vert(appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				col *= _Color;

				return col;
			}
			ENDCG
		}

		Pass
		{

			Cull Front

			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag

			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};

			struct v2f
			{
				float4 position : SV_POSITION;
			};

			float _OutlineThickness;

			v2f vert(appdata v)
			{
				v2f o;

				float3 normal = normalize(v.normal);
				float3 offset = normal * _OutlineThickness;
				float3 position = v.vertex + offset;

				o.position = UnityObjectToClipPos(position);

				return o;
			}

			float4 _OutlineColor;

			fixed4 frag(v2f i) : SV_Target
			{
				return _OutlineColor;
			}
			ENDCG
		}

		GrabPass{ "_Input" }
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float4 uv : TEXCOORD0;
				float distance : TEXCOORD1;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = ComputeGrabScreenPos(o.vertex);

				float4 objectOrigin = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0));
				o.distance = distance(objectOrigin, _WorldSpaceCameraPos);

                return o;
            }

            sampler2D _Input;
			float _Pixelation;
			float _PixelOffset;

			fixed4 frag(v2f i) : SV_Target
			{
				//float pixelator = _Pixelation;
				float pixelator = lerp(100*_Pixelation, _Pixelation, (1-(i.distance / 50)) + _PixelOffset);
				float2 uv = i.uv.xy / i.uv.w;
				uv *= pixelator;
				uv = round(uv);
				uv /= pixelator;
				float4 col = tex2D(_Input, uv);

                return col;
				//return i.distance/50;
            }
            ENDCG
        }
    }
}
