From 23ef4d7f6bfe6a5a91c78822b081a9ea63cb74a6 Mon Sep 17 00:00:00 2001 From: hgn Date: Sat, 28 Jan 2023 07:50:33 +0000 Subject: [PATCH] df shadows --- common.h | 1 + player_device_skate.h | 7 +++++++ shaders/alphatest.h | 33 +++++++++++++++++++++++++++++++-- shaders/common_world.glsl | 17 +++++++++++++++++ shaders/gpos.fs | 2 ++ shaders/gpos.h | 31 ++++++++++++++++++++++++++++++- shaders/route.fs | 2 ++ shaders/route.h | 33 +++++++++++++++++++++++++++++++-- shaders/scoretext.h | 33 +++++++++++++++++++++++++++++++-- shaders/standard.fs | 2 ++ shaders/standard.h | 33 +++++++++++++++++++++++++++++++-- shaders/std_alphatest.fs | 2 ++ shaders/terrain.fs | 2 ++ shaders/terrain.h | 33 +++++++++++++++++++++++++++++++-- shaders/vblend.fs | 2 ++ shaders/vblend.h | 33 +++++++++++++++++++++++++++++++-- shaders/viewchar.fs | 2 ++ shaders/viewchar.h | 33 +++++++++++++++++++++++++++++++-- shaders/water.fs | 2 ++ shaders/water.h | 33 +++++++++++++++++++++++++++++++-- shaders/water_fast.fs | 2 ++ shaders/water_fast.h | 33 +++++++++++++++++++++++++++++++-- skaterift.c | 1 - world_render.h | 13 +++++++++++-- world_routes.h | 2 ++ 25 files changed, 365 insertions(+), 22 deletions(-) diff --git a/common.h b/common.h index 556834d..ff52267 100644 --- 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 { diff --git a/player_device_skate.h b/player_device_skate.h index 168e8ee..d4c1e62 100644 --- a/player_device_skate.h +++ b/player_device_skate.h @@ -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, diff --git a/shaders/alphatest.h b/shaders/alphatest.h index 25e5879..5761c02 100644 --- a/shaders/alphatest.h +++ b/shaders/alphatest.h @@ -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" ); diff --git a/shaders/common_world.glsl b/shaders/common_world.glsl index a394acb..da87204 100644 --- a/shaders/common_world.glsl +++ b/shaders/common_world.glsl @@ -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 ); } diff --git a/shaders/gpos.fs b/shaders/gpos.fs index 77dac50..d76f6e4 100644 --- a/shaders/gpos.fs +++ b/shaders/gpos.fs @@ -1,6 +1,8 @@ out vec4 FragColor; uniform vec3 uCamera; +uniform vec3 uBoard0; +uniform vec3 uBoard1; in vec4 aColour; in vec2 aUv; diff --git a/shaders/gpos.h b/shaders/gpos.h index 2f4440d..e30d276 100644 --- a/shaders/gpos.h +++ b/shaders/gpos.h @@ -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 */ diff --git a/shaders/route.fs b/shaders/route.fs index 3e82be7..2e7db2e 100644 --- a/shaders/route.fs +++ b/shaders/route.fs @@ -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; diff --git a/shaders/route.h b/shaders/route.h index 60b5c5c..0c03368 100644 --- a/shaders/route.h +++ b/shaders/route.h @@ -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 */ diff --git a/shaders/scoretext.h b/shaders/scoretext.h index fea61cc..519dfbe 100644 --- a/shaders/scoretext.h +++ b/shaders/scoretext.h @@ -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 */ diff --git a/shaders/standard.fs b/shaders/standard.fs index 58678f0..321d7ad 100644 --- a/shaders/standard.fs +++ b/shaders/standard.fs @@ -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; diff --git a/shaders/standard.h b/shaders/standard.h index cf61d03..b55a94a 100644 --- a/shaders/standard.h +++ b/shaders/standard.h @@ -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 */ diff --git a/shaders/std_alphatest.fs b/shaders/std_alphatest.fs index b0f18fd..cd22275 100644 --- a/shaders/std_alphatest.fs +++ b/shaders/std_alphatest.fs @@ -1,5 +1,7 @@ uniform sampler2D uTexGarbage; uniform sampler2D uTexMain; +uniform vec3 uBoard0; +uniform vec3 uBoard1; uniform vec3 uCamera; uniform vec4 uPlane; diff --git a/shaders/terrain.fs b/shaders/terrain.fs index 6e01684..3f5cd3a 100644 --- a/shaders/terrain.fs +++ b/shaders/terrain.fs @@ -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; diff --git a/shaders/terrain.h b/shaders/terrain.h index b2730fb..09258e7 100644 --- a/shaders/terrain.h +++ b/shaders/terrain.h @@ -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 */ diff --git a/shaders/vblend.fs b/shaders/vblend.fs index 9eddd6b..b2e9928 100644 --- a/shaders/vblend.fs +++ b/shaders/vblend.fs @@ -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; diff --git a/shaders/vblend.h b/shaders/vblend.h index fd558ef..af2a496 100644 --- a/shaders/vblend.h +++ b/shaders/vblend.h @@ -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 */ diff --git a/shaders/viewchar.fs b/shaders/viewchar.fs index fb98283..3c29360 100644 --- a/shaders/viewchar.fs +++ b/shaders/viewchar.fs @@ -1,5 +1,7 @@ uniform sampler2D uTexMain; uniform vec3 uCamera; +uniform vec3 uBoard0; +uniform vec3 uBoard1; in vec4 aColour; in vec2 aUv; diff --git a/shaders/viewchar.h b/shaders/viewchar.h index f65b5ea..53f073a 100644 --- a/shaders/viewchar.h +++ b/shaders/viewchar.h @@ -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 */ diff --git a/shaders/water.fs b/shaders/water.fs index eced89a..68fc66d 100644 --- a/shaders/water.fs +++ b/shaders/water.fs @@ -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; diff --git a/shaders/water.h b/shaders/water.h index 93dcba8..ff5e6ce 100644 --- a/shaders/water.h +++ b/shaders/water.h @@ -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" ); diff --git a/shaders/water_fast.fs b/shaders/water_fast.fs index 821e47f..5f68c45 100644 --- a/shaders/water_fast.fs +++ b/shaders/water_fast.fs @@ -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; diff --git a/shaders/water_fast.h b/shaders/water_fast.h index 196c71e..90ea5c8 100644 --- a/shaders/water_fast.h +++ b/shaders/water_fast.h @@ -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" ); diff --git a/skaterift.c b/skaterift.c index 0ad5bba..518ac43 100644 --- a/skaterift.c +++ b/skaterift.c @@ -395,7 +395,6 @@ VG_STATIC void render_scene(void) /* Draw world */ glEnable( GL_DEPTH_TEST ); - render_world( &main_camera ); diff --git a/world_render.h b/world_render.h index af20830..e1c17c8 100644 --- a/world_render.h +++ b/world_render.h @@ -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 ); } diff --git a/world_routes.h b/world_routes.h index 7d4ef7c..3aeaf05 100644 --- a/world_routes.h +++ b/world_routes.h @@ -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 ); -- 2.25.1