- total_light += newlight_compute_quadratic
- (
- wnormal, halfview,
- g_point_light_positions[ aLights.x ].xyz,
- g_point_light_colours[ aLights.x ].rgb
- );
- total_light += newlight_compute_quadratic
- (
- wnormal, halfview,
- g_point_light_positions[ aLights.y ].xyz,
- g_point_light_colours[ aLights.y ].rgb
- );
- total_light += newlight_compute_quadratic
- (
- wnormal, halfview,
- g_point_light_positions[ aLights.z ].xyz,
- g_point_light_colours[ aLights.z ].rgb
- );
-
- 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 );