From http://www.jwz.org/xscreensaver/xscreensaver-5.35.tar.gz
[xscreensaver] / hacks / glx / polytopes.c
1 /* polytopes --- Shows one of the six regular polytopes rotating in 4d */
2
3 #if 0
4 static const char sccsid[] = "@(#)polytopes.c  1.2 05/09/28 xlockmore";
5 #endif
6
7 /* Copyright (c) 2003-2009 Carsten Steger <carsten@mirsanmir.org>. */
8
9 /*
10  * Permission to use, copy, modify, and distribute this software and its
11  * documentation for any purpose and without fee is hereby granted,
12  * provided that the above copyright notice appear in all copies and that
13  * both that copyright notice and this permission notice appear in
14  * supporting documentation.
15  *
16  * This file is provided AS IS with no warranties of any kind.  The author
17  * shall have no liability with respect to the infringement of copyrights,
18  * trade secrets or any patents by this file or any part thereof.  In no
19  * event will the author be liable for any lost revenue or profits or
20  * other special, indirect and consequential damages.
21  *
22  * REVISION HISTORY:
23  * C. Steger - 03/08/10: Initial version
24  * C. Steger - 05/09/28: Added trackball support
25  * C. Steger - 07/01/23: Improved 4d trackball support
26  * C. Steger - 09/08/23: Removed check-config.pl warnings
27  */
28
29 /*
30  * This program shows one of the six regular 4D polytopes rotating in 4D.
31  * Written by Carsten Steger, inspired by H.S.M Coxeter's book "Regular
32  * Polytopes", 3rd Edition, Dover Publications, Inc., 1973, and Thomas
33  * Banchoff's book "Beyond the Third Dimension: Geometry, Computer
34  * Graphics, and Higher Dimensions", Scientific American Library, 1990.
35  */
36
37 #ifndef M_PI
38 #define M_PI 3.14159265358979323846
39 #endif
40
41 #define SQRT15OVER4 1.93649167310370844259 /* sqrt(15/4) */
42 #define SQRT10OVER3 1.82574185835055371152 /* sqrt(10/3) */
43 #define SQRT5OVER2  1.58113883008418966600 /* sqrt(5/2) */
44 #define SQRT5OVER6  0.91287092917527685576 /* sqrt(5/6) */
45 #define SQRT5OVER12 0.64549722436790281420 /* sqrt(5/12) */
46 #define SQRT2       1.41421356237309504880 /* sqrt(2) */
47 #define GOLDEN      1.61803398874989484820 /* (sqrt(5)+1)/2 */
48 #define GOLDENINV   0.61803398874989484820 /* (sqrt(5)-1)/2 */
49 #define SQRT2INV    0.70710678118654752440 /* sqrt(1/2) */
50 #define GOLDEN2     1.14412280563536859520 /* ((sqrt(5)+1)/2)/sqrt(2) */
51 #define GOLDENINV2  0.43701602444882107080 /* ((sqrt(5)-1)/2)/sqrt(2) */
52 #define GOLDEN22    1.85122958682191611960 /* (((sqrt(5)+1)/2)^2)/sqrt(2) */
53 #define GOLDENINV22 0.27009075673772645360 /* (((sqrt(5)-1)/2)^2)/sqrt(2) */
54
55 #define DISP_WIREFRAME            0
56 #define DISP_SURFACE              1
57 #define DISP_TRANSPARENT          2
58
59 #define POLYTOPE_RANDOM          -1
60 #define POLYTOPE_5_CELL           0
61 #define POLYTOPE_8_CELL           1
62 #define POLYTOPE_16_CELL          2
63 #define POLYTOPE_24_CELL          3
64 #define POLYTOPE_120_CELL         4
65 #define POLYTOPE_600_CELL         5
66 #define POLYTOPE_LAST_CELL        POLYTOPE_600_CELL
67
68 #define COLORS_SINGLE             0
69 #define COLORS_DEPTH              1
70
71 #define DISP_3D_PERSPECTIVE       0
72 #define DISP_3D_ORTHOGRAPHIC      1
73
74 #define DISP_4D_PERSPECTIVE       0
75 #define DISP_4D_PERSPECTIVE_STR  "0"
76 #define DISP_4D_ORTHOGRAPHIC      1
77 #define DISP_4D_ORTHOGRAPHIC_STR "1"
78
79 #define DEF_DISPLAY_MODE          "transparent"
80 #define DEF_POLYTOPE              "random"
81 #define DEF_COLORS                "depth"
82 #define DEF_PROJECTION_3D         "perspective"
83 #define DEF_PROJECTION_4D         "perspective"
84 #define DEF_SPEEDWX               "1.1"
85 #define DEF_SPEEDWY               "1.3"
86 #define DEF_SPEEDWZ               "1.5"
87 #define DEF_SPEEDXY               "1.7"
88 #define DEF_SPEEDXZ               "1.9"
89 #define DEF_SPEEDYZ               "2.1"
90
91 #ifdef STANDALONE
92 # define DEFAULTS           "*delay:      25000 \n" \
93                             "*showFPS:    False \n" \
94                             "*suppressRotationAnimation: True\n" \
95
96 # define refresh_polytopes 0
97 # include "xlockmore.h"         /* from the xscreensaver distribution */
98 #else  /* !STANDALONE */
99 # include "xlock.h"             /* from the xlockmore distribution */
100 #endif /* !STANDALONE */
101
102 #ifdef USE_GL
103
104 #ifndef HAVE_JWXYZ
105 # include <X11/keysym.h>
106 #endif
107 #include "gltrackball.h"
108
109
110 #ifdef USE_MODULES
111 ModStruct   polytopes_description =
112 {"polytopes", "init_polytopes", "draw_polytopes", "release_polytopes",
113  "draw_polytopes", "change_polytopes", NULL, &polytopes_opts,
114  25000, 1, 1, 1, 1.0, 4, "",
115  "Shows one of the six regular 4d polytopes rotating in 4d", 0, NULL};
116
117 #endif
118
119
120 static char *mode;
121 static int display_mode;
122 static char *poly_str;
123 static int polytope;
124 static char *color_str;
125 static int color_mode;
126 static char *proj_3d;
127 static int projection_3d;
128 static char *proj_4d;
129 static int projection_4d;
130 static float speed_wx;
131 static float speed_wy;
132 static float speed_wz;
133 static float speed_xy;
134 static float speed_xz;
135 static float speed_yz;
136
137 static const float offset4d[4] = {  0.0,  0.0,  0.0,  3.0 };
138 static const float offset3d[4] = {  0.0,  0.0, -2.0,  0.0 };
139
140
141 static XrmOptionDescRec opts[] =
142 {
143   {"-mode",            ".displayMode",  XrmoptionSepArg, 0 },
144   {"-wireframe",       ".displayMode",  XrmoptionNoArg,  "wireframe" },
145   {"-surface",         ".displayMode",  XrmoptionNoArg,  "surface" },
146   {"-transparent",     ".displayMode",  XrmoptionNoArg,  "transparent" },
147   {"-polytope",        ".polytope",     XrmoptionSepArg, 0 },
148   {"-random",          ".polytope",     XrmoptionNoArg,  "random" },
149   {"-5-cell",          ".polytope",     XrmoptionNoArg,  "5-cell" },
150   {"-8-cell",          ".polytope",     XrmoptionNoArg,  "8-cell" },
151   {"-16-cell",         ".polytope",     XrmoptionNoArg,  "16-cell" },
152   {"-24-cell",         ".polytope",     XrmoptionNoArg,  "24-cell" },
153   {"-120-cell",        ".polytope",     XrmoptionNoArg,  "120-cell" },
154   {"-600-cell",        ".polytope",     XrmoptionNoArg,  "600-cell" },
155   {"-single-color",    ".colors",       XrmoptionNoArg,  "single" },
156   {"-depth-colors",    ".colors",       XrmoptionNoArg,  "depth" },
157   {"-perspective-3d",  ".projection3d", XrmoptionNoArg,  "perspective" },
158   {"-orthographic-3d", ".projection3d", XrmoptionNoArg,  "orthographic" },
159   {"-perspective-4d",  ".projection4d", XrmoptionNoArg,  "perspective" },
160   {"-orthographic-4d", ".projection4d", XrmoptionNoArg,  "orthographic" },
161   {"-speed-wx",        ".speedwx",      XrmoptionSepArg, 0 },
162   {"-speed-wy",        ".speedwy",      XrmoptionSepArg, 0 },
163   {"-speed-wz",        ".speedwz",      XrmoptionSepArg, 0 },
164   {"-speed-xy",        ".speedxy",      XrmoptionSepArg, 0 },
165   {"-speed-xz",        ".speedxz",      XrmoptionSepArg, 0 },
166   {"-speed-yz",        ".speedyz",      XrmoptionSepArg, 0 }
167 };
168
169 static argtype vars[] =
170 {
171   { &mode,      "displayMode",  "DisplayMode", DEF_DISPLAY_MODE,  t_String },
172   { &poly_str,  "polytope",     "Polytope",    DEF_POLYTOPE,      t_String },
173   { &color_str, "colors",       "Colors",      DEF_COLORS,        t_String },
174   { &proj_3d,   "projection3d", "Projection3d",DEF_PROJECTION_3D, t_String },
175   { &proj_4d,   "projection4d", "Projection4d",DEF_PROJECTION_4D, t_String },
176   { &speed_wx,  "speedwx",      "Speedwx",     DEF_SPEEDWX,       t_Float},
177   { &speed_wy,  "speedwy",      "Speedwy",     DEF_SPEEDWY,       t_Float},
178   { &speed_wz,  "speedwz",      "Speedwz",     DEF_SPEEDWZ,       t_Float},
179   { &speed_xy,  "speedxy",      "Speedxy",     DEF_SPEEDXY,       t_Float},
180   { &speed_xz,  "speedxz",      "Speedxz",     DEF_SPEEDXZ,       t_Float},
181   { &speed_yz,  "speedyz",      "Speedyz",     DEF_SPEEDYZ,       t_Float}
182 };
183
184 static OptionStruct desc[] =
185 {
186   { "-wireframe",       "display the polytope as a wireframe mesh" },
187   { "-surface",         "display the polytope as a solid surface" },
188   { "-transparent",     "display the polytope as a transparent surface" },
189   { "-solid",           "display the polytope as a solid object" },
190   { "-bands",           "display the polytope as see-through bands" },
191   { "-twosided",        "display the polytope with two colors" },
192   { "-colorwheel",      "display the polytope with a smooth color wheel" },
193   { "-perspective-3d",  "project the polytope perspectively from 3d to 2d" },
194   { "-orthographic-3d", "project the polytope orthographically from 3d to 2d"},
195   { "-perspective-4d",  "project the polytope perspectively from 4d to 3d" },
196   { "-orthographic-4d", "project the polytope orthographically from 4d to 3d"},
197   { "-speed-wx <arg>",  "rotation speed around the wx plane" },
198   { "-speed-wy <arg>",  "rotation speed around the wy plane" },
199   { "-speed-wz <arg>",  "rotation speed around the wz plane" },
200   { "-speed-xy <arg>",  "rotation speed around the xy plane" },
201   { "-speed-xz <arg>",  "rotation speed around the xz plane" },
202   { "-speed-yz <arg>",  "rotation speed around the yz plane" }
203 };
204
205 ENTRYPOINT ModeSpecOpt polytopes_opts =
206 {sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
207
208
209 /* 5-cell {3,3,3} */
210 #define NUM_VERT_5 5
211 #define NUM_EDGE_5 10
212 #define NUM_FACE_5 10
213 #define VERT_PER_FACE_5 3
214
215 #define MIN_EDGE_DEPTH_5 (-0.5)
216 #define MAX_EDGE_DEPTH_5 0.75
217 #define MIN_FACE_DEPTH_5 (-0.5)
218 #define MAX_FACE_DEPTH_5 (1.0/3.0)
219
220
221 /* 8-cell {4,3,3} */
222 #define NUM_VERT_8 16
223 #define NUM_EDGE_8 32
224 #define NUM_FACE_8 24
225 #define VERT_PER_FACE_8 4
226
227 #define MIN_EDGE_DEPTH_8 (-1.0)
228 #define MAX_EDGE_DEPTH_8 1.0
229 #define MIN_FACE_DEPTH_8 (-1.0)
230 #define MAX_FACE_DEPTH_8 1.0
231
232 /* 16-cell {3,3,4} */
233 #define NUM_VERT_16 8
234 #define NUM_EDGE_16 24
235 #define NUM_FACE_16 32
236 #define VERT_PER_FACE_16 3
237
238 #define MIN_EDGE_DEPTH_16 (-1.0)
239 #define MAX_EDGE_DEPTH_16 1.0
240 #define MIN_FACE_DEPTH_16 (-2.0/3.0)
241 #define MAX_FACE_DEPTH_16 (2.0/3.0)
242
243
244 /* 24-cell {3,4,3} */
245 #define NUM_VERT_24 24
246 #define NUM_EDGE_24 96
247 #define NUM_FACE_24 96
248 #define VERT_PER_FACE_24 3
249
250 #define MIN_EDGE_DEPTH_24 (-SQRT2)
251 #define MAX_EDGE_DEPTH_24 SQRT2
252 #define MIN_FACE_DEPTH_24 (-SQRT2)
253 #define MAX_FACE_DEPTH_24 SQRT2
254
255
256 /* 120-cell {5,3,3} */
257 #define NUM_VERT_120 600
258 #define NUM_EDGE_120 1200
259 #define NUM_FACE_120 720
260 #define VERT_PER_FACE_120 5
261
262 #define MIN_EDGE_DEPTH_120 (-GOLDEN22)
263 #define MAX_EDGE_DEPTH_120 GOLDEN22
264 #define MIN_FACE_DEPTH_120 (-GOLDEN22)
265 #define MAX_FACE_DEPTH_120 GOLDEN22
266
267
268 /* 600-cell {3,3,5} */
269 #define NUM_VERT_600 120
270 #define NUM_EDGE_600 720
271 #define NUM_FACE_600 1200
272 #define VERT_PER_FACE_600 3
273
274 #define MIN_EDGE_DEPTH_600 (-GOLDEN/2.0-1)
275 #define MAX_EDGE_DEPTH_600 (GOLDEN/2.0+1)
276 #define MIN_FACE_DEPTH_600 ((-2*GOLDEN-2)/3.0)
277 #define MAX_FACE_DEPTH_600 ((2*GOLDEN+2)/3.0)
278
279
280 typedef struct {
281   GLint       WindH, WindW;
282   GLXContext *glx_context;
283   /* 4D rotation angles */
284   float alpha, beta, delta, zeta, eta, theta;
285   /* Aspect ratio of the current window */
286   float aspect;
287   /* Counter */
288   int tick, poly;
289   /* Trackball states */
290   trackball_state *trackballs[2];
291   int current_trackball;
292   Bool button_pressed;
293
294   float edge_color_5[NUM_EDGE_5][4];
295   float face_color_5[NUM_FACE_5][4];
296   float face_color_trans_5[NUM_FACE_5][4];
297
298   float edge_color_8[NUM_EDGE_8][4];
299   float face_color_8[NUM_FACE_8][4];
300   float face_color_trans_8[NUM_FACE_8][4];
301
302   float edge_color_16[NUM_EDGE_16][4];
303   float face_color_16[NUM_FACE_16][4];
304   float face_color_trans_16[NUM_FACE_16][4];
305
306   float edge_color_24[NUM_EDGE_24][4];
307   float face_color_24[NUM_FACE_24][4];
308   float face_color_trans_24[NUM_FACE_24][4];
309
310   float edge_color_120[NUM_EDGE_120][4];
311   float face_color_120[NUM_FACE_120][4];
312   float face_color_trans_120[NUM_FACE_120][4];
313
314   float edge_color_600[NUM_EDGE_600][4];
315   float face_color_600[NUM_FACE_600][4];
316   float face_color_trans_600[NUM_FACE_600][4];
317
318   float speed_scale;
319
320 } polytopesstruct;
321
322 static polytopesstruct *poly = (polytopesstruct *) NULL;
323
324
325 /* Vertex, edge, and face data for the six regular polytopes.  All the
326    polytopes are constructed with coordinates chosen such that their 4d
327    circumsphere has a radius of 2. */
328
329 static const float vert_5[NUM_VERT_5][4] = {
330   { -SQRT5OVER2, -SQRT5OVER6, -SQRT5OVER12, -0.5 },
331   {  SQRT5OVER2, -SQRT5OVER6, -SQRT5OVER12, -0.5 },
332   {         0.0, SQRT10OVER3, -SQRT5OVER12, -0.5 },
333   {         0.0,         0.0,  SQRT15OVER4, -0.5 },
334   {         0.0,         0.0,          0.0,  2.0 }
335 };
336
337 static const int edge_5[NUM_EDGE_5][2] = {
338   { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 1, 2 }, { 1, 3 }, { 1, 4 },
339   { 2, 3 }, { 2, 4 }, { 3, 4 }
340 };
341
342 static const int face_5[NUM_FACE_5][VERT_PER_FACE_5] = {
343   { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 2, 3 }, { 0, 2, 4 }, { 0, 3, 4 },
344   { 1, 2, 3 }, { 1, 2, 4 }, { 1, 3, 4 }, { 2, 3, 4 }
345 };
346
347
348 static const float vert_8[NUM_VERT_8][4] = {
349   { -1.0, -1.0, -1.0, -1.0 }, {  1.0, -1.0, -1.0, -1.0 },
350   { -1.0,  1.0, -1.0, -1.0 }, {  1.0,  1.0, -1.0, -1.0 },
351   { -1.0, -1.0,  1.0, -1.0 }, {  1.0, -1.0,  1.0, -1.0 },
352   { -1.0,  1.0,  1.0, -1.0 }, {  1.0,  1.0,  1.0, -1.0 },
353   { -1.0, -1.0, -1.0,  1.0 }, {  1.0, -1.0, -1.0,  1.0 },
354   { -1.0,  1.0, -1.0,  1.0 }, {  1.0,  1.0, -1.0,  1.0 },
355   { -1.0, -1.0,  1.0,  1.0 }, {  1.0, -1.0,  1.0,  1.0 },
356   { -1.0,  1.0,  1.0,  1.0 }, {  1.0,  1.0,  1.0,  1.0 }
357 };
358
359 static const int edge_8[NUM_EDGE_8][2] = {
360   {  0,  1 }, {  0,  2 }, {  0,  4 }, {  0,  8 }, {  1,  3 }, {  1,  5 },
361   {  1,  9 }, {  2,  3 }, {  2,  6 }, {  2, 10 }, {  3,  7 }, {  3, 11 },
362   {  4,  5 }, {  4,  6 }, {  4, 12 }, {  5,  7 }, {  5, 13 }, {  6,  7 },
363   {  6, 14 }, {  7, 15 }, {  8,  9 }, {  8, 10 }, {  8, 12 }, {  9, 11 },
364   {  9, 13 }, { 10, 11 }, { 10, 14 }, { 11, 15 }, { 12, 13 }, { 12, 14 },
365   { 13, 15 }, { 14, 15 }
366 };
367
368 static const int face_8[NUM_FACE_8][VERT_PER_FACE_8] = {
369   {  0,  1,  3,  2 }, {  0,  1,  5,  4 }, {  0,  1,  9,  8 },
370   {  0,  2,  6,  4 }, {  0,  2, 10,  8 }, {  0,  4, 12,  8 },
371   {  1,  3,  7,  5 }, {  1,  3, 11,  9 }, {  1,  5, 13,  9 },
372   {  2,  3,  7,  6 }, {  2,  3, 11, 10 }, {  2,  6, 14, 10 },
373   {  3,  7, 15, 11 }, {  4,  5,  7,  6 }, {  4,  5, 13, 12 },
374   {  4,  6, 14, 12 }, {  5,  7, 15, 13 }, {  6,  7, 15, 14 },
375   {  8,  9, 11, 10 }, {  8,  9, 13, 12 }, {  8, 10, 14, 12 },
376   {  9, 11, 15, 13 }, { 10, 11, 15, 14 }, { 12, 13, 15, 14 }
377 };
378
379
380
381 static const float vert_16[NUM_VERT_16][4] = {
382   {  0.0,  0.0,  0.0, -2.0 }, {  0.0,  0.0, -2.0,  0.0 },
383   {  0.0, -2.0,  0.0,  0.0 }, { -2.0,  0.0,  0.0,  0.0 },
384   {  2.0,  0.0,  0.0,  0.0 }, {  0.0,  2.0,  0.0,  0.0 },
385   {  0.0,  0.0,  2.0,  0.0 }, {  0.0,  0.0,  0.0,  2.0 }
386 };
387
388 static const int edge_16[NUM_EDGE_16][2] = {
389   { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 0, 5 }, { 0, 6 }, { 1, 2 },
390   { 1, 3 }, { 1, 4 }, { 1, 5 }, { 1, 7 }, { 2, 3 }, { 2, 4 }, { 2, 6 },
391   { 2, 7 }, { 3, 5 }, { 3, 6 }, { 3, 7 }, { 4, 5 }, { 4, 6 }, { 4, 7 },
392   { 5, 6 }, { 5, 7 }, { 6, 7 }
393 };
394
395 static const int face_16[NUM_FACE_16][VERT_PER_FACE_16] = {
396   { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 1, 5 }, { 0, 2, 3 }, { 0, 2, 4 },
397   { 0, 2, 6 }, { 0, 3, 5 }, { 0, 3, 6 }, { 0, 4, 5 }, { 0, 4, 6 }, { 0, 5, 6 },
398   { 1, 2, 3 }, { 1, 2, 4 }, { 1, 2, 7 }, { 1, 3, 5 }, { 1, 3, 7 }, { 1, 4, 5 },
399   { 1, 4, 7 }, { 1, 5, 7 }, { 2, 3, 6 }, { 2, 3, 7 }, { 2, 4, 6 }, { 2, 4, 7 },
400   { 2, 6, 7 }, { 3, 5, 6 }, { 3, 5, 7 }, { 3, 6, 7 }, { 4, 5, 6 }, { 4, 5, 7 },
401   { 4, 6, 7 }, { 5, 6, 7 }
402 };
403
404
405
406 static const float vert_24[NUM_VERT_24][4] = {
407   {    0.0,    0.0, -SQRT2, -SQRT2 }, {    0.0, -SQRT2,    0.0, -SQRT2 },
408   { -SQRT2,    0.0,    0.0, -SQRT2 }, {  SQRT2,    0.0,    0.0, -SQRT2 },
409   {    0.0,  SQRT2,    0.0, -SQRT2 }, {    0.0,    0.0,  SQRT2, -SQRT2 },
410   {    0.0, -SQRT2, -SQRT2,    0.0 }, { -SQRT2,    0.0, -SQRT2,    0.0 },
411   {  SQRT2,    0.0, -SQRT2,    0.0 }, {    0.0,  SQRT2, -SQRT2,    0.0 },
412   { -SQRT2, -SQRT2,    0.0,    0.0 }, {  SQRT2, -SQRT2,    0.0,    0.0 },
413   { -SQRT2,  SQRT2,    0.0,    0.0 }, {  SQRT2,  SQRT2,    0.0,    0.0 },
414   {    0.0, -SQRT2,  SQRT2,    0.0 }, { -SQRT2,    0.0,  SQRT2,    0.0 },
415   {  SQRT2,    0.0,  SQRT2,    0.0 }, {    0.0,  SQRT2,  SQRT2,    0.0 },
416   {    0.0,    0.0, -SQRT2,  SQRT2 }, {    0.0, -SQRT2,    0.0,  SQRT2 },
417   { -SQRT2,    0.0,    0.0,  SQRT2 }, {  SQRT2,    0.0,    0.0,  SQRT2 },
418   {    0.0,  SQRT2,    0.0,  SQRT2 }, {    0.0,    0.0,  SQRT2,  SQRT2 }
419 };
420
421 static const int edge_24[NUM_EDGE_24][2] = {
422   {  0,  1 }, {  0,  2 }, {  0,  3 }, {  0,  4 }, {  0,  6 }, {  0,  7 },
423   {  0,  8 }, {  0,  9 }, {  1,  2 }, {  1,  3 }, {  1,  5 }, {  1,  6 },
424   {  1, 10 }, {  1, 11 }, {  1, 14 }, {  2,  4 }, {  2,  5 }, {  2,  7 },
425   {  2, 10 }, {  2, 12 }, {  2, 15 }, {  3,  4 }, {  3,  5 }, {  3,  8 },
426   {  3, 11 }, {  3, 13 }, {  3, 16 }, {  4,  5 }, {  4,  9 }, {  4, 12 },
427   {  4, 13 }, {  4, 17 }, {  5, 14 }, {  5, 15 }, {  5, 16 }, {  5, 17 },
428   {  6,  7 }, {  6,  8 }, {  6, 10 }, {  6, 11 }, {  6, 18 }, {  6, 19 },
429   {  7,  9 }, {  7, 10 }, {  7, 12 }, {  7, 18 }, {  7, 20 }, {  8,  9 },
430   {  8, 11 }, {  8, 13 }, {  8, 18 }, {  8, 21 }, {  9, 12 }, {  9, 13 },
431   {  9, 18 }, {  9, 22 }, { 10, 14 }, { 10, 15 }, { 10, 19 }, { 10, 20 },
432   { 11, 14 }, { 11, 16 }, { 11, 19 }, { 11, 21 }, { 12, 15 }, { 12, 17 },
433   { 12, 20 }, { 12, 22 }, { 13, 16 }, { 13, 17 }, { 13, 21 }, { 13, 22 },
434   { 14, 15 }, { 14, 16 }, { 14, 19 }, { 14, 23 }, { 15, 17 }, { 15, 20 },
435   { 15, 23 }, { 16, 17 }, { 16, 21 }, { 16, 23 }, { 17, 22 }, { 17, 23 },
436   { 18, 19 }, { 18, 20 }, { 18, 21 }, { 18, 22 }, { 19, 20 }, { 19, 21 },
437   { 19, 23 }, { 20, 22 }, { 20, 23 }, { 21, 22 }, { 21, 23 }, { 22, 23 }
438 };
439
440 static const int face_24[NUM_FACE_24][VERT_PER_FACE_24] = {
441   {  0,  1,  2 }, {  0,  1,  3 }, {  0,  1,  6 }, {  0,  2,  4 }, 
442   {  0,  2,  7 }, {  0,  3,  4 }, {  0,  3,  8 }, {  0,  4,  9 },
443   {  0,  6,  7 }, {  0,  6,  8 }, {  0,  7,  9 }, {  0,  8,  9 },
444   {  1,  2,  5 }, {  1,  2, 10 }, {  1,  3,  5 }, {  1,  3, 11 },
445   {  1,  5, 14 }, {  1,  6, 10 }, {  1,  6, 11 }, {  1, 10, 14 },
446   {  1, 11, 14 }, {  2,  4,  5 }, {  2,  4, 12 }, {  2,  5, 15 },
447   {  2,  7, 10 }, {  2,  7, 12 }, {  2, 10, 15 }, {  2, 12, 15 },
448   {  3,  4,  5 }, {  3,  4, 13 }, {  3,  5, 16 }, {  3,  8, 11 },
449   {  3,  8, 13 }, {  3, 11, 16 }, {  3, 13, 16 }, {  4,  5, 17 },
450   {  4,  9, 12 }, {  4,  9, 13 }, {  4, 12, 17 }, {  4, 13, 17 },
451   {  5, 14, 15 }, {  5, 14, 16 }, {  5, 15, 17 }, {  5, 16, 17 },
452   {  6,  7, 10 }, {  6,  7, 18 }, {  6,  8, 11 }, {  6,  8, 18 },
453   {  6, 10, 19 }, {  6, 11, 19 }, {  6, 18, 19 }, {  7,  9, 12 },
454   {  7,  9, 18 }, {  7, 10, 20 }, {  7, 12, 20 }, {  7, 18, 20 },
455   {  8,  9, 13 }, {  8,  9, 18 }, {  8, 11, 21 }, {  8, 13, 21 },
456   {  8, 18, 21 }, {  9, 12, 22 }, {  9, 13, 22 }, {  9, 18, 22 },
457   { 10, 14, 15 }, { 10, 14, 19 }, { 10, 15, 20 }, { 10, 19, 20 },
458   { 11, 14, 16 }, { 11, 14, 19 }, { 11, 16, 21 }, { 11, 19, 21 },
459   { 12, 15, 17 }, { 12, 15, 20 }, { 12, 17, 22 }, { 12, 20, 22 },
460   { 13, 16, 17 }, { 13, 16, 21 }, { 13, 17, 22 }, { 13, 21, 22 },
461   { 14, 15, 23 }, { 14, 16, 23 }, { 14, 19, 23 }, { 15, 17, 23 },
462   { 15, 20, 23 }, { 16, 17, 23 }, { 16, 21, 23 }, { 17, 22, 23 },
463   { 18, 19, 20 }, { 18, 19, 21 }, { 18, 20, 22 }, { 18, 21, 22 },
464   { 19, 20, 23 }, { 19, 21, 23 }, { 20, 22, 23 }, { 21, 22, 23 }
465 };
466
467
468
469
470 static const float vert_120[NUM_VERT_120][4] = {
471   { -GOLDENINV22,          0.0,    -SQRT2INV,    -GOLDEN22 },
472   {  GOLDENINV22,          0.0,    -SQRT2INV,    -GOLDEN22 },
473   {  -GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2,    -GOLDEN22 },
474   {   GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2,    -GOLDEN22 },
475   {  -GOLDENINV2,   GOLDENINV2,  -GOLDENINV2,    -GOLDEN22 },
476   {   GOLDENINV2,   GOLDENINV2,  -GOLDENINV2,    -GOLDEN22 },
477   {          0.0,    -SQRT2INV, -GOLDENINV22,    -GOLDEN22 },
478   {          0.0,     SQRT2INV, -GOLDENINV22,    -GOLDEN22 },
479   {    -SQRT2INV, -GOLDENINV22,          0.0,    -GOLDEN22 },
480   {     SQRT2INV, -GOLDENINV22,          0.0,    -GOLDEN22 },
481   {    -SQRT2INV,  GOLDENINV22,          0.0,    -GOLDEN22 },
482   {     SQRT2INV,  GOLDENINV22,          0.0,    -GOLDEN22 },
483   {          0.0,    -SQRT2INV,  GOLDENINV22,    -GOLDEN22 },
484   {          0.0,     SQRT2INV,  GOLDENINV22,    -GOLDEN22 },
485   {  -GOLDENINV2,  -GOLDENINV2,   GOLDENINV2,    -GOLDEN22 },
486   {   GOLDENINV2,  -GOLDENINV2,   GOLDENINV2,    -GOLDEN22 },
487   {  -GOLDENINV2,   GOLDENINV2,   GOLDENINV2,    -GOLDEN22 },
488   {   GOLDENINV2,   GOLDENINV2,   GOLDENINV2,    -GOLDEN22 },
489   { -GOLDENINV22,          0.0,     SQRT2INV,    -GOLDEN22 },
490   {  GOLDENINV22,          0.0,     SQRT2INV,    -GOLDEN22 },
491   {  -GOLDENINV2,          0.0,     -GOLDEN2,  -SQRT5OVER2 },
492   {   GOLDENINV2,          0.0,     -GOLDEN2,  -SQRT5OVER2 },
493   {    -SQRT2INV,    -SQRT2INV,    -SQRT2INV,  -SQRT5OVER2 },
494   {     SQRT2INV,    -SQRT2INV,    -SQRT2INV,  -SQRT5OVER2 },
495   {    -SQRT2INV,     SQRT2INV,    -SQRT2INV,  -SQRT5OVER2 },
496   {     SQRT2INV,     SQRT2INV,    -SQRT2INV,  -SQRT5OVER2 },
497   {          0.0,     -GOLDEN2,  -GOLDENINV2,  -SQRT5OVER2 },
498   {          0.0,      GOLDEN2,  -GOLDENINV2,  -SQRT5OVER2 },
499   {     -GOLDEN2,  -GOLDENINV2,          0.0,  -SQRT5OVER2 },
500   {      GOLDEN2,  -GOLDENINV2,          0.0,  -SQRT5OVER2 },
501   {     -GOLDEN2,   GOLDENINV2,          0.0,  -SQRT5OVER2 },
502   {      GOLDEN2,   GOLDENINV2,          0.0,  -SQRT5OVER2 },
503   {          0.0,     -GOLDEN2,   GOLDENINV2,  -SQRT5OVER2 },
504   {          0.0,      GOLDEN2,   GOLDENINV2,  -SQRT5OVER2 },
505   {    -SQRT2INV,    -SQRT2INV,     SQRT2INV,  -SQRT5OVER2 },
506   {     SQRT2INV,    -SQRT2INV,     SQRT2INV,  -SQRT5OVER2 },
507   {    -SQRT2INV,     SQRT2INV,     SQRT2INV,  -SQRT5OVER2 },
508   {     SQRT2INV,     SQRT2INV,     SQRT2INV,  -SQRT5OVER2 },
509   {  -GOLDENINV2,          0.0,      GOLDEN2,  -SQRT5OVER2 },
510   {   GOLDENINV2,          0.0,      GOLDEN2,  -SQRT5OVER2 },
511   {          0.0,          0.0,       -SQRT2,       -SQRT2 },
512   {    -SQRT2INV,  -GOLDENINV2,     -GOLDEN2,       -SQRT2 },
513   {     SQRT2INV,  -GOLDENINV2,     -GOLDEN2,       -SQRT2 },
514   {    -SQRT2INV,   GOLDENINV2,     -GOLDEN2,       -SQRT2 },
515   {     SQRT2INV,   GOLDENINV2,     -GOLDEN2,       -SQRT2 },
516   {  -GOLDENINV2,     -GOLDEN2,    -SQRT2INV,       -SQRT2 },
517   {   GOLDENINV2,     -GOLDEN2,    -SQRT2INV,       -SQRT2 },
518   {  -GOLDENINV2,      GOLDEN2,    -SQRT2INV,       -SQRT2 },
519   {   GOLDENINV2,      GOLDEN2,    -SQRT2INV,       -SQRT2 },
520   {     -GOLDEN2,    -SQRT2INV,  -GOLDENINV2,       -SQRT2 },
521   {      GOLDEN2,    -SQRT2INV,  -GOLDENINV2,       -SQRT2 },
522   {     -GOLDEN2,     SQRT2INV,  -GOLDENINV2,       -SQRT2 },
523   {      GOLDEN2,     SQRT2INV,  -GOLDENINV2,       -SQRT2 },
524   {          0.0,       -SQRT2,          0.0,       -SQRT2 },
525   {       -SQRT2,          0.0,          0.0,       -SQRT2 },
526   {        SQRT2,          0.0,          0.0,       -SQRT2 },
527   {          0.0,        SQRT2,          0.0,       -SQRT2 },
528   {     -GOLDEN2,    -SQRT2INV,   GOLDENINV2,       -SQRT2 },
529   {      GOLDEN2,    -SQRT2INV,   GOLDENINV2,       -SQRT2 },
530   {     -GOLDEN2,     SQRT2INV,   GOLDENINV2,       -SQRT2 },
531   {      GOLDEN2,     SQRT2INV,   GOLDENINV2,       -SQRT2 },
532   {  -GOLDENINV2,     -GOLDEN2,     SQRT2INV,       -SQRT2 },
533   {   GOLDENINV2,     -GOLDEN2,     SQRT2INV,       -SQRT2 },
534   {  -GOLDENINV2,      GOLDEN2,     SQRT2INV,       -SQRT2 },
535   {   GOLDENINV2,      GOLDEN2,     SQRT2INV,       -SQRT2 },
536   {    -SQRT2INV,  -GOLDENINV2,      GOLDEN2,       -SQRT2 },
537   {     SQRT2INV,  -GOLDENINV2,      GOLDEN2,       -SQRT2 },
538   {    -SQRT2INV,   GOLDENINV2,      GOLDEN2,       -SQRT2 },
539   {     SQRT2INV,   GOLDENINV2,      GOLDEN2,       -SQRT2 },
540   {          0.0,          0.0,        SQRT2,       -SQRT2 },
541   {          0.0,  -GOLDENINV2,  -SQRT5OVER2,     -GOLDEN2 },
542   {          0.0,   GOLDENINV2,  -SQRT5OVER2,     -GOLDEN2 },
543   {  -GOLDENINV2,    -SQRT2INV,       -SQRT2,     -GOLDEN2 },
544   {   GOLDENINV2,    -SQRT2INV,       -SQRT2,     -GOLDEN2 },
545   {  -GOLDENINV2,     SQRT2INV,       -SQRT2,     -GOLDEN2 },
546   {   GOLDENINV2,     SQRT2INV,       -SQRT2,     -GOLDEN2 },
547   { -GOLDENINV22,     -GOLDEN2,     -GOLDEN2,     -GOLDEN2 },
548   {  GOLDENINV22,     -GOLDEN2,     -GOLDEN2,     -GOLDEN2 },
549   {     -GOLDEN2, -GOLDENINV22,     -GOLDEN2,     -GOLDEN2 },
550   {      GOLDEN2, -GOLDENINV22,     -GOLDEN2,     -GOLDEN2 },
551   {     -GOLDEN2,  GOLDENINV22,     -GOLDEN2,     -GOLDEN2 },
552   {      GOLDEN2,  GOLDENINV22,     -GOLDEN2,     -GOLDEN2 },
553   { -GOLDENINV22,      GOLDEN2,     -GOLDEN2,     -GOLDEN2 },
554   {  GOLDENINV22,      GOLDEN2,     -GOLDEN2,     -GOLDEN2 },
555   {       -SQRT2,  -GOLDENINV2,    -SQRT2INV,     -GOLDEN2 },
556   {        SQRT2,  -GOLDENINV2,    -SQRT2INV,     -GOLDEN2 },
557   {       -SQRT2,   GOLDENINV2,    -SQRT2INV,     -GOLDEN2 },
558   {        SQRT2,   GOLDENINV2,    -SQRT2INV,     -GOLDEN2 },
559   {    -SQRT2INV,       -SQRT2,  -GOLDENINV2,     -GOLDEN2 },
560   {     SQRT2INV,       -SQRT2,  -GOLDENINV2,     -GOLDEN2 },
561   {  -SQRT5OVER2,          0.0,  -GOLDENINV2,     -GOLDEN2 },
562   {   SQRT5OVER2,          0.0,  -GOLDENINV2,     -GOLDEN2 },
563   {    -SQRT2INV,        SQRT2,  -GOLDENINV2,     -GOLDEN2 },
564   {     SQRT2INV,        SQRT2,  -GOLDENINV2,     -GOLDEN2 },
565   {     -GOLDEN2,     -GOLDEN2, -GOLDENINV22,     -GOLDEN2 },
566   {      GOLDEN2,     -GOLDEN2, -GOLDENINV22,     -GOLDEN2 },
567   {     -GOLDEN2,      GOLDEN2, -GOLDENINV22,     -GOLDEN2 },
568   {      GOLDEN2,      GOLDEN2, -GOLDENINV22,     -GOLDEN2 },
569   {  -GOLDENINV2,  -SQRT5OVER2,          0.0,     -GOLDEN2 },
570   {   GOLDENINV2,  -SQRT5OVER2,          0.0,     -GOLDEN2 },
571   {  -GOLDENINV2,   SQRT5OVER2,          0.0,     -GOLDEN2 },
572   {   GOLDENINV2,   SQRT5OVER2,          0.0,     -GOLDEN2 },
573   {     -GOLDEN2,     -GOLDEN2,  GOLDENINV22,     -GOLDEN2 },
574   {      GOLDEN2,     -GOLDEN2,  GOLDENINV22,     -GOLDEN2 },
575   {     -GOLDEN2,      GOLDEN2,  GOLDENINV22,     -GOLDEN2 },
576   {      GOLDEN2,      GOLDEN2,  GOLDENINV22,     -GOLDEN2 },
577   {    -SQRT2INV,       -SQRT2,   GOLDENINV2,     -GOLDEN2 },
578   {     SQRT2INV,       -SQRT2,   GOLDENINV2,     -GOLDEN2 },
579   {  -SQRT5OVER2,          0.0,   GOLDENINV2,     -GOLDEN2 },
580   {   SQRT5OVER2,          0.0,   GOLDENINV2,     -GOLDEN2 },
581   {    -SQRT2INV,        SQRT2,   GOLDENINV2,     -GOLDEN2 },
582   {     SQRT2INV,        SQRT2,   GOLDENINV2,     -GOLDEN2 },
583   {       -SQRT2,  -GOLDENINV2,     SQRT2INV,     -GOLDEN2 },
584   {        SQRT2,  -GOLDENINV2,     SQRT2INV,     -GOLDEN2 },
585   {       -SQRT2,   GOLDENINV2,     SQRT2INV,     -GOLDEN2 },
586   {        SQRT2,   GOLDENINV2,     SQRT2INV,     -GOLDEN2 },
587   { -GOLDENINV22,     -GOLDEN2,      GOLDEN2,     -GOLDEN2 },
588   {  GOLDENINV22,     -GOLDEN2,      GOLDEN2,     -GOLDEN2 },
589   {     -GOLDEN2, -GOLDENINV22,      GOLDEN2,     -GOLDEN2 },
590   {      GOLDEN2, -GOLDENINV22,      GOLDEN2,     -GOLDEN2 },
591   {     -GOLDEN2,  GOLDENINV22,      GOLDEN2,     -GOLDEN2 },
592   {      GOLDEN2,  GOLDENINV22,      GOLDEN2,     -GOLDEN2 },
593   { -GOLDENINV22,      GOLDEN2,      GOLDEN2,     -GOLDEN2 },
594   {  GOLDENINV22,      GOLDEN2,      GOLDEN2,     -GOLDEN2 },
595   {  -GOLDENINV2,    -SQRT2INV,        SQRT2,     -GOLDEN2 },
596   {   GOLDENINV2,    -SQRT2INV,        SQRT2,     -GOLDEN2 },
597   {  -GOLDENINV2,     SQRT2INV,        SQRT2,     -GOLDEN2 },
598   {   GOLDENINV2,     SQRT2INV,        SQRT2,     -GOLDEN2 },
599   {          0.0,  -GOLDENINV2,   SQRT5OVER2,     -GOLDEN2 },
600   {          0.0,   GOLDENINV2,   SQRT5OVER2,     -GOLDEN2 },
601   {          0.0, -GOLDENINV22,    -GOLDEN22,    -SQRT2INV },
602   {          0.0,  GOLDENINV22,    -GOLDEN22,    -SQRT2INV },
603   {    -SQRT2INV,    -SQRT2INV,  -SQRT5OVER2,    -SQRT2INV },
604   {     SQRT2INV,    -SQRT2INV,  -SQRT5OVER2,    -SQRT2INV },
605   {    -SQRT2INV,     SQRT2INV,  -SQRT5OVER2,    -SQRT2INV },
606   {     SQRT2INV,     SQRT2INV,  -SQRT5OVER2,    -SQRT2INV },
607   {     -GOLDEN2,  -GOLDENINV2,       -SQRT2,    -SQRT2INV },
608   {      GOLDEN2,  -GOLDENINV2,       -SQRT2,    -SQRT2INV },
609   {     -GOLDEN2,   GOLDENINV2,       -SQRT2,    -SQRT2INV },
610   {      GOLDEN2,   GOLDENINV2,       -SQRT2,    -SQRT2INV },
611   {  -GOLDENINV2,       -SQRT2,     -GOLDEN2,    -SQRT2INV },
612   {   GOLDENINV2,       -SQRT2,     -GOLDEN2,    -SQRT2INV },
613   {  -GOLDENINV2,        SQRT2,     -GOLDEN2,    -SQRT2INV },
614   {   GOLDENINV2,        SQRT2,     -GOLDEN2,    -SQRT2INV },
615   {    -SQRT2INV,  -SQRT5OVER2,    -SQRT2INV,    -SQRT2INV },
616   {     SQRT2INV,  -SQRT5OVER2,    -SQRT2INV,    -SQRT2INV },
617   {  -SQRT5OVER2,    -SQRT2INV,    -SQRT2INV,    -SQRT2INV },
618   {   SQRT5OVER2,    -SQRT2INV,    -SQRT2INV,    -SQRT2INV },
619   {  -SQRT5OVER2,     SQRT2INV,    -SQRT2INV,    -SQRT2INV },
620   {   SQRT5OVER2,     SQRT2INV,    -SQRT2INV,    -SQRT2INV },
621   {    -SQRT2INV,   SQRT5OVER2,    -SQRT2INV,    -SQRT2INV },
622   {     SQRT2INV,   SQRT5OVER2,    -SQRT2INV,    -SQRT2INV },
623   {       -SQRT2,     -GOLDEN2,  -GOLDENINV2,    -SQRT2INV },
624   {        SQRT2,     -GOLDEN2,  -GOLDENINV2,    -SQRT2INV },
625   {       -SQRT2,      GOLDEN2,  -GOLDENINV2,    -SQRT2INV },
626   {        SQRT2,      GOLDEN2,  -GOLDENINV2,    -SQRT2INV },
627   {    -GOLDEN22,          0.0, -GOLDENINV22,    -SQRT2INV },
628   {     GOLDEN22,          0.0, -GOLDENINV22,    -SQRT2INV },
629   { -GOLDENINV22,    -GOLDEN22,          0.0,    -SQRT2INV },
630   {  GOLDENINV22,    -GOLDEN22,          0.0,    -SQRT2INV },
631   { -GOLDENINV22,     GOLDEN22,          0.0,    -SQRT2INV },
632   {  GOLDENINV22,     GOLDEN22,          0.0,    -SQRT2INV },
633   {    -GOLDEN22,          0.0,  GOLDENINV22,    -SQRT2INV },
634   {     GOLDEN22,          0.0,  GOLDENINV22,    -SQRT2INV },
635   {       -SQRT2,     -GOLDEN2,   GOLDENINV2,    -SQRT2INV },
636   {        SQRT2,     -GOLDEN2,   GOLDENINV2,    -SQRT2INV },
637   {       -SQRT2,      GOLDEN2,   GOLDENINV2,    -SQRT2INV },
638   {        SQRT2,      GOLDEN2,   GOLDENINV2,    -SQRT2INV },
639   {    -SQRT2INV,  -SQRT5OVER2,     SQRT2INV,    -SQRT2INV },
640   {     SQRT2INV,  -SQRT5OVER2,     SQRT2INV,    -SQRT2INV },
641   {  -SQRT5OVER2,    -SQRT2INV,     SQRT2INV,    -SQRT2INV },
642   {   SQRT5OVER2,    -SQRT2INV,     SQRT2INV,    -SQRT2INV },
643   {  -SQRT5OVER2,     SQRT2INV,     SQRT2INV,    -SQRT2INV },
644   {   SQRT5OVER2,     SQRT2INV,     SQRT2INV,    -SQRT2INV },
645   {    -SQRT2INV,   SQRT5OVER2,     SQRT2INV,    -SQRT2INV },
646   {     SQRT2INV,   SQRT5OVER2,     SQRT2INV,    -SQRT2INV },
647   {  -GOLDENINV2,       -SQRT2,      GOLDEN2,    -SQRT2INV },
648   {   GOLDENINV2,       -SQRT2,      GOLDEN2,    -SQRT2INV },
649   {  -GOLDENINV2,        SQRT2,      GOLDEN2,    -SQRT2INV },
650   {   GOLDENINV2,        SQRT2,      GOLDEN2,    -SQRT2INV },
651   {     -GOLDEN2,  -GOLDENINV2,        SQRT2,    -SQRT2INV },
652   {      GOLDEN2,  -GOLDENINV2,        SQRT2,    -SQRT2INV },
653   {     -GOLDEN2,   GOLDENINV2,        SQRT2,    -SQRT2INV },
654   {      GOLDEN2,   GOLDENINV2,        SQRT2,    -SQRT2INV },
655   {    -SQRT2INV,    -SQRT2INV,   SQRT5OVER2,    -SQRT2INV },
656   {     SQRT2INV,    -SQRT2INV,   SQRT5OVER2,    -SQRT2INV },
657   {    -SQRT2INV,     SQRT2INV,   SQRT5OVER2,    -SQRT2INV },
658   {     SQRT2INV,     SQRT2INV,   SQRT5OVER2,    -SQRT2INV },
659   {          0.0, -GOLDENINV22,     GOLDEN22,    -SQRT2INV },
660   {          0.0,  GOLDENINV22,     GOLDEN22,    -SQRT2INV },
661   {  -GOLDENINV2,  -GOLDENINV2,    -GOLDEN22,  -GOLDENINV2 },
662   {   GOLDENINV2,  -GOLDENINV2,    -GOLDEN22,  -GOLDENINV2 },
663   {  -GOLDENINV2,   GOLDENINV2,    -GOLDEN22,  -GOLDENINV2 },
664   {   GOLDENINV2,   GOLDENINV2,    -GOLDEN22,  -GOLDENINV2 },
665   {     -GOLDEN2,          0.0,  -SQRT5OVER2,  -GOLDENINV2 },
666   {      GOLDEN2,          0.0,  -SQRT5OVER2,  -GOLDENINV2 },
667   {    -SQRT2INV,     -GOLDEN2,       -SQRT2,  -GOLDENINV2 },
668   {     SQRT2INV,     -GOLDEN2,       -SQRT2,  -GOLDENINV2 },
669   {    -SQRT2INV,      GOLDEN2,       -SQRT2,  -GOLDENINV2 },
670   {     SQRT2INV,      GOLDEN2,       -SQRT2,  -GOLDENINV2 },
671   {          0.0,  -SQRT5OVER2,     -GOLDEN2,  -GOLDENINV2 },
672   {       -SQRT2,    -SQRT2INV,     -GOLDEN2,  -GOLDENINV2 },
673   {        SQRT2,    -SQRT2INV,     -GOLDEN2,  -GOLDENINV2 },
674   {       -SQRT2,     SQRT2INV,     -GOLDEN2,  -GOLDENINV2 },
675   {        SQRT2,     SQRT2INV,     -GOLDEN2,  -GOLDENINV2 },
676   {          0.0,   SQRT5OVER2,     -GOLDEN2,  -GOLDENINV2 },
677   {     -GOLDEN2,       -SQRT2,    -SQRT2INV,  -GOLDENINV2 },
678   {      GOLDEN2,       -SQRT2,    -SQRT2INV,  -GOLDENINV2 },
679   {     -GOLDEN2,        SQRT2,    -SQRT2INV,  -GOLDENINV2 },
680   {      GOLDEN2,        SQRT2,    -SQRT2INV,  -GOLDENINV2 },
681   {  -GOLDENINV2,    -GOLDEN22,  -GOLDENINV2,  -GOLDENINV2 },
682   {   GOLDENINV2,    -GOLDEN22,  -GOLDENINV2,  -GOLDENINV2 },
683   {    -GOLDEN22,  -GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2 },
684   {     GOLDEN22,  -GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2 },
685   {    -GOLDEN22,   GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2 },
686   {     GOLDEN22,   GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2 },
687   {  -GOLDENINV2,     GOLDEN22,  -GOLDENINV2,  -GOLDENINV2 },
688   {   GOLDENINV2,     GOLDEN22,  -GOLDENINV2,  -GOLDENINV2 },
689   {  -SQRT5OVER2,     -GOLDEN2,          0.0,  -GOLDENINV2 },
690   {   SQRT5OVER2,     -GOLDEN2,          0.0,  -GOLDENINV2 },
691   {  -SQRT5OVER2,      GOLDEN2,          0.0,  -GOLDENINV2 },
692   {   SQRT5OVER2,      GOLDEN2,          0.0,  -GOLDENINV2 },
693   {  -GOLDENINV2,    -GOLDEN22,   GOLDENINV2,  -GOLDENINV2 },
694   {   GOLDENINV2,    -GOLDEN22,   GOLDENINV2,  -GOLDENINV2 },
695   {    -GOLDEN22,  -GOLDENINV2,   GOLDENINV2,  -GOLDENINV2 },
696   {     GOLDEN22,  -GOLDENINV2,   GOLDENINV2,  -GOLDENINV2 },
697   {    -GOLDEN22,   GOLDENINV2,   GOLDENINV2,  -GOLDENINV2 },
698   {     GOLDEN22,   GOLDENINV2,   GOLDENINV2,  -GOLDENINV2 },
699   {  -GOLDENINV2,     GOLDEN22,   GOLDENINV2,  -GOLDENINV2 },
700   {   GOLDENINV2,     GOLDEN22,   GOLDENINV2,  -GOLDENINV2 },
701   {     -GOLDEN2,       -SQRT2,     SQRT2INV,  -GOLDENINV2 },
702   {      GOLDEN2,       -SQRT2,     SQRT2INV,  -GOLDENINV2 },
703   {     -GOLDEN2,        SQRT2,     SQRT2INV,  -GOLDENINV2 },
704   {      GOLDEN2,        SQRT2,     SQRT2INV,  -GOLDENINV2 },
705   {          0.0,  -SQRT5OVER2,      GOLDEN2,  -GOLDENINV2 },
706   {       -SQRT2,    -SQRT2INV,      GOLDEN2,  -GOLDENINV2 },
707   {        SQRT2,    -SQRT2INV,      GOLDEN2,  -GOLDENINV2 },
708   {       -SQRT2,     SQRT2INV,      GOLDEN2,  -GOLDENINV2 },
709   {        SQRT2,     SQRT2INV,      GOLDEN2,  -GOLDENINV2 },
710   {          0.0,   SQRT5OVER2,      GOLDEN2,  -GOLDENINV2 },
711   {    -SQRT2INV,     -GOLDEN2,        SQRT2,  -GOLDENINV2 },
712   {     SQRT2INV,     -GOLDEN2,        SQRT2,  -GOLDENINV2 },
713   {    -SQRT2INV,      GOLDEN2,        SQRT2,  -GOLDENINV2 },
714   {     SQRT2INV,      GOLDEN2,        SQRT2,  -GOLDENINV2 },
715   {     -GOLDEN2,          0.0,   SQRT5OVER2,  -GOLDENINV2 },
716   {      GOLDEN2,          0.0,   SQRT5OVER2,  -GOLDENINV2 },
717   {  -GOLDENINV2,  -GOLDENINV2,     GOLDEN22,  -GOLDENINV2 },
718   {   GOLDENINV2,  -GOLDENINV2,     GOLDEN22,  -GOLDENINV2 },
719   {  -GOLDENINV2,   GOLDENINV2,     GOLDEN22,  -GOLDENINV2 },
720   {   GOLDENINV2,   GOLDENINV2,     GOLDEN22,  -GOLDENINV2 },
721   {    -SQRT2INV,          0.0,    -GOLDEN22, -GOLDENINV22 },
722   {     SQRT2INV,          0.0,    -GOLDEN22, -GOLDENINV22 },
723   {     -GOLDEN2,     -GOLDEN2,     -GOLDEN2, -GOLDENINV22 },
724   {      GOLDEN2,     -GOLDEN2,     -GOLDEN2, -GOLDENINV22 },
725   {     -GOLDEN2,      GOLDEN2,     -GOLDEN2, -GOLDENINV22 },
726   {      GOLDEN2,      GOLDEN2,     -GOLDEN2, -GOLDENINV22 },
727   {          0.0,    -GOLDEN22,    -SQRT2INV, -GOLDENINV22 },
728   {          0.0,     GOLDEN22,    -SQRT2INV, -GOLDENINV22 },
729   {    -GOLDEN22,    -SQRT2INV,          0.0, -GOLDENINV22 },
730   {     GOLDEN22,    -SQRT2INV,          0.0, -GOLDENINV22 },
731   {    -GOLDEN22,     SQRT2INV,          0.0, -GOLDENINV22 },
732   {     GOLDEN22,     SQRT2INV,          0.0, -GOLDENINV22 },
733   {          0.0,    -GOLDEN22,     SQRT2INV, -GOLDENINV22 },
734   {          0.0,     GOLDEN22,     SQRT2INV, -GOLDENINV22 },
735   {     -GOLDEN2,     -GOLDEN2,      GOLDEN2, -GOLDENINV22 },
736   {      GOLDEN2,     -GOLDEN2,      GOLDEN2, -GOLDENINV22 },
737   {     -GOLDEN2,      GOLDEN2,      GOLDEN2, -GOLDENINV22 },
738   {      GOLDEN2,      GOLDEN2,      GOLDEN2, -GOLDENINV22 },
739   {    -SQRT2INV,          0.0,     GOLDEN22, -GOLDENINV22 },
740   {     SQRT2INV,          0.0,     GOLDEN22, -GOLDENINV22 },
741   { -GOLDENINV22,    -SQRT2INV,    -GOLDEN22,          0.0 },
742   {  GOLDENINV22,    -SQRT2INV,    -GOLDEN22,          0.0 },
743   { -GOLDENINV22,     SQRT2INV,    -GOLDEN22,          0.0 },
744   {  GOLDENINV22,     SQRT2INV,    -GOLDEN22,          0.0 },
745   {  -GOLDENINV2,     -GOLDEN2,  -SQRT5OVER2,          0.0 },
746   {   GOLDENINV2,     -GOLDEN2,  -SQRT5OVER2,          0.0 },
747   {  -GOLDENINV2,      GOLDEN2,  -SQRT5OVER2,          0.0 },
748   {   GOLDENINV2,      GOLDEN2,  -SQRT5OVER2,          0.0 },
749   {          0.0,       -SQRT2,       -SQRT2,          0.0 },
750   {       -SQRT2,          0.0,       -SQRT2,          0.0 },
751   {        SQRT2,          0.0,       -SQRT2,          0.0 },
752   {          0.0,        SQRT2,       -SQRT2,          0.0 },
753   {  -SQRT5OVER2,  -GOLDENINV2,     -GOLDEN2,          0.0 },
754   {   SQRT5OVER2,  -GOLDENINV2,     -GOLDEN2,          0.0 },
755   {  -SQRT5OVER2,   GOLDENINV2,     -GOLDEN2,          0.0 },
756   {   SQRT5OVER2,   GOLDENINV2,     -GOLDEN2,          0.0 },
757   {    -GOLDEN22, -GOLDENINV22,    -SQRT2INV,          0.0 },
758   {     GOLDEN22, -GOLDENINV22,    -SQRT2INV,          0.0 },
759   {    -GOLDEN22,  GOLDENINV22,    -SQRT2INV,          0.0 },
760   {     GOLDEN22,  GOLDENINV22,    -SQRT2INV,          0.0 },
761   {     -GOLDEN2,  -SQRT5OVER2,  -GOLDENINV2,          0.0 },
762   {      GOLDEN2,  -SQRT5OVER2,  -GOLDENINV2,          0.0 },
763   {     -GOLDEN2,   SQRT5OVER2,  -GOLDENINV2,          0.0 },
764   {      GOLDEN2,   SQRT5OVER2,  -GOLDENINV2,          0.0 },
765   {    -SQRT2INV,    -GOLDEN22, -GOLDENINV22,          0.0 },
766   {     SQRT2INV,    -GOLDEN22, -GOLDENINV22,          0.0 },
767   {    -SQRT2INV,     GOLDEN22, -GOLDENINV22,          0.0 },
768   {     SQRT2INV,     GOLDEN22, -GOLDENINV22,          0.0 },
769   {       -SQRT2,       -SQRT2,          0.0,          0.0 },
770   {        SQRT2,       -SQRT2,          0.0,          0.0 },
771   {       -SQRT2,        SQRT2,          0.0,          0.0 },
772   {        SQRT2,        SQRT2,          0.0,          0.0 },
773   {    -SQRT2INV,    -GOLDEN22,  GOLDENINV22,          0.0 },
774   {     SQRT2INV,    -GOLDEN22,  GOLDENINV22,          0.0 },
775   {    -SQRT2INV,     GOLDEN22,  GOLDENINV22,          0.0 },
776   {     SQRT2INV,     GOLDEN22,  GOLDENINV22,          0.0 },
777   {     -GOLDEN2,  -SQRT5OVER2,   GOLDENINV2,          0.0 },
778   {      GOLDEN2,  -SQRT5OVER2,   GOLDENINV2,          0.0 },
779   {     -GOLDEN2,   SQRT5OVER2,   GOLDENINV2,          0.0 },
780   {      GOLDEN2,   SQRT5OVER2,   GOLDENINV2,          0.0 },
781   {    -GOLDEN22, -GOLDENINV22,     SQRT2INV,          0.0 },
782   {     GOLDEN22, -GOLDENINV22,     SQRT2INV,          0.0 },
783   {    -GOLDEN22,  GOLDENINV22,     SQRT2INV,          0.0 },
784   {     GOLDEN22,  GOLDENINV22,     SQRT2INV,          0.0 },
785   {  -SQRT5OVER2,  -GOLDENINV2,      GOLDEN2,          0.0 },
786   {   SQRT5OVER2,  -GOLDENINV2,      GOLDEN2,          0.0 },
787   {  -SQRT5OVER2,   GOLDENINV2,      GOLDEN2,          0.0 },
788   {   SQRT5OVER2,   GOLDENINV2,      GOLDEN2,          0.0 },
789   {          0.0,       -SQRT2,        SQRT2,          0.0 },
790   {       -SQRT2,          0.0,        SQRT2,          0.0 },
791   {        SQRT2,          0.0,        SQRT2,          0.0 },
792   {          0.0,        SQRT2,        SQRT2,          0.0 },
793   {  -GOLDENINV2,     -GOLDEN2,   SQRT5OVER2,          0.0 },
794   {   GOLDENINV2,     -GOLDEN2,   SQRT5OVER2,          0.0 },
795   {  -GOLDENINV2,      GOLDEN2,   SQRT5OVER2,          0.0 },
796   {   GOLDENINV2,      GOLDEN2,   SQRT5OVER2,          0.0 },
797   { -GOLDENINV22,    -SQRT2INV,     GOLDEN22,          0.0 },
798   {  GOLDENINV22,    -SQRT2INV,     GOLDEN22,          0.0 },
799   { -GOLDENINV22,     SQRT2INV,     GOLDEN22,          0.0 },
800   {  GOLDENINV22,     SQRT2INV,     GOLDEN22,          0.0 },
801   {    -SQRT2INV,          0.0,    -GOLDEN22,  GOLDENINV22 },
802   {     SQRT2INV,          0.0,    -GOLDEN22,  GOLDENINV22 },
803   {     -GOLDEN2,     -GOLDEN2,     -GOLDEN2,  GOLDENINV22 },
804   {      GOLDEN2,     -GOLDEN2,     -GOLDEN2,  GOLDENINV22 },
805   {     -GOLDEN2,      GOLDEN2,     -GOLDEN2,  GOLDENINV22 },
806   {      GOLDEN2,      GOLDEN2,     -GOLDEN2,  GOLDENINV22 },
807   {          0.0,    -GOLDEN22,    -SQRT2INV,  GOLDENINV22 },
808   {          0.0,     GOLDEN22,    -SQRT2INV,  GOLDENINV22 },
809   {    -GOLDEN22,    -SQRT2INV,          0.0,  GOLDENINV22 },
810   {     GOLDEN22,    -SQRT2INV,          0.0,  GOLDENINV22 },
811   {    -GOLDEN22,     SQRT2INV,          0.0,  GOLDENINV22 },
812   {     GOLDEN22,     SQRT2INV,          0.0,  GOLDENINV22 },
813   {          0.0,    -GOLDEN22,     SQRT2INV,  GOLDENINV22 },
814   {          0.0,     GOLDEN22,     SQRT2INV,  GOLDENINV22 },
815   {     -GOLDEN2,     -GOLDEN2,      GOLDEN2,  GOLDENINV22 },
816   {      GOLDEN2,     -GOLDEN2,      GOLDEN2,  GOLDENINV22 },
817   {     -GOLDEN2,      GOLDEN2,      GOLDEN2,  GOLDENINV22 },
818   {      GOLDEN2,      GOLDEN2,      GOLDEN2,  GOLDENINV22 },
819   {    -SQRT2INV,          0.0,     GOLDEN22,  GOLDENINV22 },
820   {     SQRT2INV,          0.0,     GOLDEN22,  GOLDENINV22 },
821   {  -GOLDENINV2,  -GOLDENINV2,    -GOLDEN22,   GOLDENINV2 },
822   {   GOLDENINV2,  -GOLDENINV2,    -GOLDEN22,   GOLDENINV2 },
823   {  -GOLDENINV2,   GOLDENINV2,    -GOLDEN22,   GOLDENINV2 },
824   {   GOLDENINV2,   GOLDENINV2,    -GOLDEN22,   GOLDENINV2 },
825   {     -GOLDEN2,          0.0,  -SQRT5OVER2,   GOLDENINV2 },
826   {      GOLDEN2,          0.0,  -SQRT5OVER2,   GOLDENINV2 },
827   {    -SQRT2INV,     -GOLDEN2,       -SQRT2,   GOLDENINV2 },
828   {     SQRT2INV,     -GOLDEN2,       -SQRT2,   GOLDENINV2 },
829   {    -SQRT2INV,      GOLDEN2,       -SQRT2,   GOLDENINV2 },
830   {     SQRT2INV,      GOLDEN2,       -SQRT2,   GOLDENINV2 },
831   {          0.0,  -SQRT5OVER2,     -GOLDEN2,   GOLDENINV2 },
832   {       -SQRT2,    -SQRT2INV,     -GOLDEN2,   GOLDENINV2 },
833   {        SQRT2,    -SQRT2INV,     -GOLDEN2,   GOLDENINV2 },
834   {       -SQRT2,     SQRT2INV,     -GOLDEN2,   GOLDENINV2 },
835   {        SQRT2,     SQRT2INV,     -GOLDEN2,   GOLDENINV2 },
836   {          0.0,   SQRT5OVER2,     -GOLDEN2,   GOLDENINV2 },
837   {     -GOLDEN2,       -SQRT2,    -SQRT2INV,   GOLDENINV2 },
838   {      GOLDEN2,       -SQRT2,    -SQRT2INV,   GOLDENINV2 },
839   {     -GOLDEN2,        SQRT2,    -SQRT2INV,   GOLDENINV2 },
840   {      GOLDEN2,        SQRT2,    -SQRT2INV,   GOLDENINV2 },
841   {  -GOLDENINV2,    -GOLDEN22,  -GOLDENINV2,   GOLDENINV2 },
842   {   GOLDENINV2,    -GOLDEN22,  -GOLDENINV2,   GOLDENINV2 },
843   {    -GOLDEN22,  -GOLDENINV2,  -GOLDENINV2,   GOLDENINV2 },
844   {     GOLDEN22,  -GOLDENINV2,  -GOLDENINV2,   GOLDENINV2 },
845   {    -GOLDEN22,   GOLDENINV2,  -GOLDENINV2,   GOLDENINV2 },
846   {     GOLDEN22,   GOLDENINV2,  -GOLDENINV2,   GOLDENINV2 },
847   {  -GOLDENINV2,     GOLDEN22,  -GOLDENINV2,   GOLDENINV2 },
848   {   GOLDENINV2,     GOLDEN22,  -GOLDENINV2,   GOLDENINV2 },
849   {  -SQRT5OVER2,     -GOLDEN2,          0.0,   GOLDENINV2 },
850   {   SQRT5OVER2,     -GOLDEN2,          0.0,   GOLDENINV2 },
851   {  -SQRT5OVER2,      GOLDEN2,          0.0,   GOLDENINV2 },
852   {   SQRT5OVER2,      GOLDEN2,          0.0,   GOLDENINV2 },
853   {  -GOLDENINV2,    -GOLDEN22,   GOLDENINV2,   GOLDENINV2 },
854   {   GOLDENINV2,    -GOLDEN22,   GOLDENINV2,   GOLDENINV2 },
855   {    -GOLDEN22,  -GOLDENINV2,   GOLDENINV2,   GOLDENINV2 },
856   {     GOLDEN22,  -GOLDENINV2,   GOLDENINV2,   GOLDENINV2 },
857   {    -GOLDEN22,   GOLDENINV2,   GOLDENINV2,   GOLDENINV2 },
858   {     GOLDEN22,   GOLDENINV2,   GOLDENINV2,   GOLDENINV2 },
859   {  -GOLDENINV2,     GOLDEN22,   GOLDENINV2,   GOLDENINV2 },
860   {   GOLDENINV2,     GOLDEN22,   GOLDENINV2,   GOLDENINV2 },
861   {     -GOLDEN2,       -SQRT2,     SQRT2INV,   GOLDENINV2 },
862   {      GOLDEN2,       -SQRT2,     SQRT2INV,   GOLDENINV2 },
863   {     -GOLDEN2,        SQRT2,     SQRT2INV,   GOLDENINV2 },
864   {      GOLDEN2,        SQRT2,     SQRT2INV,   GOLDENINV2 },
865   {          0.0,  -SQRT5OVER2,      GOLDEN2,   GOLDENINV2 },
866   {       -SQRT2,    -SQRT2INV,      GOLDEN2,   GOLDENINV2 },
867   {        SQRT2,    -SQRT2INV,      GOLDEN2,   GOLDENINV2 },
868   {       -SQRT2,     SQRT2INV,      GOLDEN2,   GOLDENINV2 },
869   {        SQRT2,     SQRT2INV,      GOLDEN2,   GOLDENINV2 },
870   {          0.0,   SQRT5OVER2,      GOLDEN2,   GOLDENINV2 },
871   {    -SQRT2INV,     -GOLDEN2,        SQRT2,   GOLDENINV2 },
872   {     SQRT2INV,     -GOLDEN2,        SQRT2,   GOLDENINV2 },
873   {    -SQRT2INV,      GOLDEN2,        SQRT2,   GOLDENINV2 },
874   {     SQRT2INV,      GOLDEN2,        SQRT2,   GOLDENINV2 },
875   {     -GOLDEN2,          0.0,   SQRT5OVER2,   GOLDENINV2 },
876   {      GOLDEN2,          0.0,   SQRT5OVER2,   GOLDENINV2 },
877   {  -GOLDENINV2,  -GOLDENINV2,     GOLDEN22,   GOLDENINV2 },
878   {   GOLDENINV2,  -GOLDENINV2,     GOLDEN22,   GOLDENINV2 },
879   {  -GOLDENINV2,   GOLDENINV2,     GOLDEN22,   GOLDENINV2 },
880   {   GOLDENINV2,   GOLDENINV2,     GOLDEN22,   GOLDENINV2 },
881   {          0.0, -GOLDENINV22,    -GOLDEN22,     SQRT2INV },
882   {          0.0,  GOLDENINV22,    -GOLDEN22,     SQRT2INV },
883   {    -SQRT2INV,    -SQRT2INV,  -SQRT5OVER2,     SQRT2INV },
884   {     SQRT2INV,    -SQRT2INV,  -SQRT5OVER2,     SQRT2INV },
885   {    -SQRT2INV,     SQRT2INV,  -SQRT5OVER2,     SQRT2INV },
886   {     SQRT2INV,     SQRT2INV,  -SQRT5OVER2,     SQRT2INV },
887   {     -GOLDEN2,  -GOLDENINV2,       -SQRT2,     SQRT2INV },
888   {      GOLDEN2,  -GOLDENINV2,       -SQRT2,     SQRT2INV },
889   {     -GOLDEN2,   GOLDENINV2,       -SQRT2,     SQRT2INV },
890   {      GOLDEN2,   GOLDENINV2,       -SQRT2,     SQRT2INV },
891   {  -GOLDENINV2,       -SQRT2,     -GOLDEN2,     SQRT2INV },
892   {   GOLDENINV2,       -SQRT2,     -GOLDEN2,     SQRT2INV },
893   {  -GOLDENINV2,        SQRT2,     -GOLDEN2,     SQRT2INV },
894   {   GOLDENINV2,        SQRT2,     -GOLDEN2,     SQRT2INV },
895   {    -SQRT2INV,  -SQRT5OVER2,    -SQRT2INV,     SQRT2INV },
896   {     SQRT2INV,  -SQRT5OVER2,    -SQRT2INV,     SQRT2INV },
897   {  -SQRT5OVER2,    -SQRT2INV,    -SQRT2INV,     SQRT2INV },
898   {   SQRT5OVER2,    -SQRT2INV,    -SQRT2INV,     SQRT2INV },
899   {  -SQRT5OVER2,     SQRT2INV,    -SQRT2INV,     SQRT2INV },
900   {   SQRT5OVER2,     SQRT2INV,    -SQRT2INV,     SQRT2INV },
901   {    -SQRT2INV,   SQRT5OVER2,    -SQRT2INV,     SQRT2INV },
902   {     SQRT2INV,   SQRT5OVER2,    -SQRT2INV,     SQRT2INV },
903   {       -SQRT2,     -GOLDEN2,  -GOLDENINV2,     SQRT2INV },
904   {        SQRT2,     -GOLDEN2,  -GOLDENINV2,     SQRT2INV },
905   {       -SQRT2,      GOLDEN2,  -GOLDENINV2,     SQRT2INV },
906   {        SQRT2,      GOLDEN2,  -GOLDENINV2,     SQRT2INV },
907   {    -GOLDEN22,          0.0, -GOLDENINV22,     SQRT2INV },
908   {     GOLDEN22,          0.0, -GOLDENINV22,     SQRT2INV },
909   { -GOLDENINV22,    -GOLDEN22,          0.0,     SQRT2INV },
910   {  GOLDENINV22,    -GOLDEN22,          0.0,     SQRT2INV },
911   { -GOLDENINV22,     GOLDEN22,          0.0,     SQRT2INV },
912   {  GOLDENINV22,     GOLDEN22,          0.0,     SQRT2INV },
913   {    -GOLDEN22,          0.0,  GOLDENINV22,     SQRT2INV },
914   {     GOLDEN22,          0.0,  GOLDENINV22,     SQRT2INV },
915   {       -SQRT2,     -GOLDEN2,   GOLDENINV2,     SQRT2INV },
916   {        SQRT2,     -GOLDEN2,   GOLDENINV2,     SQRT2INV },
917   {       -SQRT2,      GOLDEN2,   GOLDENINV2,     SQRT2INV },
918   {        SQRT2,      GOLDEN2,   GOLDENINV2,     SQRT2INV },
919   {    -SQRT2INV,  -SQRT5OVER2,     SQRT2INV,     SQRT2INV },
920   {     SQRT2INV,  -SQRT5OVER2,     SQRT2INV,     SQRT2INV },
921   {  -SQRT5OVER2,    -SQRT2INV,     SQRT2INV,     SQRT2INV },
922   {   SQRT5OVER2,    -SQRT2INV,     SQRT2INV,     SQRT2INV },
923   {  -SQRT5OVER2,     SQRT2INV,     SQRT2INV,     SQRT2INV },
924   {   SQRT5OVER2,     SQRT2INV,     SQRT2INV,     SQRT2INV },
925   {    -SQRT2INV,   SQRT5OVER2,     SQRT2INV,     SQRT2INV },
926   {     SQRT2INV,   SQRT5OVER2,     SQRT2INV,     SQRT2INV },
927   {  -GOLDENINV2,       -SQRT2,      GOLDEN2,     SQRT2INV },
928   {   GOLDENINV2,       -SQRT2,      GOLDEN2,     SQRT2INV },
929   {  -GOLDENINV2,        SQRT2,      GOLDEN2,     SQRT2INV },
930   {   GOLDENINV2,        SQRT2,      GOLDEN2,     SQRT2INV },
931   {     -GOLDEN2,  -GOLDENINV2,        SQRT2,     SQRT2INV },
932   {      GOLDEN2,  -GOLDENINV2,        SQRT2,     SQRT2INV },
933   {     -GOLDEN2,   GOLDENINV2,        SQRT2,     SQRT2INV },
934   {      GOLDEN2,   GOLDENINV2,        SQRT2,     SQRT2INV },
935   {    -SQRT2INV,    -SQRT2INV,   SQRT5OVER2,     SQRT2INV },
936   {     SQRT2INV,    -SQRT2INV,   SQRT5OVER2,     SQRT2INV },
937   {    -SQRT2INV,     SQRT2INV,   SQRT5OVER2,     SQRT2INV },
938   {     SQRT2INV,     SQRT2INV,   SQRT5OVER2,     SQRT2INV },
939   {          0.0, -GOLDENINV22,     GOLDEN22,     SQRT2INV },
940   {          0.0,  GOLDENINV22,     GOLDEN22,     SQRT2INV },
941   {          0.0,  -GOLDENINV2,  -SQRT5OVER2,      GOLDEN2 },
942   {          0.0,   GOLDENINV2,  -SQRT5OVER2,      GOLDEN2 },
943   {  -GOLDENINV2,    -SQRT2INV,       -SQRT2,      GOLDEN2 },
944   {   GOLDENINV2,    -SQRT2INV,       -SQRT2,      GOLDEN2 },
945   {  -GOLDENINV2,     SQRT2INV,       -SQRT2,      GOLDEN2 },
946   {   GOLDENINV2,     SQRT2INV,       -SQRT2,      GOLDEN2 },
947   { -GOLDENINV22,     -GOLDEN2,     -GOLDEN2,      GOLDEN2 },
948   {  GOLDENINV22,     -GOLDEN2,     -GOLDEN2,      GOLDEN2 },
949   {     -GOLDEN2, -GOLDENINV22,     -GOLDEN2,      GOLDEN2 },
950   {      GOLDEN2, -GOLDENINV22,     -GOLDEN2,      GOLDEN2 },
951   {     -GOLDEN2,  GOLDENINV22,     -GOLDEN2,      GOLDEN2 },
952   {      GOLDEN2,  GOLDENINV22,     -GOLDEN2,      GOLDEN2 },
953   { -GOLDENINV22,      GOLDEN2,     -GOLDEN2,      GOLDEN2 },
954   {  GOLDENINV22,      GOLDEN2,     -GOLDEN2,      GOLDEN2 },
955   {       -SQRT2,  -GOLDENINV2,    -SQRT2INV,      GOLDEN2 },
956   {        SQRT2,  -GOLDENINV2,    -SQRT2INV,      GOLDEN2 },
957   {       -SQRT2,   GOLDENINV2,    -SQRT2INV,      GOLDEN2 },
958   {        SQRT2,   GOLDENINV2,    -SQRT2INV,      GOLDEN2 },
959   {    -SQRT2INV,       -SQRT2,  -GOLDENINV2,      GOLDEN2 },
960   {     SQRT2INV,       -SQRT2,  -GOLDENINV2,      GOLDEN2 },
961   {  -SQRT5OVER2,          0.0,  -GOLDENINV2,      GOLDEN2 },
962   {   SQRT5OVER2,          0.0,  -GOLDENINV2,      GOLDEN2 },
963   {    -SQRT2INV,        SQRT2,  -GOLDENINV2,      GOLDEN2 },
964   {     SQRT2INV,        SQRT2,  -GOLDENINV2,      GOLDEN2 },
965   {     -GOLDEN2,     -GOLDEN2, -GOLDENINV22,      GOLDEN2 },
966   {      GOLDEN2,     -GOLDEN2, -GOLDENINV22,      GOLDEN2 },
967   {     -GOLDEN2,      GOLDEN2, -GOLDENINV22,      GOLDEN2 },
968   {      GOLDEN2,      GOLDEN2, -GOLDENINV22,      GOLDEN2 },
969   {  -GOLDENINV2,  -SQRT5OVER2,          0.0,      GOLDEN2 },
970   {   GOLDENINV2,  -SQRT5OVER2,          0.0,      GOLDEN2 },
971   {  -GOLDENINV2,   SQRT5OVER2,          0.0,      GOLDEN2 },
972   {   GOLDENINV2,   SQRT5OVER2,          0.0,      GOLDEN2 },
973   {     -GOLDEN2,     -GOLDEN2,  GOLDENINV22,      GOLDEN2 },
974   {      GOLDEN2,     -GOLDEN2,  GOLDENINV22,      GOLDEN2 },
975   {     -GOLDEN2,      GOLDEN2,  GOLDENINV22,      GOLDEN2 },
976   {      GOLDEN2,      GOLDEN2,  GOLDENINV22,      GOLDEN2 },
977   {    -SQRT2INV,       -SQRT2,   GOLDENINV2,      GOLDEN2 },
978   {     SQRT2INV,       -SQRT2,   GOLDENINV2,      GOLDEN2 },
979   {  -SQRT5OVER2,          0.0,   GOLDENINV2,      GOLDEN2 },
980   {   SQRT5OVER2,          0.0,   GOLDENINV2,      GOLDEN2 },
981   {    -SQRT2INV,        SQRT2,   GOLDENINV2,      GOLDEN2 },
982   {     SQRT2INV,        SQRT2,   GOLDENINV2,      GOLDEN2 },
983   {       -SQRT2,  -GOLDENINV2,     SQRT2INV,      GOLDEN2 },
984   {        SQRT2,  -GOLDENINV2,     SQRT2INV,      GOLDEN2 },
985   {       -SQRT2,   GOLDENINV2,     SQRT2INV,      GOLDEN2 },
986   {        SQRT2,   GOLDENINV2,     SQRT2INV,      GOLDEN2 },
987   { -GOLDENINV22,     -GOLDEN2,      GOLDEN2,      GOLDEN2 },
988   {  GOLDENINV22,     -GOLDEN2,      GOLDEN2,      GOLDEN2 },
989   {     -GOLDEN2, -GOLDENINV22,      GOLDEN2,      GOLDEN2 },
990   {      GOLDEN2, -GOLDENINV22,      GOLDEN2,      GOLDEN2 },
991   {     -GOLDEN2,  GOLDENINV22,      GOLDEN2,      GOLDEN2 },
992   {      GOLDEN2,  GOLDENINV22,      GOLDEN2,      GOLDEN2 },
993   { -GOLDENINV22,      GOLDEN2,      GOLDEN2,      GOLDEN2 },
994   {  GOLDENINV22,      GOLDEN2,      GOLDEN2,      GOLDEN2 },
995   {  -GOLDENINV2,    -SQRT2INV,        SQRT2,      GOLDEN2 },
996   {   GOLDENINV2,    -SQRT2INV,        SQRT2,      GOLDEN2 },
997   {  -GOLDENINV2,     SQRT2INV,        SQRT2,      GOLDEN2 },
998   {   GOLDENINV2,     SQRT2INV,        SQRT2,      GOLDEN2 },
999   {          0.0,  -GOLDENINV2,   SQRT5OVER2,      GOLDEN2 },
1000   {          0.0,   GOLDENINV2,   SQRT5OVER2,      GOLDEN2 },
1001   {          0.0,          0.0,       -SQRT2,        SQRT2 },
1002   {    -SQRT2INV,  -GOLDENINV2,     -GOLDEN2,        SQRT2 },
1003   {     SQRT2INV,  -GOLDENINV2,     -GOLDEN2,        SQRT2 },
1004   {    -SQRT2INV,   GOLDENINV2,     -GOLDEN2,        SQRT2 },
1005   {     SQRT2INV,   GOLDENINV2,     -GOLDEN2,        SQRT2 },
1006   {  -GOLDENINV2,     -GOLDEN2,    -SQRT2INV,        SQRT2 },
1007   {   GOLDENINV2,     -GOLDEN2,    -SQRT2INV,        SQRT2 },
1008   {  -GOLDENINV2,      GOLDEN2,    -SQRT2INV,        SQRT2 },
1009   {   GOLDENINV2,      GOLDEN2,    -SQRT2INV,        SQRT2 },
1010   {     -GOLDEN2,    -SQRT2INV,  -GOLDENINV2,        SQRT2 },
1011   {      GOLDEN2,    -SQRT2INV,  -GOLDENINV2,        SQRT2 },
1012   {     -GOLDEN2,     SQRT2INV,  -GOLDENINV2,        SQRT2 },
1013   {      GOLDEN2,     SQRT2INV,  -GOLDENINV2,        SQRT2 },
1014   {          0.0,       -SQRT2,          0.0,        SQRT2 },
1015   {       -SQRT2,          0.0,          0.0,        SQRT2 },
1016   {        SQRT2,          0.0,          0.0,        SQRT2 },
1017   {          0.0,        SQRT2,          0.0,        SQRT2 },
1018   {     -GOLDEN2,    -SQRT2INV,   GOLDENINV2,        SQRT2 },
1019   {      GOLDEN2,    -SQRT2INV,   GOLDENINV2,        SQRT2 },
1020   {     -GOLDEN2,     SQRT2INV,   GOLDENINV2,        SQRT2 },
1021   {      GOLDEN2,     SQRT2INV,   GOLDENINV2,        SQRT2 },
1022   {  -GOLDENINV2,     -GOLDEN2,     SQRT2INV,        SQRT2 },
1023   {   GOLDENINV2,     -GOLDEN2,     SQRT2INV,        SQRT2 },
1024   {  -GOLDENINV2,      GOLDEN2,     SQRT2INV,        SQRT2 },
1025   {   GOLDENINV2,      GOLDEN2,     SQRT2INV,        SQRT2 },
1026   {    -SQRT2INV,  -GOLDENINV2,      GOLDEN2,        SQRT2 },
1027   {     SQRT2INV,  -GOLDENINV2,      GOLDEN2,        SQRT2 },
1028   {    -SQRT2INV,   GOLDENINV2,      GOLDEN2,        SQRT2 },
1029   {     SQRT2INV,   GOLDENINV2,      GOLDEN2,        SQRT2 },
1030   {          0.0,          0.0,        SQRT2,        SQRT2 },
1031   {  -GOLDENINV2,          0.0,     -GOLDEN2,   SQRT5OVER2 },
1032   {   GOLDENINV2,          0.0,     -GOLDEN2,   SQRT5OVER2 },
1033   {    -SQRT2INV,    -SQRT2INV,    -SQRT2INV,   SQRT5OVER2 },
1034   {     SQRT2INV,    -SQRT2INV,    -SQRT2INV,   SQRT5OVER2 },
1035   {    -SQRT2INV,     SQRT2INV,    -SQRT2INV,   SQRT5OVER2 },
1036   {     SQRT2INV,     SQRT2INV,    -SQRT2INV,   SQRT5OVER2 },
1037   {          0.0,     -GOLDEN2,  -GOLDENINV2,   SQRT5OVER2 },
1038   {          0.0,      GOLDEN2,  -GOLDENINV2,   SQRT5OVER2 },
1039   {     -GOLDEN2,  -GOLDENINV2,          0.0,   SQRT5OVER2 },
1040   {      GOLDEN2,  -GOLDENINV2,          0.0,   SQRT5OVER2 },
1041   {     -GOLDEN2,   GOLDENINV2,          0.0,   SQRT5OVER2 },
1042   {      GOLDEN2,   GOLDENINV2,          0.0,   SQRT5OVER2 },
1043   {          0.0,     -GOLDEN2,   GOLDENINV2,   SQRT5OVER2 },
1044   {          0.0,      GOLDEN2,   GOLDENINV2,   SQRT5OVER2 },
1045   {    -SQRT2INV,    -SQRT2INV,     SQRT2INV,   SQRT5OVER2 },
1046   {     SQRT2INV,    -SQRT2INV,     SQRT2INV,   SQRT5OVER2 },
1047   {    -SQRT2INV,     SQRT2INV,     SQRT2INV,   SQRT5OVER2 },
1048   {     SQRT2INV,     SQRT2INV,     SQRT2INV,   SQRT5OVER2 },
1049   {  -GOLDENINV2,          0.0,      GOLDEN2,   SQRT5OVER2 },
1050   {   GOLDENINV2,          0.0,      GOLDEN2,   SQRT5OVER2 },
1051   { -GOLDENINV22,          0.0,    -SQRT2INV,     GOLDEN22 },
1052   {  GOLDENINV22,          0.0,    -SQRT2INV,     GOLDEN22 },
1053   {  -GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2,     GOLDEN22 },
1054   {   GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2,     GOLDEN22 },
1055   {  -GOLDENINV2,   GOLDENINV2,  -GOLDENINV2,     GOLDEN22 },
1056   {   GOLDENINV2,   GOLDENINV2,  -GOLDENINV2,     GOLDEN22 },
1057   {          0.0,    -SQRT2INV, -GOLDENINV22,     GOLDEN22 },
1058   {          0.0,     SQRT2INV, -GOLDENINV22,     GOLDEN22 },
1059   {    -SQRT2INV, -GOLDENINV22,          0.0,     GOLDEN22 },
1060   {     SQRT2INV, -GOLDENINV22,          0.0,     GOLDEN22 },
1061   {    -SQRT2INV,  GOLDENINV22,          0.0,     GOLDEN22 },
1062   {     SQRT2INV,  GOLDENINV22,          0.0,     GOLDEN22 },
1063   {          0.0,    -SQRT2INV,  GOLDENINV22,     GOLDEN22 },
1064   {          0.0,     SQRT2INV,  GOLDENINV22,     GOLDEN22 },
1065   {  -GOLDENINV2,  -GOLDENINV2,   GOLDENINV2,     GOLDEN22 },
1066   {   GOLDENINV2,  -GOLDENINV2,   GOLDENINV2,     GOLDEN22 },
1067   {  -GOLDENINV2,   GOLDENINV2,   GOLDENINV2,     GOLDEN22 },
1068   {   GOLDENINV2,   GOLDENINV2,   GOLDENINV2,     GOLDEN22 },
1069   { -GOLDENINV22,          0.0,     SQRT2INV,     GOLDEN22 },
1070   {  GOLDENINV22,          0.0,     SQRT2INV,     GOLDEN22 }
1071 };
1072
1073 static const int edge_120[NUM_EDGE_120][2] = {
1074   {   0,   1 }, {   0,   2 }, {   0,   4 }, {   0,  20 }, {   1,   3 },
1075   {   1,   5 }, {   1,  21 }, {   2,   6 }, {   2,   8 }, {   2,  22 },
1076   {   3,   6 }, {   3,   9 }, {   3,  23 }, {   4,   7 }, {   4,  10 },
1077   {   4,  24 }, {   5,   7 }, {   5,  11 }, {   5,  25 }, {   6,  12 },
1078   {   6,  26 }, {   7,  13 }, {   7,  27 }, {   8,  10 }, {   8,  14 },
1079   {   8,  28 }, {   9,  11 }, {   9,  15 }, {   9,  29 }, {  10,  16 },
1080   {  10,  30 }, {  11,  17 }, {  11,  31 }, {  12,  14 }, {  12,  15 },
1081   {  12,  32 }, {  13,  16 }, {  13,  17 }, {  13,  33 }, {  14,  18 },
1082   {  14,  34 }, {  15,  19 }, {  15,  35 }, {  16,  18 }, {  16,  36 },
1083   {  17,  19 }, {  17,  37 }, {  18,  19 }, {  18,  38 }, {  19,  39 },
1084   {  20,  40 }, {  20,  41 }, {  20,  43 }, {  21,  40 }, {  21,  42 },
1085   {  21,  44 }, {  22,  41 }, {  22,  45 }, {  22,  49 }, {  23,  42 },
1086   {  23,  46 }, {  23,  50 }, {  24,  43 }, {  24,  47 }, {  24,  51 },
1087   {  25,  44 }, {  25,  48 }, {  25,  52 }, {  26,  45 }, {  26,  46 },
1088   {  26,  53 }, {  27,  47 }, {  27,  48 }, {  27,  56 }, {  28,  49 },
1089   {  28,  54 }, {  28,  57 }, {  29,  50 }, {  29,  55 }, {  29,  58 },
1090   {  30,  51 }, {  30,  54 }, {  30,  59 }, {  31,  52 }, {  31,  55 },
1091   {  31,  60 }, {  32,  53 }, {  32,  61 }, {  32,  62 }, {  33,  56 },
1092   {  33,  63 }, {  33,  64 }, {  34,  57 }, {  34,  61 }, {  34,  65 },
1093   {  35,  58 }, {  35,  62 }, {  35,  66 }, {  36,  59 }, {  36,  63 },
1094   {  36,  67 }, {  37,  60 }, {  37,  64 }, {  37,  68 }, {  38,  65 },
1095   {  38,  67 }, {  38,  69 }, {  39,  66 }, {  39,  68 }, {  39,  69 },
1096   {  40,  70 }, {  40,  71 }, {  41,  72 }, {  41,  78 }, {  42,  73 },
1097   {  42,  79 }, {  43,  74 }, {  43,  80 }, {  44,  75 }, {  44,  81 },
1098   {  45,  76 }, {  45,  88 }, {  46,  77 }, {  46,  89 }, {  47,  82 },
1099   {  47,  92 }, {  48,  83 }, {  48,  93 }, {  49,  84 }, {  49,  94 },
1100   {  50,  85 }, {  50,  95 }, {  51,  86 }, {  51,  96 }, {  52,  87 },
1101   {  52,  97 }, {  53,  98 }, {  53,  99 }, {  54,  90 }, {  54, 108 },
1102   {  55,  91 }, {  55, 109 }, {  56, 100 }, {  56, 101 }, {  57, 102 },
1103   {  57, 112 }, {  58, 103 }, {  58, 113 }, {  59, 104 }, {  59, 114 },
1104   {  60, 105 }, {  60, 115 }, {  61, 106 }, {  61, 116 }, {  62, 107 },
1105   {  62, 117 }, {  63, 110 }, {  63, 122 }, {  64, 111 }, {  64, 123 },
1106   {  65, 118 }, {  65, 124 }, {  66, 119 }, {  66, 125 }, {  67, 120 },
1107   {  67, 126 }, {  68, 121 }, {  68, 127 }, {  69, 128 }, {  69, 129 },
1108   {  70,  72 }, {  70,  73 }, {  70, 130 }, {  71,  74 }, {  71,  75 },
1109   {  71, 131 }, {  72,  76 }, {  72, 132 }, {  73,  77 }, {  73, 133 },
1110   {  74,  82 }, {  74, 134 }, {  75,  83 }, {  75, 135 }, {  76,  77 },
1111   {  76, 140 }, {  77, 141 }, {  78,  80 }, {  78,  84 }, {  78, 136 },
1112   {  79,  81 }, {  79,  85 }, {  79, 137 }, {  80,  86 }, {  80, 138 },
1113   {  81,  87 }, {  81, 139 }, {  82,  83 }, {  82, 142 }, {  83, 143 },
1114   {  84,  90 }, {  84, 146 }, {  85,  91 }, {  85, 147 }, {  86,  90 },
1115   {  86, 148 }, {  87,  91 }, {  87, 149 }, {  88,  94 }, {  88,  98 },
1116   {  88, 144 }, {  89,  95 }, {  89,  99 }, {  89, 145 }, {  90, 156 },
1117   {  91, 157 }, {  92,  96 }, {  92, 100 }, {  92, 150 }, {  93,  97 },
1118   {  93, 101 }, {  93, 151 }, {  94, 102 }, {  94, 152 }, {  95, 103 },
1119   {  95, 153 }, {  96, 104 }, {  96, 154 }, {  97, 105 }, {  97, 155 },
1120   {  98, 106 }, {  98, 158 }, {  99, 107 }, {  99, 159 }, { 100, 110 },
1121   { 100, 160 }, { 101, 111 }, { 101, 161 }, { 102, 106 }, { 102, 164 },
1122   { 103, 107 }, { 103, 165 }, { 104, 110 }, { 104, 166 }, { 105, 111 },
1123   { 105, 167 }, { 106, 168 }, { 107, 169 }, { 108, 112 }, { 108, 114 },
1124   { 108, 162 }, { 109, 113 }, { 109, 115 }, { 109, 163 }, { 110, 174 },
1125   { 111, 175 }, { 112, 118 }, { 112, 170 }, { 113, 119 }, { 113, 171 },
1126   { 114, 120 }, { 114, 172 }, { 115, 121 }, { 115, 173 }, { 116, 117 },
1127   { 116, 124 }, { 116, 176 }, { 117, 125 }, { 117, 177 }, { 118, 120 },
1128   { 118, 180 }, { 119, 121 }, { 119, 181 }, { 120, 182 }, { 121, 183 },
1129   { 122, 123 }, { 122, 126 }, { 122, 178 }, { 123, 127 }, { 123, 179 },
1130   { 124, 128 }, { 124, 184 }, { 125, 128 }, { 125, 185 }, { 126, 129 },
1131   { 126, 186 }, { 127, 129 }, { 127, 187 }, { 128, 188 }, { 129, 189 },
1132   { 130, 131 }, { 130, 190 }, { 130, 191 }, { 131, 192 }, { 131, 193 },
1133   { 132, 136 }, { 132, 190 }, { 132, 196 }, { 133, 137 }, { 133, 191 },
1134   { 133, 197 }, { 134, 138 }, { 134, 192 }, { 134, 198 }, { 135, 139 },
1135   { 135, 193 }, { 135, 199 }, { 136, 194 }, { 136, 201 }, { 137, 195 },
1136   { 137, 202 }, { 138, 194 }, { 138, 203 }, { 139, 195 }, { 139, 204 },
1137   { 140, 144 }, { 140, 196 }, { 140, 200 }, { 141, 145 }, { 141, 197 },
1138   { 141, 200 }, { 142, 150 }, { 142, 198 }, { 142, 205 }, { 143, 151 },
1139   { 143, 199 }, { 143, 205 }, { 144, 206 }, { 144, 210 }, { 145, 207 },
1140   { 145, 211 }, { 146, 152 }, { 146, 201 }, { 146, 212 }, { 147, 153 },
1141   { 147, 202 }, { 147, 213 }, { 148, 154 }, { 148, 203 }, { 148, 214 },
1142   { 149, 155 }, { 149, 204 }, { 149, 215 }, { 150, 208 }, { 150, 216 },
1143   { 151, 209 }, { 151, 217 }, { 152, 206 }, { 152, 218 }, { 153, 207 },
1144   { 153, 219 }, { 154, 208 }, { 154, 220 }, { 155, 209 }, { 155, 221 },
1145   { 156, 162 }, { 156, 212 }, { 156, 214 }, { 157, 163 }, { 157, 213 },
1146   { 157, 215 }, { 158, 159 }, { 158, 210 }, { 158, 222 }, { 159, 211 },
1147   { 159, 223 }, { 160, 161 }, { 160, 216 }, { 160, 228 }, { 161, 217 },
1148   { 161, 229 }, { 162, 224 }, { 162, 226 }, { 163, 225 }, { 163, 227 },
1149   { 164, 170 }, { 164, 218 }, { 164, 230 }, { 165, 171 }, { 165, 219 },
1150   { 165, 231 }, { 166, 172 }, { 166, 220 }, { 166, 232 }, { 167, 173 },
1151   { 167, 221 }, { 167, 233 }, { 168, 176 }, { 168, 222 }, { 168, 230 },
1152   { 169, 177 }, { 169, 223 }, { 169, 231 }, { 170, 224 }, { 170, 235 },
1153   { 171, 225 }, { 171, 236 }, { 172, 226 }, { 172, 237 }, { 173, 227 },
1154   { 173, 238 }, { 174, 178 }, { 174, 228 }, { 174, 232 }, { 175, 179 },
1155   { 175, 229 }, { 175, 233 }, { 176, 234 }, { 176, 240 }, { 177, 234 },
1156   { 177, 241 }, { 178, 239 }, { 178, 242 }, { 179, 239 }, { 179, 243 },
1157   { 180, 184 }, { 180, 235 }, { 180, 244 }, { 181, 185 }, { 181, 236 },
1158   { 181, 245 }, { 182, 186 }, { 182, 237 }, { 182, 244 }, { 183, 187 },
1159   { 183, 238 }, { 183, 245 }, { 184, 240 }, { 184, 246 }, { 185, 241 },
1160   { 185, 247 }, { 186, 242 }, { 186, 248 }, { 187, 243 }, { 187, 249 },
1161   { 188, 189 }, { 188, 246 }, { 188, 247 }, { 189, 248 }, { 189, 249 },
1162   { 190, 250 }, { 190, 270 }, { 191, 251 }, { 191, 271 }, { 192, 250 },
1163   { 192, 272 }, { 193, 251 }, { 193, 273 }, { 194, 250 }, { 194, 279 },
1164   { 195, 251 }, { 195, 280 }, { 196, 252 }, { 196, 274 }, { 197, 253 },
1165   { 197, 275 }, { 198, 254 }, { 198, 276 }, { 199, 255 }, { 199, 277 },
1166   { 200, 256 }, { 200, 278 }, { 201, 252 }, { 201, 282 }, { 202, 253 },
1167   { 202, 283 }, { 203, 254 }, { 203, 284 }, { 204, 255 }, { 204, 285 },
1168   { 205, 257 }, { 205, 281 }, { 206, 252 }, { 206, 290 }, { 207, 253 },
1169   { 207, 291 }, { 208, 254 }, { 208, 292 }, { 209, 255 }, { 209, 293 },
1170   { 210, 256 }, { 210, 294 }, { 211, 256 }, { 211, 295 }, { 212, 258 },
1171   { 212, 286 }, { 213, 259 }, { 213, 287 }, { 214, 260 }, { 214, 288 },
1172   { 215, 261 }, { 215, 289 }, { 216, 257 }, { 216, 296 }, { 217, 257 },
1173   { 217, 297 }, { 218, 258 }, { 218, 298 }, { 219, 259 }, { 219, 299 },
1174   { 220, 260 }, { 220, 300 }, { 221, 261 }, { 221, 301 }, { 222, 262 },
1175   { 222, 302 }, { 223, 262 }, { 223, 303 }, { 224, 258 }, { 224, 310 },
1176   { 225, 259 }, { 225, 311 }, { 226, 260 }, { 226, 312 }, { 227, 261 },
1177   { 227, 313 }, { 228, 263 }, { 228, 304 }, { 229, 263 }, { 229, 305 },
1178   { 230, 264 }, { 230, 306 }, { 231, 265 }, { 231, 307 }, { 232, 266 },
1179   { 232, 308 }, { 233, 267 }, { 233, 309 }, { 234, 262 }, { 234, 318 },
1180   { 235, 264 }, { 235, 314 }, { 236, 265 }, { 236, 315 }, { 237, 266 },
1181   { 237, 316 }, { 238, 267 }, { 238, 317 }, { 239, 263 }, { 239, 321 },
1182   { 240, 264 }, { 240, 322 }, { 241, 265 }, { 241, 323 }, { 242, 266 },
1183   { 242, 324 }, { 243, 267 }, { 243, 325 }, { 244, 268 }, { 244, 319 },
1184   { 245, 269 }, { 245, 320 }, { 246, 268 }, { 246, 326 }, { 247, 269 },
1185   { 247, 327 }, { 248, 268 }, { 248, 328 }, { 249, 269 }, { 249, 329 },
1186   { 250, 330 }, { 251, 331 }, { 252, 332 }, { 253, 333 }, { 254, 334 },
1187   { 255, 335 }, { 256, 336 }, { 257, 337 }, { 258, 338 }, { 259, 339 },
1188   { 260, 340 }, { 261, 341 }, { 262, 342 }, { 263, 343 }, { 264, 344 },
1189   { 265, 345 }, { 266, 346 }, { 267, 347 }, { 268, 348 }, { 269, 349 },
1190   { 270, 271 }, { 270, 274 }, { 270, 350 }, { 271, 275 }, { 271, 351 },
1191   { 272, 273 }, { 272, 276 }, { 272, 352 }, { 273, 277 }, { 273, 353 },
1192   { 274, 278 }, { 274, 356 }, { 275, 278 }, { 275, 357 }, { 276, 281 },
1193   { 276, 358 }, { 277, 281 }, { 277, 359 }, { 278, 360 }, { 279, 282 },
1194   { 279, 284 }, { 279, 354 }, { 280, 283 }, { 280, 285 }, { 280, 355 },
1195   { 281, 365 }, { 282, 286 }, { 282, 361 }, { 283, 287 }, { 283, 362 },
1196   { 284, 288 }, { 284, 363 }, { 285, 289 }, { 285, 364 }, { 286, 288 },
1197   { 286, 372 }, { 287, 289 }, { 287, 373 }, { 288, 374 }, { 289, 375 },
1198   { 290, 294 }, { 290, 298 }, { 290, 366 }, { 291, 295 }, { 291, 299 },
1199   { 291, 367 }, { 292, 296 }, { 292, 300 }, { 292, 368 }, { 293, 297 },
1200   { 293, 301 }, { 293, 369 }, { 294, 302 }, { 294, 370 }, { 295, 303 },
1201   { 295, 371 }, { 296, 304 }, { 296, 376 }, { 297, 305 }, { 297, 377 },
1202   { 298, 306 }, { 298, 378 }, { 299, 307 }, { 299, 379 }, { 300, 308 },
1203   { 300, 380 }, { 301, 309 }, { 301, 381 }, { 302, 306 }, { 302, 382 },
1204   { 303, 307 }, { 303, 383 }, { 304, 308 }, { 304, 388 }, { 305, 309 },
1205   { 305, 389 }, { 306, 390 }, { 307, 391 }, { 308, 392 }, { 309, 393 },
1206   { 310, 312 }, { 310, 314 }, { 310, 384 }, { 311, 313 }, { 311, 315 },
1207   { 311, 385 }, { 312, 316 }, { 312, 386 }, { 313, 317 }, { 313, 387 },
1208   { 314, 319 }, { 314, 395 }, { 315, 320 }, { 315, 396 }, { 316, 319 },
1209   { 316, 397 }, { 317, 320 }, { 317, 398 }, { 318, 322 }, { 318, 323 },
1210   { 318, 394 }, { 319, 404 }, { 320, 405 }, { 321, 324 }, { 321, 325 },
1211   { 321, 399 }, { 322, 326 }, { 322, 400 }, { 323, 327 }, { 323, 401 },
1212   { 324, 328 }, { 324, 402 }, { 325, 329 }, { 325, 403 }, { 326, 327 },
1213   { 326, 406 }, { 327, 407 }, { 328, 329 }, { 328, 408 }, { 329, 409 },
1214   { 330, 350 }, { 330, 352 }, { 330, 354 }, { 331, 351 }, { 331, 353 },
1215   { 331, 355 }, { 332, 356 }, { 332, 361 }, { 332, 366 }, { 333, 357 },
1216   { 333, 362 }, { 333, 367 }, { 334, 358 }, { 334, 363 }, { 334, 368 },
1217   { 335, 359 }, { 335, 364 }, { 335, 369 }, { 336, 360 }, { 336, 370 },
1218   { 336, 371 }, { 337, 365 }, { 337, 376 }, { 337, 377 }, { 338, 372 },
1219   { 338, 378 }, { 338, 384 }, { 339, 373 }, { 339, 379 }, { 339, 385 },
1220   { 340, 374 }, { 340, 380 }, { 340, 386 }, { 341, 375 }, { 341, 381 },
1221   { 341, 387 }, { 342, 382 }, { 342, 383 }, { 342, 394 }, { 343, 388 },
1222   { 343, 389 }, { 343, 399 }, { 344, 390 }, { 344, 395 }, { 344, 400 },
1223   { 345, 391 }, { 345, 396 }, { 345, 401 }, { 346, 392 }, { 346, 397 },
1224   { 346, 402 }, { 347, 393 }, { 347, 398 }, { 347, 403 }, { 348, 404 },
1225   { 348, 406 }, { 348, 408 }, { 349, 405 }, { 349, 407 }, { 349, 409 },
1226   { 350, 410 }, { 350, 412 }, { 351, 410 }, { 351, 413 }, { 352, 411 },
1227   { 352, 414 }, { 353, 411 }, { 353, 415 }, { 354, 416 }, { 354, 418 },
1228   { 355, 417 }, { 355, 419 }, { 356, 412 }, { 356, 420 }, { 357, 413 },
1229   { 357, 421 }, { 358, 414 }, { 358, 422 }, { 359, 415 }, { 359, 423 },
1230   { 360, 420 }, { 360, 421 }, { 361, 416 }, { 361, 426 }, { 362, 417 },
1231   { 362, 427 }, { 363, 418 }, { 363, 428 }, { 364, 419 }, { 364, 429 },
1232   { 365, 422 }, { 365, 423 }, { 366, 424 }, { 366, 432 }, { 367, 425 },
1233   { 367, 433 }, { 368, 430 }, { 368, 434 }, { 369, 431 }, { 369, 435 },
1234   { 370, 424 }, { 370, 438 }, { 371, 425 }, { 371, 439 }, { 372, 426 },
1235   { 372, 436 }, { 373, 427 }, { 373, 437 }, { 374, 428 }, { 374, 436 },
1236   { 375, 429 }, { 375, 437 }, { 376, 430 }, { 376, 440 }, { 377, 431 },
1237   { 377, 441 }, { 378, 432 }, { 378, 444 }, { 379, 433 }, { 379, 445 },
1238   { 380, 434 }, { 380, 446 }, { 381, 435 }, { 381, 447 }, { 382, 438 },
1239   { 382, 448 }, { 383, 439 }, { 383, 449 }, { 384, 442 }, { 384, 450 },
1240   { 385, 443 }, { 385, 451 }, { 386, 442 }, { 386, 452 }, { 387, 443 },
1241   { 387, 453 }, { 388, 440 }, { 388, 454 }, { 389, 441 }, { 389, 455 },
1242   { 390, 444 }, { 390, 448 }, { 391, 445 }, { 391, 449 }, { 392, 446 },
1243   { 392, 454 }, { 393, 447 }, { 393, 455 }, { 394, 456 }, { 394, 457 },
1244   { 395, 450 }, { 395, 460 }, { 396, 451 }, { 396, 461 }, { 397, 452 },
1245   { 397, 462 }, { 398, 453 }, { 398, 463 }, { 399, 458 }, { 399, 459 },
1246   { 400, 456 }, { 400, 464 }, { 401, 457 }, { 401, 465 }, { 402, 458 },
1247   { 402, 466 }, { 403, 459 }, { 403, 467 }, { 404, 460 }, { 404, 462 },
1248   { 405, 461 }, { 405, 463 }, { 406, 464 }, { 406, 468 }, { 407, 465 },
1249   { 407, 468 }, { 408, 466 }, { 408, 469 }, { 409, 467 }, { 409, 469 },
1250   { 410, 411 }, { 410, 470 }, { 411, 471 }, { 412, 416 }, { 412, 472 },
1251   { 413, 417 }, { 413, 473 }, { 414, 418 }, { 414, 474 }, { 415, 419 },
1252   { 415, 475 }, { 416, 478 }, { 417, 479 }, { 418, 480 }, { 419, 481 },
1253   { 420, 424 }, { 420, 476 }, { 421, 425 }, { 421, 477 }, { 422, 430 },
1254   { 422, 482 }, { 423, 431 }, { 423, 483 }, { 424, 488 }, { 425, 489 },
1255   { 426, 432 }, { 426, 484 }, { 427, 433 }, { 427, 485 }, { 428, 434 },
1256   { 428, 486 }, { 429, 435 }, { 429, 487 }, { 430, 492 }, { 431, 493 },
1257   { 432, 494 }, { 433, 495 }, { 434, 496 }, { 435, 497 }, { 436, 442 },
1258   { 436, 490 }, { 437, 443 }, { 437, 491 }, { 438, 439 }, { 438, 498 },
1259   { 439, 499 }, { 440, 441 }, { 440, 500 }, { 441, 501 }, { 442, 508 },
1260   { 443, 509 }, { 444, 450 }, { 444, 502 }, { 445, 451 }, { 445, 503 },
1261   { 446, 452 }, { 446, 504 }, { 447, 453 }, { 447, 505 }, { 448, 456 },
1262   { 448, 506 }, { 449, 457 }, { 449, 507 }, { 450, 512 }, { 451, 513 },
1263   { 452, 514 }, { 453, 515 }, { 454, 458 }, { 454, 510 }, { 455, 459 },
1264   { 455, 511 }, { 456, 516 }, { 457, 517 }, { 458, 522 }, { 459, 523 },
1265   { 460, 464 }, { 460, 518 }, { 461, 465 }, { 461, 519 }, { 462, 466 },
1266   { 462, 520 }, { 463, 467 }, { 463, 521 }, { 464, 524 }, { 465, 525 },
1267   { 466, 526 }, { 467, 527 }, { 468, 469 }, { 468, 528 }, { 469, 529 },
1268   { 470, 472 }, { 470, 473 }, { 470, 530 }, { 471, 474 }, { 471, 475 },
1269   { 471, 530 }, { 472, 476 }, { 472, 531 }, { 473, 477 }, { 473, 532 },
1270   { 474, 482 }, { 474, 533 }, { 475, 483 }, { 475, 534 }, { 476, 477 },
1271   { 476, 535 }, { 477, 536 }, { 478, 480 }, { 478, 484 }, { 478, 531 },
1272   { 479, 481 }, { 479, 485 }, { 479, 532 }, { 480, 486 }, { 480, 533 },
1273   { 481, 487 }, { 481, 534 }, { 482, 483 }, { 482, 537 }, { 483, 538 },
1274   { 484, 490 }, { 484, 539 }, { 485, 491 }, { 485, 540 }, { 486, 490 },
1275   { 486, 541 }, { 487, 491 }, { 487, 542 }, { 488, 494 }, { 488, 498 },
1276   { 488, 535 }, { 489, 495 }, { 489, 499 }, { 489, 536 }, { 490, 544 },
1277   { 491, 545 }, { 492, 496 }, { 492, 500 }, { 492, 537 }, { 493, 497 },
1278   { 493, 501 }, { 493, 538 }, { 494, 502 }, { 494, 539 }, { 495, 503 },
1279   { 495, 540 }, { 496, 504 }, { 496, 541 }, { 497, 505 }, { 497, 542 },
1280   { 498, 506 }, { 498, 543 }, { 499, 507 }, { 499, 543 }, { 500, 510 },
1281   { 500, 546 }, { 501, 511 }, { 501, 546 }, { 502, 506 }, { 502, 547 },
1282   { 503, 507 }, { 503, 548 }, { 504, 510 }, { 504, 549 }, { 505, 511 },
1283   { 505, 550 }, { 506, 551 }, { 507, 552 }, { 508, 512 }, { 508, 514 },
1284   { 508, 544 }, { 509, 513 }, { 509, 515 }, { 509, 545 }, { 510, 553 },
1285   { 511, 554 }, { 512, 518 }, { 512, 547 }, { 513, 519 }, { 513, 548 },
1286   { 514, 520 }, { 514, 549 }, { 515, 521 }, { 515, 550 }, { 516, 517 },
1287   { 516, 524 }, { 516, 551 }, { 517, 525 }, { 517, 552 }, { 518, 520 },
1288   { 518, 555 }, { 519, 521 }, { 519, 556 }, { 520, 557 }, { 521, 558 },
1289   { 522, 523 }, { 522, 526 }, { 522, 553 }, { 523, 527 }, { 523, 554 },
1290   { 524, 528 }, { 524, 555 }, { 525, 528 }, { 525, 556 }, { 526, 529 },
1291   { 526, 557 }, { 527, 529 }, { 527, 558 }, { 528, 559 }, { 529, 559 },
1292   { 530, 560 }, { 530, 561 }, { 531, 560 }, { 531, 562 }, { 532, 561 },
1293   { 532, 563 }, { 533, 560 }, { 533, 564 }, { 534, 561 }, { 534, 565 },
1294   { 535, 562 }, { 535, 566 }, { 536, 563 }, { 536, 566 }, { 537, 564 },
1295   { 537, 567 }, { 538, 565 }, { 538, 567 }, { 539, 562 }, { 539, 568 },
1296   { 540, 563 }, { 540, 569 }, { 541, 564 }, { 541, 570 }, { 542, 565 },
1297   { 542, 571 }, { 543, 566 }, { 543, 572 }, { 544, 568 }, { 544, 570 },
1298   { 545, 569 }, { 545, 571 }, { 546, 567 }, { 546, 573 }, { 547, 568 },
1299   { 547, 574 }, { 548, 569 }, { 548, 575 }, { 549, 570 }, { 549, 576 },
1300   { 550, 571 }, { 550, 577 }, { 551, 572 }, { 551, 574 }, { 552, 572 },
1301   { 552, 575 }, { 553, 573 }, { 553, 576 }, { 554, 573 }, { 554, 577 },
1302   { 555, 574 }, { 555, 578 }, { 556, 575 }, { 556, 579 }, { 557, 576 },
1303   { 557, 578 }, { 558, 577 }, { 558, 579 }, { 559, 578 }, { 559, 579 },
1304   { 560, 580 }, { 561, 581 }, { 562, 582 }, { 563, 583 }, { 564, 584 },
1305   { 565, 585 }, { 566, 586 }, { 567, 587 }, { 568, 588 }, { 569, 589 },
1306   { 570, 590 }, { 571, 591 }, { 572, 592 }, { 573, 593 }, { 574, 594 },
1307   { 575, 595 }, { 576, 596 }, { 577, 597 }, { 578, 598 }, { 579, 599 },
1308   { 580, 581 }, { 580, 582 }, { 580, 584 }, { 581, 583 }, { 581, 585 },
1309   { 582, 586 }, { 582, 588 }, { 583, 586 }, { 583, 589 }, { 584, 587 },
1310   { 584, 590 }, { 585, 587 }, { 585, 591 }, { 586, 592 }, { 587, 593 },
1311   { 588, 590 }, { 588, 594 }, { 589, 591 }, { 589, 595 }, { 590, 596 },
1312   { 591, 597 }, { 592, 594 }, { 592, 595 }, { 593, 596 }, { 593, 597 },
1313   { 594, 598 }, { 595, 599 }, { 596, 598 }, { 597, 599 }, { 598, 599 }
1314 };
1315
1316 static const int face_120[NUM_FACE_120][VERT_PER_FACE_120] = {
1317   {   0,   1,   3,   6,   2 }, {   0,   1,   5,   7,   4 },
1318   {   0,   1,  21,  40,  20 }, {   0,   2,   8,  10,   4 },
1319   {   0,   2,  22,  41,  20 }, {   0,   4,  24,  43,  20 },
1320   {   1,   3,   9,  11,   5 }, {   1,   3,  23,  42,  21 },
1321   {   1,   5,  25,  44,  21 }, {   2,   6,  12,  14,   8 },
1322   {   2,   6,  26,  45,  22 }, {   2,   8,  28,  49,  22 },
1323   {   3,   6,  12,  15,   9 }, {   3,   6,  26,  46,  23 },
1324   {   3,   9,  29,  50,  23 }, {   4,   7,  13,  16,  10 },
1325   {   4,   7,  27,  47,  24 }, {   4,  10,  30,  51,  24 },
1326   {   5,   7,  13,  17,  11 }, {   5,   7,  27,  48,  25 },
1327   {   5,  11,  31,  52,  25 }, {   6,  12,  32,  53,  26 },
1328   {   7,  13,  33,  56,  27 }, {   8,  10,  16,  18,  14 },
1329   {   8,  10,  30,  54,  28 }, {   8,  14,  34,  57,  28 },
1330   {   9,  11,  17,  19,  15 }, {   9,  11,  31,  55,  29 },
1331   {   9,  15,  35,  58,  29 }, {  10,  16,  36,  59,  30 },
1332   {  11,  17,  37,  60,  31 }, {  12,  14,  18,  19,  15 },
1333   {  12,  14,  34,  61,  32 }, {  12,  15,  35,  62,  32 },
1334   {  13,  16,  18,  19,  17 }, {  13,  16,  36,  63,  33 },
1335   {  13,  17,  37,  64,  33 }, {  14,  18,  38,  65,  34 },
1336   {  15,  19,  39,  66,  35 }, {  16,  18,  38,  67,  36 },
1337   {  17,  19,  39,  68,  37 }, {  18,  19,  39,  69,  38 },
1338   {  20,  40,  70,  72,  41 }, {  20,  40,  71,  74,  43 },
1339   {  20,  41,  78,  80,  43 }, {  21,  40,  70,  73,  42 },
1340   {  21,  40,  71,  75,  44 }, {  21,  42,  79,  81,  44 },
1341   {  22,  41,  72,  76,  45 }, {  22,  41,  78,  84,  49 },
1342   {  22,  45,  88,  94,  49 }, {  23,  42,  73,  77,  46 },
1343   {  23,  42,  79,  85,  50 }, {  23,  46,  89,  95,  50 },
1344   {  24,  43,  74,  82,  47 }, {  24,  43,  80,  86,  51 },
1345   {  24,  47,  92,  96,  51 }, {  25,  44,  75,  83,  48 },
1346   {  25,  44,  81,  87,  52 }, {  25,  48,  93,  97,  52 },
1347   {  26,  45,  76,  77,  46 }, {  26,  45,  88,  98,  53 },
1348   {  26,  46,  89,  99,  53 }, {  27,  47,  82,  83,  48 },
1349   {  27,  47,  92, 100,  56 }, {  27,  48,  93, 101,  56 },
1350   {  28,  49,  84,  90,  54 }, {  28,  49,  94, 102,  57 },
1351   {  28,  54, 108, 112,  57 }, {  29,  50,  85,  91,  55 },
1352   {  29,  50,  95, 103,  58 }, {  29,  55, 109, 113,  58 },
1353   {  30,  51,  86,  90,  54 }, {  30,  51,  96, 104,  59 },
1354   {  30,  54, 108, 114,  59 }, {  31,  52,  87,  91,  55 },
1355   {  31,  52,  97, 105,  60 }, {  31,  55, 109, 115,  60 },
1356   {  32,  53,  98, 106,  61 }, {  32,  53,  99, 107,  62 },
1357   {  32,  61, 116, 117,  62 }, {  33,  56, 100, 110,  63 },
1358   {  33,  56, 101, 111,  64 }, {  33,  63, 122, 123,  64 },
1359   {  34,  57, 102, 106,  61 }, {  34,  57, 112, 118,  65 },
1360   {  34,  61, 116, 124,  65 }, {  35,  58, 103, 107,  62 },
1361   {  35,  58, 113, 119,  66 }, {  35,  62, 117, 125,  66 },
1362   {  36,  59, 104, 110,  63 }, {  36,  59, 114, 120,  67 },
1363   {  36,  63, 122, 126,  67 }, {  37,  60, 105, 111,  64 },
1364   {  37,  60, 115, 121,  68 }, {  37,  64, 123, 127,  68 },
1365   {  38,  65, 118, 120,  67 }, {  38,  65, 124, 128,  69 },
1366   {  38,  67, 126, 129,  69 }, {  39,  66, 119, 121,  68 },
1367   {  39,  66, 125, 128,  69 }, {  39,  68, 127, 129,  69 },
1368   {  40,  70, 130, 131,  71 }, {  41,  72, 132, 136,  78 },
1369   {  42,  73, 133, 137,  79 }, {  43,  74, 134, 138,  80 },
1370   {  44,  75, 135, 139,  81 }, {  45,  76, 140, 144,  88 },
1371   {  46,  77, 141, 145,  89 }, {  47,  82, 142, 150,  92 },
1372   {  48,  83, 143, 151,  93 }, {  49,  84, 146, 152,  94 },
1373   {  50,  85, 147, 153,  95 }, {  51,  86, 148, 154,  96 },
1374   {  52,  87, 149, 155,  97 }, {  53,  98, 158, 159,  99 },
1375   {  54,  90, 156, 162, 108 }, {  55,  91, 157, 163, 109 },
1376   {  56, 100, 160, 161, 101 }, {  57, 102, 164, 170, 112 },
1377   {  58, 103, 165, 171, 113 }, {  59, 104, 166, 172, 114 },
1378   {  60, 105, 167, 173, 115 }, {  61, 106, 168, 176, 116 },
1379   {  62, 107, 169, 177, 117 }, {  63, 110, 174, 178, 122 },
1380   {  64, 111, 175, 179, 123 }, {  65, 118, 180, 184, 124 },
1381   {  66, 119, 181, 185, 125 }, {  67, 120, 182, 186, 126 },
1382   {  68, 121, 183, 187, 127 }, {  69, 128, 188, 189, 129 },
1383   {  70,  72,  76,  77,  73 }, {  70,  72, 132, 190, 130 },
1384   {  70,  73, 133, 191, 130 }, {  71,  74,  82,  83,  75 },
1385   {  71,  74, 134, 192, 131 }, {  71,  75, 135, 193, 131 },
1386   {  72,  76, 140, 196, 132 }, {  73,  77, 141, 197, 133 },
1387   {  74,  82, 142, 198, 134 }, {  75,  83, 143, 199, 135 },
1388   {  76,  77, 141, 200, 140 }, {  78,  80,  86,  90,  84 },
1389   {  78,  80, 138, 194, 136 }, {  78,  84, 146, 201, 136 },
1390   {  79,  81,  87,  91,  85 }, {  79,  81, 139, 195, 137 },
1391   {  79,  85, 147, 202, 137 }, {  80,  86, 148, 203, 138 },
1392   {  81,  87, 149, 204, 139 }, {  82,  83, 143, 205, 142 },
1393   {  84,  90, 156, 212, 146 }, {  85,  91, 157, 213, 147 },
1394   {  86,  90, 156, 214, 148 }, {  87,  91, 157, 215, 149 },
1395   {  88,  94, 102, 106,  98 }, {  88,  94, 152, 206, 144 },
1396   {  88,  98, 158, 210, 144 }, {  89,  95, 103, 107,  99 },
1397   {  89,  95, 153, 207, 145 }, {  89,  99, 159, 211, 145 },
1398   {  92,  96, 104, 110, 100 }, {  92,  96, 154, 208, 150 },
1399   {  92, 100, 160, 216, 150 }, {  93,  97, 105, 111, 101 },
1400   {  93,  97, 155, 209, 151 }, {  93, 101, 161, 217, 151 },
1401   {  94, 102, 164, 218, 152 }, {  95, 103, 165, 219, 153 },
1402   {  96, 104, 166, 220, 154 }, {  97, 105, 167, 221, 155 },
1403   {  98, 106, 168, 222, 158 }, {  99, 107, 169, 223, 159 },
1404   { 100, 110, 174, 228, 160 }, { 101, 111, 175, 229, 161 },
1405   { 102, 106, 168, 230, 164 }, { 103, 107, 169, 231, 165 },
1406   { 104, 110, 174, 232, 166 }, { 105, 111, 175, 233, 167 },
1407   { 108, 112, 118, 120, 114 }, { 108, 112, 170, 224, 162 },
1408   { 108, 114, 172, 226, 162 }, { 109, 113, 119, 121, 115 },
1409   { 109, 113, 171, 225, 163 }, { 109, 115, 173, 227, 163 },
1410   { 112, 118, 180, 235, 170 }, { 113, 119, 181, 236, 171 },
1411   { 114, 120, 182, 237, 172 }, { 115, 121, 183, 238, 173 },
1412   { 116, 117, 125, 128, 124 }, { 116, 117, 177, 234, 176 },
1413   { 116, 124, 184, 240, 176 }, { 117, 125, 185, 241, 177 },
1414   { 118, 120, 182, 244, 180 }, { 119, 121, 183, 245, 181 },
1415   { 122, 123, 127, 129, 126 }, { 122, 123, 179, 239, 178 },
1416   { 122, 126, 186, 242, 178 }, { 123, 127, 187, 243, 179 },
1417   { 124, 128, 188, 246, 184 }, { 125, 128, 188, 247, 185 },
1418   { 126, 129, 189, 248, 186 }, { 127, 129, 189, 249, 187 },
1419   { 130, 131, 192, 250, 190 }, { 130, 131, 193, 251, 191 },
1420   { 130, 190, 270, 271, 191 }, { 131, 192, 272, 273, 193 },
1421   { 132, 136, 194, 250, 190 }, { 132, 136, 201, 252, 196 },
1422   { 132, 190, 270, 274, 196 }, { 133, 137, 195, 251, 191 },
1423   { 133, 137, 202, 253, 197 }, { 133, 191, 271, 275, 197 },
1424   { 134, 138, 194, 250, 192 }, { 134, 138, 203, 254, 198 },
1425   { 134, 192, 272, 276, 198 }, { 135, 139, 195, 251, 193 },
1426   { 135, 139, 204, 255, 199 }, { 135, 193, 273, 277, 199 },
1427   { 136, 194, 279, 282, 201 }, { 137, 195, 280, 283, 202 },
1428   { 138, 194, 279, 284, 203 }, { 139, 195, 280, 285, 204 },
1429   { 140, 144, 206, 252, 196 }, { 140, 144, 210, 256, 200 },
1430   { 140, 196, 274, 278, 200 }, { 141, 145, 207, 253, 197 },
1431   { 141, 145, 211, 256, 200 }, { 141, 197, 275, 278, 200 },
1432   { 142, 150, 208, 254, 198 }, { 142, 150, 216, 257, 205 },
1433   { 142, 198, 276, 281, 205 }, { 143, 151, 209, 255, 199 },
1434   { 143, 151, 217, 257, 205 }, { 143, 199, 277, 281, 205 },
1435   { 144, 206, 290, 294, 210 }, { 145, 207, 291, 295, 211 },
1436   { 146, 152, 206, 252, 201 }, { 146, 152, 218, 258, 212 },
1437   { 146, 201, 282, 286, 212 }, { 147, 153, 207, 253, 202 },
1438   { 147, 153, 219, 259, 213 }, { 147, 202, 283, 287, 213 },
1439   { 148, 154, 208, 254, 203 }, { 148, 154, 220, 260, 214 },
1440   { 148, 203, 284, 288, 214 }, { 149, 155, 209, 255, 204 },
1441   { 149, 155, 221, 261, 215 }, { 149, 204, 285, 289, 215 },
1442   { 150, 208, 292, 296, 216 }, { 151, 209, 293, 297, 217 },
1443   { 152, 206, 290, 298, 218 }, { 153, 207, 291, 299, 219 },
1444   { 154, 208, 292, 300, 220 }, { 155, 209, 293, 301, 221 },
1445   { 156, 162, 224, 258, 212 }, { 156, 162, 226, 260, 214 },
1446   { 156, 212, 286, 288, 214 }, { 157, 163, 225, 259, 213 },
1447   { 157, 163, 227, 261, 215 }, { 157, 213, 287, 289, 215 },
1448   { 158, 159, 211, 256, 210 }, { 158, 159, 223, 262, 222 },
1449   { 158, 210, 294, 302, 222 }, { 159, 211, 295, 303, 223 },
1450   { 160, 161, 217, 257, 216 }, { 160, 161, 229, 263, 228 },
1451   { 160, 216, 296, 304, 228 }, { 161, 217, 297, 305, 229 },
1452   { 162, 224, 310, 312, 226 }, { 163, 225, 311, 313, 227 },
1453   { 164, 170, 224, 258, 218 }, { 164, 170, 235, 264, 230 },
1454   { 164, 218, 298, 306, 230 }, { 165, 171, 225, 259, 219 },
1455   { 165, 171, 236, 265, 231 }, { 165, 219, 299, 307, 231 },
1456   { 166, 172, 226, 260, 220 }, { 166, 172, 237, 266, 232 },
1457   { 166, 220, 300, 308, 232 }, { 167, 173, 227, 261, 221 },
1458   { 167, 173, 238, 267, 233 }, { 167, 221, 301, 309, 233 },
1459   { 168, 176, 234, 262, 222 }, { 168, 176, 240, 264, 230 },
1460   { 168, 222, 302, 306, 230 }, { 169, 177, 234, 262, 223 },
1461   { 169, 177, 241, 265, 231 }, { 169, 223, 303, 307, 231 },
1462   { 170, 224, 310, 314, 235 }, { 171, 225, 311, 315, 236 },
1463   { 172, 226, 312, 316, 237 }, { 173, 227, 313, 317, 238 },
1464   { 174, 178, 239, 263, 228 }, { 174, 178, 242, 266, 232 },
1465   { 174, 228, 304, 308, 232 }, { 175, 179, 239, 263, 229 },
1466   { 175, 179, 243, 267, 233 }, { 175, 229, 305, 309, 233 },
1467   { 176, 234, 318, 322, 240 }, { 177, 234, 318, 323, 241 },
1468   { 178, 239, 321, 324, 242 }, { 179, 239, 321, 325, 243 },
1469   { 180, 184, 240, 264, 235 }, { 180, 184, 246, 268, 244 },
1470   { 180, 235, 314, 319, 244 }, { 181, 185, 241, 265, 236 },
1471   { 181, 185, 247, 269, 245 }, { 181, 236, 315, 320, 245 },
1472   { 182, 186, 242, 266, 237 }, { 182, 186, 248, 268, 244 },
1473   { 182, 237, 316, 319, 244 }, { 183, 187, 243, 267, 238 },
1474   { 183, 187, 249, 269, 245 }, { 183, 238, 317, 320, 245 },
1475   { 184, 240, 322, 326, 246 }, { 185, 241, 323, 327, 247 },
1476   { 186, 242, 324, 328, 248 }, { 187, 243, 325, 329, 249 },
1477   { 188, 189, 248, 268, 246 }, { 188, 189, 249, 269, 247 },
1478   { 188, 246, 326, 327, 247 }, { 189, 248, 328, 329, 249 },
1479   { 190, 250, 330, 350, 270 }, { 191, 251, 331, 351, 271 },
1480   { 192, 250, 330, 352, 272 }, { 193, 251, 331, 353, 273 },
1481   { 194, 250, 330, 354, 279 }, { 195, 251, 331, 355, 280 },
1482   { 196, 252, 332, 356, 274 }, { 197, 253, 333, 357, 275 },
1483   { 198, 254, 334, 358, 276 }, { 199, 255, 335, 359, 277 },
1484   { 200, 256, 336, 360, 278 }, { 201, 252, 332, 361, 282 },
1485   { 202, 253, 333, 362, 283 }, { 203, 254, 334, 363, 284 },
1486   { 204, 255, 335, 364, 285 }, { 205, 257, 337, 365, 281 },
1487   { 206, 252, 332, 366, 290 }, { 207, 253, 333, 367, 291 },
1488   { 208, 254, 334, 368, 292 }, { 209, 255, 335, 369, 293 },
1489   { 210, 256, 336, 370, 294 }, { 211, 256, 336, 371, 295 },
1490   { 212, 258, 338, 372, 286 }, { 213, 259, 339, 373, 287 },
1491   { 214, 260, 340, 374, 288 }, { 215, 261, 341, 375, 289 },
1492   { 216, 257, 337, 376, 296 }, { 217, 257, 337, 377, 297 },
1493   { 218, 258, 338, 378, 298 }, { 219, 259, 339, 379, 299 },
1494   { 220, 260, 340, 380, 300 }, { 221, 261, 341, 381, 301 },
1495   { 222, 262, 342, 382, 302 }, { 223, 262, 342, 383, 303 },
1496   { 224, 258, 338, 384, 310 }, { 225, 259, 339, 385, 311 },
1497   { 226, 260, 340, 386, 312 }, { 227, 261, 341, 387, 313 },
1498   { 228, 263, 343, 388, 304 }, { 229, 263, 343, 389, 305 },
1499   { 230, 264, 344, 390, 306 }, { 231, 265, 345, 391, 307 },
1500   { 232, 266, 346, 392, 308 }, { 233, 267, 347, 393, 309 },
1501   { 234, 262, 342, 394, 318 }, { 235, 264, 344, 395, 314 },
1502   { 236, 265, 345, 396, 315 }, { 237, 266, 346, 397, 316 },
1503   { 238, 267, 347, 398, 317 }, { 239, 263, 343, 399, 321 },
1504   { 240, 264, 344, 400, 322 }, { 241, 265, 345, 401, 323 },
1505   { 242, 266, 346, 402, 324 }, { 243, 267, 347, 403, 325 },
1506   { 244, 268, 348, 404, 319 }, { 245, 269, 349, 405, 320 },
1507   { 246, 268, 348, 406, 326 }, { 247, 269, 349, 407, 327 },
1508   { 248, 268, 348, 408, 328 }, { 249, 269, 349, 409, 329 },
1509   { 270, 271, 275, 278, 274 }, { 270, 271, 351, 410, 350 },
1510   { 270, 274, 356, 412, 350 }, { 271, 275, 357, 413, 351 },
1511   { 272, 273, 277, 281, 276 }, { 272, 273, 353, 411, 352 },
1512   { 272, 276, 358, 414, 352 }, { 273, 277, 359, 415, 353 },
1513   { 274, 278, 360, 420, 356 }, { 275, 278, 360, 421, 357 },
1514   { 276, 281, 365, 422, 358 }, { 277, 281, 365, 423, 359 },
1515   { 279, 282, 286, 288, 284 }, { 279, 282, 361, 416, 354 },
1516   { 279, 284, 363, 418, 354 }, { 280, 283, 287, 289, 285 },
1517   { 280, 283, 362, 417, 355 }, { 280, 285, 364, 419, 355 },
1518   { 282, 286, 372, 426, 361 }, { 283, 287, 373, 427, 362 },
1519   { 284, 288, 374, 428, 363 }, { 285, 289, 375, 429, 364 },
1520   { 286, 288, 374, 436, 372 }, { 287, 289, 375, 437, 373 },
1521   { 290, 294, 302, 306, 298 }, { 290, 294, 370, 424, 366 },
1522   { 290, 298, 378, 432, 366 }, { 291, 295, 303, 307, 299 },
1523   { 291, 295, 371, 425, 367 }, { 291, 299, 379, 433, 367 },
1524   { 292, 296, 304, 308, 300 }, { 292, 296, 376, 430, 368 },
1525   { 292, 300, 380, 434, 368 }, { 293, 297, 305, 309, 301 },
1526   { 293, 297, 377, 431, 369 }, { 293, 301, 381, 435, 369 },
1527   { 294, 302, 382, 438, 370 }, { 295, 303, 383, 439, 371 },
1528   { 296, 304, 388, 440, 376 }, { 297, 305, 389, 441, 377 },
1529   { 298, 306, 390, 444, 378 }, { 299, 307, 391, 445, 379 },
1530   { 300, 308, 392, 446, 380 }, { 301, 309, 393, 447, 381 },
1531   { 302, 306, 390, 448, 382 }, { 303, 307, 391, 449, 383 },
1532   { 304, 308, 392, 454, 388 }, { 305, 309, 393, 455, 389 },
1533   { 310, 312, 316, 319, 314 }, { 310, 312, 386, 442, 384 },
1534   { 310, 314, 395, 450, 384 }, { 311, 313, 317, 320, 315 },
1535   { 311, 313, 387, 443, 385 }, { 311, 315, 396, 451, 385 },
1536   { 312, 316, 397, 452, 386 }, { 313, 317, 398, 453, 387 },
1537   { 314, 319, 404, 460, 395 }, { 315, 320, 405, 461, 396 },
1538   { 316, 319, 404, 462, 397 }, { 317, 320, 405, 463, 398 },
1539   { 318, 322, 326, 327, 323 }, { 318, 322, 400, 456, 394 },
1540   { 318, 323, 401, 457, 394 }, { 321, 324, 328, 329, 325 },
1541   { 321, 324, 402, 458, 399 }, { 321, 325, 403, 459, 399 },
1542   { 322, 326, 406, 464, 400 }, { 323, 327, 407, 465, 401 },
1543   { 324, 328, 408, 466, 402 }, { 325, 329, 409, 467, 403 },
1544   { 326, 327, 407, 468, 406 }, { 328, 329, 409, 469, 408 },
1545   { 330, 350, 410, 411, 352 }, { 330, 350, 412, 416, 354 },
1546   { 330, 352, 414, 418, 354 }, { 331, 351, 410, 411, 353 },
1547   { 331, 351, 413, 417, 355 }, { 331, 353, 415, 419, 355 },
1548   { 332, 356, 412, 416, 361 }, { 332, 356, 420, 424, 366 },
1549   { 332, 361, 426, 432, 366 }, { 333, 357, 413, 417, 362 },
1550   { 333, 357, 421, 425, 367 }, { 333, 362, 427, 433, 367 },
1551   { 334, 358, 414, 418, 363 }, { 334, 358, 422, 430, 368 },
1552   { 334, 363, 428, 434, 368 }, { 335, 359, 415, 419, 364 },
1553   { 335, 359, 423, 431, 369 }, { 335, 364, 429, 435, 369 },
1554   { 336, 360, 420, 424, 370 }, { 336, 360, 421, 425, 371 },
1555   { 336, 370, 438, 439, 371 }, { 337, 365, 422, 430, 376 },
1556   { 337, 365, 423, 431, 377 }, { 337, 376, 440, 441, 377 },
1557   { 338, 372, 426, 432, 378 }, { 338, 372, 436, 442, 384 },
1558   { 338, 378, 444, 450, 384 }, { 339, 373, 427, 433, 379 },
1559   { 339, 373, 437, 443, 385 }, { 339, 379, 445, 451, 385 },
1560   { 340, 374, 428, 434, 380 }, { 340, 374, 436, 442, 386 },
1561   { 340, 380, 446, 452, 386 }, { 341, 375, 429, 435, 381 },
1562   { 341, 375, 437, 443, 387 }, { 341, 381, 447, 453, 387 },
1563   { 342, 382, 438, 439, 383 }, { 342, 382, 448, 456, 394 },
1564   { 342, 383, 449, 457, 394 }, { 343, 388, 440, 441, 389 },
1565   { 343, 388, 454, 458, 399 }, { 343, 389, 455, 459, 399 },
1566   { 344, 390, 444, 450, 395 }, { 344, 390, 448, 456, 400 },
1567   { 344, 395, 460, 464, 400 }, { 345, 391, 445, 451, 396 },
1568   { 345, 391, 449, 457, 401 }, { 345, 396, 461, 465, 401 },
1569   { 346, 392, 446, 452, 397 }, { 346, 392, 454, 458, 402 },
1570   { 346, 397, 462, 466, 402 }, { 347, 393, 447, 453, 398 },
1571   { 347, 393, 455, 459, 403 }, { 347, 398, 463, 467, 403 },
1572   { 348, 404, 460, 464, 406 }, { 348, 404, 462, 466, 408 },
1573   { 348, 406, 468, 469, 408 }, { 349, 405, 461, 465, 407 },
1574   { 349, 405, 463, 467, 409 }, { 349, 407, 468, 469, 409 },
1575   { 350, 410, 470, 472, 412 }, { 351, 410, 470, 473, 413 },
1576   { 352, 411, 471, 474, 414 }, { 353, 411, 471, 475, 415 },
1577   { 354, 416, 478, 480, 418 }, { 355, 417, 479, 481, 419 },
1578   { 356, 412, 472, 476, 420 }, { 357, 413, 473, 477, 421 },
1579   { 358, 414, 474, 482, 422 }, { 359, 415, 475, 483, 423 },
1580   { 360, 420, 476, 477, 421 }, { 361, 416, 478, 484, 426 },
1581   { 362, 417, 479, 485, 427 }, { 363, 418, 480, 486, 428 },
1582   { 364, 419, 481, 487, 429 }, { 365, 422, 482, 483, 423 },
1583   { 366, 424, 488, 494, 432 }, { 367, 425, 489, 495, 433 },
1584   { 368, 430, 492, 496, 434 }, { 369, 431, 493, 497, 435 },
1585   { 370, 424, 488, 498, 438 }, { 371, 425, 489, 499, 439 },
1586   { 372, 426, 484, 490, 436 }, { 373, 427, 485, 491, 437 },
1587   { 374, 428, 486, 490, 436 }, { 375, 429, 487, 491, 437 },
1588   { 376, 430, 492, 500, 440 }, { 377, 431, 493, 501, 441 },
1589   { 378, 432, 494, 502, 444 }, { 379, 433, 495, 503, 445 },
1590   { 380, 434, 496, 504, 446 }, { 381, 435, 497, 505, 447 },
1591   { 382, 438, 498, 506, 448 }, { 383, 439, 499, 507, 449 },
1592   { 384, 442, 508, 512, 450 }, { 385, 443, 509, 513, 451 },
1593   { 386, 442, 508, 514, 452 }, { 387, 443, 509, 515, 453 },
1594   { 388, 440, 500, 510, 454 }, { 389, 441, 501, 511, 455 },
1595   { 390, 444, 502, 506, 448 }, { 391, 445, 503, 507, 449 },
1596   { 392, 446, 504, 510, 454 }, { 393, 447, 505, 511, 455 },
1597   { 394, 456, 516, 517, 457 }, { 395, 450, 512, 518, 460 },
1598   { 396, 451, 513, 519, 461 }, { 397, 452, 514, 520, 462 },
1599   { 398, 453, 515, 521, 463 }, { 399, 458, 522, 523, 459 },
1600   { 400, 456, 516, 524, 464 }, { 401, 457, 517, 525, 465 },
1601   { 402, 458, 522, 526, 466 }, { 403, 459, 523, 527, 467 },
1602   { 404, 460, 518, 520, 462 }, { 405, 461, 519, 521, 463 },
1603   { 406, 464, 524, 528, 468 }, { 407, 465, 525, 528, 468 },
1604   { 408, 466, 526, 529, 469 }, { 409, 467, 527, 529, 469 },
1605   { 410, 411, 471, 530, 470 }, { 412, 416, 478, 531, 472 },
1606   { 413, 417, 479, 532, 473 }, { 414, 418, 480, 533, 474 },
1607   { 415, 419, 481, 534, 475 }, { 420, 424, 488, 535, 476 },
1608   { 421, 425, 489, 536, 477 }, { 422, 430, 492, 537, 482 },
1609   { 423, 431, 493, 538, 483 }, { 426, 432, 494, 539, 484 },
1610   { 427, 433, 495, 540, 485 }, { 428, 434, 496, 541, 486 },
1611   { 429, 435, 497, 542, 487 }, { 436, 442, 508, 544, 490 },
1612   { 437, 443, 509, 545, 491 }, { 438, 439, 499, 543, 498 },
1613   { 440, 441, 501, 546, 500 }, { 444, 450, 512, 547, 502 },
1614   { 445, 451, 513, 548, 503 }, { 446, 452, 514, 549, 504 },
1615   { 447, 453, 515, 550, 505 }, { 448, 456, 516, 551, 506 },
1616   { 449, 457, 517, 552, 507 }, { 454, 458, 522, 553, 510 },
1617   { 455, 459, 523, 554, 511 }, { 460, 464, 524, 555, 518 },
1618   { 461, 465, 525, 556, 519 }, { 462, 466, 526, 557, 520 },
1619   { 463, 467, 527, 558, 521 }, { 468, 469, 529, 559, 528 },
1620   { 470, 472, 476, 477, 473 }, { 470, 472, 531, 560, 530 },
1621   { 470, 473, 532, 561, 530 }, { 471, 474, 482, 483, 475 },
1622   { 471, 474, 533, 560, 530 }, { 471, 475, 534, 561, 530 },
1623   { 472, 476, 535, 562, 531 }, { 473, 477, 536, 563, 532 },
1624   { 474, 482, 537, 564, 533 }, { 475, 483, 538, 565, 534 },
1625   { 476, 477, 536, 566, 535 }, { 478, 480, 486, 490, 484 },
1626   { 478, 480, 533, 560, 531 }, { 478, 484, 539, 562, 531 },
1627   { 479, 481, 487, 491, 485 }, { 479, 481, 534, 561, 532 },
1628   { 479, 485, 540, 563, 532 }, { 480, 486, 541, 564, 533 },
1629   { 481, 487, 542, 565, 534 }, { 482, 483, 538, 567, 537 },
1630   { 484, 490, 544, 568, 539 }, { 485, 491, 545, 569, 540 },
1631   { 486, 490, 544, 570, 541 }, { 487, 491, 545, 571, 542 },
1632   { 488, 494, 502, 506, 498 }, { 488, 494, 539, 562, 535 },
1633   { 488, 498, 543, 566, 535 }, { 489, 495, 503, 507, 499 },
1634   { 489, 495, 540, 563, 536 }, { 489, 499, 543, 566, 536 },
1635   { 492, 496, 504, 510, 500 }, { 492, 496, 541, 564, 537 },
1636   { 492, 500, 546, 567, 537 }, { 493, 497, 505, 511, 501 },
1637   { 493, 497, 542, 565, 538 }, { 493, 501, 546, 567, 538 },
1638   { 494, 502, 547, 568, 539 }, { 495, 503, 548, 569, 540 },
1639   { 496, 504, 549, 570, 541 }, { 497, 505, 550, 571, 542 },
1640   { 498, 506, 551, 572, 543 }, { 499, 507, 552, 572, 543 },
1641   { 500, 510, 553, 573, 546 }, { 501, 511, 554, 573, 546 },
1642   { 502, 506, 551, 574, 547 }, { 503, 507, 552, 575, 548 },
1643   { 504, 510, 553, 576, 549 }, { 505, 511, 554, 577, 550 },
1644   { 508, 512, 518, 520, 514 }, { 508, 512, 547, 568, 544 },
1645   { 508, 514, 549, 570, 544 }, { 509, 513, 519, 521, 515 },
1646   { 509, 513, 548, 569, 545 }, { 509, 515, 550, 571, 545 },
1647   { 512, 518, 555, 574, 547 }, { 513, 519, 556, 575, 548 },
1648   { 514, 520, 557, 576, 549 }, { 515, 521, 558, 577, 550 },
1649   { 516, 517, 525, 528, 524 }, { 516, 517, 552, 572, 551 },
1650   { 516, 524, 555, 574, 551 }, { 517, 525, 556, 575, 552 },
1651   { 518, 520, 557, 578, 555 }, { 519, 521, 558, 579, 556 },
1652   { 522, 523, 527, 529, 526 }, { 522, 523, 554, 573, 553 },
1653   { 522, 526, 557, 576, 553 }, { 523, 527, 558, 577, 554 },
1654   { 524, 528, 559, 578, 555 }, { 525, 528, 559, 579, 556 },
1655   { 526, 529, 559, 578, 557 }, { 527, 529, 559, 579, 558 },
1656   { 530, 560, 580, 581, 561 }, { 531, 560, 580, 582, 562 },
1657   { 532, 561, 581, 583, 563 }, { 533, 560, 580, 584, 564 },
1658   { 534, 561, 581, 585, 565 }, { 535, 562, 582, 586, 566 },
1659   { 536, 563, 583, 586, 566 }, { 537, 564, 584, 587, 567 },
1660   { 538, 565, 585, 587, 567 }, { 539, 562, 582, 588, 568 },
1661   { 540, 563, 583, 589, 569 }, { 541, 564, 584, 590, 570 },
1662   { 542, 565, 585, 591, 571 }, { 543, 566, 586, 592, 572 },
1663   { 544, 568, 588, 590, 570 }, { 545, 569, 589, 591, 571 },
1664   { 546, 567, 587, 593, 573 }, { 547, 568, 588, 594, 574 },
1665   { 548, 569, 589, 595, 575 }, { 549, 570, 590, 596, 576 },
1666   { 550, 571, 591, 597, 577 }, { 551, 572, 592, 594, 574 },
1667   { 552, 572, 592, 595, 575 }, { 553, 573, 593, 596, 576 },
1668   { 554, 573, 593, 597, 577 }, { 555, 574, 594, 598, 578 },
1669   { 556, 575, 595, 599, 579 }, { 557, 576, 596, 598, 578 },
1670   { 558, 577, 597, 599, 579 }, { 559, 578, 598, 599, 579 },
1671   { 580, 581, 583, 586, 582 }, { 580, 581, 585, 587, 584 },
1672   { 580, 582, 588, 590, 584 }, { 581, 583, 589, 591, 585 },
1673   { 582, 586, 592, 594, 588 }, { 583, 586, 592, 595, 589 },
1674   { 584, 587, 593, 596, 590 }, { 585, 587, 593, 597, 591 },
1675   { 588, 590, 596, 598, 594 }, { 589, 591, 597, 599, 595 },
1676   { 592, 594, 598, 599, 595 }, { 593, 596, 598, 599, 597 }
1677 };
1678
1679
1680
1681 static const float vert_600[NUM_VERT_600][4] = {
1682   {        0.0,        0.0,        0.0,       -2.0 },
1683   {        0.0, -GOLDENINV,       -1.0,    -GOLDEN },
1684   {        0.0,  GOLDENINV,       -1.0,    -GOLDEN },
1685   {       -1.0,        0.0, -GOLDENINV,    -GOLDEN },
1686   {        1.0,        0.0, -GOLDENINV,    -GOLDEN },
1687   { -GOLDENINV,       -1.0,        0.0,    -GOLDEN },
1688   {  GOLDENINV,       -1.0,        0.0,    -GOLDEN },
1689   { -GOLDENINV,        1.0,        0.0,    -GOLDEN },
1690   {  GOLDENINV,        1.0,        0.0,    -GOLDEN },
1691   {       -1.0,        0.0,  GOLDENINV,    -GOLDEN },
1692   {        1.0,        0.0,  GOLDENINV,    -GOLDEN },
1693   {        0.0, -GOLDENINV,        1.0,    -GOLDEN },
1694   {        0.0,  GOLDENINV,        1.0,    -GOLDEN },
1695   { -GOLDENINV,        0.0,    -GOLDEN,       -1.0 },
1696   {  GOLDENINV,        0.0,    -GOLDEN,       -1.0 },
1697   {       -1.0,       -1.0,       -1.0,       -1.0 },
1698   {        1.0,       -1.0,       -1.0,       -1.0 },
1699   {       -1.0,        1.0,       -1.0,       -1.0 },
1700   {        1.0,        1.0,       -1.0,       -1.0 },
1701   {        0.0,    -GOLDEN, -GOLDENINV,       -1.0 },
1702   {        0.0,     GOLDEN, -GOLDENINV,       -1.0 },
1703   {    -GOLDEN, -GOLDENINV,        0.0,       -1.0 },
1704   {     GOLDEN, -GOLDENINV,        0.0,       -1.0 },
1705   {    -GOLDEN,  GOLDENINV,        0.0,       -1.0 },
1706   {     GOLDEN,  GOLDENINV,        0.0,       -1.0 },
1707   {        0.0,    -GOLDEN,  GOLDENINV,       -1.0 },
1708   {        0.0,     GOLDEN,  GOLDENINV,       -1.0 },
1709   {       -1.0,       -1.0,        1.0,       -1.0 },
1710   {        1.0,       -1.0,        1.0,       -1.0 },
1711   {       -1.0,        1.0,        1.0,       -1.0 },
1712   {        1.0,        1.0,        1.0,       -1.0 },
1713   { -GOLDENINV,        0.0,     GOLDEN,       -1.0 },
1714   {  GOLDENINV,        0.0,     GOLDEN,       -1.0 },
1715   {        0.0,       -1.0,    -GOLDEN, -GOLDENINV },
1716   {        0.0,        1.0,    -GOLDEN, -GOLDENINV },
1717   {    -GOLDEN,        0.0,       -1.0, -GOLDENINV },
1718   {     GOLDEN,        0.0,       -1.0, -GOLDENINV },
1719   {       -1.0,    -GOLDEN,        0.0, -GOLDENINV },
1720   {        1.0,    -GOLDEN,        0.0, -GOLDENINV },
1721   {       -1.0,     GOLDEN,        0.0, -GOLDENINV },
1722   {        1.0,     GOLDEN,        0.0, -GOLDENINV },
1723   {    -GOLDEN,        0.0,        1.0, -GOLDENINV },
1724   {     GOLDEN,        0.0,        1.0, -GOLDENINV },
1725   {        0.0,       -1.0,     GOLDEN, -GOLDENINV },
1726   {        0.0,        1.0,     GOLDEN, -GOLDENINV },
1727   {        0.0,        0.0,       -2.0,        0.0 },
1728   {       -1.0, -GOLDENINV,    -GOLDEN,        0.0 },
1729   {        1.0, -GOLDENINV,    -GOLDEN,        0.0 },
1730   {       -1.0,  GOLDENINV,    -GOLDEN,        0.0 },
1731   {        1.0,  GOLDENINV,    -GOLDEN,        0.0 },
1732   { -GOLDENINV,    -GOLDEN,       -1.0,        0.0 },
1733   {  GOLDENINV,    -GOLDEN,       -1.0,        0.0 },
1734   { -GOLDENINV,     GOLDEN,       -1.0,        0.0 },
1735   {  GOLDENINV,     GOLDEN,       -1.0,        0.0 },
1736   {    -GOLDEN,       -1.0, -GOLDENINV,        0.0 },
1737   {     GOLDEN,       -1.0, -GOLDENINV,        0.0 },
1738   {    -GOLDEN,        1.0, -GOLDENINV,        0.0 },
1739   {     GOLDEN,        1.0, -GOLDENINV,        0.0 },
1740   {        0.0,       -2.0,        0.0,        0.0 },
1741   {       -2.0,        0.0,        0.0,        0.0 },
1742   {        2.0,        0.0,        0.0,        0.0 },
1743   {        0.0,        2.0,        0.0,        0.0 },
1744   {    -GOLDEN,       -1.0,  GOLDENINV,        0.0 },
1745   {     GOLDEN,       -1.0,  GOLDENINV,        0.0 },
1746   {    -GOLDEN,        1.0,  GOLDENINV,        0.0 },
1747   {     GOLDEN,        1.0,  GOLDENINV,        0.0 },
1748   { -GOLDENINV,    -GOLDEN,        1.0,        0.0 },
1749   {  GOLDENINV,    -GOLDEN,        1.0,        0.0 },
1750   { -GOLDENINV,     GOLDEN,        1.0,        0.0 },
1751   {  GOLDENINV,     GOLDEN,        1.0,        0.0 },
1752   {       -1.0, -GOLDENINV,     GOLDEN,        0.0 },
1753   {        1.0, -GOLDENINV,     GOLDEN,        0.0 },
1754   {       -1.0,  GOLDENINV,     GOLDEN,        0.0 },
1755   {        1.0,  GOLDENINV,     GOLDEN,        0.0 },
1756   {        0.0,        0.0,        2.0,        0.0 },
1757   {        0.0,       -1.0,    -GOLDEN,  GOLDENINV },
1758   {        0.0,        1.0,    -GOLDEN,  GOLDENINV },
1759   {    -GOLDEN,        0.0,       -1.0,  GOLDENINV },
1760   {     GOLDEN,        0.0,       -1.0,  GOLDENINV },
1761   {       -1.0,    -GOLDEN,        0.0,  GOLDENINV },
1762   {        1.0,    -GOLDEN,        0.0,  GOLDENINV },
1763   {       -1.0,     GOLDEN,        0.0,  GOLDENINV },
1764   {        1.0,     GOLDEN,        0.0,  GOLDENINV },
1765   {    -GOLDEN,        0.0,        1.0,  GOLDENINV },
1766   {     GOLDEN,        0.0,        1.0,  GOLDENINV },
1767   {        0.0,       -1.0,     GOLDEN,  GOLDENINV },
1768   {        0.0,        1.0,     GOLDEN,  GOLDENINV },
1769   { -GOLDENINV,        0.0,    -GOLDEN,        1.0 },
1770   {  GOLDENINV,        0.0,    -GOLDEN,        1.0 },
1771   {       -1.0,       -1.0,       -1.0,        1.0 },
1772   {        1.0,       -1.0,       -1.0,        1.0 },
1773   {       -1.0,        1.0,       -1.0,        1.0 },
1774   {        1.0,        1.0,       -1.0,        1.0 },
1775   {        0.0,    -GOLDEN, -GOLDENINV,        1.0 },
1776   {        0.0,     GOLDEN, -GOLDENINV,        1.0 },
1777   {    -GOLDEN, -GOLDENINV,        0.0,        1.0 },
1778   {     GOLDEN, -GOLDENINV,        0.0,        1.0 },
1779   {    -GOLDEN,  GOLDENINV,        0.0,        1.0 },
1780   {     GOLDEN,  GOLDENINV,        0.0,        1.0 },
1781   {        0.0,    -GOLDEN,  GOLDENINV,        1.0 },
1782   {        0.0,     GOLDEN,  GOLDENINV,        1.0 },
1783   {       -1.0,       -1.0,        1.0,        1.0 },
1784   {        1.0,       -1.0,        1.0,        1.0 },
1785   {       -1.0,        1.0,        1.0,        1.0 },
1786   {        1.0,        1.0,        1.0,        1.0 },
1787   { -GOLDENINV,        0.0,     GOLDEN,        1.0 },
1788   {  GOLDENINV,        0.0,     GOLDEN,        1.0 },
1789   {        0.0, -GOLDENINV,       -1.0,     GOLDEN },
1790   {        0.0,  GOLDENINV,       -1.0,     GOLDEN },
1791   {       -1.0,        0.0, -GOLDENINV,     GOLDEN },
1792   {        1.0,        0.0, -GOLDENINV,     GOLDEN },
1793   { -GOLDENINV,       -1.0,        0.0,     GOLDEN },
1794   {  GOLDENINV,       -1.0,        0.0,     GOLDEN },
1795   { -GOLDENINV,        1.0,        0.0,     GOLDEN },
1796   {  GOLDENINV,        1.0,        0.0,     GOLDEN },
1797   {       -1.0,        0.0,  GOLDENINV,     GOLDEN },
1798   {        1.0,        0.0,  GOLDENINV,     GOLDEN },
1799   {        0.0, -GOLDENINV,        1.0,     GOLDEN },
1800   {        0.0,  GOLDENINV,        1.0,     GOLDEN },
1801   {        0.0,        0.0,        0.0,        2.0 }
1802 };
1803
1804 static const int edge_600[NUM_EDGE_600][2] = {
1805   {   0,   1 }, {   0,   2 }, {   0,   3 }, {   0,   4 }, {   0,   5 },
1806   {   0,   6 }, {   0,   7 }, {   0,   8 }, {   0,   9 }, {   0,  10 },
1807   {   0,  11 }, {   0,  12 }, {   1,   2 }, {   1,   3 }, {   1,   4 },
1808   {   1,   5 }, {   1,   6 }, {   1,  13 }, {   1,  14 }, {   1,  15 },
1809   {   1,  16 }, {   1,  19 }, {   1,  33 }, {   2,   3 }, {   2,   4 },
1810   {   2,   7 }, {   2,   8 }, {   2,  13 }, {   2,  14 }, {   2,  17 },
1811   {   2,  18 }, {   2,  20 }, {   2,  34 }, {   3,   5 }, {   3,   7 },
1812   {   3,   9 }, {   3,  13 }, {   3,  15 }, {   3,  17 }, {   3,  21 },
1813   {   3,  23 }, {   3,  35 }, {   4,   6 }, {   4,   8 }, {   4,  10 },
1814   {   4,  14 }, {   4,  16 }, {   4,  18 }, {   4,  22 }, {   4,  24 },
1815   {   4,  36 }, {   5,   6 }, {   5,   9 }, {   5,  11 }, {   5,  15 },
1816   {   5,  19 }, {   5,  21 }, {   5,  25 }, {   5,  27 }, {   5,  37 },
1817   {   6,  10 }, {   6,  11 }, {   6,  16 }, {   6,  19 }, {   6,  22 },
1818   {   6,  25 }, {   6,  28 }, {   6,  38 }, {   7,   8 }, {   7,   9 },
1819   {   7,  12 }, {   7,  17 }, {   7,  20 }, {   7,  23 }, {   7,  26 },
1820   {   7,  29 }, {   7,  39 }, {   8,  10 }, {   8,  12 }, {   8,  18 },
1821   {   8,  20 }, {   8,  24 }, {   8,  26 }, {   8,  30 }, {   8,  40 },
1822   {   9,  11 }, {   9,  12 }, {   9,  21 }, {   9,  23 }, {   9,  27 },
1823   {   9,  29 }, {   9,  31 }, {   9,  41 }, {  10,  11 }, {  10,  12 },
1824   {  10,  22 }, {  10,  24 }, {  10,  28 }, {  10,  30 }, {  10,  32 },
1825   {  10,  42 }, {  11,  12 }, {  11,  25 }, {  11,  27 }, {  11,  28 },
1826   {  11,  31 }, {  11,  32 }, {  11,  43 }, {  12,  26 }, {  12,  29 },
1827   {  12,  30 }, {  12,  31 }, {  12,  32 }, {  12,  44 }, {  13,  14 },
1828   {  13,  15 }, {  13,  17 }, {  13,  33 }, {  13,  34 }, {  13,  35 },
1829   {  13,  45 }, {  13,  46 }, {  13,  48 }, {  14,  16 }, {  14,  18 },
1830   {  14,  33 }, {  14,  34 }, {  14,  36 }, {  14,  45 }, {  14,  47 },
1831   {  14,  49 }, {  15,  19 }, {  15,  21 }, {  15,  33 }, {  15,  35 },
1832   {  15,  37 }, {  15,  46 }, {  15,  50 }, {  15,  54 }, {  16,  19 },
1833   {  16,  22 }, {  16,  33 }, {  16,  36 }, {  16,  38 }, {  16,  47 },
1834   {  16,  51 }, {  16,  55 }, {  17,  20 }, {  17,  23 }, {  17,  34 },
1835   {  17,  35 }, {  17,  39 }, {  17,  48 }, {  17,  52 }, {  17,  56 },
1836   {  18,  20 }, {  18,  24 }, {  18,  34 }, {  18,  36 }, {  18,  40 },
1837   {  18,  49 }, {  18,  53 }, {  18,  57 }, {  19,  25 }, {  19,  33 },
1838   {  19,  37 }, {  19,  38 }, {  19,  50 }, {  19,  51 }, {  19,  58 },
1839   {  20,  26 }, {  20,  34 }, {  20,  39 }, {  20,  40 }, {  20,  52 },
1840   {  20,  53 }, {  20,  61 }, {  21,  23 }, {  21,  27 }, {  21,  35 },
1841   {  21,  37 }, {  21,  41 }, {  21,  54 }, {  21,  59 }, {  21,  62 },
1842   {  22,  24 }, {  22,  28 }, {  22,  36 }, {  22,  38 }, {  22,  42 },
1843   {  22,  55 }, {  22,  60 }, {  22,  63 }, {  23,  29 }, {  23,  35 },
1844   {  23,  39 }, {  23,  41 }, {  23,  56 }, {  23,  59 }, {  23,  64 },
1845   {  24,  30 }, {  24,  36 }, {  24,  40 }, {  24,  42 }, {  24,  57 },
1846   {  24,  60 }, {  24,  65 }, {  25,  27 }, {  25,  28 }, {  25,  37 },
1847   {  25,  38 }, {  25,  43 }, {  25,  58 }, {  25,  66 }, {  25,  67 },
1848   {  26,  29 }, {  26,  30 }, {  26,  39 }, {  26,  40 }, {  26,  44 },
1849   {  26,  61 }, {  26,  68 }, {  26,  69 }, {  27,  31 }, {  27,  37 },
1850   {  27,  41 }, {  27,  43 }, {  27,  62 }, {  27,  66 }, {  27,  70 },
1851   {  28,  32 }, {  28,  38 }, {  28,  42 }, {  28,  43 }, {  28,  63 },
1852   {  28,  67 }, {  28,  71 }, {  29,  31 }, {  29,  39 }, {  29,  41 },
1853   {  29,  44 }, {  29,  64 }, {  29,  68 }, {  29,  72 }, {  30,  32 },
1854   {  30,  40 }, {  30,  42 }, {  30,  44 }, {  30,  65 }, {  30,  69 },
1855   {  30,  73 }, {  31,  32 }, {  31,  41 }, {  31,  43 }, {  31,  44 },
1856   {  31,  70 }, {  31,  72 }, {  31,  74 }, {  32,  42 }, {  32,  43 },
1857   {  32,  44 }, {  32,  71 }, {  32,  73 }, {  32,  74 }, {  33,  45 },
1858   {  33,  46 }, {  33,  47 }, {  33,  50 }, {  33,  51 }, {  33,  75 },
1859   {  34,  45 }, {  34,  48 }, {  34,  49 }, {  34,  52 }, {  34,  53 },
1860   {  34,  76 }, {  35,  46 }, {  35,  48 }, {  35,  54 }, {  35,  56 },
1861   {  35,  59 }, {  35,  77 }, {  36,  47 }, {  36,  49 }, {  36,  55 },
1862   {  36,  57 }, {  36,  60 }, {  36,  78 }, {  37,  50 }, {  37,  54 },
1863   {  37,  58 }, {  37,  62 }, {  37,  66 }, {  37,  79 }, {  38,  51 },
1864   {  38,  55 }, {  38,  58 }, {  38,  63 }, {  38,  67 }, {  38,  80 },
1865   {  39,  52 }, {  39,  56 }, {  39,  61 }, {  39,  64 }, {  39,  68 },
1866   {  39,  81 }, {  40,  53 }, {  40,  57 }, {  40,  61 }, {  40,  65 },
1867   {  40,  69 }, {  40,  82 }, {  41,  59 }, {  41,  62 }, {  41,  64 },
1868   {  41,  70 }, {  41,  72 }, {  41,  83 }, {  42,  60 }, {  42,  63 },
1869   {  42,  65 }, {  42,  71 }, {  42,  73 }, {  42,  84 }, {  43,  66 },
1870   {  43,  67 }, {  43,  70 }, {  43,  71 }, {  43,  74 }, {  43,  85 },
1871   {  44,  68 }, {  44,  69 }, {  44,  72 }, {  44,  73 }, {  44,  74 },
1872   {  44,  86 }, {  45,  46 }, {  45,  47 }, {  45,  48 }, {  45,  49 },
1873   {  45,  75 }, {  45,  76 }, {  45,  87 }, {  45,  88 }, {  46,  48 },
1874   {  46,  50 }, {  46,  54 }, {  46,  75 }, {  46,  77 }, {  46,  87 },
1875   {  46,  89 }, {  47,  49 }, {  47,  51 }, {  47,  55 }, {  47,  75 },
1876   {  47,  78 }, {  47,  88 }, {  47,  90 }, {  48,  52 }, {  48,  56 },
1877   {  48,  76 }, {  48,  77 }, {  48,  87 }, {  48,  91 }, {  49,  53 },
1878   {  49,  57 }, {  49,  76 }, {  49,  78 }, {  49,  88 }, {  49,  92 },
1879   {  50,  51 }, {  50,  54 }, {  50,  58 }, {  50,  75 }, {  50,  79 },
1880   {  50,  89 }, {  50,  93 }, {  51,  55 }, {  51,  58 }, {  51,  75 },
1881   {  51,  80 }, {  51,  90 }, {  51,  93 }, {  52,  53 }, {  52,  56 },
1882   {  52,  61 }, {  52,  76 }, {  52,  81 }, {  52,  91 }, {  52,  94 },
1883   {  53,  57 }, {  53,  61 }, {  53,  76 }, {  53,  82 }, {  53,  92 },
1884   {  53,  94 }, {  54,  59 }, {  54,  62 }, {  54,  77 }, {  54,  79 },
1885   {  54,  89 }, {  54,  95 }, {  55,  60 }, {  55,  63 }, {  55,  78 },
1886   {  55,  80 }, {  55,  90 }, {  55,  96 }, {  56,  59 }, {  56,  64 },
1887   {  56,  77 }, {  56,  81 }, {  56,  91 }, {  56,  97 }, {  57,  60 },
1888   {  57,  65 }, {  57,  78 }, {  57,  82 }, {  57,  92 }, {  57,  98 },
1889   {  58,  66 }, {  58,  67 }, {  58,  79 }, {  58,  80 }, {  58,  93 },
1890   {  58,  99 }, {  59,  62 }, {  59,  64 }, {  59,  77 }, {  59,  83 },
1891   {  59,  95 }, {  59,  97 }, {  60,  63 }, {  60,  65 }, {  60,  78 },
1892   {  60,  84 }, {  60,  96 }, {  60,  98 }, {  61,  68 }, {  61,  69 },
1893   {  61,  81 }, {  61,  82 }, {  61,  94 }, {  61, 100 }, {  62,  66 },
1894   {  62,  70 }, {  62,  79 }, {  62,  83 }, {  62,  95 }, {  62, 101 },
1895   {  63,  67 }, {  63,  71 }, {  63,  80 }, {  63,  84 }, {  63,  96 },
1896   {  63, 102 }, {  64,  68 }, {  64,  72 }, {  64,  81 }, {  64,  83 },
1897   {  64,  97 }, {  64, 103 }, {  65,  69 }, {  65,  73 }, {  65,  82 },
1898   {  65,  84 }, {  65,  98 }, {  65, 104 }, {  66,  67 }, {  66,  70 },
1899   {  66,  79 }, {  66,  85 }, {  66,  99 }, {  66, 101 }, {  67,  71 },
1900   {  67,  80 }, {  67,  85 }, {  67,  99 }, {  67, 102 }, {  68,  69 },
1901   {  68,  72 }, {  68,  81 }, {  68,  86 }, {  68, 100 }, {  68, 103 },
1902   {  69,  73 }, {  69,  82 }, {  69,  86 }, {  69, 100 }, {  69, 104 },
1903   {  70,  72 }, {  70,  74 }, {  70,  83 }, {  70,  85 }, {  70, 101 },
1904   {  70, 105 }, {  71,  73 }, {  71,  74 }, {  71,  84 }, {  71,  85 },
1905   {  71, 102 }, {  71, 106 }, {  72,  74 }, {  72,  83 }, {  72,  86 },
1906   {  72, 103 }, {  72, 105 }, {  73,  74 }, {  73,  84 }, {  73,  86 },
1907   {  73, 104 }, {  73, 106 }, {  74,  85 }, {  74,  86 }, {  74, 105 },
1908   {  74, 106 }, {  75,  87 }, {  75,  88 }, {  75,  89 }, {  75,  90 },
1909   {  75,  93 }, {  75, 107 }, {  76,  87 }, {  76,  88 }, {  76,  91 },
1910   {  76,  92 }, {  76,  94 }, {  76, 108 }, {  77,  87 }, {  77,  89 },
1911   {  77,  91 }, {  77,  95 }, {  77,  97 }, {  77, 109 }, {  78,  88 },
1912   {  78,  90 }, {  78,  92 }, {  78,  96 }, {  78,  98 }, {  78, 110 },
1913   {  79,  89 }, {  79,  93 }, {  79,  95 }, {  79,  99 }, {  79, 101 },
1914   {  79, 111 }, {  80,  90 }, {  80,  93 }, {  80,  96 }, {  80,  99 },
1915   {  80, 102 }, {  80, 112 }, {  81,  91 }, {  81,  94 }, {  81,  97 },
1916   {  81, 100 }, {  81, 103 }, {  81, 113 }, {  82,  92 }, {  82,  94 },
1917   {  82,  98 }, {  82, 100 }, {  82, 104 }, {  82, 114 }, {  83,  95 },
1918   {  83,  97 }, {  83, 101 }, {  83, 103 }, {  83, 105 }, {  83, 115 },
1919   {  84,  96 }, {  84,  98 }, {  84, 102 }, {  84, 104 }, {  84, 106 },
1920   {  84, 116 }, {  85,  99 }, {  85, 101 }, {  85, 102 }, {  85, 105 },
1921   {  85, 106 }, {  85, 117 }, {  86, 100 }, {  86, 103 }, {  86, 104 },
1922   {  86, 105 }, {  86, 106 }, {  86, 118 }, {  87,  88 }, {  87,  89 },
1923   {  87,  91 }, {  87, 107 }, {  87, 108 }, {  87, 109 }, {  88,  90 },
1924   {  88,  92 }, {  88, 107 }, {  88, 108 }, {  88, 110 }, {  89,  93 },
1925   {  89,  95 }, {  89, 107 }, {  89, 109 }, {  89, 111 }, {  90,  93 },
1926   {  90,  96 }, {  90, 107 }, {  90, 110 }, {  90, 112 }, {  91,  94 },
1927   {  91,  97 }, {  91, 108 }, {  91, 109 }, {  91, 113 }, {  92,  94 },
1928   {  92,  98 }, {  92, 108 }, {  92, 110 }, {  92, 114 }, {  93,  99 },
1929   {  93, 107 }, {  93, 111 }, {  93, 112 }, {  94, 100 }, {  94, 108 },
1930   {  94, 113 }, {  94, 114 }, {  95,  97 }, {  95, 101 }, {  95, 109 },
1931   {  95, 111 }, {  95, 115 }, {  96,  98 }, {  96, 102 }, {  96, 110 },
1932   {  96, 112 }, {  96, 116 }, {  97, 103 }, {  97, 109 }, {  97, 113 },
1933   {  97, 115 }, {  98, 104 }, {  98, 110 }, {  98, 114 }, {  98, 116 },
1934   {  99, 101 }, {  99, 102 }, {  99, 111 }, {  99, 112 }, {  99, 117 },
1935   { 100, 103 }, { 100, 104 }, { 100, 113 }, { 100, 114 }, { 100, 118 },
1936   { 101, 105 }, { 101, 111 }, { 101, 115 }, { 101, 117 }, { 102, 106 },
1937   { 102, 112 }, { 102, 116 }, { 102, 117 }, { 103, 105 }, { 103, 113 },
1938   { 103, 115 }, { 103, 118 }, { 104, 106 }, { 104, 114 }, { 104, 116 },
1939   { 104, 118 }, { 105, 106 }, { 105, 115 }, { 105, 117 }, { 105, 118 },
1940   { 106, 116 }, { 106, 117 }, { 106, 118 }, { 107, 108 }, { 107, 109 },
1941   { 107, 110 }, { 107, 111 }, { 107, 112 }, { 107, 119 }, { 108, 109 },
1942   { 108, 110 }, { 108, 113 }, { 108, 114 }, { 108, 119 }, { 109, 111 },
1943   { 109, 113 }, { 109, 115 }, { 109, 119 }, { 110, 112 }, { 110, 114 },
1944   { 110, 116 }, { 110, 119 }, { 111, 112 }, { 111, 115 }, { 111, 117 },
1945   { 111, 119 }, { 112, 116 }, { 112, 117 }, { 112, 119 }, { 113, 114 },
1946   { 113, 115 }, { 113, 118 }, { 113, 119 }, { 114, 116 }, { 114, 118 },
1947   { 114, 119 }, { 115, 117 }, { 115, 118 }, { 115, 119 }, { 116, 117 },
1948   { 116, 118 }, { 116, 119 }, { 117, 118 }, { 117, 119 }, { 118, 119 }
1949 };
1950
1951 static const int face_600[NUM_FACE_600][VERT_PER_FACE_600] = {
1952   {   0,   1,   2 }, {   0,   1,   3 }, {   0,   1,   4 }, {   0,   1,   5 },
1953   {   0,   1,   6 }, {   0,   2,   3 }, {   0,   2,   4 }, {   0,   2,   7 },
1954   {   0,   2,   8 }, {   0,   3,   5 }, {   0,   3,   7 }, {   0,   3,   9 },
1955   {   0,   4,   6 }, {   0,   4,   8 }, {   0,   4,  10 }, {   0,   5,   6 },
1956   {   0,   5,   9 }, {   0,   5,  11 }, {   0,   6,  10 }, {   0,   6,  11 },
1957   {   0,   7,   8 }, {   0,   7,   9 }, {   0,   7,  12 }, {   0,   8,  10 },
1958   {   0,   8,  12 }, {   0,   9,  11 }, {   0,   9,  12 }, {   0,  10,  11 },
1959   {   0,  10,  12 }, {   0,  11,  12 }, {   1,   2,   3 }, {   1,   2,   4 },
1960   {   1,   2,  13 }, {   1,   2,  14 }, {   1,   3,   5 }, {   1,   3,  13 },
1961   {   1,   3,  15 }, {   1,   4,   6 }, {   1,   4,  14 }, {   1,   4,  16 },
1962   {   1,   5,   6 }, {   1,   5,  15 }, {   1,   5,  19 }, {   1,   6,  16 },
1963   {   1,   6,  19 }, {   1,  13,  14 }, {   1,  13,  15 }, {   1,  13,  33 },
1964   {   1,  14,  16 }, {   1,  14,  33 }, {   1,  15,  19 }, {   1,  15,  33 },
1965   {   1,  16,  19 }, {   1,  16,  33 }, {   1,  19,  33 }, {   2,   3,   7 },
1966   {   2,   3,  13 }, {   2,   3,  17 }, {   2,   4,   8 }, {   2,   4,  14 },
1967   {   2,   4,  18 }, {   2,   7,   8 }, {   2,   7,  17 }, {   2,   7,  20 },
1968   {   2,   8,  18 }, {   2,   8,  20 }, {   2,  13,  14 }, {   2,  13,  17 },
1969   {   2,  13,  34 }, {   2,  14,  18 }, {   2,  14,  34 }, {   2,  17,  20 },
1970   {   2,  17,  34 }, {   2,  18,  20 }, {   2,  18,  34 }, {   2,  20,  34 },
1971   {   3,   5,   9 }, {   3,   5,  15 }, {   3,   5,  21 }, {   3,   7,   9 },
1972   {   3,   7,  17 }, {   3,   7,  23 }, {   3,   9,  21 }, {   3,   9,  23 },
1973   {   3,  13,  15 }, {   3,  13,  17 }, {   3,  13,  35 }, {   3,  15,  21 },
1974   {   3,  15,  35 }, {   3,  17,  23 }, {   3,  17,  35 }, {   3,  21,  23 },
1975   {   3,  21,  35 }, {   3,  23,  35 }, {   4,   6,  10 }, {   4,   6,  16 },
1976   {   4,   6,  22 }, {   4,   8,  10 }, {   4,   8,  18 }, {   4,   8,  24 },
1977   {   4,  10,  22 }, {   4,  10,  24 }, {   4,  14,  16 }, {   4,  14,  18 },
1978   {   4,  14,  36 }, {   4,  16,  22 }, {   4,  16,  36 }, {   4,  18,  24 },
1979   {   4,  18,  36 }, {   4,  22,  24 }, {   4,  22,  36 }, {   4,  24,  36 },
1980   {   5,   6,  11 }, {   5,   6,  19 }, {   5,   6,  25 }, {   5,   9,  11 },
1981   {   5,   9,  21 }, {   5,   9,  27 }, {   5,  11,  25 }, {   5,  11,  27 },
1982   {   5,  15,  19 }, {   5,  15,  21 }, {   5,  15,  37 }, {   5,  19,  25 },
1983   {   5,  19,  37 }, {   5,  21,  27 }, {   5,  21,  37 }, {   5,  25,  27 },
1984   {   5,  25,  37 }, {   5,  27,  37 }, {   6,  10,  11 }, {   6,  10,  22 },
1985   {   6,  10,  28 }, {   6,  11,  25 }, {   6,  11,  28 }, {   6,  16,  19 },
1986   {   6,  16,  22 }, {   6,  16,  38 }, {   6,  19,  25 }, {   6,  19,  38 },
1987   {   6,  22,  28 }, {   6,  22,  38 }, {   6,  25,  28 }, {   6,  25,  38 },
1988   {   6,  28,  38 }, {   7,   8,  12 }, {   7,   8,  20 }, {   7,   8,  26 },
1989   {   7,   9,  12 }, {   7,   9,  23 }, {   7,   9,  29 }, {   7,  12,  26 },
1990   {   7,  12,  29 }, {   7,  17,  20 }, {   7,  17,  23 }, {   7,  17,  39 },
1991   {   7,  20,  26 }, {   7,  20,  39 }, {   7,  23,  29 }, {   7,  23,  39 },
1992   {   7,  26,  29 }, {   7,  26,  39 }, {   7,  29,  39 }, {   8,  10,  12 },
1993   {   8,  10,  24 }, {   8,  10,  30 }, {   8,  12,  26 }, {   8,  12,  30 },
1994   {   8,  18,  20 }, {   8,  18,  24 }, {   8,  18,  40 }, {   8,  20,  26 },
1995   {   8,  20,  40 }, {   8,  24,  30 }, {   8,  24,  40 }, {   8,  26,  30 },
1996   {   8,  26,  40 }, {   8,  30,  40 }, {   9,  11,  12 }, {   9,  11,  27 },
1997   {   9,  11,  31 }, {   9,  12,  29 }, {   9,  12,  31 }, {   9,  21,  23 },
1998   {   9,  21,  27 }, {   9,  21,  41 }, {   9,  23,  29 }, {   9,  23,  41 },
1999   {   9,  27,  31 }, {   9,  27,  41 }, {   9,  29,  31 }, {   9,  29,  41 },
2000   {   9,  31,  41 }, {  10,  11,  12 }, {  10,  11,  28 }, {  10,  11,  32 },
2001   {  10,  12,  30 }, {  10,  12,  32 }, {  10,  22,  24 }, {  10,  22,  28 },
2002   {  10,  22,  42 }, {  10,  24,  30 }, {  10,  24,  42 }, {  10,  28,  32 },
2003   {  10,  28,  42 }, {  10,  30,  32 }, {  10,  30,  42 }, {  10,  32,  42 },
2004   {  11,  12,  31 }, {  11,  12,  32 }, {  11,  25,  27 }, {  11,  25,  28 },
2005   {  11,  25,  43 }, {  11,  27,  31 }, {  11,  27,  43 }, {  11,  28,  32 },
2006   {  11,  28,  43 }, {  11,  31,  32 }, {  11,  31,  43 }, {  11,  32,  43 },
2007   {  12,  26,  29 }, {  12,  26,  30 }, {  12,  26,  44 }, {  12,  29,  31 },
2008   {  12,  29,  44 }, {  12,  30,  32 }, {  12,  30,  44 }, {  12,  31,  32 },
2009   {  12,  31,  44 }, {  12,  32,  44 }, {  13,  14,  33 }, {  13,  14,  34 },
2010   {  13,  14,  45 }, {  13,  15,  33 }, {  13,  15,  35 }, {  13,  15,  46 },
2011   {  13,  17,  34 }, {  13,  17,  35 }, {  13,  17,  48 }, {  13,  33,  45 },
2012   {  13,  33,  46 }, {  13,  34,  45 }, {  13,  34,  48 }, {  13,  35,  46 },
2013   {  13,  35,  48 }, {  13,  45,  46 }, {  13,  45,  48 }, {  13,  46,  48 },
2014   {  14,  16,  33 }, {  14,  16,  36 }, {  14,  16,  47 }, {  14,  18,  34 },
2015   {  14,  18,  36 }, {  14,  18,  49 }, {  14,  33,  45 }, {  14,  33,  47 },
2016   {  14,  34,  45 }, {  14,  34,  49 }, {  14,  36,  47 }, {  14,  36,  49 },
2017   {  14,  45,  47 }, {  14,  45,  49 }, {  14,  47,  49 }, {  15,  19,  33 },
2018   {  15,  19,  37 }, {  15,  19,  50 }, {  15,  21,  35 }, {  15,  21,  37 },
2019   {  15,  21,  54 }, {  15,  33,  46 }, {  15,  33,  50 }, {  15,  35,  46 },
2020   {  15,  35,  54 }, {  15,  37,  50 }, {  15,  37,  54 }, {  15,  46,  50 },
2021   {  15,  46,  54 }, {  15,  50,  54 }, {  16,  19,  33 }, {  16,  19,  38 },
2022   {  16,  19,  51 }, {  16,  22,  36 }, {  16,  22,  38 }, {  16,  22,  55 },
2023   {  16,  33,  47 }, {  16,  33,  51 }, {  16,  36,  47 }, {  16,  36,  55 },
2024   {  16,  38,  51 }, {  16,  38,  55 }, {  16,  47,  51 }, {  16,  47,  55 },
2025   {  16,  51,  55 }, {  17,  20,  34 }, {  17,  20,  39 }, {  17,  20,  52 },
2026   {  17,  23,  35 }, {  17,  23,  39 }, {  17,  23,  56 }, {  17,  34,  48 },
2027   {  17,  34,  52 }, {  17,  35,  48 }, {  17,  35,  56 }, {  17,  39,  52 },
2028   {  17,  39,  56 }, {  17,  48,  52 }, {  17,  48,  56 }, {  17,  52,  56 },
2029   {  18,  20,  34 }, {  18,  20,  40 }, {  18,  20,  53 }, {  18,  24,  36 },
2030   {  18,  24,  40 }, {  18,  24,  57 }, {  18,  34,  49 }, {  18,  34,  53 },
2031   {  18,  36,  49 }, {  18,  36,  57 }, {  18,  40,  53 }, {  18,  40,  57 },
2032   {  18,  49,  53 }, {  18,  49,  57 }, {  18,  53,  57 }, {  19,  25,  37 },
2033   {  19,  25,  38 }, {  19,  25,  58 }, {  19,  33,  50 }, {  19,  33,  51 },
2034   {  19,  37,  50 }, {  19,  37,  58 }, {  19,  38,  51 }, {  19,  38,  58 },
2035   {  19,  50,  51 }, {  19,  50,  58 }, {  19,  51,  58 }, {  20,  26,  39 },
2036   {  20,  26,  40 }, {  20,  26,  61 }, {  20,  34,  52 }, {  20,  34,  53 },
2037   {  20,  39,  52 }, {  20,  39,  61 }, {  20,  40,  53 }, {  20,  40,  61 },
2038   {  20,  52,  53 }, {  20,  52,  61 }, {  20,  53,  61 }, {  21,  23,  35 },
2039   {  21,  23,  41 }, {  21,  23,  59 }, {  21,  27,  37 }, {  21,  27,  41 },
2040   {  21,  27,  62 }, {  21,  35,  54 }, {  21,  35,  59 }, {  21,  37,  54 },
2041   {  21,  37,  62 }, {  21,  41,  59 }, {  21,  41,  62 }, {  21,  54,  59 },
2042   {  21,  54,  62 }, {  21,  59,  62 }, {  22,  24,  36 }, {  22,  24,  42 },
2043   {  22,  24,  60 }, {  22,  28,  38 }, {  22,  28,  42 }, {  22,  28,  63 },
2044   {  22,  36,  55 }, {  22,  36,  60 }, {  22,  38,  55 }, {  22,  38,  63 },
2045   {  22,  42,  60 }, {  22,  42,  63 }, {  22,  55,  60 }, {  22,  55,  63 },
2046   {  22,  60,  63 }, {  23,  29,  39 }, {  23,  29,  41 }, {  23,  29,  64 },
2047   {  23,  35,  56 }, {  23,  35,  59 }, {  23,  39,  56 }, {  23,  39,  64 },
2048   {  23,  41,  59 }, {  23,  41,  64 }, {  23,  56,  59 }, {  23,  56,  64 },
2049   {  23,  59,  64 }, {  24,  30,  40 }, {  24,  30,  42 }, {  24,  30,  65 },
2050   {  24,  36,  57 }, {  24,  36,  60 }, {  24,  40,  57 }, {  24,  40,  65 },
2051   {  24,  42,  60 }, {  24,  42,  65 }, {  24,  57,  60 }, {  24,  57,  65 },
2052   {  24,  60,  65 }, {  25,  27,  37 }, {  25,  27,  43 }, {  25,  27,  66 },
2053   {  25,  28,  38 }, {  25,  28,  43 }, {  25,  28,  67 }, {  25,  37,  58 },
2054   {  25,  37,  66 }, {  25,  38,  58 }, {  25,  38,  67 }, {  25,  43,  66 },
2055   {  25,  43,  67 }, {  25,  58,  66 }, {  25,  58,  67 }, {  25,  66,  67 },
2056   {  26,  29,  39 }, {  26,  29,  44 }, {  26,  29,  68 }, {  26,  30,  40 },
2057   {  26,  30,  44 }, {  26,  30,  69 }, {  26,  39,  61 }, {  26,  39,  68 },
2058   {  26,  40,  61 }, {  26,  40,  69 }, {  26,  44,  68 }, {  26,  44,  69 },
2059   {  26,  61,  68 }, {  26,  61,  69 }, {  26,  68,  69 }, {  27,  31,  41 },
2060   {  27,  31,  43 }, {  27,  31,  70 }, {  27,  37,  62 }, {  27,  37,  66 },
2061   {  27,  41,  62 }, {  27,  41,  70 }, {  27,  43,  66 }, {  27,  43,  70 },
2062   {  27,  62,  66 }, {  27,  62,  70 }, {  27,  66,  70 }, {  28,  32,  42 },
2063   {  28,  32,  43 }, {  28,  32,  71 }, {  28,  38,  63 }, {  28,  38,  67 },
2064   {  28,  42,  63 }, {  28,  42,  71 }, {  28,  43,  67 }, {  28,  43,  71 },
2065   {  28,  63,  67 }, {  28,  63,  71 }, {  28,  67,  71 }, {  29,  31,  41 },
2066   {  29,  31,  44 }, {  29,  31,  72 }, {  29,  39,  64 }, {  29,  39,  68 },
2067   {  29,  41,  64 }, {  29,  41,  72 }, {  29,  44,  68 }, {  29,  44,  72 },
2068   {  29,  64,  68 }, {  29,  64,  72 }, {  29,  68,  72 }, {  30,  32,  42 },
2069   {  30,  32,  44 }, {  30,  32,  73 }, {  30,  40,  65 }, {  30,  40,  69 },
2070   {  30,  42,  65 }, {  30,  42,  73 }, {  30,  44,  69 }, {  30,  44,  73 },
2071   {  30,  65,  69 }, {  30,  65,  73 }, {  30,  69,  73 }, {  31,  32,  43 },
2072   {  31,  32,  44 }, {  31,  32,  74 }, {  31,  41,  70 }, {  31,  41,  72 },
2073   {  31,  43,  70 }, {  31,  43,  74 }, {  31,  44,  72 }, {  31,  44,  74 },
2074   {  31,  70,  72 }, {  31,  70,  74 }, {  31,  72,  74 }, {  32,  42,  71 },
2075   {  32,  42,  73 }, {  32,  43,  71 }, {  32,  43,  74 }, {  32,  44,  73 },
2076   {  32,  44,  74 }, {  32,  71,  73 }, {  32,  71,  74 }, {  32,  73,  74 },
2077   {  33,  45,  46 }, {  33,  45,  47 }, {  33,  45,  75 }, {  33,  46,  50 },
2078   {  33,  46,  75 }, {  33,  47,  51 }, {  33,  47,  75 }, {  33,  50,  51 },
2079   {  33,  50,  75 }, {  33,  51,  75 }, {  34,  45,  48 }, {  34,  45,  49 },
2080   {  34,  45,  76 }, {  34,  48,  52 }, {  34,  48,  76 }, {  34,  49,  53 },
2081   {  34,  49,  76 }, {  34,  52,  53 }, {  34,  52,  76 }, {  34,  53,  76 },
2082   {  35,  46,  48 }, {  35,  46,  54 }, {  35,  46,  77 }, {  35,  48,  56 },
2083   {  35,  48,  77 }, {  35,  54,  59 }, {  35,  54,  77 }, {  35,  56,  59 },
2084   {  35,  56,  77 }, {  35,  59,  77 }, {  36,  47,  49 }, {  36,  47,  55 },
2085   {  36,  47,  78 }, {  36,  49,  57 }, {  36,  49,  78 }, {  36,  55,  60 },
2086   {  36,  55,  78 }, {  36,  57,  60 }, {  36,  57,  78 }, {  36,  60,  78 },
2087   {  37,  50,  54 }, {  37,  50,  58 }, {  37,  50,  79 }, {  37,  54,  62 },
2088   {  37,  54,  79 }, {  37,  58,  66 }, {  37,  58,  79 }, {  37,  62,  66 },
2089   {  37,  62,  79 }, {  37,  66,  79 }, {  38,  51,  55 }, {  38,  51,  58 },
2090   {  38,  51,  80 }, {  38,  55,  63 }, {  38,  55,  80 }, {  38,  58,  67 },
2091   {  38,  58,  80 }, {  38,  63,  67 }, {  38,  63,  80 }, {  38,  67,  80 },
2092   {  39,  52,  56 }, {  39,  52,  61 }, {  39,  52,  81 }, {  39,  56,  64 },
2093   {  39,  56,  81 }, {  39,  61,  68 }, {  39,  61,  81 }, {  39,  64,  68 },
2094   {  39,  64,  81 }, {  39,  68,  81 }, {  40,  53,  57 }, {  40,  53,  61 },
2095   {  40,  53,  82 }, {  40,  57,  65 }, {  40,  57,  82 }, {  40,  61,  69 },
2096   {  40,  61,  82 }, {  40,  65,  69 }, {  40,  65,  82 }, {  40,  69,  82 },
2097   {  41,  59,  62 }, {  41,  59,  64 }, {  41,  59,  83 }, {  41,  62,  70 },
2098   {  41,  62,  83 }, {  41,  64,  72 }, {  41,  64,  83 }, {  41,  70,  72 },
2099   {  41,  70,  83 }, {  41,  72,  83 }, {  42,  60,  63 }, {  42,  60,  65 },
2100   {  42,  60,  84 }, {  42,  63,  71 }, {  42,  63,  84 }, {  42,  65,  73 },
2101   {  42,  65,  84 }, {  42,  71,  73 }, {  42,  71,  84 }, {  42,  73,  84 },
2102   {  43,  66,  67 }, {  43,  66,  70 }, {  43,  66,  85 }, {  43,  67,  71 },
2103   {  43,  67,  85 }, {  43,  70,  74 }, {  43,  70,  85 }, {  43,  71,  74 },
2104   {  43,  71,  85 }, {  43,  74,  85 }, {  44,  68,  69 }, {  44,  68,  72 },
2105   {  44,  68,  86 }, {  44,  69,  73 }, {  44,  69,  86 }, {  44,  72,  74 },
2106   {  44,  72,  86 }, {  44,  73,  74 }, {  44,  73,  86 }, {  44,  74,  86 },
2107   {  45,  46,  48 }, {  45,  46,  75 }, {  45,  46,  87 }, {  45,  47,  49 },
2108   {  45,  47,  75 }, {  45,  47,  88 }, {  45,  48,  76 }, {  45,  48,  87 },
2109   {  45,  49,  76 }, {  45,  49,  88 }, {  45,  75,  87 }, {  45,  75,  88 },
2110   {  45,  76,  87 }, {  45,  76,  88 }, {  45,  87,  88 }, {  46,  48,  77 },
2111   {  46,  48,  87 }, {  46,  50,  54 }, {  46,  50,  75 }, {  46,  50,  89 },
2112   {  46,  54,  77 }, {  46,  54,  89 }, {  46,  75,  87 }, {  46,  75,  89 },
2113   {  46,  77,  87 }, {  46,  77,  89 }, {  46,  87,  89 }, {  47,  49,  78 },
2114   {  47,  49,  88 }, {  47,  51,  55 }, {  47,  51,  75 }, {  47,  51,  90 },
2115   {  47,  55,  78 }, {  47,  55,  90 }, {  47,  75,  88 }, {  47,  75,  90 },
2116   {  47,  78,  88 }, {  47,  78,  90 }, {  47,  88,  90 }, {  48,  52,  56 },
2117   {  48,  52,  76 }, {  48,  52,  91 }, {  48,  56,  77 }, {  48,  56,  91 },
2118   {  48,  76,  87 }, {  48,  76,  91 }, {  48,  77,  87 }, {  48,  77,  91 },
2119   {  48,  87,  91 }, {  49,  53,  57 }, {  49,  53,  76 }, {  49,  53,  92 },
2120   {  49,  57,  78 }, {  49,  57,  92 }, {  49,  76,  88 }, {  49,  76,  92 },
2121   {  49,  78,  88 }, {  49,  78,  92 }, {  49,  88,  92 }, {  50,  51,  58 },
2122   {  50,  51,  75 }, {  50,  51,  93 }, {  50,  54,  79 }, {  50,  54,  89 },
2123   {  50,  58,  79 }, {  50,  58,  93 }, {  50,  75,  89 }, {  50,  75,  93 },
2124   {  50,  79,  89 }, {  50,  79,  93 }, {  50,  89,  93 }, {  51,  55,  80 },
2125   {  51,  55,  90 }, {  51,  58,  80 }, {  51,  58,  93 }, {  51,  75,  90 },
2126   {  51,  75,  93 }, {  51,  80,  90 }, {  51,  80,  93 }, {  51,  90,  93 },
2127   {  52,  53,  61 }, {  52,  53,  76 }, {  52,  53,  94 }, {  52,  56,  81 },
2128   {  52,  56,  91 }, {  52,  61,  81 }, {  52,  61,  94 }, {  52,  76,  91 },
2129   {  52,  76,  94 }, {  52,  81,  91 }, {  52,  81,  94 }, {  52,  91,  94 },
2130   {  53,  57,  82 }, {  53,  57,  92 }, {  53,  61,  82 }, {  53,  61,  94 },
2131   {  53,  76,  92 }, {  53,  76,  94 }, {  53,  82,  92 }, {  53,  82,  94 },
2132   {  53,  92,  94 }, {  54,  59,  62 }, {  54,  59,  77 }, {  54,  59,  95 },
2133   {  54,  62,  79 }, {  54,  62,  95 }, {  54,  77,  89 }, {  54,  77,  95 },
2134   {  54,  79,  89 }, {  54,  79,  95 }, {  54,  89,  95 }, {  55,  60,  63 },
2135   {  55,  60,  78 }, {  55,  60,  96 }, {  55,  63,  80 }, {  55,  63,  96 },
2136   {  55,  78,  90 }, {  55,  78,  96 }, {  55,  80,  90 }, {  55,  80,  96 },
2137   {  55,  90,  96 }, {  56,  59,  64 }, {  56,  59,  77 }, {  56,  59,  97 },
2138   {  56,  64,  81 }, {  56,  64,  97 }, {  56,  77,  91 }, {  56,  77,  97 },
2139   {  56,  81,  91 }, {  56,  81,  97 }, {  56,  91,  97 }, {  57,  60,  65 },
2140   {  57,  60,  78 }, {  57,  60,  98 }, {  57,  65,  82 }, {  57,  65,  98 },
2141   {  57,  78,  92 }, {  57,  78,  98 }, {  57,  82,  92 }, {  57,  82,  98 },
2142   {  57,  92,  98 }, {  58,  66,  67 }, {  58,  66,  79 }, {  58,  66,  99 },
2143   {  58,  67,  80 }, {  58,  67,  99 }, {  58,  79,  93 }, {  58,  79,  99 },
2144   {  58,  80,  93 }, {  58,  80,  99 }, {  58,  93,  99 }, {  59,  62,  83 },
2145   {  59,  62,  95 }, {  59,  64,  83 }, {  59,  64,  97 }, {  59,  77,  95 },
2146   {  59,  77,  97 }, {  59,  83,  95 }, {  59,  83,  97 }, {  59,  95,  97 },
2147   {  60,  63,  84 }, {  60,  63,  96 }, {  60,  65,  84 }, {  60,  65,  98 },
2148   {  60,  78,  96 }, {  60,  78,  98 }, {  60,  84,  96 }, {  60,  84,  98 },
2149   {  60,  96,  98 }, {  61,  68,  69 }, {  61,  68,  81 }, {  61,  68, 100 },
2150   {  61,  69,  82 }, {  61,  69, 100 }, {  61,  81,  94 }, {  61,  81, 100 },
2151   {  61,  82,  94 }, {  61,  82, 100 }, {  61,  94, 100 }, {  62,  66,  70 },
2152   {  62,  66,  79 }, {  62,  66, 101 }, {  62,  70,  83 }, {  62,  70, 101 },
2153   {  62,  79,  95 }, {  62,  79, 101 }, {  62,  83,  95 }, {  62,  83, 101 },
2154   {  62,  95, 101 }, {  63,  67,  71 }, {  63,  67,  80 }, {  63,  67, 102 },
2155   {  63,  71,  84 }, {  63,  71, 102 }, {  63,  80,  96 }, {  63,  80, 102 },
2156   {  63,  84,  96 }, {  63,  84, 102 }, {  63,  96, 102 }, {  64,  68,  72 },
2157   {  64,  68,  81 }, {  64,  68, 103 }, {  64,  72,  83 }, {  64,  72, 103 },
2158   {  64,  81,  97 }, {  64,  81, 103 }, {  64,  83,  97 }, {  64,  83, 103 },
2159   {  64,  97, 103 }, {  65,  69,  73 }, {  65,  69,  82 }, {  65,  69, 104 },
2160   {  65,  73,  84 }, {  65,  73, 104 }, {  65,  82,  98 }, {  65,  82, 104 },
2161   {  65,  84,  98 }, {  65,  84, 104 }, {  65,  98, 104 }, {  66,  67,  85 },
2162   {  66,  67,  99 }, {  66,  70,  85 }, {  66,  70, 101 }, {  66,  79,  99 },
2163   {  66,  79, 101 }, {  66,  85,  99 }, {  66,  85, 101 }, {  66,  99, 101 },
2164   {  67,  71,  85 }, {  67,  71, 102 }, {  67,  80,  99 }, {  67,  80, 102 },
2165   {  67,  85,  99 }, {  67,  85, 102 }, {  67,  99, 102 }, {  68,  69,  86 },
2166   {  68,  69, 100 }, {  68,  72,  86 }, {  68,  72, 103 }, {  68,  81, 100 },
2167   {  68,  81, 103 }, {  68,  86, 100 }, {  68,  86, 103 }, {  68, 100, 103 },
2168   {  69,  73,  86 }, {  69,  73, 104 }, {  69,  82, 100 }, {  69,  82, 104 },
2169   {  69,  86, 100 }, {  69,  86, 104 }, {  69, 100, 104 }, {  70,  72,  74 },
2170   {  70,  72,  83 }, {  70,  72, 105 }, {  70,  74,  85 }, {  70,  74, 105 },
2171   {  70,  83, 101 }, {  70,  83, 105 }, {  70,  85, 101 }, {  70,  85, 105 },
2172   {  70, 101, 105 }, {  71,  73,  74 }, {  71,  73,  84 }, {  71,  73, 106 },
2173   {  71,  74,  85 }, {  71,  74, 106 }, {  71,  84, 102 }, {  71,  84, 106 },
2174   {  71,  85, 102 }, {  71,  85, 106 }, {  71, 102, 106 }, {  72,  74,  86 },
2175   {  72,  74, 105 }, {  72,  83, 103 }, {  72,  83, 105 }, {  72,  86, 103 },
2176   {  72,  86, 105 }, {  72, 103, 105 }, {  73,  74,  86 }, {  73,  74, 106 },
2177   {  73,  84, 104 }, {  73,  84, 106 }, {  73,  86, 104 }, {  73,  86, 106 },
2178   {  73, 104, 106 }, {  74,  85, 105 }, {  74,  85, 106 }, {  74,  86, 105 },
2179   {  74,  86, 106 }, {  74, 105, 106 }, {  75,  87,  88 }, {  75,  87,  89 },
2180   {  75,  87, 107 }, {  75,  88,  90 }, {  75,  88, 107 }, {  75,  89,  93 },
2181   {  75,  89, 107 }, {  75,  90,  93 }, {  75,  90, 107 }, {  75,  93, 107 },
2182   {  76,  87,  88 }, {  76,  87,  91 }, {  76,  87, 108 }, {  76,  88,  92 },
2183   {  76,  88, 108 }, {  76,  91,  94 }, {  76,  91, 108 }, {  76,  92,  94 },
2184   {  76,  92, 108 }, {  76,  94, 108 }, {  77,  87,  89 }, {  77,  87,  91 },
2185   {  77,  87, 109 }, {  77,  89,  95 }, {  77,  89, 109 }, {  77,  91,  97 },
2186   {  77,  91, 109 }, {  77,  95,  97 }, {  77,  95, 109 }, {  77,  97, 109 },
2187   {  78,  88,  90 }, {  78,  88,  92 }, {  78,  88, 110 }, {  78,  90,  96 },
2188   {  78,  90, 110 }, {  78,  92,  98 }, {  78,  92, 110 }, {  78,  96,  98 },
2189   {  78,  96, 110 }, {  78,  98, 110 }, {  79,  89,  93 }, {  79,  89,  95 },
2190   {  79,  89, 111 }, {  79,  93,  99 }, {  79,  93, 111 }, {  79,  95, 101 },
2191   {  79,  95, 111 }, {  79,  99, 101 }, {  79,  99, 111 }, {  79, 101, 111 },
2192   {  80,  90,  93 }, {  80,  90,  96 }, {  80,  90, 112 }, {  80,  93,  99 },
2193   {  80,  93, 112 }, {  80,  96, 102 }, {  80,  96, 112 }, {  80,  99, 102 },
2194   {  80,  99, 112 }, {  80, 102, 112 }, {  81,  91,  94 }, {  81,  91,  97 },
2195   {  81,  91, 113 }, {  81,  94, 100 }, {  81,  94, 113 }, {  81,  97, 103 },
2196   {  81,  97, 113 }, {  81, 100, 103 }, {  81, 100, 113 }, {  81, 103, 113 },
2197   {  82,  92,  94 }, {  82,  92,  98 }, {  82,  92, 114 }, {  82,  94, 100 },
2198   {  82,  94, 114 }, {  82,  98, 104 }, {  82,  98, 114 }, {  82, 100, 104 },
2199   {  82, 100, 114 }, {  82, 104, 114 }, {  83,  95,  97 }, {  83,  95, 101 },
2200   {  83,  95, 115 }, {  83,  97, 103 }, {  83,  97, 115 }, {  83, 101, 105 },
2201   {  83, 101, 115 }, {  83, 103, 105 }, {  83, 103, 115 }, {  83, 105, 115 },
2202   {  84,  96,  98 }, {  84,  96, 102 }, {  84,  96, 116 }, {  84,  98, 104 },
2203   {  84,  98, 116 }, {  84, 102, 106 }, {  84, 102, 116 }, {  84, 104, 106 },
2204   {  84, 104, 116 }, {  84, 106, 116 }, {  85,  99, 101 }, {  85,  99, 102 },
2205   {  85,  99, 117 }, {  85, 101, 105 }, {  85, 101, 117 }, {  85, 102, 106 },
2206   {  85, 102, 117 }, {  85, 105, 106 }, {  85, 105, 117 }, {  85, 106, 117 },
2207   {  86, 100, 103 }, {  86, 100, 104 }, {  86, 100, 118 }, {  86, 103, 105 },
2208   {  86, 103, 118 }, {  86, 104, 106 }, {  86, 104, 118 }, {  86, 105, 106 },
2209   {  86, 105, 118 }, {  86, 106, 118 }, {  87,  88, 107 }, {  87,  88, 108 },
2210   {  87,  89, 107 }, {  87,  89, 109 }, {  87,  91, 108 }, {  87,  91, 109 },
2211   {  87, 107, 108 }, {  87, 107, 109 }, {  87, 108, 109 }, {  88,  90, 107 },
2212   {  88,  90, 110 }, {  88,  92, 108 }, {  88,  92, 110 }, {  88, 107, 108 },
2213   {  88, 107, 110 }, {  88, 108, 110 }, {  89,  93, 107 }, {  89,  93, 111 },
2214   {  89,  95, 109 }, {  89,  95, 111 }, {  89, 107, 109 }, {  89, 107, 111 },
2215   {  89, 109, 111 }, {  90,  93, 107 }, {  90,  93, 112 }, {  90,  96, 110 },
2216   {  90,  96, 112 }, {  90, 107, 110 }, {  90, 107, 112 }, {  90, 110, 112 },
2217   {  91,  94, 108 }, {  91,  94, 113 }, {  91,  97, 109 }, {  91,  97, 113 },
2218   {  91, 108, 109 }, {  91, 108, 113 }, {  91, 109, 113 }, {  92,  94, 108 },
2219   {  92,  94, 114 }, {  92,  98, 110 }, {  92,  98, 114 }, {  92, 108, 110 },
2220   {  92, 108, 114 }, {  92, 110, 114 }, {  93,  99, 111 }, {  93,  99, 112 },
2221   {  93, 107, 111 }, {  93, 107, 112 }, {  93, 111, 112 }, {  94, 100, 113 },
2222   {  94, 100, 114 }, {  94, 108, 113 }, {  94, 108, 114 }, {  94, 113, 114 },
2223   {  95,  97, 109 }, {  95,  97, 115 }, {  95, 101, 111 }, {  95, 101, 115 },
2224   {  95, 109, 111 }, {  95, 109, 115 }, {  95, 111, 115 }, {  96,  98, 110 },
2225   {  96,  98, 116 }, {  96, 102, 112 }, {  96, 102, 116 }, {  96, 110, 112 },
2226   {  96, 110, 116 }, {  96, 112, 116 }, {  97, 103, 113 }, {  97, 103, 115 },
2227   {  97, 109, 113 }, {  97, 109, 115 }, {  97, 113, 115 }, {  98, 104, 114 },
2228   {  98, 104, 116 }, {  98, 110, 114 }, {  98, 110, 116 }, {  98, 114, 116 },
2229   {  99, 101, 111 }, {  99, 101, 117 }, {  99, 102, 112 }, {  99, 102, 117 },
2230   {  99, 111, 112 }, {  99, 111, 117 }, {  99, 112, 117 }, { 100, 103, 113 },
2231   { 100, 103, 118 }, { 100, 104, 114 }, { 100, 104, 118 }, { 100, 113, 114 },
2232   { 100, 113, 118 }, { 100, 114, 118 }, { 101, 105, 115 }, { 101, 105, 117 },
2233   { 101, 111, 115 }, { 101, 111, 117 }, { 101, 115, 117 }, { 102, 106, 116 },
2234   { 102, 106, 117 }, { 102, 112, 116 }, { 102, 112, 117 }, { 102, 116, 117 },
2235   { 103, 105, 115 }, { 103, 105, 118 }, { 103, 113, 115 }, { 103, 113, 118 },
2236   { 103, 115, 118 }, { 104, 106, 116 }, { 104, 106, 118 }, { 104, 114, 116 },
2237   { 104, 114, 118 }, { 104, 116, 118 }, { 105, 106, 117 }, { 105, 106, 118 },
2238   { 105, 115, 117 }, { 105, 115, 118 }, { 105, 117, 118 }, { 106, 116, 117 },
2239   { 106, 116, 118 }, { 106, 117, 118 }, { 107, 108, 109 }, { 107, 108, 110 },
2240   { 107, 108, 119 }, { 107, 109, 111 }, { 107, 109, 119 }, { 107, 110, 112 },
2241   { 107, 110, 119 }, { 107, 111, 112 }, { 107, 111, 119 }, { 107, 112, 119 },
2242   { 108, 109, 113 }, { 108, 109, 119 }, { 108, 110, 114 }, { 108, 110, 119 },
2243   { 108, 113, 114 }, { 108, 113, 119 }, { 108, 114, 119 }, { 109, 111, 115 },
2244   { 109, 111, 119 }, { 109, 113, 115 }, { 109, 113, 119 }, { 109, 115, 119 },
2245   { 110, 112, 116 }, { 110, 112, 119 }, { 110, 114, 116 }, { 110, 114, 119 },
2246   { 110, 116, 119 }, { 111, 112, 117 }, { 111, 112, 119 }, { 111, 115, 117 },
2247   { 111, 115, 119 }, { 111, 117, 119 }, { 112, 116, 117 }, { 112, 116, 119 },
2248   { 112, 117, 119 }, { 113, 114, 118 }, { 113, 114, 119 }, { 113, 115, 118 },
2249   { 113, 115, 119 }, { 113, 118, 119 }, { 114, 116, 118 }, { 114, 116, 119 },
2250   { 114, 118, 119 }, { 115, 117, 118 }, { 115, 117, 119 }, { 115, 118, 119 },
2251   { 116, 117, 118 }, { 116, 117, 119 }, { 116, 118, 119 }, { 117, 118, 119 }
2252 };
2253
2254
2255
2256 /* Add a rotation around the wx-plane to the matrix m. */
2257 static void rotatewx(float m[4][4], float phi)
2258 {
2259   float c, s, u, v;
2260   int i;
2261
2262   phi *= M_PI/180.0;
2263   c = cos(phi);
2264   s = sin(phi);
2265   for (i=0; i<4; i++)
2266   {
2267     u = m[i][1];
2268     v = m[i][2];
2269     m[i][1] = c*u+s*v;
2270     m[i][2] = -s*u+c*v;
2271   }
2272 }
2273
2274
2275 /* Add a rotation around the wy-plane to the matrix m. */
2276 static void rotatewy(float m[4][4], float phi)
2277 {
2278   float c, s, u, v;
2279   int i;
2280
2281   phi *= M_PI/180.0;
2282   c = cos(phi);
2283   s = sin(phi);
2284   for (i=0; i<4; i++)
2285   {
2286     u = m[i][0];
2287     v = m[i][2];
2288     m[i][0] = c*u-s*v;
2289     m[i][2] = s*u+c*v;
2290   }
2291 }
2292
2293
2294 /* Add a rotation around the wz-plane to the matrix m. */
2295 static void rotatewz(float m[4][4], float phi)
2296 {
2297   float c, s, u, v;
2298   int i;
2299
2300   phi *= M_PI/180.0;
2301   c = cos(phi);
2302   s = sin(phi);
2303   for (i=0; i<4; i++)
2304   {
2305     u = m[i][0];
2306     v = m[i][1];
2307     m[i][0] = c*u+s*v;
2308     m[i][1] = -s*u+c*v;
2309   }
2310 }
2311
2312
2313 /* Add a rotation around the xy-plane to the matrix m. */
2314 static void rotatexy(float m[4][4], float phi)
2315 {
2316   float c, s, u, v;
2317   int i;
2318
2319   phi *= M_PI/180.0;
2320   c = cos(phi);
2321   s = sin(phi);
2322   for (i=0; i<4; i++)
2323   {
2324     u = m[i][2];
2325     v = m[i][3];
2326     m[i][2] = c*u+s*v;
2327     m[i][3] = -s*u+c*v;
2328   }
2329 }
2330
2331
2332 /* Add a rotation around the xz-plane to the matrix m. */
2333 static void rotatexz(float m[4][4], float phi)
2334 {
2335   float c, s, u, v;
2336   int i;
2337
2338   phi *= M_PI/180.0;
2339   c = cos(phi);
2340   s = sin(phi);
2341   for (i=0; i<4; i++)
2342   {
2343     u = m[i][1];
2344     v = m[i][3];
2345     m[i][1] = c*u-s*v;
2346     m[i][3] = s*u+c*v;
2347   }
2348 }
2349
2350
2351 /* Add a rotation around the yz-plane to the matrix m. */
2352 static void rotateyz(float m[4][4], float phi)
2353 {
2354   float c, s, u, v;
2355   int i;
2356
2357   phi *= M_PI/180.0;
2358   c = cos(phi);
2359   s = sin(phi);
2360   for (i=0; i<4; i++)
2361   {
2362     u = m[i][0];
2363     v = m[i][3];
2364     m[i][0] = c*u-s*v;
2365     m[i][3] = s*u+c*v;
2366   }
2367 }
2368
2369
2370 /* Compute the rotation matrix m from the rotation angles. */
2371 static void rotateall(float al, float be, float de, float ze, float et,
2372                       float th, float m[4][4])
2373 {
2374   int i, j;
2375
2376   for (i=0; i<4; i++)
2377     for (j=0; j<4; j++)
2378       m[i][j] = (i==j);
2379   rotatewx(m,al);
2380   rotatewy(m,be);
2381   rotatewz(m,de);
2382   rotatexz(m,et);
2383   rotatexy(m,ze);
2384   rotateyz(m,th);
2385 }
2386
2387
2388 /* Multiply two rotation matrices: o=m*n. */
2389 static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
2390 {
2391   int i, j, k;
2392
2393   for (i=0; i<4; i++)
2394   {
2395     for (j=0; j<4; j++)
2396     {
2397       o[i][j] = 0.0;
2398       for (k=0; k<4; k++)
2399         o[i][j] += m[i][k]*n[k][j];
2400     }
2401   }
2402 }
2403
2404
2405 /* Compute a 4D rotation matrix from two unit quaternions. */
2406 static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
2407 {
2408   double al, be, de, ze, et, th;
2409   double r00, r01, r02, r12, r22;
2410
2411   r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
2412   r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
2413   r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
2414   r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
2415   r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
2416
2417   al = atan2(-r12,r22)*180.0/M_PI;
2418   be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
2419   de = atan2(-r01,r00)*180.0/M_PI;
2420
2421   r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
2422   r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
2423   r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
2424   r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
2425   r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
2426
2427   et = atan2(-r12,r22)*180.0/M_PI;
2428   th = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
2429   ze = atan2(-r01,r00)*180.0/M_PI;
2430
2431   rotateall(al,be,de,ze,et,-th,m);
2432 }
2433
2434
2435 /* Compute the normal vector of a plane based on three points in the plane. */
2436 static void normal(const float *p, const float *q, const float *r, 
2437                    float *n)
2438 {
2439   float u[3], v[3], t;
2440
2441   u[0] = q[0]-p[0];
2442   u[1] = q[1]-p[1];
2443   u[2] = q[2]-p[2];
2444   v[0] = r[0]-p[0];
2445   v[1] = r[1]-p[1];
2446   v[2] = r[2]-p[2];
2447   n[0] = u[1]*v[2]-u[2]*v[1];
2448   n[1] = u[2]*v[0]-u[0]*v[2];
2449   n[2] = u[0]*v[1]-u[1]*v[0];
2450   t = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
2451   n[0] /= t;
2452   n[1] /= t;
2453   n[2] /= t;
2454 }
2455
2456
2457 /* Project an array of vertices from 4d to 3d. */
2458 static void project(ModeInfo *mi, const float vert[][4], float v[][4], int num)
2459 {
2460   float s, q1[4], q2[4], r1[4][4], r2[4][4], m[4][4];
2461   int i, j, k;
2462   polytopesstruct *pp = &poly[MI_SCREEN(mi)];
2463
2464   rotateall(pp->alpha,pp->beta,pp->delta,pp->zeta,pp->eta,pp->theta,r1);
2465
2466   gltrackball_get_quaternion(pp->trackballs[0],q1);
2467   gltrackball_get_quaternion(pp->trackballs[1],q2);
2468   quats_to_rotmat(q1,q2,r2);
2469
2470   mult_rotmat(r2,r1,m);
2471
2472   /* Project the vertices from 4d to 3d. */
2473   for (i=0; i<num; i++)
2474   {
2475     for (j=0; j<4; j++)
2476     {
2477       s = 0.0;
2478       for (k=0; k<4; k++)
2479         s += m[j][k]*vert[i][k];
2480       v[i][j] = s+offset4d[j];
2481     }
2482     if (projection_4d == DISP_4D_ORTHOGRAPHIC)
2483     {
2484       for (j=0; j<3; j++)
2485         v[i][j] /= 2.0;
2486       v[i][3] = 1.0;
2487     }
2488     else
2489     {
2490       for (j=0; j<4; j++)
2491         v[i][j] /= v[i][3];
2492     }
2493   }
2494
2495   /* Move the projected vertices along the z-axis so that they become visible
2496      in the viewport. */
2497   for (i=0; i<num; i++)
2498   {
2499     for (j=0; j<4; j++)
2500       v[i][j] += offset3d[j];
2501   }
2502 }
2503
2504
2505 /* Draw a single polytope. */
2506 static void draw(ModeInfo *mi,
2507                  float v[][4], 
2508                  const int edge[][2], int num_edge, 
2509                  const int face[], int num_face, 
2510                  int vert_per_face, 
2511                  float edge_color[][4], 
2512                  float face_color[][4], 
2513                  float face_color_trans[][4])
2514 {
2515   int i, j;
2516   float n[3];
2517   GLfloat red[4] = { 1.0, 0.0, 0.0, 1.0 };
2518   GLfloat red_trans[4] = { 1.0, 0.0, 0.0, 1.0 };
2519
2520   mi->polygon_count = 0;
2521   if (display_mode == DISP_WIREFRAME)
2522   {
2523     if (color_mode == COLORS_SINGLE)
2524       glColor4fv(red);
2525     glBegin(GL_LINES);
2526     for (i=0; i<num_edge; i++)
2527     {
2528       if (color_mode == COLORS_DEPTH)
2529         glColor4fv(edge_color[i]);
2530       glVertex4fv(v[edge[i][0]]);
2531       glVertex4fv(v[edge[i][1]]);
2532     }
2533     glEnd();
2534     mi->polygon_count = num_edge;
2535   }
2536   else
2537   {
2538     if (color_mode == COLORS_SINGLE)
2539     {
2540       red_trans[3] = face_color_trans[0][3]/2.0;
2541       if (display_mode == DISP_TRANSPARENT)
2542         glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,red_trans);
2543       else
2544         glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,red);
2545     }
2546     for (i=0; i<num_face; i++)
2547     {
2548       glBegin(GL_POLYGON);
2549       if (color_mode == COLORS_DEPTH)
2550       {
2551         if (display_mode == DISP_TRANSPARENT)
2552           glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
2553                        face_color_trans[i]);
2554         else
2555           glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
2556                        face_color[i]);
2557       }
2558       normal(v[face[i*vert_per_face]],v[face[i*vert_per_face+1]],
2559              v[face[i*vert_per_face+2]],n);
2560       glNormal3fv(n);
2561       for (j=0; j<vert_per_face; j++)
2562         glVertex4fv(v[face[i*vert_per_face+j]]);
2563       glEnd();
2564     }
2565     mi->polygon_count = num_face;
2566   }
2567 }
2568
2569
2570 /* Draw a 5-cell {3,3,3} projected into 3d. */
2571 static void cell_5(ModeInfo *mi)
2572 {
2573   polytopesstruct *hp = &poly[MI_SCREEN(mi)];
2574   float v[NUM_VERT_5][4];
2575
2576   project(mi,vert_5,v,NUM_VERT_5);
2577   draw(mi,v,edge_5,NUM_EDGE_5,(int *)face_5,NUM_FACE_5,
2578        VERT_PER_FACE_5,hp->edge_color_5,hp->face_color_5,
2579        hp->face_color_trans_5);
2580 }
2581
2582
2583 /* Draw a 8-cell {4,3,3} projected into 3d. */
2584 static void cell_8(ModeInfo *mi)
2585 {
2586   polytopesstruct *hp = &poly[MI_SCREEN(mi)];
2587   float v[NUM_VERT_8][4];
2588
2589   project(mi,vert_8,v,NUM_VERT_8);
2590   draw(mi,v,edge_8,NUM_EDGE_8,(int *)face_8,NUM_FACE_8,
2591        VERT_PER_FACE_8,hp->edge_color_8,hp->face_color_8,
2592        hp->face_color_trans_8);
2593 }
2594
2595
2596 /* Draw a 16-cell {3,3,4} projected into 3d. */
2597 static void cell_16(ModeInfo *mi)
2598 {
2599   polytopesstruct *hp = &poly[MI_SCREEN(mi)];
2600   float v[NUM_VERT_16][4];
2601
2602   project(mi,vert_16,v,NUM_VERT_16);
2603   draw(mi,v,edge_16,NUM_EDGE_16,(int *)face_16,NUM_FACE_16,
2604        VERT_PER_FACE_16,hp->edge_color_16,hp->face_color_16,
2605        hp->face_color_trans_16);
2606 }
2607
2608
2609 /* Draw a 24-cell {3,4,3} projected into 3d. */
2610 static void cell_24(ModeInfo *mi)
2611 {
2612   polytopesstruct *hp = &poly[MI_SCREEN(mi)];
2613   float v[NUM_VERT_24][4];
2614
2615   project(mi,vert_24,v,NUM_VERT_24);
2616   draw(mi,v,edge_24,NUM_EDGE_24,(int *)face_24,NUM_FACE_24,
2617        VERT_PER_FACE_24,hp->edge_color_24,hp->face_color_24,
2618        hp->face_color_trans_24);
2619 }
2620
2621
2622 /* Draw a 120-cell {5,3,3} projected into 3d. */
2623 static void cell_120(ModeInfo *mi)
2624 {
2625   polytopesstruct *hp = &poly[MI_SCREEN(mi)];
2626   float v[NUM_VERT_120][4];
2627
2628   project(mi,vert_120,v,NUM_VERT_120);
2629   draw(mi,v,edge_120,NUM_EDGE_120,(int *)face_120,NUM_FACE_120,
2630        VERT_PER_FACE_120,hp->edge_color_120,hp->face_color_120,
2631        hp->face_color_trans_120);
2632 }
2633
2634
2635 /* Draw a 600-cell {3,3,5} projected into 3d. */
2636 static void cell_600(ModeInfo *mi)
2637 {
2638   polytopesstruct *hp = &poly[MI_SCREEN(mi)];
2639   float v[NUM_VERT_600][4];
2640
2641   project(mi,vert_600,v,NUM_VERT_600);
2642   draw(mi,v,edge_600,NUM_EDGE_600,(int *)face_600,NUM_FACE_600,
2643        VERT_PER_FACE_600,hp->edge_color_600,hp->face_color_600,
2644        hp->face_color_trans_600);
2645 }
2646
2647
2648 /* Compute a color based on the w-depth of a point. */
2649 static void color(float depth, float alpha, float min, float max,
2650                   float color[4])
2651 {
2652   double d, t;
2653   int s;
2654
2655   d = (depth-min)/(max-min);
2656   s = floor(d*4.0);
2657   t = d*4.0-s;
2658   if (s < 0)
2659     s += 6;
2660   if (s >= 6)
2661     s -= 6;
2662   switch (s)
2663   {
2664     case 0:
2665       color[0] = 1.0;
2666       color[1] = t;
2667       color[2] = 0.0;
2668       break;
2669     case 1:
2670       color[0] = 1.0-t;
2671       color[1] = 1.0;
2672       color[2] = 0.0;
2673       break;
2674     case 2:
2675       color[0] = 0.0;
2676       color[1] = 1.0;
2677       color[2] = t;
2678       break;
2679     case 3:
2680       color[0] = 0.0;
2681       color[1] = 1.0-t;
2682       color[2] = 1.0;
2683       break;
2684     case 4:
2685       color[0] = t;
2686       color[1] = 0.0;
2687       color[2] = 1.0;
2688       break;
2689     case 5:
2690       color[0] = 1.0;
2691       color[1] = 0.0;
2692       color[2] = 1.0-t;
2693       break;
2694   }
2695   color[3] = alpha;
2696 }
2697
2698
2699 /* Set the colors of a single polytope's edges and faces. */
2700 static void colors(const float vert[][4], 
2701                    const int edge[][2], int num_edge, 
2702                    const int face[], int num_face, 
2703                    int vert_per_face, 
2704                    float edge_color[][4], 
2705                    float face_color[][4],
2706                    float face_color_trans[][4],
2707                    float alpha, 
2708                    float min_edge_depth, float max_edge_depth,
2709                    float min_face_depth, float max_face_depth)
2710 {
2711   int i, j;
2712   float depth;
2713
2714   for (i=0; i<num_edge; i++)
2715   {
2716     depth = (vert[edge[i][0]][3]+vert[edge[i][1]][3])/2.0;
2717     color(depth,1.0,min_edge_depth,max_edge_depth,edge_color[i]);
2718   }
2719   for (i=0; i<num_face; i++)
2720   {
2721     depth = 0.0;
2722     for (j=0; j<vert_per_face; j++)
2723       depth += vert[face[i*vert_per_face+j]][3];
2724     depth /= vert_per_face;
2725     color(depth,1.0,min_face_depth,max_face_depth,face_color[i]);
2726     color(depth,alpha,min_face_depth,max_face_depth,face_color_trans[i]);
2727   }
2728 }
2729
2730
2731 /* Set the colors of the polytopes' edges and faces. */
2732 static void set_colors(ModeInfo *mi)
2733 {
2734   polytopesstruct *hp = &poly[MI_SCREEN(mi)];
2735   /* 5-cell. */
2736   colors(vert_5,edge_5,NUM_EDGE_5,(int *)face_5,NUM_FACE_5,
2737          VERT_PER_FACE_5,hp->edge_color_5,hp->face_color_5,
2738          hp->face_color_trans_5,0.5,MIN_EDGE_DEPTH_5,
2739          MAX_EDGE_DEPTH_5,MIN_FACE_DEPTH_5,MAX_FACE_DEPTH_5);
2740
2741   /* 8-cell. */
2742   colors(vert_8,edge_8,NUM_EDGE_8,(int *)face_8,NUM_FACE_8,
2743          VERT_PER_FACE_8,hp->edge_color_8,hp->face_color_8,
2744          hp->face_color_trans_8,0.4,MIN_EDGE_DEPTH_8,
2745          MAX_EDGE_DEPTH_8,MIN_FACE_DEPTH_8,MAX_FACE_DEPTH_8);
2746
2747   /* 16-cell. */
2748   colors(vert_16,edge_16,NUM_EDGE_16,(int *)face_16,NUM_FACE_16,
2749          VERT_PER_FACE_16,hp->edge_color_16,hp->face_color_16,
2750          hp->face_color_trans_16,0.25,MIN_EDGE_DEPTH_16,
2751          MAX_EDGE_DEPTH_16,MIN_FACE_DEPTH_16,MAX_FACE_DEPTH_16);
2752
2753   /* 24-cell. */
2754   colors(vert_24,edge_24,NUM_EDGE_24,(int *)face_24,NUM_FACE_24,
2755          VERT_PER_FACE_24,hp->edge_color_24,hp->face_color_24,
2756          hp->face_color_trans_24,0.25,MIN_EDGE_DEPTH_24,
2757          MAX_EDGE_DEPTH_24,MIN_FACE_DEPTH_24,MAX_FACE_DEPTH_24);
2758
2759   /* 120-cell. */
2760   colors(vert_120,edge_120,NUM_EDGE_120,(int *)face_120,NUM_FACE_120,
2761          VERT_PER_FACE_120,hp->edge_color_120,hp->face_color_120,
2762          hp->face_color_trans_120,0.15,MIN_EDGE_DEPTH_120,
2763          MAX_EDGE_DEPTH_120,MIN_FACE_DEPTH_120,MAX_FACE_DEPTH_120);
2764
2765   /* 600-cell. */
2766   colors(vert_600,edge_600,NUM_EDGE_600,(int *)face_600,NUM_FACE_600,
2767          VERT_PER_FACE_600,hp->edge_color_600,hp->face_color_600,
2768          hp->face_color_trans_600,0.06,MIN_EDGE_DEPTH_600,
2769          MAX_EDGE_DEPTH_600,MIN_FACE_DEPTH_600,MAX_FACE_DEPTH_600);
2770 }
2771
2772
2773 static void init(ModeInfo *mi)
2774 {
2775   polytopesstruct *pp = &poly[MI_SCREEN(mi)];
2776
2777   set_colors(mi);
2778
2779   pp->alpha = 0.0;
2780   pp->beta = 0.0;
2781   pp->delta = 0.0;
2782   pp->zeta = 0.0;
2783   pp->eta = 0.0;
2784   pp->theta = 0.0;
2785
2786   pp->tick = 0;
2787   pp->poly = 0;
2788 }
2789
2790
2791 /* Redisplay the polytopes. */
2792 static void display_polytopes(ModeInfo *mi)
2793 {
2794   polytopesstruct *pp = &poly[MI_SCREEN(mi)];
2795
2796   if (!pp->button_pressed)
2797   {
2798     pp->alpha += speed_wx * pp->speed_scale;
2799     if (pp->alpha >= 360.0)
2800       pp->alpha -= 360.0;
2801     pp->beta += speed_wy * pp->speed_scale;
2802     if (pp->beta >= 360.0)
2803       pp->beta -= 360.0;
2804     pp->delta += speed_wz * pp->speed_scale;
2805     if (pp->delta >= 360.0)
2806       pp->delta -= 360.0;
2807     pp->zeta += speed_xy * pp->speed_scale;
2808     if (pp->zeta >= 360.0)
2809       pp->zeta -= 360.0;
2810     pp->eta += speed_xz * pp->speed_scale;
2811     if (pp->eta >= 360.0)
2812       pp->eta -= 360.0;
2813     pp->theta += speed_yz * pp->speed_scale;
2814     if (pp->theta >= 360.0)
2815       pp->theta -= 360.0;
2816   }
2817
2818   glMatrixMode(GL_PROJECTION);
2819   glLoadIdentity();
2820   if (projection_3d == DISP_3D_ORTHOGRAPHIC)
2821   {
2822     if (pp->aspect >= 1.0)
2823       glOrtho(-pp->aspect,pp->aspect,-1.0,1.0,0.1,100.0);
2824     else
2825       glOrtho(-1.0,1.0,-1.0/pp->aspect,1.0/pp->aspect,0.1,100.0);
2826   }
2827   else
2828   {
2829     gluPerspective(60.0,pp->aspect,0.1,100.0);
2830   }
2831
2832   glMatrixMode(GL_MODELVIEW);
2833   glLoadIdentity();
2834
2835   if (pp->tick == 0)
2836   {
2837     if (polytope == POLYTOPE_RANDOM)
2838       pp->poly = random() % (POLYTOPE_LAST_CELL+1);
2839     else
2840       pp->poly = polytope;
2841   }
2842   if (++pp->tick > 1000)
2843     pp->tick = 0;
2844
2845   if (pp->poly == POLYTOPE_5_CELL)
2846     cell_5(mi);
2847   else if (pp->poly == POLYTOPE_8_CELL)
2848     cell_8(mi);
2849   else if (pp->poly == POLYTOPE_16_CELL)
2850     cell_16(mi);
2851   else if (pp->poly == POLYTOPE_24_CELL)
2852     cell_24(mi);
2853   else if (pp->poly == POLYTOPE_120_CELL)
2854     cell_120(mi);
2855   else if (pp->poly == POLYTOPE_600_CELL)
2856     cell_600(mi);
2857   else
2858     abort();
2859 }
2860
2861
2862 ENTRYPOINT void reshape_polytopes(ModeInfo *mi, int width, int height)
2863 {
2864   polytopesstruct *pp = &poly[MI_SCREEN(mi)];
2865
2866   pp->WindW = (GLint)width;
2867   pp->WindH = (GLint)height;
2868   glViewport(0,0,width,height);
2869   pp->aspect = (GLfloat)width/(GLfloat)height;
2870 }
2871
2872
2873 ENTRYPOINT Bool polytopes_handle_event(ModeInfo *mi, XEvent *event)
2874 {
2875   polytopesstruct *pp = &poly[MI_SCREEN(mi)];
2876   KeySym  sym = 0;
2877   char c = 0;
2878
2879   if (event->xany.type == KeyPress || event->xany.type == KeyRelease)
2880     XLookupString (&event->xkey, &c, 1, &sym, 0);
2881
2882   if (event->xany.type == ButtonPress &&
2883       event->xbutton.button == Button1)
2884   {
2885     pp->button_pressed = True;
2886     gltrackball_start(pp->trackballs[pp->current_trackball],
2887                       event->xbutton.x, event->xbutton.y,
2888                       MI_WIDTH(mi), MI_HEIGHT(mi));
2889     return True;
2890   }
2891   else if (event->xany.type == ButtonRelease &&
2892            event->xbutton.button == Button1)
2893   {
2894     pp->button_pressed = False;
2895     return True;
2896   }
2897   else if (event->xany.type == KeyPress)
2898   {
2899     if (sym == XK_Shift_L || sym == XK_Shift_R)
2900     {
2901       pp->current_trackball = 1;
2902       if (pp->button_pressed)
2903         gltrackball_start(pp->trackballs[pp->current_trackball],
2904                           event->xbutton.x, event->xbutton.y,
2905                           MI_WIDTH(mi), MI_HEIGHT(mi));
2906       return True;
2907     }
2908   }
2909   else if (event->xany.type == KeyRelease)
2910   {
2911     if (sym == XK_Shift_L || sym == XK_Shift_R)
2912     {
2913       pp->current_trackball = 0;
2914       if (pp->button_pressed)
2915         gltrackball_start(pp->trackballs[pp->current_trackball],
2916                           event->xbutton.x, event->xbutton.y,
2917                           MI_WIDTH(mi), MI_HEIGHT(mi));
2918       return True;
2919     }
2920   }
2921   else if (event->xany.type == MotionNotify && pp->button_pressed)
2922   {
2923     gltrackball_track(pp->trackballs[pp->current_trackball],
2924                       event->xmotion.x, event->xmotion.y,
2925                       MI_WIDTH(mi), MI_HEIGHT(mi));
2926     return True;
2927   }
2928
2929   return False;
2930 }
2931
2932
2933 /*
2934  *-----------------------------------------------------------------------------
2935  *-----------------------------------------------------------------------------
2936  *    Xlock hooks.
2937  *-----------------------------------------------------------------------------
2938  *-----------------------------------------------------------------------------
2939  */
2940
2941 /*
2942  *-----------------------------------------------------------------------------
2943  *    Initialize polytopes.  Called each time the window changes.
2944  *-----------------------------------------------------------------------------
2945  */
2946
2947 ENTRYPOINT void init_polytopes(ModeInfo *mi)
2948 {
2949   polytopesstruct *pp;
2950
2951   if (poly == NULL)
2952   {
2953     poly = (polytopesstruct *)calloc(MI_NUM_SCREENS(mi),
2954                                      sizeof(polytopesstruct));
2955     if (poly == NULL)
2956       return;
2957   }
2958   pp = &poly[MI_SCREEN(mi)];
2959
2960   pp->trackballs[0] = gltrackball_init(True);
2961   pp->trackballs[1] = gltrackball_init(True);
2962   pp->current_trackball = 0;
2963   pp->button_pressed = False;
2964
2965   /* Set the display mode. */
2966   if (!strcasecmp(mode,"wireframe") || !strcasecmp(mode,"0"))
2967   {
2968     display_mode = DISP_WIREFRAME;
2969   }
2970   else if (!strcasecmp(mode,"surface") || !strcasecmp(mode,"1"))
2971   {
2972     display_mode = DISP_SURFACE;
2973   }
2974   else if (!strcasecmp(mode,"transparent") || !strcasecmp(mode,"2"))
2975   {
2976     display_mode = DISP_TRANSPARENT;
2977   }
2978   else
2979   {
2980     display_mode = DISP_TRANSPARENT;
2981   }
2982
2983   /* Set the Klein bottle. */
2984   if (!strcasecmp(poly_str,"random") || !strcasecmp(poly_str,"-1"))
2985   {
2986     polytope = POLYTOPE_RANDOM;
2987   }
2988   else if (!strcasecmp(poly_str,"5-cell") || !strcasecmp(poly_str,"0"))
2989   {
2990     polytope = POLYTOPE_5_CELL;
2991   }
2992   else if (!strcasecmp(poly_str,"8-cell") || !strcasecmp(poly_str,"1"))
2993   {
2994     polytope = POLYTOPE_8_CELL;
2995   }
2996   else if (!strcasecmp(poly_str,"16-cell") || !strcasecmp(poly_str,"2"))
2997   {
2998     polytope = POLYTOPE_16_CELL;
2999   }
3000   else if (!strcasecmp(poly_str,"24-cell") || !strcasecmp(poly_str,"3"))
3001   {
3002     polytope = POLYTOPE_24_CELL;
3003   }
3004   else if (!strcasecmp(poly_str,"120-cell") || !strcasecmp(poly_str,"4"))
3005   {
3006     polytope = POLYTOPE_120_CELL;
3007   }
3008   else if (!strcasecmp(poly_str,"600-cell") || !strcasecmp(poly_str,"5"))
3009   {
3010     polytope = POLYTOPE_600_CELL;
3011   }
3012   else
3013   {
3014     polytope = POLYTOPE_RANDOM;
3015   }
3016
3017   /* Set the color mode. */
3018   if (!strcasecmp(color_str,"single") || !strcasecmp(color_str,"0"))
3019   {
3020     color_mode = COLORS_SINGLE;
3021   }
3022   else if (!strcasecmp(color_str,"depth") || !strcasecmp(color_str,"1"))
3023   {
3024     color_mode = COLORS_DEPTH;
3025   }
3026   else
3027   {
3028     color_mode = COLORS_DEPTH;
3029   }
3030
3031   /* Set the 3d projection mode. */
3032   if (!strcasecmp(proj_3d,"perspective") || !strcasecmp(proj_3d,"0"))
3033   {
3034     projection_3d = DISP_3D_PERSPECTIVE;
3035   }
3036   else if (!strcasecmp(proj_3d,"orthographic") || !strcasecmp(proj_3d,"1"))
3037   {
3038     projection_3d = DISP_3D_ORTHOGRAPHIC;
3039   }
3040   else
3041   {
3042     projection_3d = DISP_3D_PERSPECTIVE;
3043   }
3044
3045   /* Set the 4d projection mode. */
3046   if (!strcasecmp(proj_4d,"perspective") || !strcasecmp(proj_4d,"0"))
3047   {
3048     projection_4d = DISP_4D_PERSPECTIVE;
3049   }
3050   else if (!strcasecmp(proj_4d,"orthographic") || !strcasecmp(proj_4d,"1"))
3051   {
3052     projection_4d = DISP_4D_ORTHOGRAPHIC;
3053   }
3054   else
3055   {
3056     projection_4d = DISP_4D_PERSPECTIVE;
3057   }
3058
3059   /* make multiple screens rotate at slightly different rates. */
3060   pp->speed_scale = 0.9 + frand(0.3);
3061
3062   if ((pp->glx_context = init_GL(mi)) != NULL)
3063   {
3064     reshape_polytopes(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
3065     glDrawBuffer(GL_BACK);
3066     init(mi);
3067   }
3068   else
3069   {
3070     MI_CLEARWINDOW(mi);
3071   }
3072 }
3073
3074 /*
3075  *-----------------------------------------------------------------------------
3076  *    Called by the mainline code periodically to update the display.
3077  *-----------------------------------------------------------------------------
3078  */
3079 ENTRYPOINT void draw_polytopes(ModeInfo *mi)
3080 {
3081   static const GLfloat light_ambient[]  = { 0.0, 0.0, 0.0, 1.0 };
3082   static const GLfloat light_diffuse[]  = { 1.0, 1.0, 1.0, 1.0 };
3083   static const GLfloat light_specular[] = { 0.0, 0.0, 0.0, 1.0 };
3084   static const GLfloat light_position[] = { 0.0, 0.0, 1.0, 0.0 };
3085   static const GLfloat mat_specular[]   = { 1.0, 1.0, 1.0, 1.0 };
3086
3087   Display         *display = MI_DISPLAY(mi);
3088   Window          window = MI_WINDOW(mi);
3089   polytopesstruct *hp;
3090
3091   if (poly == NULL)
3092     return;
3093   hp = &poly[MI_SCREEN(mi)];
3094
3095   MI_IS_DRAWN(mi) = True;
3096   if (!hp->glx_context)
3097     return;
3098
3099   glXMakeCurrent(display,window,*(hp->glx_context));
3100
3101
3102   glMatrixMode(GL_PROJECTION);
3103   glLoadIdentity();
3104   if (projection_3d == DISP_3D_PERSPECTIVE)
3105     gluPerspective(60.0,1.0,0.1,100.0);
3106   else
3107     glOrtho(-1.0,1.0,-1.0,1.0,0.1,100.0);;
3108   glMatrixMode(GL_MODELVIEW);
3109   glLoadIdentity();
3110
3111   if (display_mode == DISP_WIREFRAME)
3112   {
3113     glDisable(GL_DEPTH_TEST);
3114     glDisable(GL_LIGHTING);
3115     glDisable(GL_LIGHT0);
3116     glDisable(GL_BLEND);
3117   }
3118   else if (display_mode == DISP_SURFACE)
3119   {
3120     glEnable(GL_DEPTH_TEST);
3121     glDepthFunc(GL_LESS);
3122     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
3123     glEnable(GL_LIGHTING);
3124     glEnable(GL_LIGHT0);
3125     glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
3126     glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
3127     glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
3128     glLightfv(GL_LIGHT0,GL_POSITION,light_position);
3129     glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
3130     glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
3131     glDepthMask(GL_TRUE);
3132     glDisable(GL_BLEND);
3133   }
3134   else if (display_mode == DISP_TRANSPARENT)
3135   {
3136     glDisable(GL_DEPTH_TEST);
3137     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
3138     glEnable(GL_LIGHTING);
3139     glEnable(GL_LIGHT0);
3140     glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
3141     glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
3142     glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
3143     glLightfv(GL_LIGHT0,GL_POSITION,light_position);
3144     glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
3145     glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
3146     glDepthMask(GL_FALSE);
3147     glEnable(GL_BLEND);
3148     glBlendFunc(GL_SRC_ALPHA,GL_ONE);
3149   }
3150   else
3151   {
3152     glDisable(GL_DEPTH_TEST);
3153     glDisable(GL_LIGHTING);
3154     glDisable(GL_LIGHT0);
3155     glDisable(GL_BLEND);
3156   }
3157
3158
3159   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
3160   glLoadIdentity();
3161
3162   display_polytopes(mi);
3163
3164   if (MI_IS_FPS(mi))
3165     do_fps (mi);
3166
3167   glFlush();
3168
3169   glXSwapBuffers(display,window);
3170 }
3171
3172
3173 /*
3174  *-----------------------------------------------------------------------------
3175  *    The display is being taken away from us.  Free up malloc'ed 
3176  *      memory and X resources that we've alloc'ed.  Only called
3177  *      once, we must zap everything for every screen.
3178  *-----------------------------------------------------------------------------
3179  */
3180
3181 ENTRYPOINT void release_polytopes(ModeInfo *mi)
3182 {
3183   if (poly != NULL)
3184   {
3185     int screen;
3186
3187     for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
3188     {
3189       polytopesstruct *hp = &poly[screen];
3190
3191       if (hp->glx_context)
3192         hp->glx_context = (GLXContext *)NULL;
3193     }
3194     (void) free((void *)poly);
3195     poly = (polytopesstruct *)NULL;
3196   }
3197   FreeAllGL(mi);
3198 }
3199
3200 #ifndef STANDALONE
3201 ENTRYPOINT void change_polytopes(ModeInfo *mi)
3202 {
3203   polytopesstruct *hp = &poly[MI_SCREEN(mi)];
3204
3205   if (!hp->glx_context)
3206     return;
3207
3208   glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(hp->glx_context));
3209   init(mi);
3210 }
3211 #endif /* !STANDALONE */
3212
3213 XSCREENSAVER_MODULE ("Polytopes", polytopes)
3214
3215 #endif /* USE_GL */