mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 05:56:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
		
			No EOL
		
	
	
		
			3.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			No EOL
		
	
	
		
			3.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| #define SHADOWS @shadows_enabled
 | |
| 
 | |
| #if SHADOWS
 | |
|     uniform float maximumShadowMapDistance;
 | |
|     uniform float shadowFadeStart;
 | |
|     @foreach shadow_texture_unit_index @shadow_texture_unit_list
 | |
|         uniform sampler2DShadow shadowTexture@shadow_texture_unit_index;
 | |
|         varying vec4 shadowSpaceCoords@shadow_texture_unit_index;
 | |
| 
 | |
| #if @perspectiveShadowMaps
 | |
|         varying vec4 shadowRegionCoords@shadow_texture_unit_index;
 | |
| #endif
 | |
|     @endforeach
 | |
| #endif // SHADOWS
 | |
| 
 | |
| float unshadowedLightRatio(float distance)
 | |
| {
 | |
|     float shadowing = 1.0;
 | |
| #if SHADOWS
 | |
| #if @limitShadowMapDistance
 | |
|     float fade = clamp((distance - shadowFadeStart) / (maximumShadowMapDistance - shadowFadeStart), 0.0, 1.0);
 | |
|     if (fade == 1.0)
 | |
|         return shadowing;
 | |
| #endif
 | |
|     #if @shadowMapsOverlap
 | |
|         bool doneShadows = false;
 | |
|         @foreach shadow_texture_unit_index @shadow_texture_unit_list
 | |
|             if (!doneShadows)
 | |
|             {
 | |
|                 vec3 shadowXYZ = shadowSpaceCoords@shadow_texture_unit_index.xyz / shadowSpaceCoords@shadow_texture_unit_index.w;
 | |
| #if @perspectiveShadowMaps
 | |
|                 vec3 shadowRegionXYZ = shadowRegionCoords@shadow_texture_unit_index.xyz / shadowRegionCoords@shadow_texture_unit_index.w;
 | |
| #endif
 | |
|                 if (all(lessThan(shadowXYZ.xy, vec2(1.0, 1.0))) && all(greaterThan(shadowXYZ.xy, vec2(0.0, 0.0))))
 | |
|                 {
 | |
|                     shadowing = min(shadow2DProj(shadowTexture@shadow_texture_unit_index, shadowSpaceCoords@shadow_texture_unit_index).r, shadowing);
 | |
| 
 | |
|                     
 | |
|                     doneShadows = all(lessThan(shadowXYZ, vec3(0.95, 0.95, 1.0))) && all(greaterThan(shadowXYZ, vec3(0.05, 0.05, 0.0)));
 | |
| #if @perspectiveShadowMaps
 | |
|                     doneShadows = doneShadows && all(lessThan(shadowRegionXYZ, vec3(1.0, 1.0, 1.0))) && all(greaterThan(shadowRegionXYZ.xy, vec2(-1.0, -1.0)));
 | |
| #endif
 | |
|                 }
 | |
|             }
 | |
|         @endforeach
 | |
|     #else
 | |
|         @foreach shadow_texture_unit_index @shadow_texture_unit_list
 | |
|             shadowing = min(shadow2DProj(shadowTexture@shadow_texture_unit_index, shadowSpaceCoords@shadow_texture_unit_index).r, shadowing);
 | |
|         @endforeach
 | |
|     #endif
 | |
| #if @limitShadowMapDistance
 | |
|     shadowing = mix(shadowing, 1.0, fade);
 | |
| #endif
 | |
| #endif // SHADOWS
 | |
|     return shadowing;
 | |
| }
 | |
| 
 | |
| void applyShadowDebugOverlay()
 | |
| {
 | |
| #if SHADOWS && @useShadowDebugOverlay
 | |
|     bool doneOverlay = false;
 | |
|     float colourIndex = 0.0;
 | |
|     @foreach shadow_texture_unit_index @shadow_texture_unit_list
 | |
|         if (!doneOverlay)
 | |
|         {
 | |
|             vec3 shadowXYZ = shadowSpaceCoords@shadow_texture_unit_index.xyz / shadowSpaceCoords@shadow_texture_unit_index.w;
 | |
| #if @perspectiveShadowMaps
 | |
|             vec3 shadowRegionXYZ = shadowRegionCoords@shadow_texture_unit_index.xyz / shadowRegionCoords@shadow_texture_unit_index.w;
 | |
| #endif
 | |
|             if (all(lessThan(shadowXYZ.xy, vec2(1.0, 1.0))) && all(greaterThan(shadowXYZ.xy, vec2(0.0, 0.0))))
 | |
|             {
 | |
|                 colourIndex = mod(@shadow_texture_unit_index.0, 3.0);
 | |
| 		        if (colourIndex < 1.0)
 | |
| 			        gl_FragData[0].x += 0.1;
 | |
| 		        else if (colourIndex < 2.0)
 | |
| 			        gl_FragData[0].y += 0.1;
 | |
| 		        else
 | |
| 			        gl_FragData[0].z += 0.1;
 | |
| 
 | |
|                 doneOverlay = all(lessThan(shadowXYZ, vec3(0.95, 0.95, 1.0))) && all(greaterThan(shadowXYZ, vec3(0.05, 0.05, 0.0)));
 | |
| #if @perspectiveShadowMaps
 | |
|                 doneOverlay = doneOverlay && all(lessThan(shadowRegionXYZ.xyz, vec3(1.0, 1.0, 1.0))) && all(greaterThan(shadowRegionXYZ.xy, vec2(-1.0, -1.0)));
 | |
| #endif
 | |
|             }
 | |
|         }
 | |
|     @endforeach
 | |
| #endif // SHADOWS
 | |
| } |