#T#PoiInternalParallaxProperties
//ifex _PoiInternalParallax==0
[HideInInspector] m_start_internalparallax (" Internal Parallax--{reference_property:_PoiInternalParallax,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/special-fx/internal-parallax},hover:Documentation}}", Float) = 0
[HideInInspector][ThryToggle(POI_INTERNALPARALLAX)]_PoiInternalParallax ("Enable", Float) = 0

[Enum(Basic, 0, HeightMap, 1)] _ParallaxInternalHeightmapMode ("Parallax Mode", Int) = 0

[ThryRGBAPacker(RGB Color, A Height, sRGB, false)][sRGBWarning(true)]_ParallaxInternalMap ("Internal Map--{reference_properties:[_ParallaxInternalMapPan, _ParallaxInternalPanDepthSpeed, _ParallaxInternalHeightFromAlpha]}", 2D) = "black" { }
[HideInInspector][Vector2]_ParallaxInternalMapPan ("Panning", Vector) = (0, 0, 1, 1)
[HideInInspector][Vector2]_ParallaxInternalPanDepthSpeed ("Per Level Pan Multiplier", Vector) = (0, 0, 1, 1)
[HideInInspector][ToggleUI]_ParallaxInternalHeightFromAlpha ("Height From Alpha", Float) = 0

[sRGBWarning][ThryTexture]_ParallaxInternalMapMask ("Mask--{reference_properties:[_ParallaxInternalMapMaskPan, _ParallaxInternalMapMaskUV, _ParallaxInternalMapMaskChannel]}", 2D) = "white" { }
[HideInInspector][Vector2]_ParallaxInternalMapMaskPan ("Panning", Vector) = (0, 0, 0, 0)
[HideInInspector][Enum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, distorteduv0, 4)] _ParallaxInternalMapMaskUV ("UV", Int) = 0
[HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3)]_ParallaxInternalMapMaskChannel ("Channel", Float) = 0

[HideInInspector] s_start_ParallaxInternalLayerControls ("Layer Controls--{persistent_expand:true,default_expand:true}", Float) = 1
[IntRange]_ParallaxInternalIterations ("Parallax Internal Iterations", Range(1, 50)) = 4
_ParallaxInternalMinDepth ("Min Depth", Float) = 0
_ParallaxInternalMaxDepth ("Max Depth", Float) = 0.1
[HideInInspector] s_end_ParallaxInternalLayerControls ("", Float) = 0

[HideInInspector] s_start_ParallaxInternalLayerColoring ("Layer Colors--{persistent_expand:true,default_expand:true}", Float) = 1
_ParallaxInternalMinFade ("Min Depth Brightness", Range(0, 5)) = 1.0
_ParallaxInternalMaxFade ("Max Depth Brightness", Range(0, 5)) = 0.1
_ParallaxInternalMinColor ("Min Depth Color--{reference_property:_ParallaxInternalMinColorThemeIndex}", 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)] _ParallaxInternalMinColorThemeIndex ("", Int) = 0
_ParallaxInternalMaxColor ("Max Depth Color--{reference_property:_ParallaxInternalMaxColorThemeIndex}", 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)] _ParallaxInternalMaxColorThemeIndex ("", Int) = 0
[Enum(Add, 0, Max, 1)] _ParallaxInternalBlendMode ("Internal Blend Mode", Int) = 0
[ThryWideEnum(Replace, 0, Darken, 1, Multiply, 2, Lighten, 5, Screen, 6, Subtract, 7, Add, 8, Overlay, 9, Mixed, 20)] _ParallaxInternalSurfaceBlendMode ("Surface Blend Mode", Int) = 8
[HideInInspector] s_end_ParallaxInternalLayerColoring ("", Float) = 0
// [Vector2]_ParallaxInternalPanSpeed ("Pan Speed", Vector) = (0, 0, 0, 0)

