foliage windy shader
authorhgn <hgodden00@gmail.com>
Fri, 1 Dec 2023 02:38:07 +0000 (02:38 +0000)
committerhgn <hgodden00@gmail.com>
Fri, 1 Dec 2023 02:38:07 +0000 (02:38 +0000)
47 files changed:
blender_export.py
build.c
maps_src/dev_tutorial/main.mdl
model.h
shaders/light_clearskies.glsl
shaders/light_clearskies_stddef.glsl [new file with mode: 0644]
shaders/model_board_view.h
shaders/model_character_view.fs
shaders/model_character_view.h
shaders/model_entity.fs
shaders/model_entity.h
shaders/model_sky.fs
shaders/model_sky.h
shaders/model_sky_space.fs
shaders/model_sky_space.h
shaders/scene_cubemapped.fs
shaders/scene_cubemapped.h
shaders/scene_depth.fs
shaders/scene_depth.h
shaders/scene_foliage.fs [new file with mode: 0644]
shaders/scene_foliage.h [new file with mode: 0644]
shaders/scene_foliage.vs [new file with mode: 0644]
shaders/scene_font.fs
shaders/scene_font.h
shaders/scene_fxglow.fs
shaders/scene_fxglow.h
shaders/scene_override.fs
shaders/scene_override.h
shaders/scene_position.fs
shaders/scene_position.h
shaders/scene_route.fs
shaders/scene_route.h
shaders/scene_scoretext.h
shaders/scene_standard.fs
shaders/scene_standard.h
shaders/scene_standard_alphatest.fs
shaders/scene_standard_alphatest.h
shaders/scene_terrain.fs
shaders/scene_terrain.h
shaders/scene_vertex_blend.fs
shaders/scene_vertex_blend.h
shaders/scene_water.fs
shaders/scene_water.h
shaders/scene_water_fast.fs
shaders/scene_water_fast.h
world_render.c
world_render.h

index cc0eb21ecebf9bb2a02b5135648a7601f6815bd7..e9b7a1e46d8d7c9ceb6b4cdb70e22baaf6ca178e 100644 (file)
@@ -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 addff9e7118bc00fb6ee9f74e108c53734467f01..cd721e71e07c568abbce683ebd4fb8be245520e0 100644 (file)
--- 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" );
index 5ee4be44befaf5ba187cfc571bd5a9df1c76325d..cebd58303167436ddfa3f572f93c0b4370fb7590 100644 (file)
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 476079474aae4201fcf752a056b3cd6d86b207fe..a182e51293d9b1d18901e1671d2d39d92a251f1f 100644 (file)
--- 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
 };
 
index 0af3be0774ff0899ff6de75e026a85180c49b815..1bd2469ccb772a0539c618b56e8463d3f7a10c92 100644 (file)
@@ -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 (file)
index 0000000..24ba443
--- /dev/null
@@ -0,0 +1,2 @@
+// :D
+const float CLEARSKIES_LIGHT_DOT_MIN = 0.0;
index a131124b6c08bb9d5184319a9c4687053aa54654..a50e9d586e9fb3e71ad7168dd693d882eca51df5 100644 (file)
@@ -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"
index 09da174ee94b101ee2ff73dab3fd23df006dd221..502d67299d95d95c87dc6ff96393447928608694 100644 (file)
@@ -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"
index c9feae4655028357ba922985302670b0d02abf02..2af1bfe9d22eb4d2f0718fe070aba77b46880604 100644 (file)
@@ -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"
index b14d12077cc86e0b5fcd939758201a13aabc03a1..762fe990c99beef3977d5f8c442ac16214071b97 100644 (file)
@@ -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"
 
index e7044edad39f5847a684f05c0eee42bb98dacb68..8b842aee6958e137d847e84d88843a5432a8cba3 100644 (file)
@@ -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"
index 5fc28e5f6299f3ad4145014a00a5b4e75a7ccf13..d6f28187cf400eb1e0c31447326d08d6288d000d 100644 (file)
@@ -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"
 
index 0bf67512e38ff29c4fc51bbdaacc882a803e4eca..f8f88d3d1a19ef6e9c205c6006b3d943b56807bc 100644 (file)
@@ -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"
index 442e97eb5d94c78252f830606b031deaff4c8da7..057c23c0339ec4a2818f237abd1e446a98c0baa3 100644 (file)
@@ -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"
 
index 589175ffbc5908cd627f0715dca4c28055abe66a..83095509f465aec8ae190b6966ef5fb4230d03a1 100644 (file)
@@ -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"
index d5a9611c49c3c97fae8eed657de7d9ed1a07bc14..bc42df67377cf848640b65030d279952e2c9572d 100644 (file)
@@ -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"
 
index 5f8b80aa47c6d55e1a2d98f6e2194ded7f46adbb..544ac63cf743ecf7ff80aea139452c8ff45d3bef 100644 (file)
@@ -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"
index 053000ca1fa1bcbdef5e2960f2e8a0079b65b1c2..1f6f93d18b1ee894340c129daec7bcc0067de962 100644 (file)
@@ -4,6 +4,7 @@ uniform vec3 uCamera;
 uniform vec3 uBoard0;
 uniform vec3 uBoard1;
 
+#include "light_clearskies_stddef.glsl"
 #include "common_scene.glsl"
 
 // Water blending
