
#T#PoiMainProperties
//Main-main
_Color ("Color & Alpha--{reference_property:_ColorThemeIndex}", 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)] _ColorThemeIndex ("", Int) = 0
[sRGBWarning(true)]_MainTex ("Texture--{reference_properties:[_MainTexPan, _MainTexUV, _MainPixelMode, _MainTexStochastic, _MainIgnoreTexAlpha]}", 2D) = "white" { }
[HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7)] _MainTexUV ("UV", Int) = 0
[HideInInspector][Vector2]_MainTexPan ("Panning", Vector) = (0, 0, 0, 0)
[HideInInspector][ToggleUI]_MainPixelMode ("Pixel Mode", Float) = 0
[HideInInspector][ToggleUI]_MainTexStochastic ("Stochastic Sampling", Float) = 0
[HideInInspector][ToggleUI]_MainIgnoreTexAlpha ("Ignore Alpha", Float) = 0
[Normal]_BumpMap ("Normal Map--{reference_properties:[_BumpMapPan, _BumpMapUV, _BumpScale, _BumpMapStochastic]}", 2D) = "bump" { }
[HideInInspector][Vector2]_BumpMapPan ("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)] _BumpMapUV ("UV", Int) = 0
[HideInInspector]_BumpScale ("Intensity", Range(0, 10)) = 1
[HideInInspector][ToggleUI]_BumpMapStochastic ("Stochastic Sampling", Float) = 0
[sRGBWarning]_AlphaMask ("Alpha Map--{reference_properties:[_AlphaMaskPan, _AlphaMaskUV, _AlphaMaskInvert, _MainAlphaMaskMode, _AlphaMaskBlendStrength, _AlphaMaskValue], alts:[_AlphaMap]}", 2D) = "white" { }
[HideInInspector][Vector2]_AlphaMaskPan ("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)] _AlphaMaskUV ("UV", Int) = 0
[HideInInspector][ThryWideEnum(Off, 0, Replace, 1, Multiply, 2, Add, 3, Subtract, 4)]_MainAlphaMaskMode ("Blend Mode", Int) = 2
[HideInInspector]_AlphaMaskBlendStrength ("Blend Strength", Float) = 1
[HideInInspector]_AlphaMaskValue ("Blend Offset", Float) = 0
[HideInInspector][ToggleUI]_AlphaMaskInvert ("Invert", Float) = 0
_Cutoff ("Alpha Cutoff", Range(0, 1.001)) = 0.5

//ifex _MainColorAdjustToggle==0
[HideInInspector] m_start_ColorAdjust ("Color Adjust--{reference_property:_MainColorAdjustToggle,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/color-adjust},hover:Documentation}}", Float) = 0
[HideInInspector][ThryToggle(COLOR_GRADING_HDR)] _MainColorAdjustToggle ("Adjust Colors", Float) = 0
[sRGBWarning][ThryRGBAPacker(R Hue Mask, G Brightness Mask, B Saturation Mask,A Gamma , linear, false)]_MainColorAdjustTexture ("Mask (Expand)--{reference_properties:[_MainColorAdjustTexturePan, _MainColorAdjustTextureUV]}", 2D) = "white" { }
[HideInInspector][Vector2]_MainColorAdjustTexturePan ("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)] _MainColorAdjustTextureUV ("UV", Int) = 0
_Saturation ("Saturation", Range(-1, 10)) = 0
_MainBrightness ("Brightness", Range(-1, 2)) = 0
_MainGamma ("Gamma", Range(0.01, 5)) = 1

[HideInInspector] s_start_MainHueShift ("Hue Shift--{reference_property:_MainHueShiftToggle,persistent_expand:true,default_expand:true}", Float) = 1
[HideInInspector][ThryToggleUI(true)] _MainHueShiftToggle ("<size=13><b>  Hue Shift</b></size>", Float) = 0
[ThryWideEnum(OKLab, 0, HSV, 1)] _MainHueShiftColorSpace ("Color Space", Int) = 0
[ThryWideEnum(Hue Select, 0, Hue Shift, 1)] _MainHueShiftSelectOrShift ("Select or Shift", Int) = 1
[ToggleUI]_MainHueShiftReplace ("Hue Replace?", Float) = 1
_MainHueShift ("Hue Shift", Range(0, 1)) = 0
_MainHueShiftSpeed ("Hue Shift Speed", Float) = 0

[HideInInspector] s_start_MainHueShiftAL ("Hue Shift Audio Link--{reference_property:_MainHueALCTEnabled,persistent_expand:true,default_expand:false, condition_showS:(_EnableAudioLink==1)}", Float) = 0
[HideInInspector][ThryToggleUI(true)]_MainHueALCTEnabled ("Hue Shift Audio Link", Float) = 0
[Enum(Bass, 0, Low Mid, 1, High Mid, 2, Treble, 3, Volume, 4)]_MainALHueShiftBand ("Band", 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)]_MainALHueShiftCTIndex ("Motion Type", Int) = 0
_MainHueALMotionSpeed ("Motion Speed", Float) = 1
[HideInInspector] s_end_MainHueShiftAL ("Audio Link", Float) = 0
[HideInInspector] s_end_MainHueShift ("Name Motion", Float) = 0

[HideInInspector] s_start_ColorAdjustColorGrading ("Color Grading--{reference_property:_ColorGradingToggle, persistent_expand:true}", Float) = 0
[HideInInspector][ToggleUI] _ColorGradingToggle ("Color Grading", Float) = 0
[NoScaleOffset][Gradient] _MainGradationTex ("Gradation Map", 2D) = "white" { }
_MainGradationStrength ("Gradation Strength", Range(0, 1)) = 0
[HideInInspector] s_end_ColorAdjustColorGrading ("Color Grading", Float) = 0

[HideInInspector] s_start_MainHueShiftGlobalMask ("Global Mask--{persistent_expand:true}", Float) = 0
[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)] _MainHueGlobalMask ("Hue--{reference_property:_MainHueGlobalMaskBlendType}", Int) = 0
[HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MainHueGlobalMaskBlendType ("Blending", Int) = 2
[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)] _MainSaturationGlobalMask ("Saturation--{reference_property:_MainSaturationGlobalMaskBlendType}", Int) = 0
[HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MainSaturationGlobalMaskBlendType ("Blending", Int) = 2
[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)] _MainBrightnessGlobalMask ("Brightness--{reference_property:_MainBrightnessGlobalMaskBlendType}", Int) = 0
[HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MainBrightnessGlobalMaskBlendType ("Blending", Int) = 2
[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)] _MainGammaGlobalMask ("Gamma--{reference_property:_MainGammaGlobalMaskBlendType}", Int) = 0
[HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MainGammaGlobalMaskBlendType ("Blending", Int) = 2
[HideInInspector] s_end_MainHueShiftGlobalMask ("Global Mask", Float) = 0
[HideInInspector] m_end_ColorAdjust ("Color Adjust", Float) = 0
//endex

#T#PoiMainKeywords
//ifex _MainColorAdjustToggle==0
#pragma shader_feature COLOR_GRADING_HDR
//endex

#T#PoiMainVariables
float4 _Color;
float _ColorThemeIndex;
UNITY_DECLARE_TEX2D(_MainTex);
// Depth texture handling from d4rkpl4y3r
SamplerState point_clamp_sampler;
#ifdef UNITY_STEREO_INSTANCING_ENABLED
	#define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex)
	Texture2DArray<float> _CameraDepthTexture;
#else
	#define STEREO_UV(uv) uv
	Texture2D<float> _CameraDepthTexture;
#endif

float SampleScreenDepth(float2 uv)
{
	uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x;
	return _CameraDepthTexture.SampleLevel(point_clamp_sampler, STEREO_UV(uv), 0);
}

bool DepthTextureExists()
{
	#ifdef UNITY_STEREO_INSTANCING_ENABLED
		float3 dTexDim;
		_CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z);
	#else
		float2 dTexDim;
		_CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y);
	#endif

	return dTexDim.x > 16;
}
// End Depth texture handling
float _MainPixelMode;
float4 _MainTex_ST;
float2 _MainTexPan;
float _MainTexUV;
float4 _MainTex_TexelSize;
float _MainTexStochastic;
float _MainIgnoreTexAlpha;
#if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED)
	Texture2D _BumpMap;
