df shadows
authorhgn <hgodden00@gmail.com>
Sat, 28 Jan 2023 07:50:33 +0000 (07:50 +0000)
committerhgn <hgodden00@gmail.com>
Sat, 28 Jan 2023 07:50:33 +0000 (07:50 +0000)
25 files changed:
common.h
player_device_skate.h
shaders/alphatest.h
shaders/common_world.glsl
shaders/gpos.fs
shaders/gpos.h
shaders/route.fs
shaders/route.h
shaders/scoretext.h
shaders/standard.fs
shaders/standard.h
shaders/std_alphatest.fs
shaders/terrain.fs
shaders/terrain.h
shaders/vblend.fs
shaders/vblend.h
shaders/viewchar.fs
shaders/viewchar.h
shaders/water.fs
shaders/water.h
shaders/water_fast.fs
shaders/water_fast.h
skaterift.c
world_render.h
world_routes.h

index 556834df935b43a11fc4c1814595d029c6851fbb..ff522676c82083b4b1de77a19333bebbe95d57af 100644 (file)
--- a/common.h
+++ b/common.h
@@ -15,6 +15,7 @@
 #include "submodules/anyascii/impl/c/anyascii.c"
 
 #define RESET_MAX_TIME 45.0
+VG_STATIC v3f TEMP_BOARD_0, TEMP_BOARD_1;
 
 enum menu_controller_type
 {
index 168e8ee806c77320ba0d9f5331343a2b71f8b6e8..d4c1e6201803e795fac6382d35c4b3c00792dc79 100644 (file)
@@ -1562,6 +1562,13 @@ VG_STATIC void player_skate_get_camera( player_interface *player,
       skate_camera_thirdperson( player, s, av, cam );
    else
       skate_camera_firstperson( player, s, av, cam );
+
+   /* FIXME: Organize this. Its int wrong fucking place */
+   v3f vp0 = {0.0f,0.1f, 0.6f},
+       vp1 = {0.0f,0.1f,-0.6f};
+
+   m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp0, TEMP_BOARD_0 );
+   m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp1, TEMP_BOARD_1 );
 }
 
 VG_STATIC void player_skate_transport( player_interface *player,
index 25e58795ec18da791c1124970eaca74933978860..5761c02ba4c06b5c4e055cb01e39747198dd6669 100644 (file)
@@ -67,6 +67,8 @@ static struct vg_shader _shader_alphatest = {
 .static_src = 
 "uniform sampler2D uTexGarbage;\n"
 "uniform sampler2D uTexMain;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "uniform vec3 uCamera;\n"
 "uniform vec4 uPlane;\n"
 "\n"
@@ -153,6 +155,16 @@ static struct vg_shader _shader_alphatest = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -173,6 +185,13 @@ static struct vg_shader _shader_alphatest = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -182,7 +201,7 @@ static struct vg_shader _shader_alphatest = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     13        0 \n"
+"#line     15        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -202,7 +221,7 @@ static struct vg_shader _shader_alphatest = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     14        0 \n"
+"#line     16        0 \n"
 "\n"
 "void main()\n"
 "{\n"
@@ -242,6 +261,8 @@ static GLuint _uniform_alphatest_uPv;
 static GLuint _uniform_alphatest_uPvmPrev;
 static GLuint _uniform_alphatest_uTexGarbage;
 static GLuint _uniform_alphatest_uTexMain;
+static GLuint _uniform_alphatest_uBoard0;
+static GLuint _uniform_alphatest_uBoard1;
 static GLuint _uniform_alphatest_uCamera;
 static GLuint _uniform_alphatest_uPlane;
 static GLuint _uniform_alphatest_g_world_depth;
@@ -260,6 +281,12 @@ static void shader_alphatest_uTexGarbage(int i){
 static void shader_alphatest_uTexMain(int i){
    glUniform1i(_uniform_alphatest_uTexMain,i);
 }
+static void shader_alphatest_uBoard0(v3f v){
+   glUniform3fv(_uniform_alphatest_uBoard0,1,v);
+}
+static void shader_alphatest_uBoard1(v3f v){
+   glUniform3fv(_uniform_alphatest_uBoard1,1,v);
+}
 static void shader_alphatest_uCamera(v3f v){
    glUniform3fv(_uniform_alphatest_uCamera,1,v);
 }
@@ -279,6 +306,8 @@ static void shader_alphatest_link(void){
    _uniform_alphatest_uPvmPrev = glGetUniformLocation( _shader_alphatest.id, "uPvmPrev" );
    _uniform_alphatest_uTexGarbage = glGetUniformLocation( _shader_alphatest.id, "uTexGarbage" );
    _uniform_alphatest_uTexMain = glGetUniformLocation( _shader_alphatest.id, "uTexMain" );
+   _uniform_alphatest_uBoard0 = glGetUniformLocation( _shader_alphatest.id, "uBoard0" );
+   _uniform_alphatest_uBoard1 = glGetUniformLocation( _shader_alphatest.id, "uBoard1" );
    _uniform_alphatest_uCamera = glGetUniformLocation( _shader_alphatest.id, "uCamera" );
    _uniform_alphatest_uPlane = glGetUniformLocation( _shader_alphatest.id, "uPlane" );
    _uniform_alphatest_g_world_depth = glGetUniformLocation( _shader_alphatest.id, "g_world_depth" );
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 );
 }
 
index 77dac50175d01bb334342b87a38f1c19c6430dcf..d76f6e4441a1cba10278856de68f822c4ca2bc9d 100644 (file)
@@ -1,6 +1,8 @@
 out vec4 FragColor;
 
 uniform vec3 uCamera;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 
 in vec4 aColour;
 in vec2 aUv;
index 2f4440db78c899b68542ce010f21595c7c5394fc..e30d276cb199377ea611327191621d33a88a7b75 100644 (file)
@@ -68,6 +68,8 @@ static struct vg_shader _shader_gpos = {
 "out vec4 FragColor;\n"
 "\n"
 "uniform vec3 uCamera;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "in vec4 aColour;\n"
 "in vec2 aUv;\n"
@@ -152,6 +154,16 @@ static struct vg_shader _shader_gpos = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -172,6 +184,13 @@ static struct vg_shader _shader_gpos = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -181,7 +200,7 @@ static struct vg_shader _shader_gpos = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     12        0 \n"
+"#line     14        0 \n"
 "\n"
 "// Water blending\n"
 "// ==============\n"
@@ -209,6 +228,8 @@ static GLuint _uniform_gpos_uMdl;
 static GLuint _uniform_gpos_uPv;
 static GLuint _uniform_gpos_uPvmPrev;
 static GLuint _uniform_gpos_uCamera;
+static GLuint _uniform_gpos_uBoard0;
+static GLuint _uniform_gpos_uBoard1;
 static GLuint _uniform_gpos_g_world_depth;
 static void shader_gpos_uMdl(m4x3f m){
    glUniformMatrix4x3fv(_uniform_gpos_uMdl,1,GL_FALSE,(float*)m);
@@ -222,6 +243,12 @@ static void shader_gpos_uPvmPrev(m4x4f m){
 static void shader_gpos_uCamera(v3f v){
    glUniform3fv(_uniform_gpos_uCamera,1,v);
 }
+static void shader_gpos_uBoard0(v3f v){
+   glUniform3fv(_uniform_gpos_uBoard0,1,v);
+}
+static void shader_gpos_uBoard1(v3f v){
+   glUniform3fv(_uniform_gpos_uBoard1,1,v);
+}
 static void shader_gpos_g_world_depth(int i){
    glUniform1i(_uniform_gpos_g_world_depth,i);
 }
@@ -234,6 +261,8 @@ static void shader_gpos_link(void){
    _uniform_gpos_uPv = glGetUniformLocation( _shader_gpos.id, "uPv" );
    _uniform_gpos_uPvmPrev = glGetUniformLocation( _shader_gpos.id, "uPvmPrev" );
    _uniform_gpos_uCamera = glGetUniformLocation( _shader_gpos.id, "uCamera" );
+   _uniform_gpos_uBoard0 = glGetUniformLocation( _shader_gpos.id, "uBoard0" );
+   _uniform_gpos_uBoard1 = glGetUniformLocation( _shader_gpos.id, "uBoard1" );
    _uniform_gpos_g_world_depth = glGetUniformLocation( _shader_gpos.id, "g_world_depth" );
 }
 #endif /* SHADER_gpos_H */
index 3e82be7d679d84cd0cbfe72b8251f32751f7a92e..2e7db2e3826f98570d2d7aeabbba4df3ac0f07f9 100644 (file)
@@ -2,6 +2,8 @@ uniform sampler2D uTexGarbage;
 uniform sampler2D uTexGradients;
 uniform vec3 uCamera;
 uniform vec4 uColour;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 
 in vec4 aColour;
 in vec2 aUv;
index 60b5c5cd2676570f5ad3e0d07b9e0f72cdbeb291..0c03368217c837adf14642171e3c5a783beb5ec5 100644 (file)
@@ -69,6 +69,8 @@ static struct vg_shader _shader_route = {
 "uniform sampler2D uTexGradients;\n"
 "uniform vec3 uCamera;\n"
 "uniform vec4 uColour;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "in vec4 aColour;\n"
 "in vec2 aUv;\n"
@@ -153,6 +155,16 @@ static struct vg_shader _shader_route = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -173,6 +185,13 @@ static struct vg_shader _shader_route = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -182,7 +201,7 @@ static struct vg_shader _shader_route = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     13        0 \n"
+"#line     15        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -202,7 +221,7 @@ static struct vg_shader _shader_route = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     14        0 \n"
+"#line     16        0 \n"
 "\n"
 "void main()\n"
 "{\n"
@@ -257,6 +276,8 @@ static GLuint _uniform_route_uTexGarbage;
 static GLuint _uniform_route_uTexGradients;
 static GLuint _uniform_route_uCamera;
 static GLuint _uniform_route_uColour;
+static GLuint _uniform_route_uBoard0;
+static GLuint _uniform_route_uBoard1;
 static GLuint _uniform_route_g_world_depth;
 static void shader_route_uMdl(m4x3f m){
    glUniformMatrix4x3fv(_uniform_route_uMdl,1,GL_FALSE,(float*)m);
@@ -279,6 +300,12 @@ static void shader_route_uCamera(v3f v){
 static void shader_route_uColour(v4f v){
    glUniform4fv(_uniform_route_uColour,1,v);
 }
+static void shader_route_uBoard0(v3f v){
+   glUniform3fv(_uniform_route_uBoard0,1,v);
+}
+static void shader_route_uBoard1(v3f v){
+   glUniform3fv(_uniform_route_uBoard1,1,v);
+}
 static void shader_route_g_world_depth(int i){
    glUniform1i(_uniform_route_g_world_depth,i);
 }
@@ -294,6 +321,8 @@ static void shader_route_link(void){
    _uniform_route_uTexGradients = glGetUniformLocation( _shader_route.id, "uTexGradients" );
    _uniform_route_uCamera = glGetUniformLocation( _shader_route.id, "uCamera" );
    _uniform_route_uColour = glGetUniformLocation( _shader_route.id, "uColour" );
+   _uniform_route_uBoard0 = glGetUniformLocation( _shader_route.id, "uBoard0" );
+   _uniform_route_uBoard1 = glGetUniformLocation( _shader_route.id, "uBoard1" );
    _uniform_route_g_world_depth = glGetUniformLocation( _shader_route.id, "g_world_depth" );
 }
 #endif /* SHADER_route_H */
index fea61cc0a68631d47539ae05e13432949c47c263..519dfbeef40b763730bf9eaf1cae911916ddf2d5 100644 (file)
@@ -90,6 +90,8 @@ static struct vg_shader _shader_scoretext = {
 "uniform sampler2D uTexGarbage;\n"
 "uniform sampler2D uTexGradients;\n"
 "uniform vec3 uCamera;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "in vec4 aColour;\n"
 "in vec2 aUv;\n"
@@ -174,6 +176,16 @@ static struct vg_shader _shader_scoretext = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -194,6 +206,13 @@ static struct vg_shader _shader_scoretext = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -203,7 +222,7 @@ static struct vg_shader _shader_scoretext = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     12        0 \n"
+"#line     14        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -223,7 +242,7 @@ static struct vg_shader _shader_scoretext = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     13        0 \n"
+"#line     15        0 \n"
 "\n"
 "void main()\n"
 "{\n"
@@ -279,6 +298,8 @@ static GLuint _uniform_scoretext_uInfo;
 static GLuint _uniform_scoretext_uTexGarbage;
 static GLuint _uniform_scoretext_uTexGradients;
 static GLuint _uniform_scoretext_uCamera;
+static GLuint _uniform_scoretext_uBoard0;
+static GLuint _uniform_scoretext_uBoard1;
 static GLuint _uniform_scoretext_g_world_depth;
 static void shader_scoretext_uMdl(m4x3f m){
    glUniformMatrix4x3fv(_uniform_scoretext_uMdl,1,GL_FALSE,(float*)m);
@@ -301,6 +322,12 @@ static void shader_scoretext_uTexGradients(int i){
 static void shader_scoretext_uCamera(v3f v){
    glUniform3fv(_uniform_scoretext_uCamera,1,v);
 }
+static void shader_scoretext_uBoard0(v3f v){
+   glUniform3fv(_uniform_scoretext_uBoard0,1,v);
+}
+static void shader_scoretext_uBoard1(v3f v){
+   glUniform3fv(_uniform_scoretext_uBoard1,1,v);
+}
 static void shader_scoretext_g_world_depth(int i){
    glUniform1i(_uniform_scoretext_g_world_depth,i);
 }
@@ -316,6 +343,8 @@ static void shader_scoretext_link(void){
    _uniform_scoretext_uTexGarbage = glGetUniformLocation( _shader_scoretext.id, "uTexGarbage" );
    _uniform_scoretext_uTexGradients = glGetUniformLocation( _shader_scoretext.id, "uTexGradients" );
    _uniform_scoretext_uCamera = glGetUniformLocation( _shader_scoretext.id, "uCamera" );
+   _uniform_scoretext_uBoard0 = glGetUniformLocation( _shader_scoretext.id, "uBoard0" );
+   _uniform_scoretext_uBoard1 = glGetUniformLocation( _shader_scoretext.id, "uBoard1" );
    _uniform_scoretext_g_world_depth = glGetUniformLocation( _shader_scoretext.id, "g_world_depth" );
 }
 #endif /* SHADER_scoretext_H */
index 58678f01195a3ff47fc4711ee45e7ed988080477..321d7ada7833b84785d423a392c08e37886934ed 100644 (file)
@@ -2,6 +2,8 @@ uniform sampler2D uTexGarbage;
 uniform sampler2D uTexMain;
 uniform vec3 uCamera;
 uniform vec4 uPlane;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 
 in vec4 aColour;
 in vec2 aUv;
index cf61d03be700cc16df6532698314bcba747c1c2d..b55a94abc2f8122c3fd5ec9b1288b835bf8317b6 100644 (file)
@@ -69,6 +69,8 @@ static struct vg_shader _shader_standard = {
 "uniform sampler2D uTexMain;\n"
 "uniform vec3 uCamera;\n"
 "uniform vec4 uPlane;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "in vec4 aColour;\n"
 "in vec2 aUv;\n"
@@ -153,6 +155,16 @@ static struct vg_shader _shader_standard = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -173,6 +185,13 @@ static struct vg_shader _shader_standard = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -182,7 +201,7 @@ static struct vg_shader _shader_standard = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     13        0 \n"
+"#line     15        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -202,7 +221,7 @@ static struct vg_shader _shader_standard = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     14        0 \n"
+"#line     16        0 \n"
 "\n"
 "void main()\n"
 "{\n"
@@ -241,6 +260,8 @@ static GLuint _uniform_standard_uTexGarbage;
 static GLuint _uniform_standard_uTexMain;
 static GLuint _uniform_standard_uCamera;
 static GLuint _uniform_standard_uPlane;
+static GLuint _uniform_standard_uBoard0;
+static GLuint _uniform_standard_uBoard1;
 static GLuint _uniform_standard_g_world_depth;
 static void shader_standard_uMdl(m4x3f m){
    glUniformMatrix4x3fv(_uniform_standard_uMdl,1,GL_FALSE,(float*)m);
@@ -263,6 +284,12 @@ static void shader_standard_uCamera(v3f v){
 static void shader_standard_uPlane(v4f v){
    glUniform4fv(_uniform_standard_uPlane,1,v);
 }
+static void shader_standard_uBoard0(v3f v){
+   glUniform3fv(_uniform_standard_uBoard0,1,v);
+}
+static void shader_standard_uBoard1(v3f v){
+   glUniform3fv(_uniform_standard_uBoard1,1,v);
+}
 static void shader_standard_g_world_depth(int i){
    glUniform1i(_uniform_standard_g_world_depth,i);
 }
@@ -278,6 +305,8 @@ static void shader_standard_link(void){
    _uniform_standard_uTexMain = glGetUniformLocation( _shader_standard.id, "uTexMain" );
    _uniform_standard_uCamera = glGetUniformLocation( _shader_standard.id, "uCamera" );
    _uniform_standard_uPlane = glGetUniformLocation( _shader_standard.id, "uPlane" );
+   _uniform_standard_uBoard0 = glGetUniformLocation( _shader_standard.id, "uBoard0" );
+   _uniform_standard_uBoard1 = glGetUniformLocation( _shader_standard.id, "uBoard1" );
    _uniform_standard_g_world_depth = glGetUniformLocation( _shader_standard.id, "g_world_depth" );
 }
 #endif /* SHADER_standard_H */
index b0f18fd1db484d651a77685ac826543474ae6862..cd22275fee1897942d7aa9b2662fc1f5c8535be5 100644 (file)
@@ -1,5 +1,7 @@
 uniform sampler2D uTexGarbage;
 uniform sampler2D uTexMain;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 uniform vec3 uCamera;
 uniform vec4 uPlane;
 
index 6e01684cf9b85bb3825436488f5c2fc2c770e2de..3f5cd3abdf28a3a43a80a9a5ead999fd35764e1b 100644 (file)
@@ -3,6 +3,8 @@ uniform sampler2D uTexGradients;
 uniform vec3 uCamera;
 uniform vec3 uSandColour;
 uniform vec2 uBlendOffset;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 
 in vec4 aColour;
 in vec2 aUv;
index b2730fba9ebc4ab69ed67f166affcba6aefada36..09258e744221022a5961ee9b753ea18756b3f796 100644 (file)
@@ -70,6 +70,8 @@ static struct vg_shader _shader_terrain = {
 "uniform vec3 uCamera;\n"
 "uniform vec3 uSandColour;\n"
 "uniform vec2 uBlendOffset;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "in vec4 aColour;\n"
 "in vec2 aUv;\n"
@@ -154,6 +156,16 @@ static struct vg_shader _shader_terrain = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -174,6 +186,13 @@ static struct vg_shader _shader_terrain = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -183,7 +202,7 @@ static struct vg_shader _shader_terrain = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     14        0 \n"
+"#line     16        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -203,7 +222,7 @@ static struct vg_shader _shader_terrain = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     15        0 \n"
+"#line     17        0 \n"
 "\n"
 "void main()\n"
 "{\n"
@@ -263,6 +282,8 @@ static GLuint _uniform_terrain_uTexGradients;
 static GLuint _uniform_terrain_uCamera;
 static GLuint _uniform_terrain_uSandColour;
 static GLuint _uniform_terrain_uBlendOffset;
+static GLuint _uniform_terrain_uBoard0;
+static GLuint _uniform_terrain_uBoard1;
 static GLuint _uniform_terrain_g_world_depth;
 static void shader_terrain_uMdl(m4x3f m){
    glUniformMatrix4x3fv(_uniform_terrain_uMdl,1,GL_FALSE,(float*)m);
@@ -288,6 +309,12 @@ static void shader_terrain_uSandColour(v3f v){
 static void shader_terrain_uBlendOffset(v2f v){
    glUniform2fv(_uniform_terrain_uBlendOffset,1,v);
 }
+static void shader_terrain_uBoard0(v3f v){
+   glUniform3fv(_uniform_terrain_uBoard0,1,v);
+}
+static void shader_terrain_uBoard1(v3f v){
+   glUniform3fv(_uniform_terrain_uBoard1,1,v);
+}
 static void shader_terrain_g_world_depth(int i){
    glUniform1i(_uniform_terrain_g_world_depth,i);
 }
@@ -304,6 +331,8 @@ static void shader_terrain_link(void){
    _uniform_terrain_uCamera = glGetUniformLocation( _shader_terrain.id, "uCamera" );
    _uniform_terrain_uSandColour = glGetUniformLocation( _shader_terrain.id, "uSandColour" );
    _uniform_terrain_uBlendOffset = glGetUniformLocation( _shader_terrain.id, "uBlendOffset" );
+   _uniform_terrain_uBoard0 = glGetUniformLocation( _shader_terrain.id, "uBoard0" );
+   _uniform_terrain_uBoard1 = glGetUniformLocation( _shader_terrain.id, "uBoard1" );
    _uniform_terrain_g_world_depth = glGetUniformLocation( _shader_terrain.id, "g_world_depth" );
 }
 #endif /* SHADER_terrain_H */
index 9eddd6b7f25ecff0c36a32226413cf905c153024..b2e9928777566ecb335d0b419c93c44257abcb76 100644 (file)
@@ -1,6 +1,8 @@
 uniform sampler2D uTexGarbage;
 uniform sampler2D uTexGradients;
 uniform vec3 uCamera;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 
 in vec4 aColour;
 in vec2 aUv;
index fd558ef8acdd3798829f4ce5d9173a982ec98158..af2a4967d85fd4974742de68ea9376630972e1e9 100644 (file)
@@ -68,6 +68,8 @@ static struct vg_shader _shader_vblend = {
 "uniform sampler2D uTexGarbage;\n"
 "uniform sampler2D uTexGradients;\n"
 "uniform vec3 uCamera;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "in vec4 aColour;\n"
 "in vec2 aUv;\n"
@@ -152,6 +154,16 @@ static struct vg_shader _shader_vblend = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -172,6 +184,13 @@ static struct vg_shader _shader_vblend = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -181,7 +200,7 @@ static struct vg_shader _shader_vblend = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     12        0 \n"
+"#line     14        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -201,7 +220,7 @@ static struct vg_shader _shader_vblend = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     13        0 \n"
+"#line     15        0 \n"
 "\n"
 "void main()\n"
 "{\n"
@@ -256,6 +275,8 @@ static GLuint _uniform_vblend_uPvmPrev;
 static GLuint _uniform_vblend_uTexGarbage;
 static GLuint _uniform_vblend_uTexGradients;
 static GLuint _uniform_vblend_uCamera;
+static GLuint _uniform_vblend_uBoard0;
+static GLuint _uniform_vblend_uBoard1;
 static GLuint _uniform_vblend_g_world_depth;
 static void shader_vblend_uMdl(m4x3f m){
    glUniformMatrix4x3fv(_uniform_vblend_uMdl,1,GL_FALSE,(float*)m);
@@ -275,6 +296,12 @@ static void shader_vblend_uTexGradients(int i){
 static void shader_vblend_uCamera(v3f v){
    glUniform3fv(_uniform_vblend_uCamera,1,v);
 }
+static void shader_vblend_uBoard0(v3f v){
+   glUniform3fv(_uniform_vblend_uBoard0,1,v);
+}
+static void shader_vblend_uBoard1(v3f v){
+   glUniform3fv(_uniform_vblend_uBoard1,1,v);
+}
 static void shader_vblend_g_world_depth(int i){
    glUniform1i(_uniform_vblend_g_world_depth,i);
 }
@@ -289,6 +316,8 @@ static void shader_vblend_link(void){
    _uniform_vblend_uTexGarbage = glGetUniformLocation( _shader_vblend.id, "uTexGarbage" );
    _uniform_vblend_uTexGradients = glGetUniformLocation( _shader_vblend.id, "uTexGradients" );
    _uniform_vblend_uCamera = glGetUniformLocation( _shader_vblend.id, "uCamera" );
+   _uniform_vblend_uBoard0 = glGetUniformLocation( _shader_vblend.id, "uBoard0" );
+   _uniform_vblend_uBoard1 = glGetUniformLocation( _shader_vblend.id, "uBoard1" );
    _uniform_vblend_g_world_depth = glGetUniformLocation( _shader_vblend.id, "g_world_depth" );
 }
 #endif /* SHADER_vblend_H */
index fb98283b0d6dd080679f1074783fe9bf49d62f64..3c2936018f185e1afbd65ef197bb01332c9cf088 100644 (file)
@@ -1,5 +1,7 @@
 uniform sampler2D uTexMain;
 uniform vec3 uCamera;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 
 in vec4 aColour;
 in vec2 aUv;
index f65b5eaa3eb27c02dc54c72855b65cf1978c3a28..53f073a2c6a5fd53ee4b7113ce91279a90626017 100644 (file)
@@ -78,6 +78,8 @@ static struct vg_shader _shader_viewchar = {
 .static_src = 
 "uniform sampler2D uTexMain;\n"
 "uniform vec3 uCamera;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "in vec4 aColour;\n"
 "in vec2 aUv;\n"
@@ -162,6 +164,16 @@ static struct vg_shader _shader_viewchar = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -182,6 +194,13 @@ static struct vg_shader _shader_viewchar = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -191,7 +210,7 @@ static struct vg_shader _shader_viewchar = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     11        0 \n"
+"#line     13        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -211,7 +230,7 @@ static struct vg_shader _shader_viewchar = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     12        0 \n"
+"#line     14        0 \n"
 "\n"
 "void main()\n"
 "{\n"
@@ -242,6 +261,8 @@ static GLuint _uniform_viewchar_uPv;
 static GLuint _uniform_viewchar_uTransforms;
 static GLuint _uniform_viewchar_uTexMain;
 static GLuint _uniform_viewchar_uCamera;
+static GLuint _uniform_viewchar_uBoard0;
+static GLuint _uniform_viewchar_uBoard1;
 static GLuint _uniform_viewchar_g_world_depth;
 static void shader_viewchar_uPv(m4x4f m){
    glUniformMatrix4fv(_uniform_viewchar_uPv,1,GL_FALSE,(float*)m);
@@ -252,6 +273,12 @@ static void shader_viewchar_uTexMain(int i){
 static void shader_viewchar_uCamera(v3f v){
    glUniform3fv(_uniform_viewchar_uCamera,1,v);
 }
+static void shader_viewchar_uBoard0(v3f v){
+   glUniform3fv(_uniform_viewchar_uBoard0,1,v);
+}
+static void shader_viewchar_uBoard1(v3f v){
+   glUniform3fv(_uniform_viewchar_uBoard1,1,v);
+}
 static void shader_viewchar_g_world_depth(int i){
    glUniform1i(_uniform_viewchar_g_world_depth,i);
 }
@@ -264,6 +291,8 @@ static void shader_viewchar_link(void){
    _uniform_viewchar_uTransforms = glGetUniformLocation( _shader_viewchar.id, "uTransforms" );
    _uniform_viewchar_uTexMain = glGetUniformLocation( _shader_viewchar.id, "uTexMain" );
    _uniform_viewchar_uCamera = glGetUniformLocation( _shader_viewchar.id, "uCamera" );
+   _uniform_viewchar_uBoard0 = glGetUniformLocation( _shader_viewchar.id, "uBoard0" );
+   _uniform_viewchar_uBoard1 = glGetUniformLocation( _shader_viewchar.id, "uBoard1" );
    _uniform_viewchar_g_world_depth = glGetUniformLocation( _shader_viewchar.id, "g_world_depth" );
 }
 #endif /* SHADER_viewchar_H */
index eced89aef82cb4e6eedc85f305bda45374a11202..68fc66da863796327914985805df75c1ea1eac89 100644 (file)
@@ -6,6 +6,8 @@ uniform vec2 uInvRes;
 uniform float uTime;
 uniform vec3 uCamera;
 uniform float uSurfaceY;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 
 uniform vec3 uShoreColour;
 uniform vec3 uOceanColour;
index 93dcba858e07048a0ecdba1a9247ffd05cceb3c3..ff5e6ced89ff24a97337487bcc5dd1cfee34e3b3 100644 (file)
@@ -73,6 +73,8 @@ static struct vg_shader _shader_water = {
 "uniform float uTime;\n"
 "uniform vec3 uCamera;\n"
 "uniform float uSurfaceY;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "uniform vec3 uShoreColour;\n"
 "uniform vec3 uOceanColour;\n"
@@ -160,6 +162,16 @@ static struct vg_shader _shader_water = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -180,6 +192,13 @@ static struct vg_shader _shader_water = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -189,7 +208,7 @@ static struct vg_shader _shader_water = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     20        0 \n"
+"#line     22        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -209,7 +228,7 @@ static struct vg_shader _shader_water = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     21        0 \n"
+"#line     23        0 \n"
 "\n"
 "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue, \n"
 "      vec4 beneath, vec4 above )\n"
@@ -282,6 +301,8 @@ static GLuint _uniform_water_uInvRes;
 static GLuint _uniform_water_uTime;
 static GLuint _uniform_water_uCamera;
 static GLuint _uniform_water_uSurfaceY;
+static GLuint _uniform_water_uBoard0;
+static GLuint _uniform_water_uBoard1;
 static GLuint _uniform_water_uShoreColour;
 static GLuint _uniform_water_uOceanColour;
 static GLuint _uniform_water_g_world_depth;
@@ -315,6 +336,12 @@ static void shader_water_uCamera(v3f v){
 static void shader_water_uSurfaceY(float f){
    glUniform1f(_uniform_water_uSurfaceY,f);
 }
+static void shader_water_uBoard0(v3f v){
+   glUniform3fv(_uniform_water_uBoard0,1,v);
+}
+static void shader_water_uBoard1(v3f v){
+   glUniform3fv(_uniform_water_uBoard1,1,v);
+}
 static void shader_water_uShoreColour(v3f v){
    glUniform3fv(_uniform_water_uShoreColour,1,v);
 }
@@ -339,6 +366,8 @@ static void shader_water_link(void){
    _uniform_water_uTime = glGetUniformLocation( _shader_water.id, "uTime" );
    _uniform_water_uCamera = glGetUniformLocation( _shader_water.id, "uCamera" );
    _uniform_water_uSurfaceY = glGetUniformLocation( _shader_water.id, "uSurfaceY" );
+   _uniform_water_uBoard0 = glGetUniformLocation( _shader_water.id, "uBoard0" );
+   _uniform_water_uBoard1 = glGetUniformLocation( _shader_water.id, "uBoard1" );
    _uniform_water_uShoreColour = glGetUniformLocation( _shader_water.id, "uShoreColour" );
    _uniform_water_uOceanColour = glGetUniformLocation( _shader_water.id, "uOceanColour" );
    _uniform_water_g_world_depth = glGetUniformLocation( _shader_water.id, "g_world_depth" );
index 821e47f9269bbae32acf186f2b88238f210042b1..5f68c452dc363c26e8768277094c6e60e32d5e34 100644 (file)
@@ -3,6 +3,8 @@ uniform sampler2D uTexDudv;
 uniform float uTime;
 uniform vec3 uCamera;
 uniform float uSurfaceY;
+uniform vec3 uBoard0;
+uniform vec3 uBoard1;
 
 uniform vec3 uShoreColour;
 uniform vec3 uOceanColour;
index 196c71ee738a0adea3e3f5860dccde17da6fab71..90ea5c8023973d2559dca0cdcbe58a8f01cc1f32 100644 (file)
@@ -70,6 +70,8 @@ static struct vg_shader _shader_water_fast = {
 "uniform float uTime;\n"
 "uniform vec3 uCamera;\n"
 "uniform float uSurfaceY;\n"
+"uniform vec3 uBoard0;\n"
+"uniform vec3 uBoard1;\n"
 "\n"
 "uniform vec3 uShoreColour;\n"
 "uniform vec3 uOceanColour;\n"
@@ -157,6 +159,16 @@ static struct vg_shader _shader_water_fast = {
 "   return mix( vfrag, g_ambient_colour.rgb, faccum );\n"
 "}\n"
 "\n"
+"// FIXME\n"
+"float sdLine( vec3 p, vec3 a, vec3 b )\n"
+"{\n"
+"  vec3 pa = p - a;\n"
+"  vec3 ba = b - a;\n"
+"\n"
+"  float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\n"
+"  return length( pa - ba*h );\n"
+"}\n"
+"\n"
 "vec3 do_light_shadowing( vec3 vfrag )\n"
 "{\n"
 "   if( g_shadow_samples == 0 )\n"
@@ -177,6 +189,13 @@ static struct vg_shader _shader_water_fast = {
 "   famt+=shadow_sample((vdir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n"
 "   famt+=shadow_sample((vdir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n"
+"\n"
+"   // player shadow\n"
+"   float dist_to_player = max( 0.0, sdLine( aWorldCo, uBoard0, uBoard1 )-0.03 );\n"
+"   float player_shadow = max( 1.0-dist_to_player*1.7, 0.0 );\n"
+"   player_shadow *= player_shadow*player_shadow*player_shadow;\n"
+"\n"
+"   famt = max( player_shadow*0.6, famt );\n"
 "   return mix( vfrag, g_ambient_colour.rgb, famt );\n"
 "}\n"
 "\n"
@@ -186,7 +205,7 @@ static struct vg_shader _shader_water_fast = {
 "   return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n"
 "}\n"
 "\n"
-"#line     17        0 \n"
+"#line     19        0 \n"
 "#line       1        2 \n"
 "const float k_motion_lerp_amount = 0.01;\n"
 "\n"
@@ -206,7 +225,7 @@ static struct vg_shader _shader_water_fast = {
 "   oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n"
 "}\n"
 "\n"
-"#line     18        0 \n"
+"#line     20        0 \n"
 "\n"
 "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue )\n"
 "{\n"
@@ -261,6 +280,8 @@ static GLuint _uniform_water_fast_uTexDudv;
 static GLuint _uniform_water_fast_uTime;
 static GLuint _uniform_water_fast_uCamera;
 static GLuint _uniform_water_fast_uSurfaceY;
+static GLuint _uniform_water_fast_uBoard0;
+static GLuint _uniform_water_fast_uBoard1;
 static GLuint _uniform_water_fast_uShoreColour;
 static GLuint _uniform_water_fast_uOceanColour;
 static GLuint _uniform_water_fast_g_world_depth;
@@ -285,6 +306,12 @@ static void shader_water_fast_uCamera(v3f v){
 static void shader_water_fast_uSurfaceY(float f){
    glUniform1f(_uniform_water_fast_uSurfaceY,f);
 }
+static void shader_water_fast_uBoard0(v3f v){
+   glUniform3fv(_uniform_water_fast_uBoard0,1,v);
+}
+static void shader_water_fast_uBoard1(v3f v){
+   glUniform3fv(_uniform_water_fast_uBoard1,1,v);
+}
 static void shader_water_fast_uShoreColour(v3f v){
    glUniform3fv(_uniform_water_fast_uShoreColour,1,v);
 }
@@ -306,6 +333,8 @@ static void shader_water_fast_link(void){
    _uniform_water_fast_uTime = glGetUniformLocation( _shader_water_fast.id, "uTime" );
    _uniform_water_fast_uCamera = glGetUniformLocation( _shader_water_fast.id, "uCamera" );
    _uniform_water_fast_uSurfaceY = glGetUniformLocation( _shader_water_fast.id, "uSurfaceY" );
+   _uniform_water_fast_uBoard0 = glGetUniformLocation( _shader_water_fast.id, "uBoard0" );
+   _uniform_water_fast_uBoard1 = glGetUniformLocation( _shader_water_fast.id, "uBoard1" );
    _uniform_water_fast_uShoreColour = glGetUniformLocation( _shader_water_fast.id, "uShoreColour" );
    _uniform_water_fast_uOceanColour = glGetUniformLocation( _shader_water_fast.id, "uOceanColour" );
    _uniform_water_fast_g_world_depth = glGetUniformLocation( _shader_water_fast.id, "g_world_depth" );
index 0ad5bba4838186909bf1687176005976b2a7b617..518ac439995c8dd39c42764e4217b9ae4161ebd6 100644 (file)
@@ -395,7 +395,6 @@ VG_STATIC void render_scene(void)
 
    /* Draw world */
    glEnable( GL_DEPTH_TEST );
-
    render_world( &main_camera );
 
 
index af20830cd0f6d388ca7abcdb58bba139769d5bf9..e1c17c828ee9824e4408b3869a470459bc8d36c0 100644 (file)
@@ -8,8 +8,9 @@
 #include "camera.h"
 #include "world.h"
 
-vg_tex2d tex_terrain_noise = { .path = "textures/garbage.qoi",
-                                 .flags = VG_TEXTURE_NEAREST };
+/* FIXME */
+VG_STATIC vg_tex2d tex_terrain_noise = { .path = "textures/garbage.qoi",
+                                         .flags = VG_TEXTURE_NEAREST };
 
 VG_STATIC void world_render_init(void)
 {
@@ -93,6 +94,8 @@ VG_STATIC void render_world_vb( camera *cam )
    shader_vblend_uPvmPrev( cam->mtx_prev.pv );
    shader_vblend_uMdl( identity_matrix );
    shader_vblend_uCamera( cam->transform[3] );
+   shader_vblend_uBoard0( TEMP_BOARD_0 );
+   shader_vblend_uBoard1( TEMP_BOARD_1 );
 
    world_render_both_stages( k_shader_standard_vertex_blend, 
                              bindpoint_diffuse_texture1 );
@@ -113,6 +116,8 @@ VG_STATIC void render_world_standard( camera *cam )
 
    shader_standard_uMdl( identity_matrix );
    shader_standard_uCamera( cam->transform[3] );
+   shader_standard_uBoard0( TEMP_BOARD_0 );
+   shader_standard_uBoard1( TEMP_BOARD_1 );
    
    world_render_both_stages( k_shader_standard,
                              bindpoint_diffuse_texture1 );
@@ -133,6 +138,8 @@ VG_STATIC void render_world_alphatest( camera *cam )
 
    shader_alphatest_uMdl( identity_matrix );
    shader_alphatest_uCamera( cam->transform[3] );
+   shader_alphatest_uBoard0( TEMP_BOARD_0 );
+   shader_alphatest_uBoard1( TEMP_BOARD_1 );
 
    glDisable(GL_CULL_FACE);
    
@@ -168,6 +175,8 @@ VG_STATIC void render_terrain( camera *cam )
 
    shader_terrain_uMdl( identity_matrix );
    shader_terrain_uCamera( cam->transform[3] );
+   shader_terrain_uBoard0( TEMP_BOARD_0 );
+   shader_terrain_uBoard1( TEMP_BOARD_1 );
 
    world_render_both_stages( k_shader_terrain_blend, bindpoint_terrain );
 }
index 7d4ef7c7778b8fd53cf17622595d9371aea05dd8..3aeaf05e931afe3885f880ee6772bcef1c9f7352 100644 (file)
@@ -1146,6 +1146,8 @@ VG_STATIC void render_world_routes( camera *cam )
    shader_route_uPvmPrev( cam->mtx_prev.pv );
    shader_route_uMdl( identity_matrix );
    shader_route_uCamera( cam->transform[3] );
+   shader_route_uBoard0( TEMP_BOARD_0 );
+   shader_route_uBoard1( TEMP_BOARD_1 );
 
    mesh_bind( &world.mesh_route_lines );