﻿// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Quantum/MovingGems"{
	Properties{
		_Color1 ("Color1", Color) = (0, 0, 0, 1)
		_Color2 ("Color2", Color) = (1, 1, 1, 1)
		_Size ("Size", Range(0,100.0)) = 25.
		_Speed ("Speed", Range(0,10.0)) = 0.1
		_Seed ("RNG Seed", Range(0,100000.0)) = 43758.5453
	}

	CGINCLUDE
	float4 _Color1;
	float4 _Color2;
	float _Seed;
	float _Size;
	float _Speed;

	float2 noise_2d(float3 p) {
		p.z += frac(sin(dot(floor(p).xy,float2(127.1, 311.7)))*(43758.5453 + _Seed));
		float f = frac(p.z);
		float2 u = f*f*(3.0-2.0*f);
		p.z = floor(p.z);
		float2 t1 = frac(sin(float2(dot(p,float3(127.1,311.7,413.5)),dot(p,float3(269.5,183.3,197.7))))*(43758.5453 + _Seed));
		p.z+=1.0;
		float2 t2 = frac(sin(float2(dot(p,float3(127.1,311.7,413.5)),dot(p,float3(269.5,183.3,197.7))))*(43758.5453 + _Seed));
		return float2(t1*(1.0-u) + t2*u);
	}

	float4 voronoi( in float2 x ) {
	    float2 n = floor(x);
	    float2 f = frac(x);

	    // first pass: regular voronoi
	    float2 mg, mr, mv;
	    float md = 8.0;
	    for (int j= -1; j <= 1; j++) {
	        for (int i= -1; i <= 1; i++) {
	            float2 g = float2(float(i),float(j));
				float2 o = noise_2d(float3((n + g), _Time.y*_Speed));

	            float2 r = g + o - f;
	            float d = dot(r,r);

	            if( d<md ) {
	                md = d;
	                mr = r;
	                mg = g;
	                mv = o;
	            }
	        }
	    }

	    // second pass: distance to borders
	    md = 8.0;
	    for (int j= -2; j <= 2; j++) {
	        for (int i= -2; i <= 2; i++) {
	            float2 g = mg + float2(float(i),float(j));
	            float2 o = noise_2d(float3((n + g), _Time.y*_Speed));

	            float2 r = g + o - f;

	            if ( dot(mr-r,mr-r)>0.00001 ) {
	                float temp = dot( 0.5*(mr+r), normalize(r-mr));
	                if(temp < md){
	                	md = temp;
	                    mv = o;
	                }
	            }
	        }
	    }
	    return mv.x*_Color1 + (1.-mv.x)*_Color2;
	}

	ENDCG

	SubShader{
		Pass{
			CGPROGRAM

			#pragma vertex vertexFunction
			#pragma fragment fragmentFunction

			#include "UnityCG.cginc"

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

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

			v2f vertexFunction(appdata IN){
				v2f OUT;

				OUT.position = UnityObjectToClipPos(IN.vertex);
				OUT.uv = IN.uv;

				return OUT;
			}

			fixed4 fragmentFunction(v2f IN) : SV_Target{
				return voronoi(IN.uv*_Size);
			}
			ENDCG
		}
	}
}