index ea2fbebb45cd24128a30ac221c54cd81e9589534..6f28ad438928cd9e66e3bafb71f92e362d4546c6 100644 (file)
@@ -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 (file)
index 0000000..3257900
--- /dev/null
@@ -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 (file)
index 0000000..8dbbc29
--- /dev/null
@@ -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 (file)
index 0000000..79209e6
--- /dev/null
@@ -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;
+}
index a03b006b766494721f9dd41489280613f8fac987..366e120115a448eebd9f4bcfcfc42d51d3aa5330 100644 (file)
@@ -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"
 
index 2cae29230482e13dde1bdb2f58a32618b4e664ee..891947d25f369d92d21f35bdb243413ae9fc603d 100644 (file)
@@ -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"
index 5d1a5bbd769ca385427e5964469010663c3ac1b3..cebd810961f0e3edf676ee564e7d00cd0a02ff97 100644 (file)
@@ -1,6 +1,7 @@
 uniform sampler2D uTexMain;
 uniform vec3 uCamera;
 
+#include "light_clearskies_stddef.glsl"
 #include "common_scene.glsl"
 #include "motion_vectors_fs.glsl"
 
index f5c14c3a8f90af7085bf9856216a180668e2d5bc..c47d6ab71a205cb23457362449bc083e1a286f50 100644 (file)
@@ -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"
index 42e97b47fab9168214df4fa5844f087efd87d6e0..ec2a89a3a49c19cdeba45eb0c8a7fcb69818f0f5 100644 (file)
@@ -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"
 
index 0d7515b8c7616b864160cdbdb3bde784925962e5..c84a5baaa62b0ac9f7b79501a3be8ca2aed3283a 100644 (file)
@@ -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"
index 2d959b0772c186c3d272c7eac584e39b0fb639fb..930068fc39a7cc84cb74fc5995a6477751b10ad9 100644 (file)
@@ -4,6 +4,7 @@ uniform vec3 uCamera;
 uniform vec3 uBoard0;
 uniform vec3 uBoard1;
 
+#include "light_clearskies_stddef.glsl"
 #include "common_scene.glsl"
 
 void main()
index 4b0a22652bade7b0f0ae6448a062def867a8d762..9736d9441d62a8a964e95d85502034671ef4204f 100644 (file)
@@ -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"
index 4af09071cfd886292c97043b4ab20526861a81a5..946d4b7ae291782316ed2b0e53829c32915f1e9e 100644 (file)
@@ -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"
 
index eea0c75bd0211b544ac9a43f78cebd4ed4a24046..f136afe45d12abf3410ebf40a02ed40d56d33a89 100644 (file)
@@ -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"
index 17d0eba18715ad7dc62b79218526266a03527a23..3b91becdea75b7e4d04f9d37eb2c73aedbd4bde9 100644 (file)
@@ -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"
index 58a472da906bf048d8cd1d2def94d505d4894910..9106e4a4558af480be7c506f929017da8daf0b3d 100644 (file)
@@ -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"
 
index b5b329847025c4a2445b3b1918bf50a320dcdfe0..6a337e7dcb63cb4daade27f984ae3667fda0d33e 100644 (file)
@@ -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"
index d7127a7e3e32eb092de1a4c7eff538210a4027d3..3c0deaefd53a9acde60f21f366fffd68ad32a425 100644 (file)
@@ -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"
 
index f54889965d5b7e6aa204ff9a3c3ba6377716e3f8..0d6911c27eee702148a9bb9828cec7c4dbbb8b97 100644 (file)
@@ -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"
index a1feb1a3be500a9141925bc3e62ce509d9367ab0..6be11459126be8a36d848d2599d483142801726a 100644 (file)
@@ -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"
 
index 5bf992c28944e6c07e2f383271b19731d1871f06..d7c58efb03593282ef60e70e016d3315c395786f 100644 (file)
@@ -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"
index 0368b20a5fab902e288202c9ac8653d8ce12feab..12a00140e2af1d4e4808ff1057b3835f0bc12b70 100644 (file)
@@ -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"
 
index 2cc345b6c95768a7ff6d9b82f9d3764d84f5bba3..7cc9102706ad5219e5dcf1ddfd378e8218d829cb 100644 (file)
@@ -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"
index 22aa665e3f5e00885e99976b9d0931f2efe243de..98875d06dab54885ca44b3e293b0d5947a976529 100644 (file)
@@ -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"
 
index 3a733b33780f452d82f944c882716451122afc1c..3ac3b9d89eadee1326335ec34852edfb8eabff62 100644 (file)
@@ -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"
index 62672d468594e411a12a58cb275cd11920979f18..77aa569dd3dd7121345bfa1fb6c5ac78eee58720 100644 (file)
@@ -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"
 
index 8a1ba5ed6beb339dbb0d33d42530d78afb59eaf0..7c5a079106558d9cf0849b517a08098bb36d0582 100644 (file)
@@ -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"
index 8c346b677606b832313031a891f474bcfa2b20a8..33814858c1eacc564be511b85718678b2bb6279e 100644 (file)
@@ -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 ){
index f6d629ddd36f618044f27a1c24b3c6d079e0c84b..540e0be2aa5bb85f29e0d0ddddd78c6d085f9e5b 100644 (file)
@@ -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"