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