df shadows
[carveJwlIkooP6JGAAIwe30JlM.git] / shaders / common_world.glsl
index a394acb75b73724666528c640a0698b5ac66b882..da87204bbebe620f803961ae4755b45cf5d0870d 100644 (file)
@@ -74,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 )
@@ -94,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 );
 }