From b0a9044240df88df613dcf134bfb080912864e9f Mon Sep 17 00:00:00 2001
From: Ptolemy <ptolemy@lindenlab.com>
Date: Sun, 11 Sep 2022 21:07:34 -0700
Subject: SL-17701: PBR: Fix alpha blended objects not receving Sun shadow.

---
 .../shaders/class1/deferred/pbralphaF.glsl          | 21 +++++++++++++--------
 .../shaders/class1/deferred/pbralphaV.glsl          | 16 +++++++++++++---
 2 files changed, 26 insertions(+), 11 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl
index c14a30ef39..1533d1dcb0 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl
@@ -76,10 +76,15 @@ uniform vec3 moon_dir;
   #endif
 #endif
 
+#ifdef HAS_SHADOW
+  VARYING vec3 vary_fragcoord;
+  uniform vec2 screen_res;
+#endif
 
 VARYING vec3 vary_position;
 VARYING vec4 vertex_color;
 VARYING vec2 vary_texcoord0;
+
 #ifdef HAS_NORMAL_MAP
 VARYING vec3 vary_normal;
 VARYING vec3 vary_mat0;
@@ -116,6 +121,7 @@ float calcLegacyDistanceAttenuation(float distance, float falloff);
 vec2 getGGX( vec2 brdfPoint );
 void initMaterial( vec3 diffuse, vec3 packedORM,
         out float alphaRough, out vec3 c_diff, out vec3 reflect0, out vec3 reflect90, out float specWeight );
+float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
 void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv, 
         vec3 pos, vec3 norm, float glossiness, float envIntensity);
 
@@ -164,15 +170,8 @@ void main()
     vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir;
     vec3  pos         = vary_position;
 
-#if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)
-    vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
-    scol_ambocc      = pow(scol_ambocc, vec2(light_gamma));
-    float scol       = max(scol_ambocc.r, diffuse.a);
-    float ambocc     = scol_ambocc.g;
-#else
     float scol = 1.0;
     float ambocc = 1.0;
-#endif
 
     vec3 sunlit;
     vec3 amblit;
@@ -211,6 +210,12 @@ void main()
     tnorm = normalize(tnorm.xyz);
     norm.xyz = tnorm.xyz;
 
+#if HAS_SHADOW
+    vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+    frag *= screen_res;
+    scol = sampleDirectionalShadow(pos.xyz, norm.xyz, frag);
+#endif
+
     // RGB = Occlusion, Roughness, Metal
     // default values, see LLViewerFetchedTexture::sWhiteImagep since roughnessFactor and metallicFactor are multiplied in
     //   occlusion 1.0
@@ -308,7 +313,7 @@ irradiance = vec3(amblit);
     vec3 light = vec3(0);
 
     // Punctual lights
-#define LIGHT_LOOP(i) light += calcPointLightOrSpotLight( reflect0, c_diff, srgb_to_linear(light_diffuse[i].rgb), albedo.rgb, pos.xyz, n, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w );
+#define LIGHT_LOOP(i) light += scol * calcPointLightOrSpotLight( reflect0, c_diff, srgb_to_linear(light_diffuse[i].rgb), albedo.rgb, pos.xyz, n, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w );
 
     LIGHT_LOOP(1)
     LIGHT_LOOP(2)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
index 8cc3c11fa1..e0672f09e4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
@@ -46,6 +46,11 @@ uniform mat4 modelview_projection_matrix;
 
 uniform mat4 texture_matrix0;
 
+#ifdef HAS_SHADOW
+VARYING vec3 vary_fragcoord;
+uniform float near_clip;
+#endif
+
 ATTRIBUTE vec3 position;
 ATTRIBUTE vec4 diffuse_color;
 ATTRIBUTE vec3 normal;
@@ -82,12 +87,17 @@ void main()
 #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
 	vary_position = pos;
 #endif
-	gl_Position = projection_matrix*vec4(pos,1.0);
+    vec4 vert = projection_matrix * vec4(pos,1.0);
 #else
 	//transform vertex
-	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); 
+    vec4 vert = modelview_projection_matrix * vec4(position.xyz, 1.0);
 #endif
-	
+    gl_Position = vert;
+
+#if HAS_SHADOW
+    vary_fragcoord.xyz = vert.xyz + vec3(0,0,near_clip);
+#endif
+
 	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
 	
 #ifdef HAS_NORMAL_MAP
-- 
cgit v1.2.3