final changes before dropping
[ld37_one_room] / sdr / uber.p.glsl
1 /* vi:set ft=glsl: */
2 #ifdef USE_TEXMAP
3 uniform sampler2D texmap;
4 #endif
5 #ifdef USE_CUBEMAP
6 uniform samplerCube envmap;
7 #endif
8 #ifdef USE_SHADOWMAP
9 uniform sampler2DShadow shadowmap;
10 #endif
11
12 varying vec3 vpos, vdir, normal;
13 #ifdef USE_SHADOWMAP
14 varying vec4 shadow_tc;
15 #endif
16 #ifdef USE_CUBEMAP
17 varying vec3 wdir;
18 #endif
19
20 #ifdef USE_TEXMAP
21 #define KD texel.rgb
22 #else
23 #define KD gl_FrontMaterial.diffuse.rgb
24 #endif
25
26 #define KS gl_FrontMaterial.specular.rgb
27 #define SPOW gl_FrontMaterial.shininess
28
29 #define LD(i) gl_LightSource[i].diffuse.rgb
30 #define LS(i) gl_LightSource[i].specular.rgb
31 #define LPOS(i) gl_LightSource[i].position.xyz
32
33 vec3 calc_diffuse(in vec3 n, in vec3 l, in vec3 color, in vec3 lcol)
34 {
35         float ndotl = max(dot(n, l), 0.0);
36         return color * lcol * ndotl;
37 }
38
39 vec3 calc_specular(in vec3 n, in vec3 l, in vec3 v, in vec3 color, in vec3 lcol)
40 {
41         vec3 h = normalize(l + v);
42         float ndoth = max(dot(n, h), 0.0);
43         return color * lcol * pow(ndoth, SPOW);
44 }
45
46
47 void main()
48 {
49 #ifdef USE_TEXMAP
50         vec4 texel = texture2D(texmap, gl_TexCoord[0].st);
51 #endif
52 #ifdef USE_SHADOWMAP
53         float shadow = shadow2DProj(shadowmap, shadow_tc).x;
54 #else
55         const float shadow = 1.0;
56 #endif
57
58         vec3 n = normalize(normal);
59         vec3 v = normalize(vdir);
60
61         vec3 diffuse = vec3(0.0, 0.0, 0.0);
62         vec3 specular = vec3(0.0, 0.0, 0.0);
63
64 #ifdef USE_LIGHT0
65         {
66                 vec3 l = normalize(LPOS(0) - vpos);
67                 diffuse += calc_diffuse(n, l, KD, LD(0)) * shadow;
68                 specular += calc_specular(n, l, v, KS, LS(0)) * shadow;
69         }
70 #endif
71 #ifdef USE_LIGHT1
72         {
73                 vec3 l = normalize(LPOS(1) - vpos);
74                 diffuse += calc_diffuse(n, l, KD, LD(1)) * shadow;
75                 specular += calc_specular(n, l, v, KS, LS(1)) * shadow;
76         }
77 #endif
78 #ifdef USE_LIGHT2
79         {
80                 vec3 l = normalize(LPOS(2) - vpos);
81                 diffuse += calc_diffuse(n, l, KD, LD(2)) * shadow;
82                 specular += calc_specular(n, l, v, KS, LS(2)) * shadow;
83         }
84 #endif
85
86 #ifdef USE_CUBEMAP
87         // envmap
88         vec3 rdir = -reflect(wdir, n);
89         vec3 env_texel = textureCube(envmap, rdir).xyz;
90         specular += KS * env_texel;
91 #endif  // USE_CUBEMAP
92
93         vec3 ambient = gl_LightModel.ambient.rgb * KD;
94         gl_FragColor.rgb = ambient + diffuse;// + specular;
95 #ifdef USE_TEXMAP
96         gl_FragColor.a = gl_FrontMaterial.diffuse.a * texel.a;
97 #else
98         gl_FragColor.a = gl_FrontMaterial.diffuse.a;
99 #endif
100 }