From 7c0134ea1263a54bf69dfcf799d46b0661b31858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20=E2=80=98Touky=E2=80=99=20Huet?= Date: Tue, 18 Dec 2012 19:48:08 +0000 Subject: [PATCH] shiny.lolfx now has a PointLight & a DirectionalLight. Sorry for all the fine projects that use this shader ! --- src/easymesh/shiny.lolfx | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/easymesh/shiny.lolfx b/src/easymesh/shiny.lolfx index 85b0f3e7..b79ebf23 100644 --- a/src/easymesh/shiny.lolfx +++ b/src/easymesh/shiny.lolfx @@ -42,8 +42,10 @@ varying vec3 pass_TNormal; varying vec4 pass_Color; // FIXME: the light direction should be passed in the code -vec3 in_LightDir = vec3(0.3, 0.3, 0.7); -vec4 in_Light2_Pos = vec4(-100.0, 100.0, -100.0, 1.0); +vec3 in_LightDir = vec3(-0.3, -0.3, -0.7); +vec4 in_Light2_Pos = vec4(0.0, 10.0, 0.0, 1.0); +float in_Light2_Radius = 20.0; +vec3 in_Light2_diffuse = vec3(0.4, 0.4, 1.0); void main(void) { @@ -54,7 +56,7 @@ void main(void) /* World properties */ float ambient_mul = 0.5; vec3 ambient_color = vec3(0.0, 0.0, 0.0); - vec3 diffuse_color = vec3(1.0, 1.0, 0.6); + vec3 diffuse_color = vec3(0.4, 0.4, 0.4); vec3 specular_color = vec3(1.0, 1.0, 0.6); vec3 ambient = ambient_color; @@ -65,30 +67,31 @@ void main(void) vec3 r = vec3(0.0, 0.0, 0.0); float sdotn = 0.0; - /* //Light calculation for directional light - s = normalize(in_LightDir); + s = normalize(-in_LightDir); v = normalize(-pass_Vertex.xyz); - r = reflect(-s, pass_TNormal); + r = reflect(s, pass_TNormal); sdotn = max(dot(s, pass_TNormal), 0.0); diffuse += diffuse_color * sdotn; if (sdotn > 0.0) specular += specular_color * specular_reflect * pow(max(dot(r, v), 0.0), specular_power); - */ + //Light calculation for point light - s = normalize((in_View * in_Light2_Pos).xyz - pass_Vertex.xyz); + vec3 tmpLightDir = (in_View * in_Light2_Pos).xyz - pass_Vertex.xyz; + float light_radius_mod = max(0.0, 1.0 - (length(tmpLightDir) / in_Light2_Radius)); + s = normalize(tmpLightDir); v = normalize(-pass_Vertex.xyz); r = reflect(-s, pass_TNormal); sdotn = max(dot(s, pass_TNormal), 0.0); - diffuse += diffuse_color * sdotn; - //if (sdotn > 0.0) - // specular += specular_color * specular_reflect - // * pow(max(dot(r, v), 0.0), specular_power); - + diffuse += in_Light2_diffuse * min(sdotn, light_radius_mod); + if (sdotn > 0.0 && light_radius_mod > 0.0) + specular += specular_color * min(specular_reflect, light_radius_mod) + * pow(max(dot(r, v), 0.0), specular_power); + vec3 light = ambient + diffuse + specular;