X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=shaders%2Fimpl.c;h=dbcebf8258ab0a0d9067d92a3a4153d8675f0161;hb=422fe8bd45ecb522ae5b1d90187e95e24a5ad179;hp=539bcb1b66743421e0d15fecca79267c583abc37;hpb=1c4d337455a2697bd5a5344fe7226fad0b4ca1a0;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/shaders/impl.c b/shaders/impl.c index 539bcb1..dbcebf8 100644 --- a/shaders/impl.c +++ b/shaders/impl.c @@ -5960,6 +5960,59 @@ struct vg_shader _shader_scene_water = { "\n" "#line 18 0 \n" "\n" +"// Pasted from common_world.glsl\n" +"vec3 water_compute_lighting( vec3 diffuse, vec3 normal, vec3 co )\n" +"{\n" +" float light_mask = compute_board_shadow();\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" +" return diffuse * total_light;\n" +"}\n" +"\n" "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue, \n" " vec4 beneath, vec4 above, vec4 dudva )\n" "{\n" @@ -5980,8 +6033,22 @@ struct vg_shader _shader_scene_water = { "\n" " vec4 surf = mix( vec4(surface_tint,depthblend), \n" " vec4(1.0,1.0,1.0,0.5), fband );\n" -" surf.rgb = scene_compute_lighting( surf.rgb, aNorm.xyz, aWorldCo );\n" +" surf.rgb = water_compute_lighting( surf.rgb, aNorm.xyz, aWorldCo );\n" " surf.rgb = mix(surf.rgb, above.rgb, ffresnel );\n" +"\n" +" // Take a section of the sky function to give us a matching fog colour\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" +" surf.rgb = scene_apply_fog( surf.rgb, fog_colour, \n" +" distance(uCamera, aWorldCo) );\n" +"\n" " return surf;\n" "}\n" "\n"