http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.05.tar.gz
[xscreensaver] / hacks / glx / chessmodels.c
1 /*
2  * glChess - A 3D chess interface
3  *
4  * Copyright (C) 2002  Robert  Ancell <bob27@users.sourceforge.net>
5  *                     Michael Duelli <duelli@users.sourceforge.net>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 /* chessmodels.c: Contains the code for piece model creation */
23
24 #include <math.h>
25 #include <GL/glx.h>
26 #include <GL/gl.h>
27 #include <GL/glu.h>
28
29 #include "chessmodels.h"
30
31 double piece_size = 0.1;
32
33 #define ROT 16
34
35 #define piece_size 0.095
36 #define EPSILON 0.001
37
38 /* Make a revolved piece */
39 void revolve_line(double *trace_r, double *trace_h, double max_ih, int rot) {
40   double theta, norm_theta, sin_theta, cos_theta;
41   double norm_ptheta = 0.0, sin_ptheta = 0.0, cos_ptheta = 1.0;
42   double radius, pradius;
43   double max_height = max_ih, height, pheight;
44   double dx, dy, len;
45   int npoints, p;
46   double dtheta = (2.0*M_PI) / rot;
47
48   /* Get the number of points */
49   for(npoints = 0; 
50       fabs(trace_r[npoints]) > EPSILON || fabs(trace_h[npoints]) > EPSILON;
51       ++npoints);
52
53   /* If less than two points, can not revolve */
54   if(npoints < 2)
55     return;
56
57   /* If the max_height hasn't been defined, find it */
58   if(max_height < EPSILON)
59     for(p = 0; p < npoints; ++p)
60       if(max_height < trace_h[p])
61         max_height = trace_h[p];
62
63   /* Draw the revolution */
64   for(theta = dtheta; rot > 0; --rot) {
65     sin_theta = sin(theta);
66     cos_theta = cos(theta);
67     norm_theta = theta / (2.0 * M_PI);
68     pradius = trace_r[0] * piece_size;
69     pheight = trace_h[0] * piece_size;
70     
71     for(p = 0; p < npoints; ++p) {
72       radius = trace_r[p] * piece_size;
73       height = trace_h[p] * piece_size;
74
75       /* Get the normalized lengths of the normal vector */
76       dx = radius - pradius;
77       dy = height - pheight;
78       len = sqrt(dx*dx + dy*dy);
79       dx /= len;
80       dy /= len;
81
82       /* If only triangles required */
83       if (fabs(radius) < EPSILON) {
84         glBegin(GL_TRIANGLES);
85
86         glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta);
87         glTexCoord2f(norm_ptheta, pheight / max_height);
88         glVertex3f(pradius * sin_ptheta, pheight, pradius * cos_ptheta);
89         
90         glNormal3f(dy * sin_theta, -dx, dy * cos_theta);
91         glTexCoord2f(norm_theta, pheight / max_height);
92         glVertex3f(pradius * sin_theta, pheight, pradius * cos_theta);
93         
94         glTexCoord2f(0.5 * (norm_theta + norm_ptheta),
95                      height / max_height);
96         glVertex3f(0.0, height, 0.0);
97         
98         glEnd();
99       } 
100       
101       else {
102         glBegin(GL_QUADS);
103
104         glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta);
105         glTexCoord2f(norm_ptheta, pheight / max_height);
106         glVertex3f(pradius * sin_ptheta, pheight, pradius * cos_ptheta);
107
108         glNormal3f(dy * sin_theta, -dx, dy * cos_theta);
109         glTexCoord2f(norm_theta, pheight / max_height);
110         glVertex3f(pradius * sin_theta, pheight, pradius * cos_theta);
111
112         glTexCoord2f(norm_theta, height / max_height);
113         glVertex3f(radius * sin_theta, height, radius * cos_theta);
114
115         glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta);
116         glTexCoord2f(norm_ptheta, height / max_height);
117         glVertex3f(radius * sin_ptheta, height, radius * cos_ptheta);
118
119         glEnd();
120       }
121
122       pradius = radius;
123       pheight = height;
124     }
125
126     sin_ptheta = sin_theta;
127     cos_ptheta = cos_theta;
128     norm_ptheta = norm_theta;
129     theta += dtheta;
130   }
131 }
132
133 void gen_model_lists(void) {
134   glNewList(1, GL_COMPILE);
135   draw_king();
136   glEndList();
137   
138   glNewList(2, GL_COMPILE);
139   draw_queen();
140   glEndList();
141
142   glNewList(3, GL_COMPILE);
143   draw_bishop();
144   glEndList();
145
146   glNewList(4, GL_COMPILE);
147   draw_knight();
148   glEndList();
149
150   glNewList(5, GL_COMPILE);
151   draw_rook();
152   glEndList();
153
154   glNewList(6, GL_COMPILE);
155   draw_pawn();
156   glEndList();
157 }
158
159 void draw_pawn(void) {
160   double trace_r[] = 
161     { 3.5, 3.5, 2.5, 2.5, 1.5, 1.0, 1.8, 1.0, 2.0, 1.0, 0.0, 0.0 };
162   double trace_h[] =
163     { 0.0, 2.0, 3.0, 4.0, 6.0, 8.8, 8.8, 9.2, 11.6, 13.4, 13.4, 0.0 };
164   
165   revolve_line(trace_r, trace_h, 0.0, ROT);
166 }
167
168 void draw_rook(void)
169 {
170   double trace_r[] =
171     { 3.8, 3.8, 2.6, 2.0, 2.8, 2.8, 2.2, 2.2, 0.0, 0.0 };
172   double trace_h[] =
173     { 0.0, 2.0, 5.0, 10.2, 10.2, 13.6, 13.6, 13.0, 13.0, 0.0 };
174
175   revolve_line(trace_r, trace_h, 0.0, ROT);
176 }
177
178 void draw_knight(void)
179 {
180   double trace_r[] = { 4.1, 4.1, 2.0, 2.0, 2.6, 0.0 };
181   double trace_h[] = { 0.0, 2.0, 3.6, 4.8, 5.8, 0.0 };
182
183   /* Revolved base */
184   revolve_line(trace_r, trace_h, 17.8, ROT);
185
186   /* Non revolved pieces */
187   /* Quads */
188   glBegin(GL_QUADS);
189
190   /* Square base */
191   glNormal3f(0.0, -1.0, 0.0);
192   glTexCoord2f(0.0, 5.8 / 17.8 * piece_size);
193   glVertex3f(2.6 * piece_size, 5.8 * piece_size, 2.6 * piece_size);
194   glTexCoord2f(0.0, 5.8 / 17.8 * piece_size);
195   glVertex3f(-2.6 * piece_size, 5.8 * piece_size, 2.6 * piece_size);
196   glTexCoord2f(0.0, 5.8 / 17.8 * piece_size);
197   glVertex3f(-2.6 * piece_size, 5.8 * piece_size, -0.8 * piece_size);
198   glTexCoord2f(0.0, 5.8 / 17.8 * piece_size);
199   glVertex3f(2.6 * piece_size, 5.8 * piece_size, -0.8 * piece_size);
200
201   /* Upper edge of nose */
202   glNormal3f(0.0, 0.707107, 0.707107);
203   glTexCoord2f(0.0, 16.2 / 17.8 * piece_size);
204   glVertex3f(0.8 * piece_size, 16.2 * piece_size, 4.0 * piece_size);
205   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
206   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 3.4 * piece_size);
207   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
208   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 3.4 * piece_size);
209   glTexCoord2f(0.0, 16.2 / 17.8 * piece_size);
210   glVertex3f(-0.8 * piece_size, 16.2 * piece_size, 4.0 * piece_size);
211
212   /* Above head */
213   glNormal3f(0.0, 1.0, 0.0);
214
215   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
216   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 3.4 * piece_size);
217   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
218   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 3.0 * piece_size);
219   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
220   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 3.0 * piece_size);
221   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
222   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 3.4 * piece_size);
223
224   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
225   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 3.0 * piece_size);
226   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
227   glVertex3f(0.5 * piece_size, 16.8 * piece_size, 1.6 * piece_size);
228   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
229   glVertex3f(-0.5 * piece_size, 16.8 * piece_size, 1.6 * piece_size);
230   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
231   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 3.0 * piece_size);
232
233   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
234   glVertex3f(0.5 * piece_size, 16.8 * piece_size, 1.6 * piece_size);
235   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
236   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 0.2 * piece_size);
237   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
238   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 0.2 * piece_size);
239   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
240   glVertex3f(-0.5 * piece_size, 16.8 * piece_size, 1.6 * piece_size);
241
242   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
243   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 0.2 * piece_size);
244   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
245   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -0.2 * piece_size);
246   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
247   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -0.2 * piece_size);
248   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
249   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 0.2 * piece_size);
250
251   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
252   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -0.2 * piece_size);
253   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
254   glVertex3f(0.4 * piece_size, 16.8 * piece_size, -1.1 * piece_size);
255   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
256   glVertex3f(-0.4 * piece_size, 16.8 * piece_size, -1.1 * piece_size);
257   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
258   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -0.2 * piece_size);
259
260   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
261   glVertex3f(0.4 * piece_size, 16.8 * piece_size, -1.1 * piece_size);
262   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
263   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
264   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
265   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
266   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
267   glVertex3f(-0.4 * piece_size, 16.8 * piece_size, -1.1 * piece_size);
268
269   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
270   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
271   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
272   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
273   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
274   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
275   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
276   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
277
278   /* Back of head */
279   glNormal3f(0.0, 0.0, -1.0);
280   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
281   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
282   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
283   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
284   glTexCoord2f(0.0, 15.0 / 17.8 * piece_size);
285   glVertex3f(1.0 * piece_size, 15.0 * piece_size, -4.4 * piece_size);
286   glTexCoord2f(0.0, 15.0 / 17.8 * piece_size);
287   glVertex3f(-1.0 * piece_size, 15.0 * piece_size, -4.4 * piece_size);
288
289   /* Under back */
290   glNormal3f(0.0, 0.0, -1.0);
291   glTexCoord2f(0.0, 15.0 / 17.8 * piece_size);
292   glVertex3f(-1.0 * piece_size, 15.0 * piece_size, -4.4 * piece_size);
293   glTexCoord2f(0.0, 15.0 / 17.8 * piece_size);
294   glVertex3f(1.0 * piece_size, 15.0 * piece_size, -4.4 * piece_size);
295   glTexCoord2f(0.0, 14.8 / 17.8 * piece_size);
296   glVertex3f(0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
297   glTexCoord2f(0.0, 14.8 / 17.8 * piece_size);
298   glVertex3f(-0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
299
300   /* Right side of face */
301   glNormal3f(-0.933878, 0.128964, -0.333528);
302   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
303   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 3.0 * piece_size);
304   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
305   glVertex3f(-0.5 * piece_size, 16.8 * piece_size, 1.6 * piece_size);
306   glTexCoord2f(0.0, 14.0 / 17.8 * piece_size);
307   glVertex3f(-1.0 * piece_size, 14.0 * piece_size, 1.3 * piece_size);
308   glTexCoord2f(0.0, 13.8 / 17.8 * piece_size);
309   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
310
311   glNormal3f(-0.966676, 0.150427, 0.207145);
312   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
313   glVertex3f(-0.5 * piece_size, 16.8 * piece_size, 1.6 * piece_size);
314   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
315   glVertex3f(-0.8 * piece_size, 16.8 * piece_size, 0.2 * piece_size);
316   glTexCoord2f(0.0, 13.8 / 17.8 * piece_size);
317   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 0.2 * piece_size);
318   glTexCoord2f(0.0, 14.0 / 17.8 * piece_size);
319   glVertex3f(-1.0 * piece_size, 14.0 * piece_size, 1.3 * piece_size);
320
321   /* (above and below eye) */
322   glNormal3f(-0.934057, 0.124541, -0.334704);
323
324   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
325   glVertex3f(-0.82666667 * piece_size, 16.6 * piece_size,
326              0.2 * piece_size);
327   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
328   glVertex3f(-0.8 * piece_size, 16.8 * piece_size, 0.2 * piece_size);
329   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
330   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -0.2 * piece_size);
331   glTexCoord2f(0.0, 16.6 / 17.8 * piece_size);
332   glVertex3f(-1.0 * piece_size, 16.6 * piece_size, -0.38 * piece_size);
333
334   glTexCoord2f(0.0, 13.8 / 17.8 * piece_size);
335   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 0.2 * piece_size);
336   glTexCoord2f(0.0, 16.2 / 17.8 * piece_size);
337   glVertex3f(-0.88 * piece_size, 16.2 * piece_size, 0.2 * piece_size);
338   glTexCoord2f(0.0, 16.2 / 17.8 * piece_size);
339   glVertex3f(-1.0 * piece_size, 16.2 * piece_size, -0.74 * piece_size);
340   glTexCoord2f(0.0, 13.6 / 17.8 * piece_size);
341   glVertex3f(-1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
342
343   glTexCoord2f(0.0, 13.6 / 17.8 * piece_size);
344   glVertex3f(-1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
345   glTexCoord2f(0.0, 16.2 / 17.8 * piece_size);
346   glVertex3f(-1.0 * piece_size, 16.2 * piece_size, -0.74 * piece_size);
347   glTexCoord2f(0.0, 15.8 / 17.8 * piece_size);
348   glVertex3f(-1.0 * piece_size, 15.8 * piece_size, -1.1 * piece_size);
349   glTexCoord2f(0.0, 14.0 / 17.8 * piece_size);
350   glVertex3f(-0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
351
352   glNormal3f(-0.970801, -0.191698, -0.144213);
353   glTexCoord2f(0.0, 16.8 / 17.8 * piece_size);
354   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
355   glTexCoord2f(0.0, 14.8 / 17.8 * piece_size);
356   glVertex3f(-0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
357   glTexCoord2f(0.0, 14.0 / 17.8 * piece_size);
358   glVertex3f(-0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
359   glTexCoord2f(0.0, 15.8 / 17.8 * piece_size);
360   glVertex3f(-1.0 * piece_size, 15.8 * piece_size, -1.1 * piece_size);
361
362   glNormal3f(-0.975610, 0.219512, 0.0);
363   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
364   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
365   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
366   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
367   glTexCoord2f(0.0f * piece_size, 15.0f / 17.8f * piece_size);
368   glVertex3f(-1.0 * piece_size, 15.0 * piece_size, -4.4 * piece_size);
369   glTexCoord2f(0.0f * piece_size, 14.8f / 17.8f * piece_size);
370   glVertex3f(-0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
371
372   /* Left side of face */
373   glNormal3f(0.933878, 0.128964, -0.333528);
374   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
375   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 3.0 * piece_size);
376   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
377   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
378   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
379   glVertex3f(1.0 * piece_size, 14.0 * piece_size, 1.3 * piece_size);
380   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
381   glVertex3f(0.5 * piece_size, 16.8 * piece_size, 1.6 * piece_size);
382
383   glNormal3f(0.966676, 0.150427, 0.207145);
384   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
385   glVertex3f(0.5 * piece_size, 16.8 * piece_size, 1.6 * piece_size);
386   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
387   glVertex3f(1.0 * piece_size, 14.0 * piece_size, 1.3 * piece_size);
388   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
389   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 0.2 * piece_size);
390   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
391   glVertex3f(0.8 * piece_size, 16.8 * piece_size, 0.2 * piece_size);
392
393   /* (above and below eye) */
394   glNormal3f(0.934057, 0.124541, -0.334704);
395
396   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
397   glVertex3f(0.82666667 * piece_size, 16.6 * piece_size, 0.2 * piece_size);
398   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
399   glVertex3f(1.0 * piece_size, 16.6 * piece_size, -0.38 * piece_size);
400   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
401   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -0.2 * piece_size);
402   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
403   glVertex3f(0.8 * piece_size, 16.8 * piece_size, 0.2 * piece_size);
404
405   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
406   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 0.2 * piece_size);
407   glTexCoord2f(0.0f * piece_size, 13.6f / 17.8f * piece_size);
408   glVertex3f(1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
409   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
410   glVertex3f(1.0 * piece_size, 16.2 * piece_size, -0.74 * piece_size);
411   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
412   glVertex3f(0.88 * piece_size, 16.2 * piece_size, 0.2 * piece_size);
413
414   glTexCoord2f(0.0f * piece_size, 13.6f / 17.8f * piece_size);
415   glVertex3f(1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
416   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
417   glVertex3f(0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
418   glTexCoord2f(0.0f * piece_size, 15.8f / 17.8f * piece_size);
419   glVertex3f(1.0 * piece_size, 15.8 * piece_size, -1.1 * piece_size);
420   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
421   glVertex3f(1.0 * piece_size, 16.2 * piece_size, -0.74 * piece_size);
422
423   glNormal3f(0.970801, -0.191698, -0.144213);
424   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
425   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
426   glTexCoord2f(0.0f * piece_size, 15.8f / 17.8f * piece_size);
427   glVertex3f(1.0 * piece_size, 15.8 * piece_size, -1.1 * piece_size);
428   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
429   glVertex3f(0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
430   glTexCoord2f(0.0f * piece_size, 14.8f / 17.8f * piece_size);
431   glVertex3f(0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
432
433   glNormal3f(0.975610, -0.219512, 0.0);
434   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
435   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
436   glTexCoord2f(0.0f * piece_size, 14.8f / 17.8f * piece_size);
437   glVertex3f(0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
438   glTexCoord2f(0.0f * piece_size, 15.0f / 17.8f * piece_size);
439   glVertex3f(1.0 * piece_size, 15.0 * piece_size, -4.4 * piece_size);
440   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
441   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
442
443   /* Eyes */
444   glNormal3f(0.598246, 0.797665, 0.076372);
445   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
446   glVertex3f(0.88 * piece_size, 16.2 * piece_size, 0.2 * piece_size);
447   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
448   glVertex3f(1.0 * piece_size, 16.2 * piece_size, -0.74 * piece_size);
449   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
450   glVertex3f(0.8 * piece_size, 16.4 * piece_size, -0.56 * piece_size);
451   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
452   glVertex3f(0.61333334 * piece_size, 16.4 * piece_size, 0.2 * piece_size);
453
454   glNormal3f(0.670088, -0.714758, 0.200256);
455   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
456   glVertex3f(0.61333334 * piece_size, 16.4 * piece_size, 0.2 * piece_size);
457   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
458   glVertex3f(0.8 * piece_size, 16.4 * piece_size, -0.56 * piece_size);
459   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
460   glVertex3f(1.0 * piece_size, 16.6 * piece_size, -0.38 * piece_size);
461   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
462   glVertex3f(0.82666667 * piece_size, 16.6 * piece_size, 0.2 * piece_size);
463
464   glNormal3f(-0.598246, 0.797665, 0.076372);
465   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
466   glVertex3f(-0.88 * piece_size, 16.2 * piece_size, 0.2 * piece_size);
467   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
468   glVertex3f(-0.61333334 * piece_size, 16.4 * piece_size,
469              0.2 * piece_size);
470   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
471   glVertex3f(-0.8 * piece_size, 16.4 * piece_size, -0.56 * piece_size);
472   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
473   glVertex3f(-1.0 * piece_size, 16.2 * piece_size, -0.74 * piece_size);
474
475   glNormal3f(-0.670088, -0.714758, 0.200256);
476   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
477   glVertex3f(-0.61333334 * piece_size, 16.4 * piece_size,
478              0.2 * piece_size);
479   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
480   glVertex3f(-0.82666667 * piece_size, 16.6 * piece_size,
481              0.2 * piece_size);
482   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
483   glVertex3f(-1.0 * piece_size, 16.6 * piece_size, -0.38 * piece_size);
484   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
485   glVertex3f(-0.8 * piece_size, 16.4 * piece_size, -0.56 * piece_size);
486
487   /* Hair */
488   glNormal3f(0.0, 1.0, 0.0);
489   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
490   glVertex3f(0.35 * piece_size, 17.8 * piece_size, -0.8 * piece_size);
491   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
492   glVertex3f(0.35 * piece_size, 17.8 * piece_size, -4.4 * piece_size);
493   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
494   glVertex3f(-0.35 * piece_size, 17.8 * piece_size, -4.4 * piece_size);
495   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
496   glVertex3f(-0.35 * piece_size, 17.8 * piece_size, -0.8 * piece_size);
497
498   glNormal3f(1.0, 0.0, 0.0);
499   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
500   glVertex3f(0.35 * piece_size, 17.8 * piece_size, -0.8 * piece_size);
501   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
502   glVertex3f(0.35 * piece_size, 16.8 * piece_size, -0.8 * piece_size);
503   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
504   glVertex3f(0.35 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
505   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
506   glVertex3f(0.35 * piece_size, 17.8 * piece_size, -4.4 * piece_size);
507
508   glNormal3f(-1.0, 0.0, 0.0);
509   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
510   glVertex3f(-0.35 * piece_size, 17.8 * piece_size, -0.8 * piece_size);
511   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
512   glVertex3f(-0.35 * piece_size, 17.8 * piece_size, -4.4 * piece_size);
513   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
514   glVertex3f(-0.35 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
515   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
516   glVertex3f(-0.35 * piece_size, 16.8 * piece_size, -0.8 * piece_size);
517
518   glNormal3f(0.0, 0.0, 1.0);
519   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
520   glVertex3f(0.35 * piece_size, 17.8 * piece_size, -0.8 * piece_size);
521   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
522   glVertex3f(-0.35 * piece_size, 17.8 * piece_size, -0.8 * piece_size);
523   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
524   glVertex3f(-0.35 * piece_size, 16.8 * piece_size, -0.8 * piece_size);
525   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
526   glVertex3f(0.35 * piece_size, 16.8 * piece_size, -0.8 * piece_size);
527
528   glNormal3f(0.0, 0.0, -1.0);
529   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
530   glVertex3f(0.35 * piece_size, 17.8 * piece_size, -4.4 * piece_size);
531   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
532   glVertex3f(0.35 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
533   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
534   glVertex3f(-0.35 * piece_size, 16.8 * piece_size, -4.4 * piece_size);
535   glTexCoord2f(0.0f * piece_size, 17.8f / 17.8f * piece_size);
536   glVertex3f(-0.35 * piece_size, 17.8 * piece_size, -4.4 * piece_size);
537
538   /* Under chin */
539   glNormal3f(0.0, -0.853282, 0.521450);
540   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
541   glVertex3f(-1.0 * piece_size, 14.0 * piece_size, 1.3 * piece_size);
542   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
543   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 0.2 * piece_size);
544   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
545   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 0.2 * piece_size);
546   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
547   glVertex3f(1.0 * piece_size, 14.0 * piece_size, 1.3 * piece_size);
548
549   glNormal3f(0.0, -0.983870, -0.178885);
550   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
551   glVertex3f(-1.0 * piece_size, 14.0 * piece_size, 1.3 * piece_size);
552   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
553   glVertex3f(1.0 * piece_size, 14.0 * piece_size, 1.3 * piece_size);
554   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
555   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
556   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
557   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
558
559   /* Mane */
560
561   /* Right */
562   glNormal3f(-0.788443, 0.043237, -0.613587);
563   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
564   glVertex3f(-2.6 * piece_size, 5.8 * piece_size, -0.8 * piece_size);
565   glTexCoord2f(0.0f * piece_size, 14.8f / 17.8f * piece_size);
566   glVertex3f(-0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
567   glTexCoord2f(0.0f * piece_size, 15.0f / 17.8f * piece_size);
568   glVertex3f(0.0, 15.0 * piece_size, -3.6 * piece_size);
569   glTexCoord2f(0.0f * piece_size, 7.8f / 17.8f * piece_size);
570   glVertex3f(0.0, 7.8 * piece_size, -4.0 * piece_size);
571
572   /* Left */
573   glNormal3f(0.788443, 0.043237, -0.613587);
574   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
575   glVertex3f(2.6 * piece_size, 5.8 * piece_size, -0.8 * piece_size);
576   glTexCoord2f(0.0f * piece_size, 7.8f / 17.8f * piece_size);
577   glVertex3f(0.0, 7.8 * piece_size, -4.0 * piece_size);
578   glTexCoord2f(0.0f * piece_size, 15.0f / 17.8f * piece_size);
579   glVertex3f(0.0, 15.0 * piece_size, -3.6 * piece_size);
580   glTexCoord2f(0.0f * piece_size, 14.8f / 17.8f * piece_size);
581   glVertex3f(0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
582
583   /* Chest */
584   /* Front */
585   glNormal3f(0.0, 0.584305, 0.811534);
586   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
587   glVertex3f(-0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
588   glTexCoord2f(0.0f * piece_size, 8.8f / 17.8f * piece_size);
589   glVertex3f(-2.0 * piece_size, 8.8 * piece_size, 4.0 * piece_size);
590   glTexCoord2f(0.0f * piece_size, 8.8f / 17.8f * piece_size);
591   glVertex3f(2.0 * piece_size, 8.8 * piece_size, 4.0 * piece_size);
592   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
593   glVertex3f(0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
594
595   /* Bottom */
596   glNormal3f(0.0, -0.422886, 0.906183);
597   glTexCoord2f(0.0f * piece_size, 8.8f / 17.8f * piece_size);
598   glVertex3f(-2.0 * piece_size, 8.8 * piece_size, 4.0 * piece_size);
599   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
600   glVertex3f(-2.6 * piece_size, 5.8 * piece_size, 2.6 * piece_size);
601   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
602   glVertex3f(2.6 * piece_size, 5.8 * piece_size, 2.6 * piece_size);
603   glTexCoord2f(0.0f * piece_size, 8.8f / 17.8f * piece_size);
604   glVertex3f(2.0 * piece_size, 8.8 * piece_size, 4.0 * piece_size);
605
606   /* Right */
607   glNormal3f(-0.969286, 0.231975, -0.081681);
608   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
609   glVertex3f(-0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
610   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
611   glVertex3f(-1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
612   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
613   glVertex3f(-2.6 * piece_size, 5.8 * piece_size, 2.6 * piece_size);
614   glTexCoord2f(0.0f * piece_size, 8.8f / 17.8f * piece_size);
615   glVertex3f(-2.0 * piece_size, 8.8 * piece_size, 4.0 * piece_size);
616
617   glNormal3f(-0.982872, 0.184289, 0.0);
618   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
619   glVertex3f(-1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
620   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
621   glVertex3f(-1.1422222222 * piece_size, 12.2 * piece_size,
622              -2.2222222222 * piece_size);
623   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
624   glVertex3f(-2.6 * piece_size, 5.8 * piece_size, -0.8 * piece_size);
625   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
626   glVertex3f(-2.6 * piece_size, 5.8 * piece_size, 2.6 * piece_size);
627
628   glTexCoord2f(0.0f * piece_size, 14.8f / 17.8f * piece_size);
629   glVertex3f(-0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
630   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
631   glVertex3f(-1.1422222222 * piece_size, 12.2 * piece_size,
632              -2.2222222222 * piece_size);
633   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
634   glVertex3f(-1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
635   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
636   glVertex3f(-0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
637
638   /* Left */
639   glNormal3f(0.969286, 0.231975, -0.081681);
640   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
641   glVertex3f(0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
642   glTexCoord2f(0.0f * piece_size, 8.8f / 17.8f * piece_size);
643   glVertex3f(2.0 * piece_size, 8.8 * piece_size, 4.0 * piece_size);
644   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
645   glVertex3f(2.6 * piece_size, 5.8 * piece_size, 2.6 * piece_size);
646   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
647   glVertex3f(1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
648
649   glNormal3f(0.982872, 0.184289, 0.0);
650   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
651   glVertex3f(1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
652   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
653   glVertex3f(2.6 * piece_size, 5.8 * piece_size, 2.6 * piece_size);
654   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
655   glVertex3f(2.6 * piece_size, 5.8 * piece_size, -0.8 * piece_size);
656   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
657   glVertex3f(1.1422222222 * piece_size, 12.2 * piece_size,
658              -2.2222222222 * piece_size);
659
660   glTexCoord2f(0.0f * piece_size, 14.8f / 17.8f * piece_size);
661   glVertex3f(0.55 * piece_size, 14.8 * piece_size, -2.8 * piece_size);
662   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
663   glVertex3f(0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
664   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
665   glVertex3f(1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
666   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
667   glVertex3f(1.1422222222 * piece_size, 12.2 * piece_size,
668              -2.2222222222 * piece_size);
669   glEnd();
670
671   /* Triangles */
672   glBegin(GL_TRIANGLES);
673
674   /* Under mane */
675   glNormal3f(0.819890, -0.220459, -0.528373);
676   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
677   glVertex3f(2.6 * piece_size, 5.8 * piece_size, -0.8 * piece_size);
678   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
679   glVertex3f(1.44 * piece_size, 5.8 * piece_size, -2.6 * piece_size);
680   glTexCoord2f(0.0f * piece_size, 7.8f / 17.8f * piece_size);
681   glVertex3f(0.0, 7.8 * piece_size, -4.0 * piece_size);
682
683   glNormal3f(0.0, -0.573462, -0.819232);
684   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
685   glVertex3f(1.44 * piece_size, 5.8 * piece_size, -2.6 * piece_size);
686   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
687   glVertex3f(-1.44 * piece_size, 5.8 * piece_size, -2.6 * piece_size);
688   glTexCoord2f(0.0f * piece_size, 7.8f / 17.8f * piece_size);
689   glVertex3f(0.0, 7.8 * piece_size, -4.0 * piece_size);
690
691   glNormal3f(-0.819890, -0.220459, -0.528373);
692   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
693   glVertex3f(-2.6 * piece_size, 5.8 * piece_size, -0.8 * piece_size);
694   glTexCoord2f(0.0f * piece_size, 7.8f / 17.8f * piece_size);
695   glVertex3f(0.0, 7.8 * piece_size, -4.0 * piece_size);
696   glTexCoord2f(0.0f * piece_size, 5.8f / 17.8f * piece_size);
697   glVertex3f(-1.44 * piece_size, 5.8 * piece_size, -2.6 * piece_size);
698
699   /* Nose tip */
700   glNormal3f(0.0, 0.0, 1.0);
701   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
702   glVertex3f(0.0, 14.0 * piece_size, 4.0 * piece_size);
703   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
704   glVertex3f(0.8 * piece_size, 16.2 * piece_size, 4.0 * piece_size);
705   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
706   glVertex3f(-0.8 * piece_size, 16.2 * piece_size, 4.0 * piece_size);
707
708   /* Mouth left */
709   glNormal3f(-0.752714, -0.273714, 0.598750);
710   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
711   glVertex3f(0.0, 14.0 * piece_size, 4.0 * piece_size);
712   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
713   glVertex3f(-0.8 * piece_size, 16.2 * piece_size, 4.0 * piece_size);
714   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
715   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
716
717   glNormal3f(-0.957338, 0.031911, 0.287202);
718   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
719   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
720   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
721   glVertex3f(-0.8 * piece_size, 16.2 * piece_size, 4.0 * piece_size);
722   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
723   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 3.4 * piece_size);
724
725   glNormal3f(-0.997785, 0.066519, 0.0);
726   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
727   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
728   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
729   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 3.4 * piece_size);
730   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
731   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, 3.0 * piece_size);
732
733   /* Mouth right */
734   glNormal3f(0.752714, -0.273714, 0.598750);
735   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
736   glVertex3f(0.0, 14.0 * piece_size, 4.0 * piece_size);
737   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
738   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
739   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
740   glVertex3f(0.8 * piece_size, 16.2 * piece_size, 4.0 * piece_size);
741
742   glNormal3f(0.957338, 0.031911, 0.287202);
743   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
744   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
745   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
746   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 3.4 * piece_size);
747   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
748   glVertex3f(0.8 * piece_size, 16.2 * piece_size, 4.0 * piece_size);
749
750   glNormal3f(0.997785, 0.066519, 0.0);
751   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
752   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
753   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
754   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 3.0 * piece_size);
755   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
756   glVertex3f(1.0 * piece_size, 16.8 * piece_size, 3.4 * piece_size);
757
758   /* Under nose */
759   glNormal3f(0.0, -0.992278, 0.124035);
760   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
761   glVertex3f(0.0, 14.0 * piece_size, 4.0 * piece_size);
762   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
763   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
764   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
765   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 2.4 * piece_size);
766
767   /* Neck indents */
768   glNormal3f(-0.854714, 0.484047, 0.187514);
769   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
770   glVertex3f(-0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
771   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
772   glVertex3f(-1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
773   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
774   glVertex3f(-0.45 * piece_size, 13.8 * piece_size, -0.2 * piece_size);
775
776   glNormal3f(-0.853747, 0.515805, -0.071146);
777   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
778   glVertex3f(-0.45 * piece_size, 13.8 * piece_size, -0.2 * piece_size);
779   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
780   glVertex3f(-1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
781   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
782   glVertex3f(-0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
783
784   glNormal3f(0.854714, 0.484047, 0.187514);
785   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
786   glVertex3f(0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
787   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
788   glVertex3f(0.45 * piece_size, 13.8 * piece_size, -0.2 * piece_size);
789   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
790   glVertex3f(1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
791
792   glNormal3f(0.853747, 0.515805, -0.071146);
793   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
794   glVertex3f(0.45 * piece_size, 13.8 * piece_size, -0.2 * piece_size);
795   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
796   glVertex3f(0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
797   glTexCoord2f(0.0f * piece_size, 12.2f / 17.8f * piece_size);
798   glVertex3f(1.4 * piece_size, 12.2 * piece_size, -0.4 * piece_size);
799
800   /* Under chin */
801   glNormal3f(0.252982, -0.948683, -0.189737);
802   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
803   glVertex3f(0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
804   glTexCoord2f(0.0f * piece_size, 13.6f / 17.8f * piece_size);
805   glVertex3f(1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
806   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
807   glVertex3f(0.45 * piece_size, 13.8 * piece_size, -0.2 * piece_size);
808
809   glNormal3f(0.257603, -0.966012, 0.021467);
810   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
811   glVertex3f(0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
812   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
813   glVertex3f(0.45 * piece_size, 13.8 * piece_size, -0.2 * piece_size);
814   glTexCoord2f(0.0f * piece_size, 13.6f / 17.8f * piece_size);
815   glVertex3f(1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
816
817   glNormal3f(0.126745, -0.887214, 0.443607);
818   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
819   glVertex3f(0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
820   glTexCoord2f(0.0f * piece_size, 13.6f / 17.8f * piece_size);
821   glVertex3f(1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
822   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
823   glVertex3f(1.2 * piece_size, 13.8 * piece_size, 0.2 * piece_size);
824
825   glNormal3f(-0.252982, -0.948683, -0.189737);
826   glTexCoord2f(0.0f * piece_size, 14.0f / 17.8f * piece_size);
827   glVertex3f(-0.6 * piece_size, 14.0 * piece_size, -1.4 * piece_size);
828   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
829   glVertex3f(-0.45 * piece_size, 13.8 * piece_size, -0.2 * piece_size);
830   glTexCoord2f(0.0f * piece_size, 13.6f / 17.8f * piece_size);
831   glVertex3f(-1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
832
833   glNormal3f(-0.257603, -0.966012, 0.021467);
834   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
835   glVertex3f(-0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
836   glTexCoord2f(0.0f * piece_size, 13.6f / 17.8f * piece_size);
837   glVertex3f(-1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
838   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
839   glVertex3f(-0.45 * piece_size, 13.8 * piece_size, -0.2 * piece_size);
840
841   glNormal3f(-0.126745, -0.887214, 0.443607);
842   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
843   glVertex3f(-0.5 * piece_size, 13.8 * piece_size, 0.4 * piece_size);
844   glTexCoord2f(0.0f * piece_size, 13.8f / 17.8f * piece_size);
845   glVertex3f(-1.2 * piece_size, 13.8 * piece_size, 0.2 * piece_size);
846   glTexCoord2f(0.0f * piece_size, 13.6f / 17.8f * piece_size);
847   glVertex3f(-1.2 * piece_size, 13.6 * piece_size, -0.2 * piece_size);
848
849   /* Eyes */
850   glNormal3f(0.0, 0.0, -1.0);
851   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
852   glVertex3f(0.88 * piece_size, 16.2 * piece_size, 0.2 * piece_size);
853   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
854   glVertex3f(0.61333334 * piece_size, 16.4 * piece_size, 0.2 * piece_size);
855   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
856   glVertex3f(0.82666667 * piece_size, 16.6 * piece_size, 0.2 * piece_size);
857
858   glNormal3f(0.000003, -0.668965, 0.743294);
859   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
860   glVertex3f(1.0 * piece_size, 16.2 * piece_size, -0.74 * piece_size);
861   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
862   glVertex3f(1.0 * piece_size, 16.6 * piece_size, -0.38 * piece_size);
863   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
864   glVertex3f(0.8 * piece_size, 16.4 * piece_size, -0.56 * piece_size);
865
866   glNormal3f(0.0, 0.0, -1.0);
867   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
868   glVertex3f(-0.88 * piece_size, 16.2 * piece_size, 0.2 * piece_size);
869   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
870   glVertex3f(-0.82666667 * piece_size, 16.6 * piece_size,
871              0.2 * piece_size);
872   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
873   glVertex3f(-0.61333334 * piece_size, 16.4 * piece_size,
874              0.2 * piece_size);
875
876   glNormal3f(-0.000003, -0.668965, 0.743294);
877   glTexCoord2f(0.0f * piece_size, 16.2f / 17.8f * piece_size);
878   glVertex3f(-1.0 * piece_size, 16.2 * piece_size, -0.74 * piece_size);
879   glTexCoord2f(0.0f * piece_size, 16.4f / 17.8f * piece_size);
880   glVertex3f(-0.8 * piece_size, 16.4 * piece_size, -0.56 * piece_size);
881   glTexCoord2f(0.0f * piece_size, 16.6f / 17.8f * piece_size);
882   glVertex3f(-1.0 * piece_size, 16.6 * piece_size, -0.38 * piece_size);
883
884   /* Behind eyes */
885   /* Right */
886   glNormal3f(-0.997484, 0.070735, 0.004796);
887   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
888   glVertex3f(-0.4 * piece_size, 16.8 * piece_size, -1.1 * piece_size);
889   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
890   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
891   glTexCoord2f(0.0f * piece_size, 15.8f / 17.8f * piece_size);
892   glVertex3f(-1.0 * piece_size, 15.8 * piece_size, -1.1 * piece_size);
893
894   glNormal3f(-0.744437, 0.446663, -0.496292);
895   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
896   glVertex3f(-1.0 * piece_size, 16.8 * piece_size, -0.2 * piece_size);
897   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
898   glVertex3f(-0.4 * piece_size, 16.8 * piece_size, -1.1 * piece_size);
899   glTexCoord2f(0.0f * piece_size, 15.8f / 17.8f * piece_size);
900   glVertex3f(-1.0 * piece_size, 15.8 * piece_size, -1.1 * piece_size);
901
902   /* Left */
903   glNormal3f(0.997484, 0.070735, 0.004796);
904   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
905   glVertex3f(0.4 * piece_size, 16.8 * piece_size, -1.1 * piece_size);
906   glTexCoord2f(0.0f * piece_size, 15.8f / 17.8f * piece_size);
907   glVertex3f(1.0 * piece_size, 15.8 * piece_size, -1.1 * piece_size);
908   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
909   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -2.0 * piece_size);
910
911   glNormal3f(0.744437, 0.446663, -0.496292);
912   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
913   glVertex3f(1.0 * piece_size, 16.8 * piece_size, -0.2 * piece_size);
914   glTexCoord2f(0.0f * piece_size, 15.8f / 17.8f * piece_size);
915   glVertex3f(1.0 * piece_size, 15.8 * piece_size, -1.1 * piece_size);
916   glTexCoord2f(0.0f * piece_size, 16.8f / 17.8f * piece_size);
917   glVertex3f(0.4 * piece_size, 16.8 * piece_size, -1.1 * piece_size);
918
919   glEnd();
920 }
921
922 void draw_bishop(void)
923 {
924   double trace_r[] =
925       { 4.0, 4.0, 2.5, 2.5, 1.5, 1.2, 2.5, 1.7, 1.7, 2.2, 2.2,
926     1.0, 0.8, 1.2, 0.8, 0.0, 0.0
927   };
928   double trace_h[] =
929       { 0.0, 2.0, 3.0, 4.0, 7.0, 9.4, 9.4, 11.0, 12.2, 13.2,
930     14.8, 16.0, 17.0, 17.7, 18.4, 18.4, 0.0
931   };
932
933   revolve_line(trace_r, trace_h, 0.0, ROT);
934 }
935
936 void draw_queen(void)
937 {
938   double trace_r[] =
939       { 4.8, 4.8, 3.4, 3.4, 1.8, 1.4, 2.9, 1.8, 1.8, 2.0, 2.7,
940     2.4, 1.7, 0.95, 0.7, 0.9, 0.7, 0.0, 0.0
941   };
942   double trace_h[] =
943       { 0.0, 2.2, 4.0, 5.0, 8.0, 11.8, 11.8, 13.6, 15.2, 17.8,
944     19.2, 20.0, 20.0, 20.8, 20.8, 21.4, 22.0, 22.0, 0.0
945   };
946
947   revolve_line(trace_r, trace_h, 0.0, ROT);
948 }
949
950 void draw_king(void)
951 {
952   double trace_r[] =
953       { 5.0, 5.0, 3.5, 3.5, 2.0, 1.4, 3.0, 2.0, 2.0, 2.8, 1.6,
954     1.6, 0.0, 0.0
955   };
956   double trace_h[] =
957       { 0.0, 2.0, 3.0, 4.6, 7.6, 12.6, 12.6, 14.6, 15.6, 19.1,
958     19.7, 20.1, 20.1, 0.0
959   };
960
961   revolve_line(trace_r, trace_h, 0.0, ROT);
962
963   glBegin(GL_QUADS);
964
965   /* Cross front */
966   glNormal3f(0.0, 0.0, 1.0);
967
968   glVertex3f(-0.3 * piece_size, 20.1 * piece_size, 0.351 * piece_size);
969   glVertex3f(0.3 * piece_size, 20.1 * piece_size, 0.35 * piece_size);
970   glVertex3f(0.3 * piece_size, 23.1 * piece_size, 0.35 * piece_size);
971   glVertex3f(-0.3 * piece_size, 23.1 * piece_size, 0.35 * piece_size);
972
973   glVertex3f(-0.9 * piece_size, 21.1 * piece_size, 0.35 * piece_size);
974   glVertex3f(-0.3 * piece_size, 21.1 * piece_size, 0.35 * piece_size);
975   glVertex3f(-0.3 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
976   glVertex3f(-0.9 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
977
978   glVertex3f(0.9 * piece_size, 21.1 * piece_size, 0.35 * piece_size);
979   glVertex3f(0.9 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
980   glVertex3f(0.3 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
981   glVertex3f(0.3 * piece_size, 21.1 * piece_size, 0.35 * piece_size);
982
983   /* Cross back */
984   glNormal3f(0.0, 0.0, -1.0);
985
986   glVertex3f(0.3 * piece_size, 20.1 * piece_size, -0.35 * piece_size);
987   glVertex3f(-0.3 * piece_size, 20.1 * piece_size, -0.35 * piece_size);
988   glVertex3f(-0.3 * piece_size, 23.1 * piece_size, -0.35 * piece_size);
989   glVertex3f(0.3 * piece_size, 23.1 * piece_size, -0.35 * piece_size);
990
991   glVertex3f(-0.3 * piece_size, 21.1 * piece_size, -0.35 * piece_size);
992   glVertex3f(-0.9 * piece_size, 21.1 * piece_size, -0.35 * piece_size);
993   glVertex3f(-0.9 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
994   glVertex3f(-0.3 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
995
996   glVertex3f(0.3 * piece_size, 21.1 * piece_size, -0.35 * piece_size);
997   glVertex3f(0.3 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
998   glVertex3f(0.9 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
999   glVertex3f(0.9 * piece_size, 21.1 * piece_size, -0.35 * piece_size);
1000
1001   /* Cross left */
1002   glNormal3f(-1.0, 0.0, 0.0);
1003
1004   glVertex3f(-0.9 * piece_size, 21.1 * piece_size, 0.35 * piece_size);
1005   glVertex3f(-0.9 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
1006   glVertex3f(-0.9 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
1007   glVertex3f(-0.9 * piece_size, 21.1 * piece_size, -0.35 * piece_size);
1008
1009   glVertex3f(-0.3 * piece_size, 20.1 * piece_size, 0.35 * piece_size);
1010   glVertex3f(-0.3 * piece_size, 21.1 * piece_size, 0.35 * piece_size);
1011   glVertex3f(-0.3 * piece_size, 21.1 * piece_size, -0.35 * piece_size);
1012   glVertex3f(-0.3 * piece_size, 20.1 * piece_size, -0.35 * piece_size);
1013
1014   glVertex3f(-0.3 * piece_size, 22.1 * piece_size, 0.3 * piece_size);
1015   glVertex3f(-0.3 * piece_size, 23.1 * piece_size, 0.3 * piece_size);
1016   glVertex3f(-0.3 * piece_size, 23.1 * piece_size, -0.3 * piece_size);
1017   glVertex3f(-0.3 * piece_size, 22.1 * piece_size, -0.3 * piece_size);
1018
1019   /* Cross right */
1020   glNormal3f(1.0, 0.0, 0.0);
1021
1022   glVertex3f(0.9 * piece_size, 21.1 * piece_size, -0.35 * piece_size);
1023   glVertex3f(0.9 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
1024   glVertex3f(0.9 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
1025   glVertex3f(0.9 * piece_size, 21.1 * piece_size, 0.35 * piece_size);
1026
1027   glVertex3f(0.3 * piece_size, 20.1 * piece_size, -0.35 * piece_size);
1028   glVertex3f(0.3 * piece_size, 21.1 * piece_size, -0.35 * piece_size);
1029   glVertex3f(0.3 * piece_size, 21.1 * piece_size, 0.35 * piece_size);
1030   glVertex3f(0.3 * piece_size, 20.1 * piece_size, 0.35 * piece_size);
1031
1032   glVertex3f(0.3 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
1033   glVertex3f(0.3 * piece_size, 23.1 * piece_size, -0.35 * piece_size);
1034   glVertex3f(0.3 * piece_size, 23.1 * piece_size, 0.35 * piece_size);
1035   glVertex3f(0.3 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
1036
1037   /* Cross top */
1038   glNormal3f(0.0, 1.0, 0.0);
1039
1040   glVertex3f(-0.9 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
1041   glVertex3f(-0.9 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
1042   glVertex3f(-0.3 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
1043   glVertex3f(-0.3 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
1044
1045   glVertex3f(0.3 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
1046   glVertex3f(0.3 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
1047   glVertex3f(0.9 * piece_size, 22.1 * piece_size, 0.35 * piece_size);
1048   glVertex3f(0.9 * piece_size, 22.1 * piece_size, -0.35 * piece_size);
1049
1050   glVertex3f(-0.3 * piece_size, 23.1 * piece_size, -0.35 * piece_size);
1051   glVertex3f(-0.3 * piece_size, 23.1 * piece_size, 0.35 * piece_size);
1052   glVertex3f(0.3 * piece_size, 23.1 * piece_size, 0.35 * piece_size);
1053   glVertex3f(0.3 * piece_size, 23.1 * piece_size, -0.35 * piece_size);
1054
1055   glEnd();
1056 }