aboutsummaryrefslogtreecommitdiff
path: root/data/shaders/fill-light.frag
blob: eb89c79e2ef61ffa714ea56fc1e8d72631d11f17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
 * fill-light.frag
 *
 * Simplified lighting calculations for the lander craft
 *
 * (c) 2007-2008 Thomas White <taw27@cam.ac.uk>
 *
 *  thrust3d - a silly game
 *
 */

varying vec3 pos;
varying vec3 normal;

varying vec3 light2vc;

uniform sampler2D texture;
uniform sampler2D normalmap;

uniform bool has_normals;
uniform float alpha;

varying vec3 col_ambi_diff;
varying vec3 col_emit;
varying float shininess;

void main() {
	
	vec3 ambi, emit, diff, spec;
	vec3 norm;
	float diff_fac, spec_fac;
	vec3 L, E, R;
	vec3 tex;
	
	tex = texture2D(texture, gl_TexCoord[0].st).rgb;
	
	if ( has_normals ) {
		norm += (texture2D(normalmap, gl_TexCoord[0].st).rgb - vec3(0.5, 0.5, 0.5)) / 2.0;
	}
	
	norm = normalize(normal);
	
	/* Ambient */
	ambi = min(1.0, col_ambi_diff * (gl_LightModel.ambient.rgb + vec3(0.5, 0.5, 0.5)));
	
	/* Emission */
	emit = col_emit;
	
	/* Light 2: Fill-in for lander craft */
	L = normalize(gl_LightSource[2].position.xyz - pos); 
	E = normalize(-pos);
	R = normalize(-reflect(L, norm)); 
	diff_fac = max(0.0, dot(normalize(light2vc).xyz, norm));
	spec_fac = max(0.0, dot(R, E));
	spec_fac = pow(spec_fac, shininess);
	
	diff = col_ambi_diff * gl_LightSource[2].diffuse.rgb * diff_fac;
	spec = gl_LightSource[2].specular.rgb * spec_fac;
	
	gl_FragColor = vec4(min(tex.r * (ambi.r + diff.r) + spec.r, 1.0),
			    min(tex.g * (ambi.g + diff.g) + spec.g, 1.0),
			    min(tex.b * (ambi.b + diff.b) + spec.b, 1.0),
			    alpha);

}