df shadows
[carveJwlIkooP6JGAAIwe30JlM.git] / shaders / common_world.glsl
index d7b3ccfefc0741947a9bcd380b64e44e24d4a23a..da87204bbebe620f803961ae4755b45cf5d0870d 100644 (file)
@@ -1,3 +1,5 @@
+layout (location = 0) out vec4 oColour;
+
 layout (std140) uniform ub_world_lighting
 {
    vec4 g_light_colours[3];
@@ -72,6 +74,16 @@ vec3 do_light_shadowing_old( vec3 vfrag )
    return mix( vfrag, g_ambient_colour.rgb, faccum );
 }
 
+// FIXME
+float sdLine( vec3 p, vec3 a, vec3 b )
+{
+  vec3 pa = p - a;
+  vec3 ba = b - a;
+
+  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
+  return length( pa - ba*h );
+}
+
 vec3 do_light_shadowing( vec3 vfrag )
 {
    if( g_shadow_samples == 0 )
@@ -92,6 +104,13 @@ vec3 do_light_shadowing( vec3 vfrag )
    famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);
    famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);
    famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);
+
+   // player shadow
+   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );
+   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );
+   player_shadow *= player_shadow*player_shadow*player_shadow;
+
+   famt = max( player_shadow*0.6, famt );
    return mix( vfrag, g_ambient_colour.rgb, famt );
 }