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
- (
- wnormal, halfview,
- light_positions[0].xyz,
- light_colours[0].rgb
- ) * board_shadow;
- total_light += newlight_compute_quadratic
- (
- wnormal, halfview,
- light_positions[1].xyz,
- light_colours[1].rgb
- ) * board_shadow;
- total_light += newlight_compute_quadratic
- (
- wnormal, halfview,
- light_positions[2].xyz,
- light_colours[2].rgb
- ) * board_shadow;
-
- return apply_fog( diffuse * total_light, fdist );
+ // 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 );
+
+ if( g_debug_indices == 1 )
+ {
+ float rings = min( fract(distance(light_co_0.xyz,aWorldCo)),
+ min( 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 )) + (rings-0.5) * 0.25;
+ }
+
+ if( g_debug_complexity == 1 )
+ {
+ return vec3(1.0,0.0,0.0) * ( light_indices.w/3.0 );
+ }
+
+ if( light_indices.w >= 1 )
+ {
+ total_light += newlight_compute_spot
+ (
+ wnormal, halfview,
+ light_colour_0.rgb,
+ light_co_0.xyz,
+ light_dir_0
+ ) * board_shadow
+ * step( world.day_phase, light_colour_0.w );
+
+ if( light_indices.w >= 2 )
+ {
+ total_light += newlight_compute_spot
+ (
+ wnormal, halfview,
+ light_colour_1.rgb,
+ light_co_1.xyz,
+ light_dir_1
+ ) * board_shadow
+ * step( world.day_phase, light_colour_1.w );
+
+ if( light_indices.w >= 3 )
+ {
+ total_light += newlight_compute_spot
+ (
+ wnormal, halfview,
+ light_colour_2.rgb,
+ light_co_2.xyz,
+ light_dir_2
+ ) * board_shadow
+ * step( world.day_phase, light_colour_2.w );
+ }
+ }
+ }
+
+ vec3 fog_colour = scene_sky( -halfview, world );
+
+ return scene_apply_fog( diffuse * total_light, fog_colour, fdist );
}