#endif
float4 _BumpMap_ST;
float2 _BumpMapPan;
float _BumpMapUV;
float _BumpScale;
float _BumpMapStochastic;
#if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED)
	Texture2D _AlphaMask;
#endif
float4 _AlphaMask_ST;
float2 _AlphaMaskPan;
float _AlphaMaskUV;
float _AlphaMaskInvert;
float _MainAlphaMaskMode;
float _AlphaMaskBlendStrength;
float _AlphaMaskValue;
float _Cutoff;
//ifex _MainColorAdjustToggle==0
#ifdef COLOR_GRADING_HDR
	float _MainColorAdjustToggle;
	#if defined(PROP_MAINCOLORADJUSTTEXTURE) || !defined(OPTIMIZER_ENABLED)
		Texture2D _MainColorAdjustTexture;
	#endif
	float4 _MainColorAdjustTexture_ST;
	float2 _MainColorAdjustTexturePan;
	float _MainColorAdjustTextureUV;
	float _MainHueShiftColorSpace;
	float _MainHueShiftSelectOrShift;
	float _MainHueShiftToggle;
	float _MainHueShiftReplace;
	float _MainHueShift;
	float _MainHueShiftSpeed;
	float _Saturation;
	float _MainBrightness;
	float _MainGamma;

	float _MainHueALCTEnabled;
	float _MainALHueShiftBand;
	float _MainALHueShiftCTIndex;
	float _MainHueALMotionSpeed;

	float _MainHueGlobalMask;
	float _MainHueGlobalMaskBlendType;
	float _MainSaturationGlobalMask;
	float _MainSaturationGlobalMaskBlendType;
	float _MainBrightnessGlobalMask;
	float _MainBrightnessGlobalMaskBlendType;
	float _MainGammaGlobalMask;
	float _MainGammaGlobalMaskBlendType;

	#if defined(PROP_MAINGRADATIONTEX) || !defined(OPTIMIZER_ENABLED)
		Texture2D _MainGradationTex;
	#endif
	float _ColorGradingToggle;
	float _MainGradationStrength;
