Workbench: Matcaps T55291
[blender.git] / source / blender / draw / engines / workbench / shaders / workbench_world_light_lib.glsl
1 #define BLINN
2
3 vec3 get_world_diffuse_light(WorldData world_data, vec3 N)
4 {
5         vec4 result = world_data.diffuse_light_x_pos * clamp(N.x, 0.0, 1.0);
6         result = mix(result, world_data.diffuse_light_x_neg, clamp(-N.x, 0.0, 1.0));
7         result = mix(result, world_data.diffuse_light_y_pos, clamp(-N.y, 0.0, 1.0));
8         result = mix(result, world_data.diffuse_light_y_neg, clamp(N.y, 0.0, 1.0));
9         result = mix(result, world_data.diffuse_light_z_pos, clamp(N.z, 0.0, 1.0));
10         return mix(result, world_data.diffuse_light_z_neg, clamp(-N.z, 0.0, 1.0)).xyz;
11 }
12
13 vec3 get_camera_diffuse_light(WorldData world_data, vec3 N)
14 {
15         vec4 result = world_data.diffuse_light_x_pos * clamp(N.x, 0.0, 1.0);
16         result = mix(result, world_data.diffuse_light_x_neg, clamp(-N.x, 0.0, 1.0));
17         result = mix(result, world_data.diffuse_light_z_pos, clamp( N.y, 0.0, 1.0));
18         result = mix(result, world_data.diffuse_light_z_neg, clamp(-N.y, 0.0, 1.0));
19         result = mix(result, world_data.diffuse_light_y_pos, clamp( N.z, 0.0, 1.0));
20         result = mix(result, world_data.diffuse_light_y_neg, clamp(-N.z, 0.0, 1.0));
21         return result.rgb;
22 }
23
24 /* N And I are in View Space. */
25 vec3 get_world_specular_light(vec4 specular_data, LightData light_data, vec3 N, vec3 I)
26 {
27 #ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
28         vec3 specular_light = specular_data.rgb * light_data.specular_color.rgb * light_data.specular_color.a;
29
30         float shininess = exp2(10*(1.0-specular_data.a) + 1);
31
32 #  ifdef BLINN
33         float normalization_factor = (shininess + 8) / (8 * M_PI);
34         vec3 L = -light_data.light_direction_vs.xyz;
35         vec3 halfDir = normalize(L + I);
36         float specAngle = max(dot(halfDir, N), 0.0);
37         float NL = max(dot(L, N), 0.0);
38         float specular_influence = pow(specAngle, shininess) * NL  * normalization_factor;
39
40 #  else
41         vec3 reflection_vector = reflect(I, N);
42         float specAngle = max(dot(light_data.light_direction_vs.xyz, reflection_vector), 0.0);
43         float specular_influence = pow(specAngle, shininess);
44 #  endif
45
46         vec3 specular_color = specular_light * specular_influence;
47
48 #else /* V3D_SHADING_SPECULAR_HIGHLIGHT */
49         vec3 specular_color = vec3(0.0);
50 #endif /* V3D_SHADING_SPECULAR_HIGHLIGHT */
51         return specular_color;
52 }
53
54 vec3 get_world_specular_lights(WorldData world_data, vec4 specular_data, vec3 N, vec3 I)
55 {
56         vec3 specular_light = vec3(0.0);
57         specular_light += get_world_specular_light(specular_data, world_data.lights[0], N, I);
58         for (int i = 0 ; i < world_data.num_lights ; i ++) {
59                 specular_light += get_world_specular_light(specular_data, world_data.lights[i], N, I);
60         }
61         return specular_light;
62 }
63