[HideInInspector] s_start_ParallaxInternalHueShift ("Hue Shift--{reference_property:_ParallaxInternalHueShiftEnabled,persistent_expand:true,default_expand:false}", Float) = 0
[HideInInspector][ToggleUI]_ParallaxInternalHueShiftEnabled ("Hue Shift", Float) = 0
[ThryWideEnum(OKLab, 0, HSV, 1)] _ParallaxInternalHueShiftColorSpace ("Color Space", Int) = 0
[ThryWideEnum(Hue Select, 0, Hue Shift, 1)] _ParallaxInternalHueSelectOrShift ("Select or Shift", Int) = 1
_ParallaxInternalHueShift ("Hue Shift", Range(0, 1)) = 0
_ParallaxInternalHueShiftSpeed ("Hue Shift Speed", Float) = 0
_ParallaxInternalHueShiftPerLevel ("Hue Shift Per Level", Float) = 0
[HideInInspector] s_end_ParallaxInternalHueShift ("", Float) = 0
// _ParallaxInternalHueShiftPerLevelSpeed ("Hue Shift Per Level Speed", Float) = 0

[HideInInspector] m_end_internalparallax ("Internal Parallax", Float) = 0
//endex

#T#PoiInternalParallaxKeywords
//ifex _PoiInternalParallax==0
#pragma shader_feature_local POI_INTERNALPARALLAX
//endex

#T#PoiInternalParallaxVariables
//ifex _PoiInternalParallax==0
#ifdef POI_INTERNALPARALLAX
	#if defined(PROP_PARALLAXINTERNALMAP) || !defined(OPTIMIZER_ENABLED)
		Texture2D _ParallaxInternalMap;
	#endif
	float4 _ParallaxInternalMap_ST;
	float2 _ParallaxInternalMapPan;

	#if defined(PROP_PARALLAXINTERNALMAPMASK) || !defined(OPTIMIZER_ENABLED)
		Texture2D _ParallaxInternalMapMask;
	#endif
	float4 _ParallaxInternalMapMask_ST;
	float2 _ParallaxInternalMapMaskPan;
	float _ParallaxInternalMapMaskUV;
	float _ParallaxInternalMapMaskChannel;

	float _ParallaxInternalIterations;
	float _ParallaxInternalMinDepth;
	float _ParallaxInternalMaxDepth;
	float _ParallaxInternalMinFade;
	float _ParallaxInternalMaxFade;
	float4 _ParallaxInternalMinColor;
	float4 _ParallaxInternalMaxColor;
	float _ParallaxInternalMinColorThemeIndex;
	float _ParallaxInternalMaxColorThemeIndex;
	// float4 _ParallaxInternalPanSpeed;
	float4 _ParallaxInternalPanDepthSpeed;
	float _ParallaxInternalHeightmapMode;
	float _ParallaxInternalHeightFromAlpha;

	float _ParallaxInternalHueShiftEnabled;
	float _ParallaxInternalHueShift;
	float _ParallaxInternalHueShiftSpeed;
	float _ParallaxInternalHueShiftPerLevel;
	float _ParallaxInternalHueShiftColorSpace;
	float _ParallaxInternalHueSelectOrShift;
	float _ParallaxInternalSurfaceBlendMode;
	float _ParallaxInternalBlendMode;
	// float _ParallaxInternalHueShiftPerLevelSpeed;
#endif
//endex