#endif
//endex

SamplerState sampler_linear_clamp;
SamplerState sampler_linear_repeat;
SamplerState sampler_trilinear_repeat;

#T#PoiMainTextureSample
float2 mainUV = poiUV(poiMesh.uv[_MainTexUV].xy, _MainTex_ST);

if (_MainPixelMode)
{
	mainUV = sharpSample(_MainTex_TexelSize, mainUV);
}

float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, _MainTexPan, _MainTexStochastic);
mainTexture.a = max(mainTexture.a, _MainIgnoreTexAlpha);



#T#PoiMainImplementation
poiFragData.baseColor = mainTexture.rgb * poiThemeColor(poiMods, _Color.rgb, _ColorThemeIndex);
poiFragData.alpha = mainTexture.a * _Color.a;

//ifex _MainColorAdjustToggle==0
#ifdef COLOR_GRADING_HDR
	#if defined(PROP_MAINCOLORADJUSTTEXTURE) || !defined(OPTIMIZER_ENABLED)
		float4 hueShiftAlpha = POI2D_SAMPLER_PAN(_MainColorAdjustTexture, _MainTex, poiUV(poiMesh.uv[_MainColorAdjustTextureUV], _MainColorAdjustTexture_ST), _MainColorAdjustTexturePan);
	#else
		float4 hueShiftAlpha = 1;
	#endif

	if (_MainHueGlobalMask > 0)
	{
		hueShiftAlpha.r = maskBlend(hueShiftAlpha.r, poiMods.globalMask[_MainHueGlobalMask - 1], _MainHueGlobalMaskBlendType);
	}
	if (_MainSaturationGlobalMask > 0)
	{
		hueShiftAlpha.b = maskBlend(hueShiftAlpha.b, poiMods.globalMask[_MainSaturationGlobalMask - 1], _MainSaturationGlobalMaskBlendType);
	}
	if (_MainBrightnessGlobalMask > 0)
	{
		hueShiftAlpha.g = maskBlend(hueShiftAlpha.g, poiMods.globalMask[_MainBrightnessGlobalMask - 1], _MainBrightnessGlobalMaskBlendType);
	}
	if (_MainGammaGlobalMask > 0)
	{
		hueShiftAlpha.a = maskBlend(hueShiftAlpha.a, poiMods.globalMask[_MainGammaGlobalMask - 1], _MainGammaGlobalMaskBlendType);
	}
	
	if (_MainHueShiftToggle == 1)
	{
		float shift = _MainHueShift;
		#ifdef POI_AUDIOLINK
			//UNITY_BRANCH
			if (poiMods.audioLinkAvailable && _MainHueALCTEnabled)
			{
				shift += AudioLinkGetChronoTime(_MainALHueShiftCTIndex, _MainALHueShiftBand) * _MainHueALMotionSpeed;
			}
		#endif
		if (_MainHueShiftReplace)
		{
			poiFragData.baseColor = lerp(poiFragData.baseColor, hueShift(poiFragData.baseColor, shift + _MainHueShiftSpeed * _Time.x, _MainHueShiftColorSpace, _MainHueShiftSelectOrShift), hueShiftAlpha.r);
		}
		else
		{
			poiFragData.baseColor = hueShift(poiFragData.baseColor, frac((shift - (1 - hueShiftAlpha.r) + _MainHueShiftSpeed * _Time.x)), _MainHueShiftColorSpace, _MainHueShiftSelectOrShift);
		}
	}


	if (_MainGradationStrength && _ColorGradingToggle)
	{
		#if !defined(UNITY_COLORSPACE_GAMMA)
			float3 tempColor = OpenLitLinearToSRGB(poiFragData.baseColor);
		#else
			float3 tempColor = poiFragData.baseColor;
		#endif
		#if defined(PROP_MAINGRADATIONTEX) || !defined(OPTIMIZER_ENABLED)
			tempColor.r = POI_SAMPLE_1D_X(_MainGradationTex, sampler_linear_clamp, tempColor.r).r;
			tempColor.g = POI_SAMPLE_1D_X(_MainGradationTex, sampler_linear_clamp, tempColor.g).g;
			tempColor.b = POI_SAMPLE_1D_X(_MainGradationTex, sampler_linear_clamp, tempColor.b).b;
		#else
			tempColor = float3(1, 1, 1);
		#endif
		#if !defined(UNITY_COLORSPACE_GAMMA)
			tempColor = OpenLitSRGBToLinear(tempColor);
		#endif
		poiFragData.baseColor = lerp(poiFragData.baseColor, tempColor, _MainGradationStrength);
	}
	poiFragData.baseColor = lerp(poiFragData.baseColor, pow(abs(poiFragData.baseColor), _MainGamma), hueShiftAlpha.a);
	poiFragData.baseColor = lerp(poiFragData.baseColor, dot(poiFragData.baseColor, float3(0.3, 0.59, 0.11)), - (_Saturation) * hueShiftAlpha.b);
	poiFragData.baseColor = saturate(lerp(poiFragData.baseColor, poiFragData.baseColor * (_MainBrightness + 1), hueShiftAlpha.g));
