]> git.tdb.fi Git - libs/gl.git/blob - shaderlib/common.glsl
bac82fc131150bf0895db30d975c71cb398ae56d
[libs/gl.git] / shaderlib / common.glsl
1 import msp_interface;
2 import shadow;
3
4 layout(constant_id=auto) const bool use_normal_map = false;
5
6 #pragma MSP stage(vertex)
7 vec4 get_vertex_position()
8 {
9         return vertex;
10 }
11
12 vec3 get_vertex_normal()
13 {
14         return normal;
15 }
16
17 vec4 transform_position(vec4 pos)
18 {
19         return eye_obj_matrix*pos;
20 }
21
22 vec3 transform_normal(vec3 nor)
23 {
24         return eye_obj_normal_matrix*nor;
25 }
26
27 void standard_transform()
28 {
29         out vec4 eye_vertex = transform_position(get_vertex_position());
30         gl_Position = projection_matrix*eye_vertex;
31
32         out vec3 eye_normal = transform_normal(get_vertex_normal());
33         vec3 eye_tangent = transform_normal(tangent);
34         vec3 eye_binormal = transform_normal(binormal);
35         out mat3 eye_tbn_matrix = mat3(eye_tangent, eye_binormal, eye_normal);
36
37         out vec3 eye_look_dir = normalize(eye_vertex.xyz);
38         out vec3 tbn_look_dir = eye_look_dir*eye_tbn_matrix;
39
40         out vec3 eye_light_dir = normalize(light_sources[0].position.xyz-eye_vertex.xyz*light_sources[0].position.w);
41         out vec3 tbn_light_dir = eye_light_dir*eye_tbn_matrix;
42
43         out vec3 eye_halfway_dir = normalize(eye_light_dir-eye_look_dir);
44         out vec3 tbn_halfway_dir = eye_halfway_dir*eye_tbn_matrix;
45
46         out vec3 tbn_zenith_dir = eye_zenith_dir*eye_tbn_matrix;
47         out float fog_coord = eye_vertex.z;
48
49         for(int i=0; i<max_clip_planes; ++i)
50                 gl_ClipDistance[i] = dot(eye_vertex, clip_planes[i].equation);
51
52         shadow_transform(eye_vertex);
53 }
54
55 void custom_transform()
56 {
57 }
58
59 void main()
60 {
61         standard_transform();
62         custom_transform();
63         passthrough;
64 }
65
66 #pragma MSP stage(fragment)
67 vec3 get_fragment_normal()
68 {
69         if(use_normal_map)
70                 return normalize(texture(normal_map, texcoord.xy).xyz*2.0-1.0);
71         else
72                 return vec3(0.0, 0.0, 1.0);
73 }
74
75 vec4 get_environment_sample(vec3 direction)
76 {
77         return texture(environment_map, direction);
78 }
79
80 vec3 get_reflection(vec3 normal, vec3 look)
81 {
82         vec3 reflect_dir = reflect(look, normal);
83         if(use_normal_map)
84                 reflect_dir = eye_tbn_matrix*reflect_dir;
85
86         return get_environment_sample(env_eye_matrix*reflect_dir).rgb;
87 }
88
89 vec3 apply_fog(vec3 color)
90 {
91         float fog_value = exp(fog_coord*fog_density);
92         return mix(fog_color, color, fog_value);
93 }