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