mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-03 02:56:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			No EOL
		
	
	
		
			3.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			87 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
 | 
						|
} |