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

// Rainbow shader with lots of adjustable properties!

Shader "_Shaders/Rainbow" {
	Properties{
		_Saturation("Saturation", Range(0.0, 1.0)) = 0.8
		_Luminosity("Luminosity", Range(0.0, 1.0)) = 0.5
		_MainTex("Albedo (RGB)", 2D) = "white" {}
		_Spread("Spread", Range(0.5, 10.0)) = 3.8
		_Speed("Speed", Range(-10.0, 10.0)) = 2.4
		_TimeOffset("TimeOffset", Range(0.0, 6.28318531)) = 0.0
	}
		SubShader{
		Pass{
		CGPROGRAM

#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "ShaderTools.cginc"

		fixed _Saturation;
	fixed _Luminosity;
	half _Spread;
	half _Speed;
	half _TimeOffset;
	sampler2D _MainTex;

	struct vertexInput {
		float4 vertex : POSITION;
		float4 texcoord0 : TEXCOORD0;
	};

	struct fragmentInput {
		float4 position : SV_POSITION;
		float4 texcoord0 : TEXCOORD0;
		fixed3 localPosition : TEXCOORD1;
	};

	fragmentInput vert(vertexInput i) {
		fragmentInput o;
		o.position = UnityObjectToClipPos(i.vertex);
		o.texcoord0 = i.texcoord0;
		o.localPosition = i.vertex.xyz; +fixed3(0.5, 0.5, 0.5);
		return o;
	}

	fixed4 frag(fragmentInput i) : SV_TARGET{
		fixed2 lPos = i.localPosition / _Spread;
		half time = _Time.y * _Speed / _Spread;
		half timeWithOffset = time + _TimeOffset;
		fixed sine = sin(timeWithOffset);
		fixed cosine = cos(timeWithOffset);
		//fixed hue = (lPos.x * sine + lPos.y * cosine) / 2.0;
		//fixed hue = (lPos.x * 0 - lPos.y) / 2.0;
		fixed hue = (-lPos.y) / 2.0;
		hue += time;
		while (hue < 0.0) hue += 1.0;
		while (hue > 1.0) hue -= 1.0;
		fixed4 hsl = tex2D(_MainTex, i.texcoord0) * fixed4(hue, _Saturation, _Luminosity, 1.0);
		return HSLtoRGB(hsl);
	}

		ENDCG
	}
	}
		FallBack "Diffuse"
}