#T#PoiInternalParallaxFunctions
//ifex _PoiInternalParallax==0
#ifdef POI_INTERNALPARALLAX
	void applyInternalParallax(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods)
	{
		float3 parallax = 0;
		
		for (int j = _ParallaxInternalIterations - 1; j >= 0; j--)
		{
			float ratio = saturate((float)j / max(_ParallaxInternalIterations - 1, 1));
			float2 parallaxOffset = _Time.y * (_ParallaxInternalMapPan + ratio * _ParallaxInternalPanDepthSpeed);
			float fade = lerp(_ParallaxInternalMinFade, _ParallaxInternalMaxFade, ratio);
			fade = pow(fade, 2.2);
			#if defined(PROP_PARALLAXINTERNALMAP) || !defined(OPTIMIZER_ENABLED)
				float4 parallaxColor = UNITY_SAMPLE_TEX2D_SAMPLER(_ParallaxInternalMap, _MainTex, TRANSFORM_TEX(poiMesh.uv[0], _ParallaxInternalMap) + (lerp(_ParallaxInternalMinDepth, _ParallaxInternalMaxDepth, ratio)) * - (poiCam.tangentViewDir.xy / (poiCam.tangentViewDir.z)) + parallaxOffset);
			#else
				float4 parallaxColor = 0;
			#endif
			float3 minColor = poiThemeColor(poiMods, _ParallaxInternalMinColor.rgb, _ParallaxInternalMinColorThemeIndex);
			float3 maxColor = poiThemeColor(poiMods, _ParallaxInternalMaxColor.rgb, _ParallaxInternalMaxColorThemeIndex);
			float3 parallaxTint = lerp(minColor, maxColor, ratio);
			float parallaxHeight;
			if (_ParallaxInternalHeightFromAlpha)
			{
				parallaxTint *= parallaxColor.rgb;
				parallaxHeight = parallaxColor.a;
			}
			else
			{
				parallaxHeight = parallaxColor.r;
			}
			// parallaxTint = hueShift(parallaxTint, frac((ratio * _ParallaxInternalHueShiftPerLevel) + (ratio * _ParallaxInternalHueShiftPerLevelSpeed * _Time.x)) * _ParallaxInternalHueShiftEnabled);
			parallaxTint = hueShift(parallaxTint, frac(ratio * _ParallaxInternalHueShiftPerLevel) * _ParallaxInternalHueShiftEnabled, _ParallaxInternalHueShiftColorSpace, _ParallaxInternalHueSelectOrShift);
			//float parallaxColor *= lerp(_ParallaxInternalMinColor, _ParallaxInternalMaxColor, 1 - ratio);
			UNITY_BRANCH
			if (_ParallaxInternalHeightmapMode == 1)
			{
				parallax = lerp(parallax, parallaxTint * fade, parallaxHeight >= 1 - ratio);
			}
			else
			{
				if (_ParallaxInternalBlendMode == 0) parallax += parallaxTint * parallaxHeight * fade;
				if (_ParallaxInternalBlendMode == 1) parallax = max(parallax, parallaxTint * parallaxHeight * fade);
			}
		}
		parallax = hueShift(parallax, frac(_ParallaxInternalHueShift + _ParallaxInternalHueShiftSpeed * _Time.x) * _ParallaxInternalHueShiftEnabled, _ParallaxInternalHueShiftColorSpace, _ParallaxInternalHueSelectOrShift);
		//parallax /= _ParallaxInternalIterations;
		#if defined(PROP_PARALLAXINTERNALMAPMASK) || !defined(OPTIMIZER_ENABLED)
			poiFragData.baseColor.rgb = customBlend(poiFragData.baseColor.rgb, parallax.rgb, _ParallaxInternalSurfaceBlendMode, POI2D_SAMPLER_PAN(_ParallaxInternalMapMask, _MainTex, poiUV(poiMesh.uv[_ParallaxInternalMapMaskUV], _ParallaxInternalMapMask_ST), _ParallaxInternalMapMaskPan)[_ParallaxInternalMapMaskChannel]);
		#else
			poiFragData.baseColor.rgb = customBlend(poiFragData.baseColor.rgb, parallax.rgb, _ParallaxInternalSurfaceBlendMode);
		#endif
	}
#endif
//endex

#T#PoiInternalParallaxFunctionCalls
//ifex _PoiInternalParallax==0
#ifdef POI_INTERNALPARALLAX
	applyInternalParallax(poiFragData, poiMesh, poiCam, poiMods);
#endif
//endex