#endif
//endex


if (_MainAlphaMaskMode)
{
	#if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED)
		float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[_AlphaMaskUV], _AlphaMask_ST), _AlphaMaskPan.xy).r;
	#else
		float alphaMask = 1;
	#endif
	alphaMask = saturate(alphaMask * _AlphaMaskBlendStrength + (_AlphaMaskInvert ? _AlphaMaskValue * - 1 : _AlphaMaskValue));
	if (_AlphaMaskInvert) alphaMask = 1 - alphaMask;
	if (_MainAlphaMaskMode == 1) poiFragData.alpha = alphaMask;
	if (_MainAlphaMaskMode == 2) poiFragData.alpha = poiFragData.alpha * alphaMask;
	if (_MainAlphaMaskMode == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask);
	if (_MainAlphaMaskMode == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask);
}

#K#BASE_COLOR_MOD

#T#PoiMainNormalImplementation
#if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED)
	poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[_BumpMapUV].xy, _BumpMap_ST), _BumpMapPan, _BumpMapStochastic), _BumpScale);
#else
	poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1));
#endif

#K#TANGENT_NORMAL_INJECTION
float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1));
poiMesh.normals[0] = normalize(
	tangentSpaceNormal.x * poiMesh.tangent[0] +
	tangentSpaceNormal.y * poiMesh.binormal[0] +
	tangentSpaceNormal.z * poiMesh.normals[0]
);

poiMesh.normals[1] = normalize(
	poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] +
	poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] +
	poiMesh.tangentSpaceNormal.z * poiMesh.normals[0]
);

poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]);
poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]);