#ifndef FOLIAGE_LIGHTING_INCLUDE
#define FOLIAGE_LIGHTING_INCLUDE

#include "/Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

#ifdef SHADOW_BAKED_SECTOR

uniform float4 _SectorWPosInfo;
uniform float4 _SectorUVScaleInfo;
uniform float4 _SectorMaskSelector;
TEXTURE2D(_SectorShadowMaskTex);  SAMPLER(sampler_SectorShadowMaskTex);

half  X2M_SampleSectorBakedOcclusion(float3 worldPos) {
	////float2 testWorld = float2(512.0f, -1024.0f);
	//float2 lightmapUV = worldPos.xz - _SectorWPosInfo.xy;
	////if (_SectorMaskSelector.z > 0.8)
	//	//return _SectorMaskSelector.w;
	//lightmapUV = lightmapUV / _SectorWPosInfo.zw;
	////lightmapUV.y = 1.0 - lightmapUV.y;
	//
	//lightmapUV = lightmapUV*_SectorUVScaleInfo.xy + _SectorUVScaleInfo.zw;
	//fixed4 rawOcclusionMask = UNITY_SAMPLE_TEX2D(_SectorShadowMaskTex, lightmapUV.xy);
	//return saturate(dot(rawOcclusionMask, _SectorMaskSelector));

	//if (worldPos.x > _SectorWPosInfo[0].x && worldPos.x < _SectorWPosInfo[0].x + 512.0f) {
		//return 0.1f;
	//}
	half4 rawOcclusionMask;
	float2 lightmapUV = worldPos.xz - _SectorWPosInfo.xy;
	lightmapUV = lightmapUV / _SectorWPosInfo.zw;
	lightmapUV = saturate(lightmapUV);
	//if (lightmapUV.x > 0.0f && lightmapUV.x < 1.0f && lightmapUV.y > 0.0f && lightmapUV.y < 1.0f) {
	lightmapUV = lightmapUV * _SectorUVScaleInfo.xy + _SectorUVScaleInfo.zw;
	rawOcclusionMask = SAMPLE_TEXTURE2D(_SectorShadowMaskTex, sampler_SectorShadowMaskTex, lightmapUV.xy);
	half shadow = saturate(dot(rawOcclusionMask, _SectorMaskSelector));

	half shadowStrength = GetMainLightShadowStrength();
	shadow = LerpWhiteTo(shadow, shadowStrength);
	return shadow;
	//}
	//bOutSector = true;
	//return 1.0f;

}



#endif

half GetRealtimeTerrainShadow(float4 lightShadowCoord) {

	half shadowAttenuation = MainLightRealtimeShadow(lightShadowCoord);
	return shadowAttenuation;
}

float3 EllipsolidLineInteraction(float a, float b, float c, float x0, float y0, float z0,
	float k, float l, float switch_value)
{
	float pow_a_2 = a*a;
	float pow_b_2 = b*b;
	float pow_c_2 = c*c;
	float pow_k_2 = k*k;
	float pow_z0_2 = z0*z0;
	float pow_l_2 = l*l;
	float pow_y0_2 = y0*y0;
	float pow_x0_2 = x0*x0;

	float pow_a_2_multi_pow_b_2 = pow_a_2*pow_b_2;
	float pow_a_2_multi_pow_c_2 = pow_a_2*pow_c_2;
	float pow_b_2_multi_pow_c_2 = pow_b_2*pow_c_2;
	float pow_a_2_multi_pow_b_2_multi_pow_l_2 = pow_a_2_multi_pow_b_2*pow_l_2;
	float pow_a_2_multi_pow_c_2_multi_pow_k_2 = pow_a_2_multi_pow_c_2*pow_k_2;
	float pow_a_2_multi_pow_b_2_multi_pow_c_2 = pow_a_2_multi_pow_b_2*pow_c_2;

	float sqrt_result = sqrt(pow_a_2_multi_pow_b_2_multi_pow_c_2*(pow_a_2_multi_pow_b_2_multi_pow_l_2 + pow_a_2_multi_pow_c_2_multi_pow_k_2 - pow_a_2*pow_k_2*pow_z0_2 + 2*pow_a_2*k*l*y0*z0 - pow_a_2*pow_l_2*pow_y0_2 + pow_b_2_multi_pow_c_2 - pow_b_2*pow_l_2*pow_x0_2 + 2*pow_b_2*l*x0*z0 - pow_b_2*pow_z0_2 - pow_c_2*pow_k_2*pow_x0_2 + 2*pow_c_2*k*x0*y0 - pow_c_2*pow_y0_2));

	float first_half_value = (-pow_a_2_multi_pow_b_2*l*z0 - pow_a_2_multi_pow_c_2*k*y0 - pow_b_2_multi_pow_c_2*x0 + sqrt_result)/(pow_a_2_multi_pow_b_2_multi_pow_l_2 + pow_a_2_multi_pow_c_2_multi_pow_k_2 + pow_b_2_multi_pow_c_2);

	float sec_half_value = (pow_a_2_multi_pow_b_2*l*z0 + pow_a_2_multi_pow_c_2*k*y0 + pow_b_2_multi_pow_c_2*x0 + sqrt_result)/(pow_a_2_multi_pow_b_2_multi_pow_l_2 + pow_a_2_multi_pow_c_2_multi_pow_k_2 + pow_b_2_multi_pow_c_2);

	float switcher = switch_value > 0.0;
	float x = lerp(x0 + first_half_value,x0 - sec_half_value,switcher);
	float y = lerp(k*first_half_value + y0,-k*sec_half_value + y0,switcher);
	float z = lerp(l*first_half_value + z0,-l*sec_half_value + z0,switcher);

	return normalize(2.0*float3(x/(a*a), y/(b*b), z/(c*c)));
}

