mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 21:26:41 +00:00 
			
		
		
		
	This also makes Force Per Pixel Lighting caption shorter to provide more space for the new button
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| #ifndef LIB_LIGHT_LIGHTING
 | |
| #define LIB_LIGHT_LIGHTING
 | |
| 
 | |
| #include "lighting_util.glsl"
 | |
| 
 | |
| float calcLambert(vec3 viewNormal, vec3 lightDir, vec3 viewDir)
 | |
| {
 | |
|     float lambert = dot(viewNormal, lightDir);
 | |
| #ifndef GROUNDCOVER
 | |
|     lambert = max(lambert, 0.0);
 | |
| #else
 | |
|     float eyeCosine = dot(viewNormal, viewDir);
 | |
|     if (lambert < 0.0)
 | |
|     {
 | |
|         lambert = -lambert;
 | |
|         eyeCosine = -eyeCosine;
 | |
|     }
 | |
|     lambert *= clamp(-8.0 * (1.0 - 0.3) * eyeCosine + 1.0, 0.3, 1.0);
 | |
| #endif
 | |
|     return lambert;
 | |
| }
 | |
| 
 | |
| float calcSpecIntensity(vec3 viewNormal, vec3 viewDir, float shininess, vec3 lightDir)
 | |
| {
 | |
|     if (dot(viewNormal, lightDir) > 0.0)
 | |
|     {
 | |
|         vec3 halfVec = normalize(lightDir - viewDir);
 | |
|         float NdotH = max(dot(viewNormal, halfVec), 0.0);
 | |
|         return pow(NdotH, shininess);
 | |
|     }
 | |
| 
 | |
|     return 0.0;
 | |
| }
 | |
| 
 | |
| #if PER_PIXEL_LIGHTING
 | |
| void doLighting(vec3 viewPos, vec3 viewNormal, float shininess, float shadowing, out vec3 diffuseLight, out vec3 ambientLight, out vec3 specularLight)
 | |
| #else
 | |
| void doLighting(vec3 viewPos, vec3 viewNormal, float shininess, out vec3 diffuseLight, out vec3 ambientLight, out vec3 specularLight, out vec3 shadowDiffuse, out vec3 shadowSpecular)
 | |
| #endif
 | |
| {
 | |
|     vec3 viewDir = normalize(viewPos);
 | |
|     shininess = max(shininess, 1e-4);
 | |
| 
 | |
|     vec3 sunDir = normalize(lcalcPosition(0));
 | |
|     diffuseLight = lcalcDiffuse(0) * calcLambert(viewNormal, sunDir, viewDir);
 | |
|     ambientLight = gl_LightModel.ambient.xyz;
 | |
|     specularLight = lcalcSpecular(0).xyz * calcSpecIntensity(viewNormal, viewDir, shininess, sunDir);
 | |
| #if PER_PIXEL_LIGHTING
 | |
|     diffuseLight *= shadowing;
 | |
|     specularLight *= shadowing;
 | |
| #else
 | |
|     shadowDiffuse = diffuseLight;
 | |
|     shadowSpecular = specularLight;
 | |
|     diffuseLight = vec3(0.0);
 | |
|     specularLight = vec3(0.0);
 | |
| #endif
 | |
| 
 | |
|     for (int i = @startLight; i < @endLight; ++i)
 | |
|     {
 | |
| #if @lightingMethodUBO
 | |
|         int lightIndex = PointLightIndex[i];
 | |
| #else
 | |
|         int lightIndex = i;
 | |
| #endif
 | |
|         vec3 lightPos = lcalcPosition(lightIndex) - viewPos;
 | |
|         float lightDistance = length(lightPos);
 | |
| 
 | |
|         // cull non-FFP point lighting by radius, light is guaranteed to not fall outside this bound with our cutoff
 | |
| #if !@classicFalloff && !@lightingMethodFFP
 | |
|         if (lightDistance > lcalcRadius(lightIndex) * 2.0)
 | |
|             continue;
 | |
| #endif
 | |
| 
 | |
|         vec3 lightDir = lightPos / lightDistance;
 | |
| 
 | |
|         float illumination = lcalcIllumination(lightIndex, lightDistance);
 | |
|         diffuseLight += lcalcDiffuse(lightIndex) * calcLambert(viewNormal, lightDir, viewDir) * illumination;
 | |
|         ambientLight += lcalcAmbient(lightIndex) * illumination;
 | |
|         specularLight += lcalcSpecular(lightIndex).xyz * calcSpecIntensity(viewNormal, viewDir, shininess, lightDir) * illumination;
 | |
|     }
 | |
| }
 | |
| 
 | |
| #endif
 |