1 // This is the Schlick Term function, to be included into the shader classes
 2 
 3 // Schlick approximation of Cook Torrance illumination model
 4 float SchlickTerm(float t, float u, float v, float x, float w)
 5 {
 6 	float s1, s2,            // spectral factors
 7 	      d1, d2,            // directional factors
 8 	      a1, a2,            // azimuth angle
 9 	      z1, z2,            // zenith angle
10 	      zd1, zd2,          // denominator of zenith angle (precomp)
11 	      gv1, gv2,          // smith factor v
12 	      gx1, gx2;          // smith factor v'
13 
14 	if (material->c1 == UNDEF)
15 		return 0.0f;
16 
17 	// Single layered part
18 	s1  = material->c1 + (1 - material->c1) * powf(1 - u, 5);
19 
20 	if (material->p1)
21 	{
22 		a1 = sqrt(material->p1 / (p12 - p12 * w + w));
23 
24 		if (material->r1)
25 		{
26 			zd1 = 1 + (material->r1 - 1) * t * t;
27 			zd1 = zd1 * zd1;
28 			z1 = material->r1 / zd1;
29 			gv1 = v / (material->r1 - material->r1 * v + v);
30 			gx1 = x / (material->r1 - material->r1 * x + x);
31 			d1  = (((1 - gv1 * gx1) * v * x) + gv1 * gx1 * z1 / 4) * a1 / M_PI;
32 		}
33 		else
34 			d1 = a1 / M_PI;
35 	}
36 	else
37 		d1 = 0;
38 
39 	float result = s1 * d1;
40 
41 	// Optional double layered part
42 	if (material->c2 != UNDEF)
43 	{
44 		s2  = material->c2 + (1 - material->c2) * powf(1 - u, 5);
45 
46 		if (material->p2)
47 		{
48 			a2 = sqrt(material->p2 / (p22 - p22 * w + w));
49 
50 			if (material->r2)
51 			{
52 				zd2 = 1 + (material->r2 - 1) * t * t;
53 				zd2 = zd2 * zd2;
54 				z2 = material->r2 / zd2;
55 				gv2 = v / (material->r2 - material->r2 * v + v);
56 				gx2 = x / (material->r2 - material->r2 * x + x);
57 				d2  = (((1 - gv2 * gx2) * v * x) + gv2 * gx2 * z2 / 4) * a2 / M_PI;
58 			}
59 			else
60 				d2 = a2 / M_PI;
61 		}
62 		else
63 			d2 = 0;
64 
65 		result += (1 - s1) * s2 * d2;
66 	}
67 
68 	return result;
69 }


syntax highlighted by Code2HTML, v. 0.9.1