From: hgn Date: Fri, 1 Dec 2023 02:38:07 +0000 (+0000) Subject: foliage windy shader X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=e311bbe2fa903a7e2a922f202f389b799193195d;p=carveJwlIkooP6JGAAIwe30JlM.git foliage windy shader --- diff --git a/blender_export.py b/blender_export.py index cc0eb21..e9b7a1e 100644 --- a/blender_export.py +++ b/blender_export.py @@ -872,6 +872,7 @@ def sr_compile_material( mat ):#{ if mat.SR_data.shader == 'standard': m.shader = 0 if mat.SR_data.shader == 'standard_cutout': m.shader = 1 + if mat.SR_data.shader == 'foliage': m.shader = 10 if mat.SR_data.shader == 'terrain_blend':#{ m.shader = 2 @@ -931,7 +932,8 @@ def sr_compile_material( mat ):#{ #} if mat.SR_data.shader in ['standard', 'standard_cutout', 'terrain_blend', \ - 'vertex_blend', 'fxglow', 'cubemap' ]: #{ + 'vertex_blend', 'fxglow', 'cubemap', \ + 'foliage' ]: #{ if 'tex_diffuse' in inf: m.tex_diffuse = sr_compile_texture(inf['tex_diffuse']) #} @@ -3655,7 +3657,8 @@ class SR_MATERIAL_PROPERTIES(bpy.types.PropertyGroup): ('boundary','Boundary',''), ('fxglow','FX Glow',''), ('cubemap','Cubemap',''), - ('walking','Walking','') + ('walking','Walking',''), + ('foliage','Foliage','') ]) surface_prop: bpy.props.EnumProperty( diff --git a/build.c b/build.c index addff9e..cd721e7 100644 --- a/build.c +++ b/build.c @@ -199,6 +199,9 @@ int main( int argc, char *argv[] ){ if( vg_long_opt( "clang-aadb-edit" ) ) build_aadb_edit( k_compiler_clang ); + if( vg_long_opt( "clang-demo" ) ) + build_game( k_compiler_clang ); + if( vg_long_opt( "clean" ) ) vg_build_clean(); @@ -245,6 +248,7 @@ void build_shaders(void){ /* Scene */ _S( "scene_standard", "scene.vs", "scene_standard.fs" ); _S( "scene_standard_alphatest", "scene.vs", "scene_standard_alphatest.fs" ); + _S( "scene_foliage", "scene_foliage.vs", "scene_foliage.fs" ); _S( "scene_override", "scene_override.vs", "scene_override.fs" ); _S( "scene_fxglow", "scene_fxglow.vs", "scene_fxglow.fs" ); _S( "scene_vertex_blend", "scene.vs", "scene_vertex_blend.fs" ); diff --git a/maps_src/dev_tutorial/main.mdl b/maps_src/dev_tutorial/main.mdl index 5ee4be4..cebd583 100644 Binary files a/maps_src/dev_tutorial/main.mdl and b/maps_src/dev_tutorial/main.mdl differ diff --git a/model.h b/model.h index 4760794..a182e51 100644 --- a/model.h +++ b/model.h @@ -20,6 +20,8 @@ enum mdl_shader{ k_shader_boundary = 6, k_shader_fxglow = 7, k_shader_cubemap = 8, + k_shader_walking = 9, + k_shader_foliage = 10, k_shader_override = 30000 }; diff --git a/shaders/light_clearskies.glsl b/shaders/light_clearskies.glsl index 0af3be0..1bd2469 100644 --- a/shaders/light_clearskies.glsl +++ b/shaders/light_clearskies.glsl @@ -107,8 +107,9 @@ vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview ) g_sunset_phase ); vec3 sky_reflection = 0.5 * fresnel * reflect_colour; - vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) - * g_sun_colour.rgb * g_day_phase; + vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, + dot(normal,g_sun_dir.xyz)*0.75+0.25 + ) * g_sun_colour.rgb * g_day_phase; float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) ); vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, diff --git a/shaders/light_clearskies_stddef.glsl b/shaders/light_clearskies_stddef.glsl new file mode 100644 index 0000000..24ba443 --- /dev/null +++ b/shaders/light_clearskies_stddef.glsl @@ -0,0 +1,2 @@ +// :D +const float CLEARSKIES_LIGHT_DOT_MIN = 0.0; diff --git a/shaders/model_board_view.h b/shaders/model_board_view.h index a131124..a50e9d5 100644 --- a/shaders/model_board_view.h +++ b/shaders/model_board_view.h @@ -76,6 +76,11 @@ static struct vg_shader _shader_model_board_view = { "in vec3 aWorldCo;\n" "\n" "#line 1 1 \n" +"// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 11 0 \n" +"#line 1 2 \n" "layout (location = 0) out vec4 oColour;\n" "\n" "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n" @@ -228,8 +233,9 @@ static struct vg_shader _shader_model_board_view = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -407,8 +413,8 @@ static struct vg_shader _shader_model_board_view = { " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n" "}\n" "\n" -"#line 11 0 \n" -"#line 1 2 \n" +"#line 12 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -427,8 +433,8 @@ static struct vg_shader _shader_model_board_view = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 12 0 \n" -"#line 1 3 \n" +"#line 13 0 \n" +"#line 1 4 \n" "uniform sampler2D uTexSceneDepth;\n" "uniform vec3 uInverseRatioDepth;\n" "uniform vec3 uInverseRatioMain;\n" @@ -458,7 +464,7 @@ static struct vg_shader _shader_model_board_view = { " }\n" "}\n" "\n" -"#line 13 0 \n" +"#line 14 0 \n" "\n" "vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n" "{\n" diff --git a/shaders/model_character_view.fs b/shaders/model_character_view.fs index 09da174..502d672 100644 --- a/shaders/model_character_view.fs +++ b/shaders/model_character_view.fs @@ -7,6 +7,7 @@ in vec3 aNorm; in vec3 aCo; in vec3 aWorldCo; +#include "light_clearskies_stddef.glsl" #include "common_world.glsl" #include "motion_vectors_fs.glsl" #include "depth_compare.glsl" diff --git a/shaders/model_character_view.h b/shaders/model_character_view.h index c9feae4..2af1bfe 100644 --- a/shaders/model_character_view.h +++ b/shaders/model_character_view.h @@ -84,6 +84,11 @@ static struct vg_shader _shader_model_character_view = { "in vec3 aWorldCo;\n" "\n" "#line 1 1 \n" +"// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 11 0 \n" +"#line 1 2 \n" "layout (location = 0) out vec4 oColour;\n" "\n" "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n" @@ -236,8 +241,9 @@ static struct vg_shader _shader_model_character_view = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -415,8 +421,8 @@ static struct vg_shader _shader_model_character_view = { " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n" "}\n" "\n" -"#line 11 0 \n" -"#line 1 2 \n" +"#line 12 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -435,8 +441,8 @@ static struct vg_shader _shader_model_character_view = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 12 0 \n" -"#line 1 3 \n" +"#line 13 0 \n" +"#line 1 4 \n" "uniform sampler2D uTexSceneDepth;\n" "uniform vec3 uInverseRatioDepth;\n" "uniform vec3 uInverseRatioMain;\n" @@ -466,7 +472,7 @@ static struct vg_shader _shader_model_character_view = { " }\n" "}\n" "\n" -"#line 13 0 \n" +"#line 14 0 \n" "\n" "vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n" "{\n" diff --git a/shaders/model_entity.fs b/shaders/model_entity.fs index b14d120..762fe99 100644 --- a/shaders/model_entity.fs +++ b/shaders/model_entity.fs @@ -7,6 +7,7 @@ in vec3 aNorm; in vec3 aCo; in vec3 aWorldCo; +#include "light_clearskies_stddef.glsl" #include "common_world.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/model_entity.h b/shaders/model_entity.h index e7044ed..8b842ae 100644 --- a/shaders/model_entity.h +++ b/shaders/model_entity.h @@ -76,6 +76,11 @@ static struct vg_shader _shader_model_entity = { "in vec3 aWorldCo;\n" "\n" "#line 1 1 \n" +"// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 11 0 \n" +"#line 1 2 \n" "layout (location = 0) out vec4 oColour;\n" "\n" "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n" @@ -228,8 +233,9 @@ static struct vg_shader _shader_model_entity = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -407,8 +413,8 @@ static struct vg_shader _shader_model_entity = { " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n" "}\n" "\n" -"#line 11 0 \n" -"#line 1 2 \n" +"#line 12 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -427,7 +433,7 @@ static struct vg_shader _shader_model_entity = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 12 0 \n" +"#line 13 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/model_sky.fs b/shaders/model_sky.fs index 5fc28e5..d6f2818 100644 --- a/shaders/model_sky.fs +++ b/shaders/model_sky.fs @@ -9,6 +9,7 @@ in vec3 aWorldCo; // Spooky! const vec3 uCamera = vec3(0.0); +#include "light_clearskies_stddef.glsl" #include "common_world.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/model_sky.h b/shaders/model_sky.h index 0bf6751..f8f88d3 100644 --- a/shaders/model_sky.h +++ b/shaders/model_sky.h @@ -78,6 +78,11 @@ static struct vg_shader _shader_model_sky = { "const vec3 uCamera = vec3(0.0);\n" "\n" "#line 1 1 \n" +"// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 13 0 \n" +"#line 1 2 \n" "layout (location = 0) out vec4 oColour;\n" "\n" "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n" @@ -230,8 +235,9 @@ static struct vg_shader _shader_model_sky = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -409,8 +415,8 @@ static struct vg_shader _shader_model_sky = { " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n" "}\n" "\n" -"#line 13 0 \n" -"#line 1 2 \n" +"#line 14 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -429,7 +435,7 @@ static struct vg_shader _shader_model_sky = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 14 0 \n" +"#line 15 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/model_sky_space.fs b/shaders/model_sky_space.fs index 442e97e..057c23c 100644 --- a/shaders/model_sky_space.fs +++ b/shaders/model_sky_space.fs @@ -9,6 +9,7 @@ in vec3 aWorldCo; // Spooky! const vec3 uCamera = vec3(0.0); +#include "light_clearskies_stddef.glsl" #include "common_world.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/model_sky_space.h b/shaders/model_sky_space.h index 589175f..8309550 100644 --- a/shaders/model_sky_space.h +++ b/shaders/model_sky_space.h @@ -78,6 +78,11 @@ static struct vg_shader _shader_model_sky_space = { "const vec3 uCamera = vec3(0.0);\n" "\n" "#line 1 1 \n" +"// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 13 0 \n" +"#line 1 2 \n" "layout (location = 0) out vec4 oColour;\n" "\n" "// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n" @@ -230,8 +235,9 @@ static struct vg_shader _shader_model_sky_space = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -409,8 +415,8 @@ static struct vg_shader _shader_model_sky_space = { " return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n" "}\n" "\n" -"#line 13 0 \n" -"#line 1 2 \n" +"#line 14 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -429,7 +435,7 @@ static struct vg_shader _shader_model_sky_space = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 14 0 \n" +"#line 15 0 \n" "\n" "float stars1( vec3 rd, float rr, float size ){\n" " vec3 co = rd * rr;\n" diff --git a/shaders/scene_cubemapped.fs b/shaders/scene_cubemapped.fs index d5a9611..bc42df6 100644 --- a/shaders/scene_cubemapped.fs +++ b/shaders/scene_cubemapped.fs @@ -5,6 +5,7 @@ uniform vec3 uCamera; uniform vec4 uPlane; uniform vec4 uColour; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_cubemapped.h b/shaders/scene_cubemapped.h index 5f8b80a..544ac63 100644 --- a/shaders/scene_cubemapped.h +++ b/shaders/scene_cubemapped.h @@ -71,6 +71,11 @@ static struct vg_shader _shader_scene_cubemapped = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 9 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -230,8 +235,9 @@ static struct vg_shader _shader_scene_cubemapped = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -436,8 +442,8 @@ static struct vg_shader _shader_scene_cubemapped = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 9 0 \n" -"#line 1 2 \n" +"#line 10 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -456,7 +462,7 @@ static struct vg_shader _shader_scene_cubemapped = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 10 0 \n" +"#line 11 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/scene_depth.fs b/shaders/scene_depth.fs index 053000c..1f6f93d 100644 --- a/shaders/scene_depth.fs +++ b/shaders/scene_depth.fs @@ -4,6 +4,7 @@ uniform vec3 uCamera; uniform vec3 uBoard0; uniform vec3 uBoard1; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" // Water blending diff --git a/shaders/scene_depth.h b/shaders/scene_depth.h index ea2fbeb..6f28ad4 100644 --- a/shaders/scene_depth.h +++ b/shaders/scene_depth.h @@ -70,6 +70,11 @@ static struct vg_shader _shader_scene_depth = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 8 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -229,8 +234,9 @@ static struct vg_shader _shader_scene_depth = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -435,7 +441,7 @@ static struct vg_shader _shader_scene_depth = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 8 0 \n" +"#line 9 0 \n" "\n" "// Water blending\n" "// ==============\n" diff --git a/shaders/scene_foliage.fs b/shaders/scene_foliage.fs new file mode 100644 index 0000000..3257900 --- /dev/null +++ b/shaders/scene_foliage.fs @@ -0,0 +1,28 @@ +uniform sampler2D uTexGarbage; +uniform sampler2D uTexMain; +uniform vec3 uCamera; +uniform vec4 uPlane; + +const float CLEARSKIES_LIGHT_DOT_MIN = 0.4; +#include "common_scene.glsl" +#include "motion_vectors_fs.glsl" + +void main(){ + compute_motion_vectors(); + + vec3 vfrag = vec3(0.5,0.5,0.5); + vec4 vsamplemain = texture( uTexMain, aUv ); + vec3 qnorm = aNorm.xyz; + + if( vsamplemain.a < 0.15 ) + discard; + + vfrag = vsamplemain.rgb; + + if( g_light_preview == 1 ){ + vfrag = vec3(0.5); + } + + vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo ); + oColour = vec4(vfrag, 1.0); +} diff --git a/shaders/scene_foliage.h b/shaders/scene_foliage.h new file mode 100644 index 0000000..8dbbc29 --- /dev/null +++ b/shaders/scene_foliage.h @@ -0,0 +1,538 @@ +#ifndef SHADER_scene_foliage_H +#define SHADER_scene_foliage_H +static void shader_scene_foliage_link(void); +static void shader_scene_foliage_register(void); +static struct vg_shader _shader_scene_foliage = { + .name = "scene_foliage", + .link = shader_scene_foliage_link, + .vs = +{ +.orig_file = "shaders/scene_foliage.vs", +.static_src = +"layout (location=0) in vec3 a_co;\n" +"layout (location=1) in vec4 a_norm;\n" +"layout (location=2) in vec2 a_uv;\n" +"\n" +"#line 1 1 \n" +"const float k_motion_lerp_amount = 0.01;\n" +"\n" +"#line 2 0 \n" +"\n" +"out vec3 aMotionVec0;\n" +"out vec3 aMotionVec1;\n" +"\n" +"void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n" +"{\n" +" // This magically solves some artifacting errors!\n" +" //\n" +" vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n" +"\n" +" aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n" +" aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n" +"}\n" +"\n" +"#line 6 0 \n" +"\n" +"uniform mat4x3 uMdl;\n" +"uniform mat4 uPv;\n" +"uniform mat4 uPvmPrev;\n" +"uniform float uTime;\n" +"\n" +"out vec2 aUv;\n" +"out vec4 aNorm;\n" +"out vec3 aCo;\n" +"out vec3 aWorldCo;\n" +"\n" +"void main(){\n" +" vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n" +" vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n" +" vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n" +"\n" +" vs_motion_out( vproj0, vproj1 );\n" +"\n" +" gl_Position = vproj0;\n" +"\n" +" aUv = a_uv;\n" +" aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n" +" aCo = a_co;\n" +" aWorldCo = world_pos0;\n" +"}\n" +""}, + .fs = +{ +.orig_file = "shaders/scene_foliage.fs", +.static_src = +"uniform sampler2D uTexGarbage;\n" +"uniform sampler2D uTexMain;\n" +"uniform vec3 uCamera;\n" +"uniform vec4 uPlane;\n" +"\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.4;\n" +"#line 1 1 \n" +"// :D\n" +"\n" +"in vec2 aUv;\n" +"in vec4 aNorm;\n" +"in vec3 aCo;\n" +"in vec3 aWorldCo;\n" +"\n" +"#line 1 1 \n" +"layout (location = 0) out vec4 oColour;\n" +"\n" +"// OpenGL wiki: Recommends do not use vec3 because of drivers. hence the v4s...\n" +"layout (std140) uniform ub_world_lighting\n" +"{\n" +" vec4 g_cube_min;\n" +" vec4 g_cube_inv_range;\n" +"\n" +" vec4 g_water_plane;\n" +" vec4 g_depth_bounds;\n" +"\n" +" vec4 g_daysky_colour;\n" +" vec4 g_nightsky_colour;\n" +" vec4 g_sunset_colour;\n" +" vec4 g_ambient_colour;\n" +" vec4 g_sunset_ambient;\n" +" vec4 g_sun_colour;\n" +" vec4 g_sun_dir;\n" +" vec4 g_board_0;\n" +" vec4 g_board_1;\n" +"\n" +" float g_water_fog;\n" +" float g_time;\n" +" float g_realtime;\n" +" float g_shadow_length;\n" +" float g_shadow_spread;\n" +"\n" +" float g_time_of_day;\n" +" float g_day_phase;\n" +" float g_sunset_phase;\n" +"\n" +" int g_light_preview;\n" +" int g_shadow_samples;\n" +"\n" +" int g_debug_indices;\n" +" int g_debug_complexity;\n" +"};\n" +"\n" +"uniform sampler2D g_world_depth;\n" +"uniform samplerBuffer uLightsArray;\n" +"uniform usampler3D uLightsIndex;\n" +"\n" +"#line 1 1 \n" +"//const vec3 DAYSKY_COLOUR = vec3( 0.37, 0.54, 0.97 );\n" +"//const vec3 NIGHTSKY_COLOUR = vec3( 0.03, 0.05, 0.20 );\n" +"//const vec3 SUNSET_COLOUR = vec3( 1.00, 0.32, 0.01 );\n" +"//const vec3 AMBIENT_COLOUR = vec3( 0.13, 0.17, 0.35 );\n" +"//const vec3 SUNSET_AMBIENT = vec3( 0.25, 0.17, 0.51 );\n" +"//const vec3 SUN_COLOUR = vec3( 1.10, 0.89, 0.35 );\n" +"\n" +"const float SUN_ANGLE = 0.0001;\n" +"const float PI = 3.14159265358979323846264;\n" +"\n" +"//struct world_info\n" +"//{\n" +"// float time,\n" +"// time_of_day,\n" +"// day_phase,\n" +"// sunset_phase;\n" +"// \n" +"// vec3 sun_dir;\n" +"//};\n" +"\n" +"vec3 rand33(vec3 p3)\n" +"{\n" +" p3 = fract(p3 * vec3(.1031, .1030, .0973));\n" +" p3 += dot(p3, p3.yxz+33.33);\n" +" return fract((p3.xxy + p3.yxx)*p3.zyx);\n" +"}\n" +"\n" +"float stars( vec3 rd, float rr, float size ){\n" +" vec3 co = rd * rr;\n" +"\n" +" float a = atan(co.y, length(co.xz)) + 4.0 * PI;\n" +"\n" +" float spaces = 1.0 / rr;\n" +" size = (rr * 0.0015) * fwidth(a) * 1000.0 * size;\n" +" a -= mod(a, spaces) - spaces * 0.5;\n" +"\n" +" float count = floor(sqrt(pow(rr, 2.0) * (1.0 - pow(sin(a), 2.0))) * 3.0);\n" +" \n" +" float plane = atan(co.z, co.x) + 4.0 * PI;\n" +" plane = plane - mod(plane, PI / count);\n" +"\n" +" vec2 delta = rand33(vec3(plane, a, 0.0)).xy;\n" +"\n" +" float level = sin(a + spaces * (delta.y - 0.5) * (1.0 - size)) * rr;\n" +" float ydist = sqrt(rr * rr - level * level);\n" +" float angle = plane + (PI * (delta.x * (1.0-size) + size * 0.5) / count);\n" +" vec3 center = vec3(cos(angle) * ydist, level, sin(angle) * ydist);\n" +" float star = smoothstep(size, 0.0, distance(center, co));\n" +" return star;\n" +"}\n" +"\n" +"float luminance( vec3 v )\n" +"{\n" +" return dot( v, vec3(0.2126, 0.7152, 0.0722) );\n" +"}\n" +"\n" +"vec3 clearskies_ambient( vec3 dir )\n" +"{\n" +" float sun_azimuth = g_sunset_phase * (dot( dir.xz, g_sun_dir.xz )*0.4+0.6);\n" +" float sky_gradient = dir.y;\n" +" \n" +" /* Blend phase colours */\n" +" vec3 ambient = g_daysky_colour.rgb * (g_day_phase-g_sunset_phase*0.1);\n" +" ambient += g_sunset_colour.rgb * (1.0-dir.y*0.5)*sun_azimuth;\n" +" ambient += g_nightsky_colour.rgb * (1.0-g_day_phase);\n" +" \n" +" /* Add gradient */\n" +" ambient -= sky_gradient * luminance(ambient);\n" +" \n" +" return ambient;\n" +"}\n" +"\n" +"vec3 clearskies_sky( vec3 ray_dir )\n" +"{\n" +" ray_dir.y = abs( ray_dir.y );\n" +" vec3 sky_colour = clearskies_ambient( ray_dir );\n" +" \n" +" /* Sun */\n" +" float sun_theta = dot( ray_dir, g_sun_dir.xyz );\n" +" float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 + SUN_ANGLE );\n" +" float sun_shape = pow( sun_size, 2000.0 );\n" +" sun_shape += sun_size * max(g_sun_dir.y,0.0) * 0.5;\n" +" \n" +" vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n" +" sun_colour *= sun_shape;\n" +"\n" +" \n" +" float star = 0.0;\n" +" float star_blend = 10.0*max(0.0,(1.0-g_day_phase*2.0));\n" +"\n" +" if( star_blend > 0.001 ){\n" +" for( float j = 1.0; j <= 4.1; j += 1.0 ){\n" +" float m = mix(0.6, 0.9, smoothstep(1.0, 2.0, j));\n" +" star += stars( ray_dir, 1.94 * pow( 1.64, j ), m ) * (1.0/pow(4.0, j));\n" +" }\n" +" }\n" +" \n" +" vec3 composite = sky_colour + sun_colour + star*star_blend;\n" +" return composite;\n" +"}\n" +"\n" +"vec3 clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n" +"{\n" +" float fresnel = 1.0 - abs(dot(normal,halfview));\n" +"\n" +" vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n" +" g_sunset_phase );\n" +"\n" +" vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" +"\n" +" float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" +" vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" +" g_sunset_phase );\n" +"\n" +" return ambient + (light_sun + sky_reflection) * shadow;\n" +"}\n" +"\n" +"#line 44 0 \n" +"\n" +"float world_depth_sample( vec3 pos )\n" +"{\n" +" vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n" +" return texture( g_world_depth, depth_coord ).r;\n" +"}\n" +"\n" +"float world_water_depth( vec3 pos )\n" +"{\n" +" float ref_depth = g_water_plane.y*g_water_plane.w;\n" +" return world_depth_sample( pos ) - ref_depth;\n" +"}\n" +"\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" +"\n" +" float fdelta = height_sample - co.y;\n" +" return clamp( fdelta, 0.2, 0.4 )-0.2;\n" +"}\n" +"\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" +" return 1.0;\n" +" }\n" +"\n" +" float fspread = g_shadow_spread;\n" +" float flength = g_shadow_length;\n" +"\n" +" float famt = 0.0;\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +"\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +"\n" +" return 1.0 - famt;\n" +"}\n" +"\n" +"float newlight_specular( vec3 wnormal, vec3 dir, vec3 halfview, float exponent )\n" +"{\n" +" vec3 specdir = reflect( -dir, wnormal );\n" +" return pow(max(dot( halfview, specdir ), 0.0), exponent);\n" +"}\n" +"\n" +"vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist ){\n" +" float dist = pow(fdist*0.0010,0.78);\n" +" return mix( vfrag, colour, min( 1.0, dist ) );\n" +"}\n" +"\n" +"vec3 scene_calculate_light( int light_index, \n" +" vec3 halfview, vec3 co, vec3 normal )\n" +"{\n" +" vec4 light_colour = texelFetch( uLightsArray, light_index+0 );\n" +" vec4 light_co = texelFetch( uLightsArray, light_index+1 );\n" +" vec4 light_dir = texelFetch( uLightsArray, light_index+2 );\n" +"\n" +" vec3 light_delta = light_co.xyz-co;\n" +" float dist2 = dot(light_delta,light_delta);\n" +"\n" +" light_delta = normalize( light_delta );\n" +"\n" +" float quadratic = dist2*100.0;\n" +" float attenuation = 1.0/( 1.0 + quadratic );\n" +" attenuation *= max( dot( light_delta, normal ), 0.0 );\n" +"\n" +" float falloff = max( 0.0, 1.0-(dist2*light_co.w) );\n" +"\n" +" if( light_dir.w < 0.999999 ){\n" +" float spot_theta = max( 0.0, dot( light_delta, -light_dir.xyz ) );\n" +" falloff *= max( 0.0, (spot_theta - light_dir.w) / (1.0-light_dir.w) );\n" +" }\n" +"\n" +" return light_colour.rgb * attenuation * falloff \n" +" * step( g_day_phase, light_colour.w );\n" +"}\n" +"\n" +"vec3 scene_calculate_packed_light_patch( uint packed_index, \n" +" vec3 halfview, vec3 co, vec3 normal )\n" +"{\n" +" uint light_count = packed_index & 0x3u;\n" +"\n" +" vec3 l = vec3(0.0);\n" +"\n" +" if( light_count >= 1u ){\n" +" int index_0 = int( ((packed_index >> 2u) & 0x3ffu) * 3u );\n" +" int index_1 = int( ((packed_index >> 12u) & 0x3ffu) * 3u );\n" +" int index_2 = int( ((packed_index >> 22u) & 0x3ffu) * 3u );\n" +"\n" +" l += scene_calculate_light( index_0, halfview, co, normal );\n" +"\n" +" if( light_count >= 2u ){\n" +" l += scene_calculate_light( index_1, halfview, co, normal );\n" +"\n" +" if( light_count >= 3u ){\n" +" l += scene_calculate_light( index_2, halfview, co, normal );\n" +" }\n" +" }\n" +" }\n" +"\n" +" return l;\n" +"}\n" +"\n" +"vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n" +" float light_mask )\n" +"{\n" +" if( g_light_preview == 1 )\n" +" diffuse = vec3(0.75);\n" +"\n" +" // Lighting\n" +" vec3 halfview = uCamera - co;\n" +" float fdist = length(halfview);\n" +" halfview /= fdist;\n" +"\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +"\n" +" vec3 total_light = clearskies_lighting( \n" +" normal, min( light_mask, world_shadow ), halfview );\n" +"\n" +" vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n" +" cube_coord = floor( cube_coord );\n" +"\n" +" if( g_debug_indices == 1 )\n" +" {\n" +" return rand33(cube_coord);\n" +" }\n" +"\n" +" if( g_debug_complexity == 1 )\n" +" {\n" +" ivec3 coord = ivec3( cube_coord );\n" +" uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n" +"\n" +" uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n" +" return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n" +" }\n" +"\n" +" // FIXME: this coord should absolutely must be clamped!\n" +" \n" +" ivec3 coord = ivec3( cube_coord );\n" +" uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n" +"\n" +" total_light += \n" +" scene_calculate_packed_light_patch( index_sample.x,\n" +" halfview, co, normal ) \n" +" * light_mask;\n" +" total_light += \n" +" scene_calculate_packed_light_patch( index_sample.y,\n" +" halfview, co, normal )\n" +" * light_mask;\n" +"\n" +" // Take a section of the sky function to give us a matching fog colour\n" +"\n" +" vec3 fog_colour = clearskies_ambient( -halfview );\n" +" float sun_theta = dot( -halfview, g_sun_dir.xyz );\n" +" float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n" +" float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n" +" \n" +" vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n" +" sun_colour *= sun_shape;\n" +"\n" +" fog_colour += sun_colour;\n" +" return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n" +"}\n" +"\n" +"#line 9 0 \n" +"\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" +"float compute_board_shadow()\n" +"{\n" +" // player shadow\n" +" float dist_to_player = max( 0.0, sdLine( aWorldCo, g_board_0.xyz,\n" +" g_board_1.xyz )-0.1 );\n" +" float player_shadow = max( 1.0-dist_to_player*2.7, 0.0 );\n" +" player_shadow *= player_shadow*player_shadow*player_shadow;\n" +"\n" +" return 1.0 - player_shadow*0.8;\n" +"}\n" +"\n" +"vec3 scene_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n" +"{\n" +" return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" +"}\n" +"\n" +"#line 8 0 \n" +"#line 1 2 \n" +"const float k_motion_lerp_amount = 0.01;\n" +"\n" +"#line 2 0 \n" +"\n" +"layout (location = 1) out vec2 oMotionVec;\n" +"\n" +"in vec3 aMotionVec0;\n" +"in vec3 aMotionVec1;\n" +"\n" +"void compute_motion_vectors()\n" +"{\n" +" // Write motion vectors\n" +" vec2 vmotion0 = aMotionVec0.xy / aMotionVec0.z;\n" +" vec2 vmotion1 = aMotionVec1.xy / aMotionVec1.z;\n" +"\n" +" oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" +"}\n" +"\n" +"#line 9 0 \n" +"\n" +"void main(){\n" +" compute_motion_vectors();\n" +"\n" +" vec3 vfrag = vec3(0.5,0.5,0.5);\n" +" vec4 vsamplemain = texture( uTexMain, aUv );\n" +" vec3 qnorm = aNorm.xyz;\n" +"\n" +" if( vsamplemain.a < 0.15 )\n" +" discard;\n" +"\n" +" vfrag = vsamplemain.rgb;\n" +"\n" +" if( g_light_preview == 1 ){\n" +" vfrag = vec3(0.5);\n" +" }\n" +"\n" +" vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n" +" oColour = vec4(vfrag, 1.0);\n" +"}\n" +""}, +}; + +static GLuint _uniform_scene_foliage_uMdl; +static GLuint _uniform_scene_foliage_uPv; +static GLuint _uniform_scene_foliage_uPvmPrev; +static GLuint _uniform_scene_foliage_uTime; +static GLuint _uniform_scene_foliage_uTexGarbage; +static GLuint _uniform_scene_foliage_uTexMain; +static GLuint _uniform_scene_foliage_uCamera; +static GLuint _uniform_scene_foliage_uPlane; +static GLuint _uniform_scene_foliage_g_world_depth; +static GLuint _uniform_scene_foliage_uLightsArray; +static GLuint _uniform_scene_foliage_uLightsIndex; +static void shader_scene_foliage_uMdl(m4x3f m){ + glUniformMatrix4x3fv(_uniform_scene_foliage_uMdl,1,GL_FALSE,(float*)m); +} +static void shader_scene_foliage_uPv(m4x4f m){ + glUniformMatrix4fv(_uniform_scene_foliage_uPv,1,GL_FALSE,(float*)m); +} +static void shader_scene_foliage_uPvmPrev(m4x4f m){ + glUniformMatrix4fv(_uniform_scene_foliage_uPvmPrev,1,GL_FALSE,(float*)m); +} +static void shader_scene_foliage_uTime(float f){ + glUniform1f(_uniform_scene_foliage_uTime,f); +} +static void shader_scene_foliage_uTexGarbage(int i){ + glUniform1i(_uniform_scene_foliage_uTexGarbage,i); +} +static void shader_scene_foliage_uTexMain(int i){ + glUniform1i(_uniform_scene_foliage_uTexMain,i); +} +static void shader_scene_foliage_uCamera(v3f v){ + glUniform3fv(_uniform_scene_foliage_uCamera,1,v); +} +static void shader_scene_foliage_uPlane(v4f v){ + glUniform4fv(_uniform_scene_foliage_uPlane,1,v); +} +static void shader_scene_foliage_g_world_depth(int i){ + glUniform1i(_uniform_scene_foliage_g_world_depth,i); +} +static void shader_scene_foliage_register(void){ + vg_shader_register( &_shader_scene_foliage ); +} +static void shader_scene_foliage_use(void){ glUseProgram(_shader_scene_foliage.id); } +static void shader_scene_foliage_link(void){ + _uniform_scene_foliage_uMdl = glGetUniformLocation( _shader_scene_foliage.id, "uMdl" ); + _uniform_scene_foliage_uPv = glGetUniformLocation( _shader_scene_foliage.id, "uPv" ); + _uniform_scene_foliage_uPvmPrev = glGetUniformLocation( _shader_scene_foliage.id, "uPvmPrev" ); + _uniform_scene_foliage_uTime = glGetUniformLocation( _shader_scene_foliage.id, "uTime" ); + _uniform_scene_foliage_uTexGarbage = glGetUniformLocation( _shader_scene_foliage.id, "uTexGarbage" ); + _uniform_scene_foliage_uTexMain = glGetUniformLocation( _shader_scene_foliage.id, "uTexMain" ); + _uniform_scene_foliage_uCamera = glGetUniformLocation( _shader_scene_foliage.id, "uCamera" ); + _uniform_scene_foliage_uPlane = glGetUniformLocation( _shader_scene_foliage.id, "uPlane" ); + _uniform_scene_foliage_g_world_depth = glGetUniformLocation( _shader_scene_foliage.id, "g_world_depth" ); + _uniform_scene_foliage_uLightsArray = glGetUniformLocation( _shader_scene_foliage.id, "uLightsArray" ); + _uniform_scene_foliage_uLightsIndex = glGetUniformLocation( _shader_scene_foliage.id, "uLightsIndex" ); +} +#endif /* SHADER_scene_foliage_H */ diff --git a/shaders/scene_foliage.vs b/shaders/scene_foliage.vs new file mode 100644 index 0000000..79209e6 --- /dev/null +++ b/shaders/scene_foliage.vs @@ -0,0 +1,33 @@ +layout (location=0) in vec3 a_co; +layout (location=1) in vec4 a_norm; +layout (location=2) in vec2 a_uv; + +#include "motion_vectors_vs.glsl" + +uniform mat4x3 uMdl; +uniform mat4 uPv; +uniform mat4 uPvmPrev; +uniform float uTime; + +out vec2 aUv; +out vec4 aNorm; +out vec3 aCo; +out vec3 aWorldCo; + +void main(){ + vec4 vsine = sin(vec4(uTime + a_co.x, uTime*0.7 + a_co.z,uTime,uTime*1.3)); + vec3 co = a_co + vsine.xyz * a_norm.w * 0.5; + + vec3 world_pos0 = uMdl * vec4( co, 1.0 ); + vec4 vproj0 = uPv * vec4( world_pos0, 1.0 ); + vec4 vproj1 = uPvmPrev * vec4( co, 1.0 ); + + vs_motion_out( vproj0, vproj1 ); + + gl_Position = vproj0; + + aUv = a_uv; + aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w ); + aCo = a_co; + aWorldCo = world_pos0; +} diff --git a/shaders/scene_font.fs b/shaders/scene_font.fs index a03b006..366e120 100644 --- a/shaders/scene_font.fs +++ b/shaders/scene_font.fs @@ -5,6 +5,7 @@ uniform float uTime; uniform float uOpacity; uniform float uColourize; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_font.h b/shaders/scene_font.h index 2cae292..891947d 100644 --- a/shaders/scene_font.h +++ b/shaders/scene_font.h @@ -73,6 +73,11 @@ static struct vg_shader _shader_scene_font = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 9 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -232,8 +237,9 @@ static struct vg_shader _shader_scene_font = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -438,8 +444,8 @@ static struct vg_shader _shader_scene_font = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 9 0 \n" -"#line 1 2 \n" +"#line 10 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -458,7 +464,7 @@ static struct vg_shader _shader_scene_font = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 10 0 \n" +"#line 11 0 \n" "\n" "vec3 pal( float t ){\n" " vec3 a = vec3(0.30,0.3,0.3);\n" diff --git a/shaders/scene_fxglow.fs b/shaders/scene_fxglow.fs index 5d1a5bb..cebd810 100644 --- a/shaders/scene_fxglow.fs +++ b/shaders/scene_fxglow.fs @@ -1,6 +1,7 @@ uniform sampler2D uTexMain; uniform vec3 uCamera; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_fxglow.h b/shaders/scene_fxglow.h index f5c14c3..c47d6ab 100644 --- a/shaders/scene_fxglow.h +++ b/shaders/scene_fxglow.h @@ -68,6 +68,11 @@ static struct vg_shader _shader_scene_fxglow = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 5 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -227,8 +232,9 @@ static struct vg_shader _shader_scene_fxglow = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -433,8 +439,8 @@ static struct vg_shader _shader_scene_fxglow = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 5 0 \n" -"#line 1 2 \n" +"#line 6 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -453,7 +459,7 @@ static struct vg_shader _shader_scene_fxglow = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 6 0 \n" +"#line 7 0 \n" "\n" "void main(){\n" " oMotionVec = vec2(0.0);\n" diff --git a/shaders/scene_override.fs b/shaders/scene_override.fs index 42e97b4..ec2a89a 100644 --- a/shaders/scene_override.fs +++ b/shaders/scene_override.fs @@ -8,6 +8,7 @@ uniform vec4 uSpawnPos; /* w: inverse distance to uPlayerPos */ uniform bool uAlphatest; uniform vec4 uMapInfo; /* x: min, y: max, z: iso line amount */ +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_override.h b/shaders/scene_override.h index 0d7515b..c84a5ba 100644 --- a/shaders/scene_override.h +++ b/shaders/scene_override.h @@ -75,6 +75,11 @@ static struct vg_shader _shader_scene_override = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 12 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -234,8 +239,9 @@ static struct vg_shader _shader_scene_override = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -440,8 +446,8 @@ static struct vg_shader _shader_scene_override = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 12 0 \n" -"#line 1 2 \n" +"#line 13 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -460,7 +466,7 @@ static struct vg_shader _shader_scene_override = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 13 0 \n" +"#line 14 0 \n" "\n" "vec2 smin( float a, float b, float k ){\n" " float h = max( k-abs(a-b), 0.0 )/k;\n" diff --git a/shaders/scene_position.fs b/shaders/scene_position.fs index 2d959b0..930068f 100644 --- a/shaders/scene_position.fs +++ b/shaders/scene_position.fs @@ -4,6 +4,7 @@ uniform vec3 uCamera; uniform vec3 uBoard0; uniform vec3 uBoard1; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" void main() diff --git a/shaders/scene_position.h b/shaders/scene_position.h index 4b0a226..9736d94 100644 --- a/shaders/scene_position.h +++ b/shaders/scene_position.h @@ -70,6 +70,11 @@ static struct vg_shader _shader_scene_position = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 8 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -229,8 +234,9 @@ static struct vg_shader _shader_scene_position = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -435,7 +441,7 @@ static struct vg_shader _shader_scene_position = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 8 0 \n" +"#line 9 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/scene_route.fs b/shaders/scene_route.fs index 4af0907..946d4b7 100644 --- a/shaders/scene_route.fs +++ b/shaders/scene_route.fs @@ -3,6 +3,7 @@ uniform sampler2D uTexGradients; uniform vec3 uCamera; uniform vec4 uColour; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_route.h b/shaders/scene_route.h index eea0c75..f136afe 100644 --- a/shaders/scene_route.h +++ b/shaders/scene_route.h @@ -70,6 +70,11 @@ static struct vg_shader _shader_scene_route = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 7 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -229,8 +234,9 @@ static struct vg_shader _shader_scene_route = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -435,8 +441,8 @@ static struct vg_shader _shader_scene_route = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 7 0 \n" -"#line 1 2 \n" +"#line 8 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -455,7 +461,7 @@ static struct vg_shader _shader_scene_route = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 8 0 \n" +"#line 9 0 \n" "\n" "float filtered_stripe( in float p, in float ddx, in float ddy )\n" "{\n" diff --git a/shaders/scene_scoretext.h b/shaders/scene_scoretext.h index 17d0eba..3b91bec 100644 --- a/shaders/scene_scoretext.h +++ b/shaders/scene_scoretext.h @@ -89,6 +89,11 @@ static struct vg_shader _shader_scene_scoretext = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 7 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -248,8 +253,9 @@ static struct vg_shader _shader_scene_scoretext = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -454,8 +460,8 @@ static struct vg_shader _shader_scene_scoretext = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 7 0 \n" -"#line 1 2 \n" +"#line 8 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -474,7 +480,7 @@ static struct vg_shader _shader_scene_scoretext = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 8 0 \n" +"#line 9 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/scene_standard.fs b/shaders/scene_standard.fs index 58a472d..9106e4a 100644 --- a/shaders/scene_standard.fs +++ b/shaders/scene_standard.fs @@ -3,6 +3,7 @@ uniform sampler2D uTexMain; uniform vec3 uCamera; uniform vec4 uPlane; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_standard.h b/shaders/scene_standard.h index b5b3298..6a337e7 100644 --- a/shaders/scene_standard.h +++ b/shaders/scene_standard.h @@ -69,6 +69,11 @@ static struct vg_shader _shader_scene_standard = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 7 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -228,8 +233,9 @@ static struct vg_shader _shader_scene_standard = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -434,8 +440,8 @@ static struct vg_shader _shader_scene_standard = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 7 0 \n" -"#line 1 2 \n" +"#line 8 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -454,7 +460,7 @@ static struct vg_shader _shader_scene_standard = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 8 0 \n" +"#line 9 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/scene_standard_alphatest.fs b/shaders/scene_standard_alphatest.fs index d7127a7..3c0deae 100644 --- a/shaders/scene_standard_alphatest.fs +++ b/shaders/scene_standard_alphatest.fs @@ -3,6 +3,7 @@ uniform sampler2D uTexMain; uniform vec3 uCamera; uniform vec4 uPlane; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_standard_alphatest.h b/shaders/scene_standard_alphatest.h index f548899..0d6911c 100644 --- a/shaders/scene_standard_alphatest.h +++ b/shaders/scene_standard_alphatest.h @@ -69,6 +69,11 @@ static struct vg_shader _shader_scene_standard_alphatest = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 7 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -228,8 +233,9 @@ static struct vg_shader _shader_scene_standard_alphatest = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -434,8 +440,8 @@ static struct vg_shader _shader_scene_standard_alphatest = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 7 0 \n" -"#line 1 2 \n" +"#line 8 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -454,7 +460,7 @@ static struct vg_shader _shader_scene_standard_alphatest = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 8 0 \n" +"#line 9 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/scene_terrain.fs b/shaders/scene_terrain.fs index a1feb1a..6be1145 100644 --- a/shaders/scene_terrain.fs +++ b/shaders/scene_terrain.fs @@ -4,6 +4,7 @@ uniform vec3 uCamera; uniform vec3 uSandColour; uniform vec2 uBlendOffset; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_terrain.h b/shaders/scene_terrain.h index 5bf992c..d7c58ef 100644 --- a/shaders/scene_terrain.h +++ b/shaders/scene_terrain.h @@ -70,6 +70,11 @@ static struct vg_shader _shader_scene_terrain = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 8 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -229,8 +234,9 @@ static struct vg_shader _shader_scene_terrain = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -435,8 +441,8 @@ static struct vg_shader _shader_scene_terrain = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 8 0 \n" -"#line 1 2 \n" +"#line 9 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -455,7 +461,7 @@ static struct vg_shader _shader_scene_terrain = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 9 0 \n" +"#line 10 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/scene_vertex_blend.fs b/shaders/scene_vertex_blend.fs index 0368b20..12a0014 100644 --- a/shaders/scene_vertex_blend.fs +++ b/shaders/scene_vertex_blend.fs @@ -2,6 +2,7 @@ uniform sampler2D uTexGarbage; uniform sampler2D uTexGradients; uniform vec3 uCamera; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_vertex_blend.h b/shaders/scene_vertex_blend.h index 2cc345b..7cc9102 100644 --- a/shaders/scene_vertex_blend.h +++ b/shaders/scene_vertex_blend.h @@ -68,6 +68,11 @@ static struct vg_shader _shader_scene_vertex_blend = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 6 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -227,8 +232,9 @@ static struct vg_shader _shader_scene_vertex_blend = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -433,8 +439,8 @@ static struct vg_shader _shader_scene_vertex_blend = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 6 0 \n" -"#line 1 2 \n" +"#line 7 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -453,7 +459,7 @@ static struct vg_shader _shader_scene_vertex_blend = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 7 0 \n" +"#line 8 0 \n" "\n" "void main()\n" "{\n" diff --git a/shaders/scene_water.fs b/shaders/scene_water.fs index 22aa665..98875d0 100644 --- a/shaders/scene_water.fs +++ b/shaders/scene_water.fs @@ -12,6 +12,7 @@ uniform vec3 uBoard1; uniform vec3 uShoreColour; uniform vec3 uOceanColour; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_water.h b/shaders/scene_water.h index 3a733b3..3ac3b9d 100644 --- a/shaders/scene_water.h +++ b/shaders/scene_water.h @@ -78,6 +78,11 @@ static struct vg_shader _shader_scene_water = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 16 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -237,8 +242,9 @@ static struct vg_shader _shader_scene_water = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -443,8 +449,8 @@ static struct vg_shader _shader_scene_water = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 16 0 \n" -"#line 1 2 \n" +"#line 17 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -463,7 +469,7 @@ static struct vg_shader _shader_scene_water = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 17 0 \n" +"#line 18 0 \n" "\n" "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue, \n" " vec4 beneath, vec4 above )\n" diff --git a/shaders/scene_water_fast.fs b/shaders/scene_water_fast.fs index 62672d4..77aa569 100644 --- a/shaders/scene_water_fast.fs +++ b/shaders/scene_water_fast.fs @@ -9,6 +9,7 @@ uniform vec3 uBoard1; uniform vec3 uShoreColour; uniform vec3 uOceanColour; +#include "light_clearskies_stddef.glsl" #include "common_scene.glsl" #include "motion_vectors_fs.glsl" diff --git a/shaders/scene_water_fast.h b/shaders/scene_water_fast.h index 8a1ba5e..7c5a079 100644 --- a/shaders/scene_water_fast.h +++ b/shaders/scene_water_fast.h @@ -75,6 +75,11 @@ static struct vg_shader _shader_scene_water_fast = { "\n" "#line 1 1 \n" "// :D\n" +"const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;\n" +"\n" +"#line 13 0 \n" +"#line 1 2 \n" +"// :D\n" "\n" "in vec2 aUv;\n" "in vec4 aNorm;\n" @@ -234,8 +239,9 @@ static struct vg_shader _shader_scene_water_fast = { " g_sunset_phase );\n" "\n" " vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" -" vec3 light_sun = max(0.0,dot(normal,g_sun_dir.xyz)*0.75+0.25) \n" -" * g_sun_colour.rgb * g_day_phase;\n" +" vec3 light_sun = max( CLEARSKIES_LIGHT_DOT_MIN, \n" +" dot(normal,g_sun_dir.xyz)*0.75+0.25\n" +" ) * g_sun_colour.rgb * g_day_phase;\n" "\n" " float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" " vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" @@ -440,8 +446,8 @@ static struct vg_shader _shader_scene_water_fast = { " return world_compute_lighting( diffuse, normal, co, compute_board_shadow() );\n" "}\n" "\n" -"#line 13 0 \n" -"#line 1 2 \n" +"#line 14 0 \n" +"#line 1 3 \n" "const float k_motion_lerp_amount = 0.01;\n" "\n" "#line 2 0 \n" @@ -460,7 +466,7 @@ static struct vg_shader _shader_scene_water_fast = { " oMotionVec = (vmotion1-vmotion0) * (1.0/k_motion_lerp_amount);\n" "}\n" "\n" -"#line 14 0 \n" +"#line 15 0 \n" "\n" "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue )\n" "{\n" diff --git a/world_render.c b/world_render.c index 8c346b6..3381485 100644 --- a/world_render.c +++ b/world_render.c @@ -79,6 +79,7 @@ static void world_render_init(void) shader_scene_standard_register(); shader_scene_standard_alphatest_register(); + shader_scene_foliage_register(); shader_scene_override_register(); shader_scene_cubemapped_register(); shader_scene_fxglow_register(); @@ -453,6 +454,29 @@ static void render_world_alphatest( world_instance *world, camera *cam ){ glEnable(GL_CULL_FACE); } +static void render_world_foliage( world_instance *world, camera *cam ){ + shader_scene_foliage_use(); + shader_scene_foliage_uTexGarbage(0); + shader_scene_foliage_uTexMain(1); + shader_scene_foliage_uPv( cam->mtx.pv ); + shader_scene_foliage_uTime( vg.time ); + + WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, scene_foliage ); + bind_terrain_noise(); + + shader_scene_foliage_uCamera( cam->transform[3] ); + glDisable(GL_CULL_FACE); + struct world_pass pass = { + .shader = k_shader_foliage, + .cam = cam, + .fn_bind_textures = bindpoint_diffuse_texture1, + .fn_set_mdl = shader_scene_foliage_uMdl, + .fn_set_uPvmPrev = shader_scene_foliage_uPvmPrev, + }; + world_render_both_stages( world, &pass ); + glEnable(GL_CULL_FACE); +} + static void world_render_challenges( world_instance *world, struct world_pass *pass, v3f pos ){ if( !world ) return; @@ -920,6 +944,7 @@ static void render_world( world_instance *world, camera *cam, render_world_vb( world, cam ); render_world_alphatest( world, cam ); + render_world_foliage( world, cam ); render_terrain( world, cam ); if( !viewing_from_gate ){ diff --git a/world_render.h b/world_render.h index f6d629d..540e0be 100644 --- a/world_render.h +++ b/world_render.h @@ -12,6 +12,7 @@ #include "shaders/scene_standard.h" #include "shaders/scene_standard_alphatest.h" +#include "shaders/scene_foliage.h" #include "shaders/scene_override.h" #include "shaders/scene_cubemapped.h" #include "shaders/scene_vertex_blend.h"