struct LightStruct
{
float enable;
float intensity;
float radius;
vec2 position;
vec2 direction;
vec4 color;
float type;
};
uniform LightStruct lightInfos[32];
uniform vec2 screen_size;
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords)
{
vec4 pic_color = texture2D( texture, texture_coords );
vec4 light_color = vec4(0.0);
vec4 light_color_inter = vec4(0.0);
vec2 light_pos;
vec2 light_vec;
float light_value;
float light_angle;
float light_vec_cos;
float light_spot;
vec2 light_dir;
float PI = 3.14159265358979323846264;
for ( int i = 0; i < lightInfos.length; i++ )
{
if ( lightInfos[i].enable == 1 )
{
if ( lightInfos[i].type == 0 )
{
light_pos = lightInfos[i].position;
light_dir = lightInfos[i].direction;
light_vec = vec2( pixel_coords.x / screen_size.x, ( screen_size.y - pixel_coords.y ) / screen_size.y ) - light_pos;
light_vec.x = light_vec.x * ( screen_size.x / screen_size.y );
light_value = lightInfos[i].intensity * ( 1.0 - ( length( light_vec ) / ( lightInfos[i].radius * 2 ) ) );
light_color_inter = light_color + vec4( light_value, light_value, light_value, 1.0 ) + clamp(light_value, 0.0, 1.0);
light_angle = PI / 3;
light_vec_cos = dot( normalize( light_vec ), normalize( light_dir ) );
light_spot = ( clamp( light_vec_cos, cos( light_angle ), 1.0 ) - cos( light_angle ) ) * ( cos( light_angle ) * 2.0 );
light_color_inter.rgb *= clamp( light_spot, 0.0, 1.0 );
}
else if ( lightInfos[i].type == 1 )
{
light_pos = lightInfos[i].position;
light_vec = vec2( pixel_coords.x / screen_size.x, ( screen_size.y - pixel_coords.y ) / screen_size.y ) - light_pos;
light_vec.x = light_vec.x * ( screen_size.x / screen_size.y );
light_value = lightInfos[i].intensity * ( 1.0 - ( length( light_vec ) / lightInfos[i].radius ) );
light_color_inter = light_color + vec4( light_value, light_value, light_value, 1.0 ) + clamp(light_value, 0.0, 1.0);
}
light_color += light_color_inter;
}
}
return pic_color * light_color;
}