float3 EllipsolidLineInteractionEx(float a, float b, float c, float x0, float y0, float z0,
	float k, float l, float switch_value)
{
	float pow_a_2 = a*a;
	float pow_b_2 = b*b;
	float pow_c_2 = c*c;
	float pow_k_2 = k*k;
	float pow_z0_2 = z0*z0;
	float pow_l_2 = l*l;
	float pow_y0_2 = y0*y0;
	float pow_x0_2 = x0*x0;

	float pow_a_2_multi_pow_b_2 = pow_a_2*pow_b_2;
	float pow_a_2_multi_pow_c_2 = pow_a_2*pow_c_2;
	float pow_b_2_multi_pow_c_2 = pow_b_2*pow_c_2;
	float pow_a_2_multi_pow_b_2_multi_pow_l_2 = pow_a_2_multi_pow_b_2*pow_l_2;
	float pow_a_2_multi_pow_c_2_multi_pow_k_2 = pow_a_2_multi_pow_c_2*pow_k_2;
	float pow_a_2_multi_pow_b_2_multi_pow_c_2 = pow_a_2_multi_pow_b_2*pow_c_2;

	float sqrt_result = sqrt(pow_a_2_multi_pow_b_2_multi_pow_c_2*(pow_a_2_multi_pow_b_2_multi_pow_l_2 + pow_a_2_multi_pow_c_2_multi_pow_k_2 - pow_a_2*pow_k_2*pow_z0_2 + 2*pow_a_2*k*l*y0*z0 - pow_a_2*pow_l_2*pow_y0_2 + pow_b_2_multi_pow_c_2 - pow_b_2*pow_l_2*pow_x0_2 + 2*pow_b_2*l*x0*z0 - pow_b_2*pow_z0_2 - pow_c_2*pow_k_2*pow_x0_2 + 2*pow_c_2*k*x0*y0 - pow_c_2*pow_y0_2));

	float first_half_value = (-pow_a_2_multi_pow_b_2*l*z0 - pow_a_2_multi_pow_c_2*k*y0 - pow_b_2_multi_pow_c_2*x0 + sqrt_result)/(pow_a_2_multi_pow_b_2_multi_pow_l_2 + pow_a_2_multi_pow_c_2_multi_pow_k_2 + pow_b_2_multi_pow_c_2);

	float sec_half_value = (pow_a_2_multi_pow_b_2*l*z0 + pow_a_2_multi_pow_c_2*k*y0 + pow_b_2_multi_pow_c_2*x0 + sqrt_result)/(pow_a_2_multi_pow_b_2_multi_pow_l_2 + pow_a_2_multi_pow_c_2_multi_pow_k_2 + pow_b_2_multi_pow_c_2);

	float switcher = switch_value > 0.0;
	float x = lerp(x0 + first_half_value,x0 - sec_half_value,switcher);
	float y = lerp(k*first_half_value + y0,-k*sec_half_value + y0,switcher);
	float z = lerp(l*first_half_value + z0,-l*sec_half_value + z0,switcher);
	return float3(x,y,z);
	//return normalize(2.0*float3(x/(a*a), y/(b*b), z/(c*c)));
}




#endif