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

Shader "Quantum/Colorful"{
	Properties{
	_MainTex ("Texture", 2D) = "white" {}
	_Seed ("RNG Seed", Range(0,3.1416)) = 0
	}

	CGINCLUDE
	float _Seed;

	float random (in float3 st) {
		return frac(sin(dot(st,float3(12.9898,78.233,54.5913)))*(43758.5453 + _Seed));
	}

	float noise (in float3 _st) {
		float3 i = floor(_st);
		float3 f = frac(_st);

		// Four corners in 2D of a tile
		float v000 = random(i);
		float v100 = random(i + float3(1., 0., 0.));
		float v010 = random(i + float3(0., 1., 0.));
		float v110 = random(i + float3(1., 1., 0.));
		float v001 = random(i + float3(0., 0., 1.));
		float v101 = random(i + float3(1., 0., 1.));
		float v011 = random(i + float3(0., 1., 1.));
		float v111 = random(i + float3(1., 1., 1.));

		float3 u = f * f * (3.0 - 2.0 * f);

		float t1 = lerp(v000, v100, u.x) + (v010 - v000)* u.y * (1.0 - u.x) + (v110 - v100) * u.x * u.y;
		float t2 = lerp(v001, v101, u.x) + (v011 - v001)* u.y * (1.0 - u.x) + (v111 - v101) * u.x * u.y;
		return lerp(t1, t2, u.z);
	}

	#define NUM_OCTAVES 5

	float fbm ( in float3 _st) {
		float v = 0.0;
		float a = 0.5;
		float2 shift = float2(100.0, 100.0);
		// Rotate to reduce axial bias
		float2x2 rot = float2x2(cos(0.5), sin(0.5),
						-sin(0.5), cos(0.50));
		for (int i = 0; i < NUM_OCTAVES; ++i) {
			v += a * noise(_st);
			_st.xy = mul(rot,_st.xy) * 2.0 + shift;
			a *= 0.5;
		}
		return v;
	}
	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;
			};

			sampler2D _MainTex;

			v2f vertexFunction(appdata IN){
				v2f OUT;
				OUT.position = UnityObjectToClipPos(IN.vertex);
				OUT.uv = IN.uv;
				return OUT;
			}

			fixed4 fragmentFunction(v2f IN) : SV_Target{
				float3 col = float3(0,0,0);
				float4 tint = tex2D(_MainTex, IN.uv);
				col += fbm(float3(IN.uv.xy*50.0,_Time.y))*float3(tint.r, 0.0, 0.0);
				col += fbm(float3(IN.uv.xy*50.0,_Time.y+10.))*float3(0.0, tint.g, 0.0);
				col += fbm(float3(IN.uv.xy*50.0,_Time.y+30.))*float3(0.0, 0.0, tint.b);
//				col = round(col*10)/10;
				return float4(col,1);
			}
			ENDCG
		}
	}
}
