#T#PoiTruchetProperties
//ifex _EnableTruchet!=1
[HideInInspector] m_start_truchet ("Truchet--{reference_property: _EnableTruchet}", Float) = 0
[HideInInspector][ThryToggle(POI_TRUCHET)] _EnableTruchet ("Enable Truchet", Float) = 0
[ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7)] _TruchetUV ("UV", Int) = 0
[ThryWideEnum(Replace, 0, Multiply, 2, Screen, 6, Linear Dodge(Add), 8, Overlay, 9, Mixed, 20)]_TruchetBlendType ("Blending", Range(0, 1)) = 0
[VectorLabel(PanX, PanY, OffX, OffY)]_TruchetPanOffset ("Pan & Offset", Vector) = (0, 0, 0, 0)
_TruchetDensity ("Density", Float) = 10
_TruchetColor ("Color--{reference_property:_TruchetColorThemeIndex}", Color) = (1, 1, 1, 1)
[HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _TruchetColorThemeIndex ("", Int) = 0
[sRGBWarning(true)]_TruchetTex ("TruchetTex--{reference_properties:[_TruchetTexPan]}", 2D) = "white" { }
[HideInInspector][Vector2]_TruchetTexPan ("Panning", Vector) = (0, 0, 0, 0)

[sRGBWarning]_TruchetMask ("Truchet Mask--{reference_properties:[_TruchetMaskPan, _TruchetMaskUV, _TruchetMaskChannel, _TruchetMaskInvert, _TruchetMaskGlobalMask, _TruchetMaskGlobalMaskBlendType]}", 2D) = "white" { }
[HideInInspector][Vector2]_TruchetMaskPan ("Panning", Vector) = (0, 0, 0, 0)
[HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7)] _TruchetMaskUV ("UV", Int) = 0
[HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3)]_TruchetMaskChannel ("Channel", Float) = 0
[HideInInspector][ToggleUI]_TruchetMaskInvert ("Invert", Float) = 0
[HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _TruchetMaskGlobalMask ("Global Mask--{reference_property:_TruchetMaskGlobalMaskBlendType}", Int) = 0
[HideInInspector][ThryWideEnum(Add, 0, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6)]_TruchetMaskGlobalMaskBlendType ("Blending", Range(0, 1)) = 2

_TruchetEmissionStrength ("Emission Strength", Range(0, 20)) = 0
_TruchetThiccness ("Thiccness", Range(0, .5)) = .1
_TruchetEdgeSharpness ("Edge Sharpness", Range(0, 1)) = 1
_TruchetAlpha ("Alpha", Range(0, 1)) = 1

[HideInInspector] m_start_TruchetudioLink ("Audio Link ♫--{ condition_showS:_EnableAudioLink==1}", Float) = 0
[ToggleUI]_TruchetHideWhenNoAL ("Hide When No AL", Float) = 0
// AL Emission
[ThryToggleUI(true)]_TruchetALEmissionToggle ("AL Emission", Float) = 0
[Enum(Bass, 0, Low Mid, 1, High Mid, 2, Treble, 3)] _TruchetALEmissionBand ("Emission Band--{condition_showS:(_TruchetALEmissionToggle==1)}", Int) = 0
[VectorLabel(Min, Max)]_TruchetALEmission ("Emission Add--{condition_showS:(_TruchetALEmissionToggle==1)}", Vector) = (0, 0, 0, 0)
// AL Alpha
[ThryToggleUI(true)]_TruchetALAlphaToggle ("AL Alpha", Float) = 0
[Enum(Bass, 0, Low Mid, 1, High Mid, 2, Treble, 3)] _TruchetALAlphaBand ("Alpha Band--{condition_showS:(_TruchetALAlphaToggle==1)}", Int) = 0
[VectorLabel(Min, Max)]_TruchetALAlpha ("Alpha Multiply--{condition_showS:(_TruchetALAlphaToggle==1)}", Vector) = (0, 0, 0, 0)
// Chrono Pan
[ThryToggleUI(true)]_TruchetChronoPanToggle ("Chrono Pan", Float) = 0
[Enum(Bass, 0, Low Mid, 1, High Mid, 2, Treble, 3)] _TruchetChronoPanBand ("Band--{condition_showS:(_TruchetChronoPanToggle==1)}", Int) = 0
[ThryWideEnum(Motion increases as intensity of band increases, 0, Above but Smooth, 1, Motion moves back and forth as a function of intensity, 2, Above but Smoooth, 3, Fixed speed increase when the band is dark Stationary when light, 4, Above but Smooooth, 5, Fixed speed increase when the band is dark Fixed speed decrease when light, 6, Above but Smoooooth, 7)]_TruchetChronoPanType ("Chrono Motion Type--{condition_showS:(_TruchetChronoPanToggle==1)}", Int) = 0
[Vector2]_TruchetChronoPanSpeed ("Pan Speed--{condition_showS:(_TruchetChronoPanToggle==1)}", Vector) = (0, 0, 0, 0)

[HideInInspector] m_end_TruchetudioLink ("Audio Link", Float) = 0
[HideInInspector] m_end_truchet ("", Float) = 0

//endex
#T#PoiTruchetKeywords
//ifex _EnableTruchet!=1
#pragma shader_feature_local POI_TRUCHET
//endex
#T#PoiTruchetVariables
//ifex _EnableTruchet!=1
#ifdef POI_TRUCHET

	float _TruchetUV;
	float _TruchetBlendType;
	float _TruchetDensity;
	float _TruchetThiccness;
	float4 _TruchetColor;
	float _TruchetColorThemeIndex;
	#if defined(PROP_TRUCHETTEX) || !defined(OPTIMIZER_ENABLED)
		Texture2D _TruchetTex;
	#endif
	float4 _TruchetTex_ST;
	float4 _TruchetTexPan;
	float4 _TruchetPanOffset;
	float _TruchetAlpha;
	float _TruchetEdgeSharpness;
	float _TruchetEmissionStrength;
	float _TruchetHideWhenNoAL;

	#if defined(PROP_TRUCHETMASK) || !defined(OPTIMIZER_ENABLED)
		Texture2D _TruchetMask;
	#endif
	float4 _TruchetMask_ST;
	float4 _TruchetMaskPan;
	float _TruchetMaskUV;
	float _TruchetMaskChannel;
	float _TruchetMaskInvert;
	float _TruchetMaskGlobalMask;
	float _TruchetMaskGlobalMaskBlendType;

	//ifex _EnableAudioLink==0
	#ifdef POI_AUDIOLINK
		float _TruchetALEmissionToggle;
		float _TruchetALEmissionBand;
		float4 _TruchetALEmission;
		float _TruchetALAlphaToggle;
		float _TruchetALAlphaBand;
		float4 _TruchetALAlpha;
		float _TruchetChronoPanToggle;
		float _TruchetChronoPanType;
		float4 _TruchetChronoPanSpeed;
		float _TruchetChronoPanBand;
	#endif
	//endex

#endif
//endex
#T#PoiTruchetFunctions
//ifex _EnableTruchet!=1
#ifdef POI_TRUCHET
	float Hash21(float2 value)
	{
		value = frac(value * float2(923.34, 567.345));
		value += dot(value, value + 34.23);
		return frac(value.x * value.y);
	}

	void applyTruchet(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiMods poiMods)
	{
		float2 uv = poiMesh.uv[_TruchetUV] * _TruchetDensity + _TruchetPanOffset.xy * _Time.x + _TruchetPanOffset.zw;
		float2 gridUV = frac(uv) - .5;
		float2 id = floor(uv);
		float2 dx = ddx(uv);
		float2 dy = ddy(uv);

		// Random # 0-1
		float randomID = Hash21(id);

		if (randomID < .5)
		{
			gridUV.x *= -1;
		}
		float mask = 0;
		float distance = 0;
		float side = sign(gridUV.x + gridUV.y + .001);
		float checker = glsl_mod(id.x + id.y, 2.0) * 2 - 1;
		float2 pathUV = float2(0, 0);

		pathUV = gridUV - side * 0.5;
		distance = length(pathUV);
		
		mask = saturate((_TruchetThiccness - abs(distance - 0.5)) / fwidth(abs(distance - 0.5)));
		mask *= smoothstep(0, 1 - _TruchetEdgeSharpness, (_TruchetThiccness - abs(distance - 0.5)));

		#if defined(PROP_TRUCHETMASK) || !defined(OPTIMIZER_ENABLED)
			float maskTex = UNITY_SAMPLE_TEX2D_SAMPLER(_TruchetMask, _MainTex, poiUV(poiMesh.uv[_TruchetMaskUV], _TruchetMask_ST) + _Time.x * _TruchetMaskPan)[_TruchetMaskChannel];
		#else
			float maskTex = 1;
		#endif

		if (_TruchetMaskInvert)
		{
			maskTex = 1 - maskTex;
		}

		if (_TruchetMaskGlobalMask > 0)
		{
			maskTex = maskBlend(maskTex, poiMods.globalMask[_TruchetMaskGlobalMask - 1], _TruchetMaskGlobalMaskBlendType);
		}
		mask *= maskTex;

		// -pi to pi
		float angle = atan2(pathUV.x, pathUV.y);

		pathUV.x = checker * angle / 1.57;
		pathUV.y = (distance - (.5 - _TruchetThiccness)) / (2 * _TruchetThiccness);
		if (randomID < .5 ^ checker > 0)
		{
			pathUV.y = 1 - pathUV.y;
		}
		float emission = _TruchetEmissionStrength;
		float2 uvOffset = float2(0, 0);

		//ifex _EnableAudioLink==0
		#ifdef POI_AUDIOLINK
			if (poiMods.audioLinkAvailable)
			{
				if (_TruchetChronoPanToggle)
				{
					uvOffset = AudioLinkGetChronoTime(_TruchetChronoPanType, _TruchetChronoPanBand) * _TruchetChronoPanSpeed.xy;
				}
				if (_TruchetALEmissionToggle)
				{
					emission += lerp(_TruchetALEmission.x, _TruchetALEmission.y, poiMods.audioLink[_TruchetALEmissionBand]);
				}
				if (_TruchetALAlphaToggle)
				{
					mask = saturate(mask * lerp(_TruchetALAlpha.x, _TruchetALAlpha.y, poiMods.audioLink[_TruchetALAlphaBand]));
				}
			}
			
			if (!poiMods.audioLinkAvailable && _TruchetHideWhenNoAL)
			{
				mask = 0;
			}
		#endif
		//endex

		#if defined(PROP_TRUCHETTEX) || !defined(OPTIMIZER_ENABLED)
			float4 TruchetTex = POI2D_SAMPLER_PANGRAD(_TruchetTex, _MainTex, poiUV(pathUV, _TruchetTex_ST) + uvOffset, _TruchetTexPan.xy, dx, dy);
		#else
			float4 TruchetTex = 1;
		#endif
		float3 truchetColor = poiThemeColor(poiMods, _TruchetColor.rgb, _TruchetColorThemeIndex);
		poiFragData.emission += lerp(0, TruchetTex.rgb * truchetColor, min(mask, TruchetTex.a) * emission);
		poiFragData.baseColor.rgb = lerp(poiFragData.baseColor.rgb, customBlend(poiFragData.baseColor.rgb, TruchetTex.rgb * truchetColor, _TruchetBlendType), min(mask, TruchetTex.a) * _TruchetAlpha);
	}
#endif
//endex
#T#PoiTruchetFunctionCalls
//ifex _EnableTruchet!=1
#ifdef POI_TRUCHET
	applyTruchet(poiFragData, poiMesh, poiMods);
#endif
//endex
