in vec4 aNorm;
in vec3 aCo;
in vec3 aWorldCo;
-flat in vec4 light_colours[3];
-flat in vec4 light_positions[3];
+flat in ivec4 light_indices;
+
+uniform samplerBuffer uLightsArray;
#include "common_world.glsl"
+#include "light_clearskies.glsl"
float sdLine( vec3 p, vec3 a, vec3 b )
{
return 1.0 - player_shadow*0.8;
}
+vec3 scene_apply_fog( vec3 vfrag, vec3 colour, float fdist )
+{
+ float dist = pow(fdist*0.0010,0.78);
+ return mix( vfrag, colour, min( 1.0, dist ) );
+}
+
vec3 scene_do_lighting( vec3 diffuse, vec3 wnormal )
{
+ world_info world;
+ scene_state( g_time, world );
+
// Lighting
vec3 halfview = uCamera - aWorldCo;
float fdist = length(halfview);
halfview /= fdist;
- vec3 total_light = newlight_compute_ambient();
-
- // Compute world lighting contribution and apply it according to the
- // shadow map
- //
- vec3 world_light = newlight_compute_world_diffuse( wnormal );
- world_light += newlight_compute_sun_spec( wnormal, halfview, 0.1 );
+ vec3 total_light = vec3(0.0);
+
- float world_shadow = newlight_compute_sun_shadow();
+ float world_shadow = newlight_compute_sun_shadow( world.sun_dir
+ * (1.0/(max(world.sun_dir.y,0.0)+0.2)) );
float board_shadow = compute_board_shadow();
- total_light += world_light * min( board_shadow, world_shadow );
+ total_light += scene_lighting( wnormal, min( board_shadow, world_shadow ),
+ halfview, world );
+
+ //total_light += scene_lighting_old( wnormal, world );
// Compute the other lights that exist in the map, not effected by the sun
// shadow
- total_light += newlight_compute_quadratic
+ // read lights
+ vec4 light_colour_0 = texelFetch( uLightsArray, light_indices.x*3+0 );
+ vec4 light_colour_1 = texelFetch( uLightsArray, light_indices.y*3+0 );
+ vec4 light_colour_2 = texelFetch( uLightsArray, light_indices.z*3+0 );
+ vec4 light_co_0 = texelFetch( uLightsArray, light_indices.x*3+1 );
+ vec4 light_co_1 = texelFetch( uLightsArray, light_indices.y*3+1 );
+ vec4 light_co_2 = texelFetch( uLightsArray, light_indices.z*3+1 );
+ vec4 light_dir_0 = texelFetch( uLightsArray, light_indices.x*3+2 );
+ vec4 light_dir_1 = texelFetch( uLightsArray, light_indices.y*3+2 );
+ vec4 light_dir_2 = texelFetch( uLightsArray, light_indices.z*3+2 );
+
+ //return vec3(fract(distance(light_co_0.xyz,aWorldCo)),
+ // fract(distance(light_co_1.xyz,aWorldCo)),
+ // fract(distance(light_co_2.xyz,aWorldCo)));
+
+ // return vec3(fract(light_indices.x * 0.125), fract(light_indices.y*0.125),
+ // fract(light_indices.z * 0.125 ));
+
+ total_light += newlight_compute_spot
(
wnormal, halfview,
- light_positions[0].xyz,
- light_colours[0].rgb
+ light_colour_0.rgb,
+ light_co_0.xyz,
+ light_dir_0
) * board_shadow;
- total_light += newlight_compute_quadratic
+
+ total_light += newlight_compute_spot
(
wnormal, halfview,
- light_positions[1].xyz,
- light_colours[1].rgb
+ light_colour_1.rgb,
+ light_co_1.xyz,
+ light_dir_1
) * board_shadow;
- total_light += newlight_compute_quadratic
+ total_light += newlight_compute_spot
(
wnormal, halfview,
- light_positions[2].xyz,
- light_colours[2].rgb
+ light_colour_2.rgb,
+ light_co_2.xyz,
+ light_dir_2
) * board_shadow;
- return apply_fog( diffuse * total_light, fdist );
+ vec3 fog_colour = scene_sky( -halfview, world );
+
+ return scene_apply_fog( diffuse * total_light, fog_colour, fdist );
}