| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | #ifndef _LIGHT_GLSL_ | 
					
						
							|  |  |  | #define _LIGHT_GLSL_ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "compiled.inc" | 
					
						
							|  |  |  | #include "std/brdf.glsl" | 
					
						
							|  |  |  | #include "std/math.glsl" | 
					
						
							|  |  |  | #ifdef _ShadowMap | 
					
						
							|  |  |  | #include "std/shadows.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | #ifdef _VoxelShadow | 
					
						
							|  |  |  | #include "std/conetrace.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | #ifdef _LTC | 
					
						
							|  |  |  | #include "std/ltc.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | #ifdef _LightIES | 
					
						
							|  |  |  | #include "std/ies.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | #ifdef _SSRS | 
					
						
							|  |  |  | #include "std/ssrs.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | #ifdef _Spot | 
					
						
							|  |  |  | #include "std/light_common.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2025-05-22 02:20:28 +00:00
										 |  |  | #ifdef _VoxelShadow | 
					
						
							|  |  |  | #include "std/conetrace.glsl" | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef _ShadowMap | 
					
						
							|  |  |  | 	#ifdef _SinglePoint | 
					
						
							|  |  |  | 		#ifdef _Spot | 
					
						
							|  |  |  | 			#ifndef _LTC | 
					
						
							|  |  |  | 				uniform sampler2DShadow shadowMapSpot[1]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 				#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 				uniform sampler2D shadowMapSpotTransparent[1]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 				#endif | 
					
						
							|  |  |  | 				uniform mat4 LWVPSpotArray[1]; | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			#endif | 
					
						
							|  |  |  | 		#else | 
					
						
							|  |  |  | 			uniform samplerCubeShadow shadowMapPoint[1]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			uniform samplerCube shadowMapPointTransparent[1]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			#endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			uniform vec2 lightProj; | 
					
						
							|  |  |  | 		#endif | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	#ifdef _Clusters | 
					
						
							|  |  |  | 		#ifdef _SingleAtlas | 
					
						
							|  |  |  | 		//!uniform sampler2DShadow shadowMapAtlas; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		//!uniform sampler2D shadowMapAtlasTransparent; | 
					
						
							|  |  |  | 		#endif | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		uniform vec2 lightProj; | 
					
						
							|  |  |  | 		#ifdef _ShadowMapAtlas | 
					
						
							|  |  |  | 		#ifndef _SingleAtlas | 
					
						
							|  |  |  | 		uniform sampler2DShadow shadowMapAtlasPoint; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		uniform sampler2D shadowMapAtlasPointTransparent; | 
					
						
							|  |  |  | 		#endif | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		#else | 
					
						
							|  |  |  | 		uniform samplerCubeShadow shadowMapPoint[4]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		uniform samplerCube shadowMapPointTransparent[4]; | 
					
						
							|  |  |  | 		#endif | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		#ifdef _Spot | 
					
						
							|  |  |  | 			#ifdef _ShadowMapAtlas | 
					
						
							|  |  |  | 			#ifndef _SingleAtlas | 
					
						
							|  |  |  | 			uniform sampler2DShadow shadowMapAtlasSpot; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			uniform sampler2D shadowMapAtlasSpotTransparent; | 
					
						
							|  |  |  | 			#endif | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			#endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			#else | 
					
						
							|  |  |  | 			uniform sampler2DShadow shadowMapSpot[4]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			uniform sampler2D shadowMapSpotTransparent[4]; | 
					
						
							|  |  |  | 			#endif | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			#endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			uniform mat4 LWVPSpotArray[maxLightsCluster]; | 
					
						
							|  |  |  | 		#endif | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _LTC | 
					
						
							|  |  |  | uniform vec3 lightArea0; | 
					
						
							|  |  |  | uniform vec3 lightArea1; | 
					
						
							|  |  |  | uniform vec3 lightArea2; | 
					
						
							|  |  |  | uniform vec3 lightArea3; | 
					
						
							|  |  |  | uniform sampler2D sltcMat; | 
					
						
							|  |  |  | uniform sampler2D sltcMag; | 
					
						
							|  |  |  | #ifdef _ShadowMap | 
					
						
							|  |  |  | #ifndef _Spot | 
					
						
							|  |  |  | 	#ifdef _SinglePoint | 
					
						
							|  |  |  | 		uniform sampler2DShadow shadowMapSpot[1]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		uniform sampler2D shadowMapSpotTransparent[1]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#endif | 
					
						
							|  |  |  | 		uniform mat4 LWVPSpotArray[1]; | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 	#endif | 
					
						
							|  |  |  | 	#ifdef _Clusters | 
					
						
							|  |  |  | 		uniform sampler2DShadow shadowMapSpot[maxLightsCluster]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#ifdef _ShadowMapTransparent | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		uniform sampler2D shadowMapSpotTransparent[maxLightsCluster]; | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		#endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 		uniform mat4 LWVPSpotArray[maxLightsCluster]; | 
					
						
							|  |  |  | 	#endif | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | #endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | #endif | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, const vec3 lp, const vec3 lightCol, | 
					
						
							|  |  |  | 	const vec3 albedo, const float rough, const float spec, const vec3 f0 | 
					
						
							|  |  |  | 	#ifdef _ShadowMap | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		, int index, float bias, bool receiveShadow | 
					
						
							|  |  |  | 	#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 		, bool transparent | 
					
						
							|  |  |  | 	#endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 	#endif | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 		, const bool isSpot, const float spotSize, float spotBlend, vec3 spotDir, vec2 scale, vec3 right | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	#ifdef _VoxelShadow | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 		, sampler3D voxels, sampler3D voxelsSDF, float clipmaps[10 * voxelgiClipmapCount], vec2 velocity | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 	#endif | 
					
						
							|  |  |  | 	#ifdef _MicroShadowing | 
					
						
							|  |  |  | 		, float occ | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	#ifdef _SSRS | 
					
						
							|  |  |  | 		, sampler2D gbufferD, mat4 invVP, vec3 eye | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	) { | 
					
						
							|  |  |  | 	vec3 ld = lp - p; | 
					
						
							|  |  |  | 	vec3 l = normalize(ld); | 
					
						
							|  |  |  | 	vec3 h = normalize(v + l); | 
					
						
							|  |  |  | 	float dotNH = max(0.0, dot(n, h)); | 
					
						
							|  |  |  | 	float dotVH = max(0.0, dot(v, h)); | 
					
						
							|  |  |  | 	float dotNL = max(0.0, dot(n, l)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _LTC | 
					
						
							|  |  |  | 	float theta = acos(dotNV); | 
					
						
							|  |  |  | 	vec2 tuv = vec2(rough, theta / (0.5 * PI)); | 
					
						
							|  |  |  | 	tuv = tuv * LUT_SCALE + LUT_BIAS; | 
					
						
							|  |  |  | 	vec4 t = textureLod(sltcMat, tuv, 0.0); | 
					
						
							|  |  |  | 	mat3 invM = mat3( | 
					
						
							|  |  |  | 		vec3(1.0, 0.0, t.y), | 
					
						
							|  |  |  | 		vec3(0.0, t.z, 0.0), | 
					
						
							|  |  |  | 		vec3(t.w, 0.0, t.x)); | 
					
						
							|  |  |  | 	float ltcspec = ltcEvaluate(n, v, dotNV, p, invM, lightArea0, lightArea1, lightArea2, lightArea3); | 
					
						
							|  |  |  | 	ltcspec *= textureLod(sltcMag, tuv, 0.0).a; | 
					
						
							|  |  |  | 	float ltcdiff = ltcEvaluate(n, v, dotNV, p, mat3(1.0), lightArea0, lightArea1, lightArea2, lightArea3); | 
					
						
							|  |  |  | 	vec3 direct = albedo * ltcdiff + ltcspec * spec * 0.05; | 
					
						
							|  |  |  | 	#else | 
					
						
							|  |  |  | 	vec3 direct = lambertDiffuseBRDF(albedo, dotNL) + | 
					
						
							|  |  |  | 				  specularBRDF(f0, rough, dotNL, dotNH, dotNV, dotVH) * spec; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	direct *= attenuate(distance(p, lp)); | 
					
						
							|  |  |  | 	direct *= lightCol; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _MicroShadowing | 
					
						
							|  |  |  | 	direct *= clamp(dotNL + 2.0 * occ * occ - 1.0, 0.0, 1.0); | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _SSRS | 
					
						
							|  |  |  | 	direct *= traceShadowSS(l, p, gbufferD, invVP, eye); | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _VoxelShadow | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 	vec3 lightDir = l; | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 	if (isSpot) | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 		lightDir = spotDir; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	direct *= (1.0 - traceShadow(p, n, voxels, voxelsSDF, lightDir, clipmaps, gl_FragCoord.xy, velocity).r) * voxelgiShad; | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _LTC | 
					
						
							|  |  |  | 	#ifdef _ShadowMap | 
					
						
							|  |  |  | 		if (receiveShadow) { | 
					
						
							|  |  |  | 			#ifdef _SinglePoint | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			vec4 lPos = LWVPSpot[0] * vec4(p + n * bias * 10, 1.0); | 
					
						
							|  |  |  | 			direct *= shadowTest(shadowMapSpot[0], | 
					
						
							|  |  |  | 								#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 								shadowMapSpotTransparent[0], | 
					
						
							|  |  |  | 								#endif | 
					
						
							|  |  |  | 								lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 								#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 								, transparent | 
					
						
							|  |  |  | 								#endif | 
					
						
							|  |  |  | 								); | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			#endif | 
					
						
							|  |  |  | 			#ifdef _Clusters | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			vec4 lPos = LWVPSpot[index] * vec4(p + n * bias * 10, 1.0); | 
					
						
							|  |  |  | 			if (index == 0) direct *= shadowTest(shadowMapSpot[0], | 
					
						
							|  |  |  | 												#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 												shadowMapSpotTransparent[0], | 
					
						
							|  |  |  | 												#endif | 
					
						
							|  |  |  | 												lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 												#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 												, transparent | 
					
						
							|  |  |  | 												#endif | 
					
						
							|  |  |  | 												); | 
					
						
							|  |  |  | 			else if (index == 1) direct *= shadowTest(shadowMapSpot[1], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapSpotTransparent[1], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 			else if (index == 2) direct *= shadowTest(shadowMapSpot[2], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapSpotTransparent[2], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 			else if (index == 3) direct *= shadowTest(shadowMapSpot[3], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapSpotTransparent[3], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			#endif | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	return direct; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 	if (isSpot) { | 
					
						
							|  |  |  | 		direct *= spotlightMask(l, spotDir, right, scale, spotSize, spotBlend); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		#ifdef _ShadowMap | 
					
						
							|  |  |  | 			if (receiveShadow) { | 
					
						
							|  |  |  | 				#ifdef _SinglePoint | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 				vec4 lPos = LWVPSpotArray[0] * vec4(p + n * bias * 10, 1.0); | 
					
						
							|  |  |  | 				direct *= shadowTest(shadowMapSpot[0], | 
					
						
							|  |  |  | 									#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 									shadowMapSpotTransparent[0], | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 									#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 									, transparent | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									); | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 				#endif | 
					
						
							|  |  |  | 				#ifdef _Clusters | 
					
						
							|  |  |  | 					vec4 lPos = LWVPSpotArray[index] * vec4(p + n * bias * 10, 1.0); | 
					
						
							|  |  |  | 					#ifdef _ShadowMapAtlas | 
					
						
							|  |  |  | 						direct *= shadowTest( | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 											#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 											#ifndef _SingleAtlas | 
					
						
							|  |  |  | 											shadowMapAtlasSpot, shadowMapAtlasSpotTransparent | 
					
						
							|  |  |  | 											#else | 
					
						
							|  |  |  | 											shadowMapAtlas, shadowMapAtlasTransparent | 
					
						
							|  |  |  | 											#endif | 
					
						
							|  |  |  | 											#else | 
					
						
							|  |  |  | 											#ifndef _SingleAtlas | 
					
						
							|  |  |  | 											shadowMapAtlasSpot | 
					
						
							|  |  |  | 											#else | 
					
						
							|  |  |  | 											shadowMapAtlas | 
					
						
							|  |  |  | 											#endif | 
					
						
							|  |  |  | 											#endif | 
					
						
							|  |  |  | 											, lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 											#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 											, transparent | 
					
						
							|  |  |  | 											#endif | 
					
						
							|  |  |  | 											); | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 					#else | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 							 if (index == 0) direct *= shadowTest(shadowMapSpot[0], | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																shadowMapSpotTransparent[0], | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																, transparent | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																); | 
					
						
							|  |  |  | 						else if (index == 1) direct *= shadowTest(shadowMapSpot[1], | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																shadowMapSpotTransparent[1], | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																, transparent | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																); | 
					
						
							|  |  |  | 						else if (index == 2) direct *= shadowTest(shadowMapSpot[2], | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																shadowMapSpotTransparent[2], | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																, transparent | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																); | 
					
						
							|  |  |  | 						else if (index == 3) direct *= shadowTest(shadowMapSpot[3], | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																shadowMapSpotTransparent[3], | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																, transparent | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																); | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 					#endif | 
					
						
							|  |  |  | 				#endif | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		#endif | 
					
						
							|  |  |  | 		return direct; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _LightIES | 
					
						
							|  |  |  | 	direct *= iesAttenuation(-l); | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _ShadowMap | 
					
						
							|  |  |  | 		if (receiveShadow) { | 
					
						
							|  |  |  | 			#ifdef _SinglePoint | 
					
						
							|  |  |  | 			#ifndef _Spot | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			direct *= PCFCube(shadowMapPoint[0], | 
					
						
							|  |  |  | 							#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 							shadowMapPointTransparent[0], | 
					
						
							|  |  |  | 							#endif | 
					
						
							|  |  |  | 							ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 							#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 							, transparent | 
					
						
							|  |  |  | 							#endif | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 			#endif | 
					
						
							|  |  |  | 			#endif | 
					
						
							|  |  |  | 			#ifdef _Clusters | 
					
						
							|  |  |  | 				#ifdef _ShadowMapAtlas | 
					
						
							|  |  |  | 				direct *= PCFFakeCube( | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 									#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 									#ifndef _SingleAtlas | 
					
						
							|  |  |  | 									shadowMapAtlasPoint, shadowMapAtlasPointTransparent | 
					
						
							|  |  |  | 									#else | 
					
						
							|  |  |  | 									shadowMapAtlas, shadowMapAtlasTransparent | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									#else | 
					
						
							|  |  |  | 									#ifndef _SingleAtlas | 
					
						
							|  |  |  | 									shadowMapAtlasPoint | 
					
						
							|  |  |  | 									#else | 
					
						
							|  |  |  | 									shadowMapAtlas | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									, ld, -l, bias, lightProj, n, index | 
					
						
							|  |  |  | 									#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 									, transparent | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									); | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 				#else | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 					 if (index == 0) direct *= PCFCube(shadowMapPoint[0], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapPointTransparent[0], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 				else if (index == 1) direct *= PCFCube(shadowMapPoint[1], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapPointTransparent[1], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 				else if (index == 2) direct *= PCFCube(shadowMapPoint[2], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapPointTransparent[2], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 				else if (index == 3) direct *= PCFCube(shadowMapPoint[3], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapPointTransparent[3], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | 				#endif | 
					
						
							|  |  |  | 			#endif | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return direct; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | #ifdef _VoxelGI | 
					
						
							|  |  |  | vec3 sampleLightVoxels(const vec3 p, const vec3 n, const vec3 v, const float dotNV, const vec3 lp, const vec3 lightCol, | 
					
						
							|  |  |  | 	const vec3 albedo, const float rough, const float spec, const vec3 f0 | 
					
						
							|  |  |  | 	#ifdef _ShadowMap | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 		, int index, float bias, bool receiveShadow | 
					
						
							|  |  |  | 	#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 		, bool transparent | 
					
						
							|  |  |  | 	#endif | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 	#endif | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 		, const bool isSpot, const float spotSize, float spotBlend, vec3 spotDir, vec2 scale, vec3 right | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	) { | 
					
						
							|  |  |  | 	vec3 ld = lp - p; | 
					
						
							|  |  |  | 	vec3 l = normalize(ld); | 
					
						
							|  |  |  | 	vec3 h = normalize(v + l); | 
					
						
							|  |  |  | 	float dotNH = max(0.0, dot(n, h)); | 
					
						
							|  |  |  | 	float dotVH = max(0.0, dot(v, h)); | 
					
						
							|  |  |  | 	float dotNL = max(0.0, dot(n, l)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _LTC | 
					
						
							|  |  |  | 	float theta = acos(dotNV); | 
					
						
							|  |  |  | 	vec2 tuv = vec2(rough, theta / (0.5 * PI)); | 
					
						
							|  |  |  | 	tuv = tuv * LUT_SCALE + LUT_BIAS; | 
					
						
							|  |  |  | 	vec4 t = textureLod(sltcMat, tuv, 0.0); | 
					
						
							|  |  |  | 	mat3 invM = mat3( | 
					
						
							|  |  |  | 		vec3(1.0, 0.0, t.y), | 
					
						
							|  |  |  | 		vec3(0.0, t.z, 0.0), | 
					
						
							|  |  |  | 		vec3(t.w, 0.0, t.x)); | 
					
						
							|  |  |  | 	float ltcspec = ltcEvaluate(n, v, dotNV, p, invM, lightArea0, lightArea1, lightArea2, lightArea3); | 
					
						
							|  |  |  | 	ltcspec *= textureLod(sltcMag, tuv, 0.0).a; | 
					
						
							|  |  |  | 	float ltcdiff = ltcEvaluate(n, v, dotNV, p, mat3(1.0), lightArea0, lightArea1, lightArea2, lightArea3); | 
					
						
							|  |  |  | 	vec3 direct = albedo * ltcdiff + ltcspec * spec * 0.05; | 
					
						
							|  |  |  | 	#else | 
					
						
							|  |  |  | 	vec3 direct = lambertDiffuseBRDF(albedo, dotNL) + | 
					
						
							|  |  |  | 				  specularBRDF(f0, rough, dotNL, dotNH, dotNV, dotVH) * spec; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	direct *= attenuate(distance(p, lp)); | 
					
						
							|  |  |  | 	direct *= lightCol; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _LTC | 
					
						
							|  |  |  | 	#ifdef _ShadowMap | 
					
						
							|  |  |  | 		if (receiveShadow) { | 
					
						
							|  |  |  | 			#ifdef _SinglePoint | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			vec4 lPos = LWVPSpot[0] * vec4(p + n * bias * 10, 1.0); | 
					
						
							|  |  |  | 			direct *= shadowTest(shadowMapSpot[0], | 
					
						
							|  |  |  | 								#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 								shadowMapSpotTransparent[0], | 
					
						
							|  |  |  | 								#endif | 
					
						
							|  |  |  | 								lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 								#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 								, transparent | 
					
						
							|  |  |  | 								#endif | 
					
						
							|  |  |  | 								); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 			#endif | 
					
						
							|  |  |  | 			#ifdef _Clusters | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			vec4 lPos = LWVPSpot[index] * vec4(p + n * bias * 10, 1.0); | 
					
						
							|  |  |  | 			if (index == 0) direct *= shadowTest(shadowMapSpot[0], | 
					
						
							|  |  |  | 												#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 												shadowMapSpotTransparent[0], | 
					
						
							|  |  |  | 												#endif | 
					
						
							|  |  |  | 												lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 												#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 												, transparent | 
					
						
							|  |  |  | 												#endif | 
					
						
							|  |  |  | 												); | 
					
						
							|  |  |  | 			else if (index == 1) direct *= shadowTest(shadowMapSpot[1], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapSpotTransparent[1], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 			else if (index == 2) direct *= shadowTest(shadowMapSpot[2], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapSpotTransparent[2], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 			else if (index == 3) direct *= shadowTest(shadowMapSpot[3], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapSpotTransparent[3], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 			#endif | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 	return direct; | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _Spot | 
					
						
							|  |  |  | 	if (isSpot) { | 
					
						
							|  |  |  | 		direct *= spotlightMask(l, spotDir, right, scale, spotSize, spotBlend); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		#ifdef _ShadowMap | 
					
						
							|  |  |  | 			if (receiveShadow) { | 
					
						
							|  |  |  | 				#ifdef _SinglePoint | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 				vec4 lPos = LWVPSpotArray[0] * vec4(p + n * bias * 10, 1.0); | 
					
						
							|  |  |  | 				direct *= shadowTest(shadowMapSpot[0], | 
					
						
							|  |  |  | 									#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 									shadowMapSpotTransparent[0], | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 									#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 									, transparent | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 				#endif | 
					
						
							|  |  |  | 				#ifdef _Clusters | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 					vec4 lPos = LWVPSpotArray[index] * vec4(p + n * bias * 10, 1.0); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 					#ifdef _ShadowMapAtlas | 
					
						
							|  |  |  | 						direct *= shadowTest( | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 											#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 											#ifndef _SingleAtlas | 
					
						
							|  |  |  | 											shadowMapAtlasSpot, shadowMapAtlasSpotTransparent | 
					
						
							|  |  |  | 											#else | 
					
						
							|  |  |  | 											shadowMapAtlas, shadowMapAtlasTransparent | 
					
						
							|  |  |  | 											#endif | 
					
						
							|  |  |  | 											#else | 
					
						
							|  |  |  | 											#ifndef _SingleAtlas | 
					
						
							|  |  |  | 											shadowMapAtlasSpot | 
					
						
							|  |  |  | 											#else | 
					
						
							|  |  |  | 											shadowMapAtlas | 
					
						
							|  |  |  | 											#endif | 
					
						
							|  |  |  | 											#endif | 
					
						
							|  |  |  | 											, lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 											#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 											, transparent | 
					
						
							|  |  |  | 											#endif | 
					
						
							|  |  |  | 											); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 					#else | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 							 if (index == 0) direct *= shadowTest(shadowMapSpot[0], | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																shadowMapSpotTransparent[0], | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																, transparent | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																); | 
					
						
							|  |  |  | 						else if (index == 1) direct *= shadowTest(shadowMapSpot[1], | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																shadowMapSpotTransparent[1], | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																, transparent | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																); | 
					
						
							|  |  |  | 						else if (index == 2) direct *= shadowTest(shadowMapSpot[2], | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																shadowMapSpotTransparent[2], | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																, transparent | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																); | 
					
						
							|  |  |  | 						else if (index == 3) direct *= shadowTest(shadowMapSpot[3], | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																shadowMapSpotTransparent[3], | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																lPos.xyz / lPos.w, bias | 
					
						
							|  |  |  | 																#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 																, transparent | 
					
						
							|  |  |  | 																#endif | 
					
						
							|  |  |  | 																); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 					#endif | 
					
						
							|  |  |  | 				#endif | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		#endif | 
					
						
							|  |  |  | 		return direct; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _LightIES | 
					
						
							|  |  |  | 	direct *= iesAttenuation(-l); | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#ifdef _ShadowMap | 
					
						
							|  |  |  | 		if (receiveShadow) { | 
					
						
							|  |  |  | 			#ifdef _SinglePoint | 
					
						
							|  |  |  | 			#ifndef _Spot | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 			direct *= PCFCube(shadowMapPoint[0], | 
					
						
							|  |  |  | 							#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 							shadowMapPointTransparent[0], | 
					
						
							|  |  |  | 							#endif | 
					
						
							|  |  |  | 							ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 							#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 							, transparent | 
					
						
							|  |  |  | 							#endif | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 			#endif | 
					
						
							|  |  |  | 			#endif | 
					
						
							|  |  |  | 			#ifdef _Clusters | 
					
						
							|  |  |  | 				#ifdef _ShadowMapAtlas | 
					
						
							|  |  |  | 				direct *= PCFFakeCube( | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 									#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 									#ifndef _SingleAtlas | 
					
						
							|  |  |  | 									shadowMapAtlasPoint, shadowMapAtlasPointTransparent | 
					
						
							|  |  |  | 									#else | 
					
						
							|  |  |  | 									shadowMapAtlas, shadowMapAtlasTransparent | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									#else | 
					
						
							|  |  |  | 									#ifndef _SingleAtlas | 
					
						
							|  |  |  | 									shadowMapAtlasPoint | 
					
						
							|  |  |  | 									#else | 
					
						
							|  |  |  | 									shadowMapAtlas | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									, ld, -l, bias, lightProj, n, index | 
					
						
							|  |  |  | 									#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 									, transparent | 
					
						
							|  |  |  | 									#endif | 
					
						
							|  |  |  | 									); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 				#else | 
					
						
							| 
									
										
										
										
											2025-05-29 21:22:25 +00:00
										 |  |  | 					 if (index == 0) direct *= PCFCube(shadowMapPoint[0], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapPointTransparent[0], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 				else if (index == 1) direct *= PCFCube(shadowMapPoint[1], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapPointTransparent[1], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 				else if (index == 2) direct *= PCFCube(shadowMapPoint[2], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapPointTransparent[2], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							|  |  |  | 				else if (index == 3) direct *= PCFCube(shadowMapPoint[3], | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													shadowMapPointTransparent[3], | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													ld, -l, bias, lightProj, n | 
					
						
							|  |  |  | 													#ifdef _ShadowMapTransparent | 
					
						
							|  |  |  | 													, transparent | 
					
						
							|  |  |  | 													#endif | 
					
						
							|  |  |  | 													); | 
					
						
							| 
									
										
										
										
											2025-05-21 01:04:30 +00:00
										 |  |  | 				#endif | 
					
						
							|  |  |  | 			#endif | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	#endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return direct; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2025-04-07 15:45:04 +00:00
										 |  |  | #endif |