132001f49Smrg
232001f49Smrg/*
332001f49Smrg * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
432001f49Smrg *
532001f49Smrg * Permission to use, copy, modify, distribute, and sell this software and
632001f49Smrg * its documentation for any purpose is hereby granted without fee, provided
732001f49Smrg * that (i) the above copyright notices and this permission notice appear in
832001f49Smrg * all copies of the software and related documentation, and (ii) the name of
932001f49Smrg * Silicon Graphics may not be used in any advertising or
1032001f49Smrg * publicity relating to the software without the specific, prior written
1132001f49Smrg * permission of Silicon Graphics.
1232001f49Smrg *
1332001f49Smrg * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
1432001f49Smrg * ANY KIND,
1532001f49Smrg * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
1632001f49Smrg * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1732001f49Smrg *
1832001f49Smrg * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
1932001f49Smrg * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
2032001f49Smrg * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
2132001f49Smrg * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
2232001f49Smrg * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
2332001f49Smrg * OF THIS SOFTWARE.
2432001f49Smrg */
2532001f49Smrg
2632001f49Smrg#include <stdio.h>
2732001f49Smrg#include <string.h>
2832001f49Smrg#include <stdlib.h>
2932001f49Smrg#include "glut_wrap.h"
3032001f49Smrg
3132001f49Smrg
3232001f49Smrg#define PI 3.141592654
3332001f49Smrg
3432001f49Smrg#define	BLACK 0
3532001f49Smrg#define	GRAY 128
3632001f49Smrg#define	WHITE 255
3732001f49Smrg#define BL 0x00
3832001f49Smrg#define WH 0xFF
3932001f49Smrg#define RD 0xA4,0x00,0x00,0xFF
4032001f49Smrg#define WT 0xFF,0xFF,0xFF,0xFF
4132001f49Smrg
4232001f49Smrg#define	CHECKIMAGEWIDTH 8
4332001f49Smrg#define	CHECKIMAGEHEIGHT 8
4432001f49Smrg#define	BRICKIMAGEWIDTH 16
4532001f49Smrg#define	BRICKIMAGEHEIGHT 16
4632001f49Smrg
4732001f49Smrg
4832001f49SmrgGLenum rgb, doubleBuffer;
4932001f49Smrg
5032001f49Smrg#include "tkmap.c"
5132001f49Smrg
5232001f49Smrgfloat black[3] = {0.0, 0.0, 0.0};
5332001f49Smrgfloat white[3] = {1.0, 1.0, 1.0};
5432001f49Smrgfloat gray[3] = {0.5, 0.5, 0.5};
5532001f49Smrgfloat blue[3] = {0.0, 0.0, 1.0};
5632001f49SmrgGLint colorIndexes[3] = {0, 200, 255};
5732001f49Smrg
5832001f49SmrgGLenum polyMode;
5932001f49SmrgGLboolean dithering;
6032001f49SmrgGLboolean shade;
6132001f49SmrgGLboolean doStipple;
6232001f49SmrgGLboolean noDraw = 0;
6332001f49SmrgGLboolean LineSmooth = GL_FALSE;
6432001f49Smrg
6532001f49Smrgdouble plane[4] = {1.0, 0.0, -1.0, 0.0};
6632001f49Smrgfloat xRotation = 30.0, yRotation = 30.0;
6732001f49Smrgfloat zTranslation = -15.0;
6832001f49Smrg
6932001f49SmrgGLint singleCylinder;
7032001f49SmrgGLint doubleCylinder;
7132001f49SmrgGLint elbow, logo;
7232001f49Smrg
7332001f49SmrgGLubyte checkImage[3*CHECKIMAGEWIDTH*CHECKIMAGEHEIGHT] = {
7432001f49Smrg    BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
7532001f49Smrg    WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
7632001f49Smrg    WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
7732001f49Smrg    BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
7832001f49Smrg    WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
7932001f49Smrg    WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
8032001f49Smrg    BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
8132001f49Smrg    WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
8232001f49Smrg    WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
8332001f49Smrg    BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
8432001f49Smrg    WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
8532001f49Smrg    WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
8632001f49Smrg};
8732001f49SmrgGLubyte brickImage[4*BRICKIMAGEWIDTH*BRICKIMAGEHEIGHT] = {
8832001f49Smrg    RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
8932001f49Smrg    RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
9032001f49Smrg    RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
9132001f49Smrg    RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
9232001f49Smrg    WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
9332001f49Smrg    RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
9432001f49Smrg    RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
9532001f49Smrg    RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
9632001f49Smrg    RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
9732001f49Smrg    WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
9832001f49Smrg    RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
9932001f49Smrg    RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
10032001f49Smrg    RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
10132001f49Smrg    RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
10232001f49Smrg    WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
10332001f49Smrg    RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
10432001f49Smrg};
10532001f49Smrg
10632001f49SmrgGLubyte *image = checkImage;
10732001f49SmrgGLint imageHeight = CHECKIMAGEHEIGHT;
10832001f49SmrgGLint imageWidth = CHECKIMAGEWIDTH;
10932001f49Smrg
11032001f49Smrgstatic float decal[] = {
11132001f49Smrg    GL_DECAL,
11232001f49Smrg};
11332001f49Smrgstatic float modulate[] = {
11432001f49Smrg    GL_MODULATE,
11532001f49Smrg};
11632001f49Smrgstatic float repeat[] = {
11732001f49Smrg    GL_REPEAT,
11832001f49Smrg};
11932001f49Smrgstatic float nearest[] = {
12032001f49Smrg    GL_NEAREST,
12132001f49Smrg};
12232001f49Smrg
12332001f49SmrgGLubyte stipple[4*32] = {
12432001f49Smrg    0x00, 0x00, 0x00, 0x00,
12532001f49Smrg    0x00, 0x00, 0x00, 0x00,
12632001f49Smrg    0x00, 0x00, 0x00, 0x00,
12732001f49Smrg    0x00, 0x00, 0x00, 0x00,
12832001f49Smrg    0x00, 0x00, 0x00, 0x00,
12932001f49Smrg    0x00, 0x00, 0x00, 0x00,
13032001f49Smrg    0x00, 0x00, 0x00, 0x00,
13132001f49Smrg    0x00, 0x00, 0x00, 0x00,
13232001f49Smrg
13332001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
13432001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
13532001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
13632001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
13732001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
13832001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
13932001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14032001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14132001f49Smrg
14232001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14332001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14432001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14532001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14632001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14732001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14832001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
14932001f49Smrg    0x00, 0x0F, 0xF0, 0x00,
15032001f49Smrg
15132001f49Smrg    0x00, 0x00, 0x00, 0x00,
15232001f49Smrg    0x00, 0x00, 0x00, 0x00,
15332001f49Smrg    0x00, 0x00, 0x00, 0x00,
15432001f49Smrg    0x00, 0x00, 0x00, 0x00,
15532001f49Smrg    0x00, 0x00, 0x00, 0x00,
15632001f49Smrg    0x00, 0x00, 0x00, 0x00,
15732001f49Smrg    0x00, 0x00, 0x00, 0x00,
15832001f49Smrg    0x00, 0x00, 0x00, 0x00,
15932001f49Smrg};
16032001f49Smrg
16132001f49Smrgfloat tscp[18][2] = {
16232001f49Smrg    {
16332001f49Smrg	0.0, 0.0
16432001f49Smrg    },
16532001f49Smrg    {
16632001f49Smrg	1.0, 0.0
16732001f49Smrg    },
16832001f49Smrg    {
16932001f49Smrg	0.0, 0.125
17032001f49Smrg    },
17132001f49Smrg    {
17232001f49Smrg	1.0, 0.125
17332001f49Smrg    },
17432001f49Smrg    {
17532001f49Smrg	0.0, 0.250
17632001f49Smrg    },
17732001f49Smrg    {
17832001f49Smrg	1.0, 0.25
17932001f49Smrg    },
18032001f49Smrg    {
18132001f49Smrg	0.0, 0.375
18232001f49Smrg    },
18332001f49Smrg    {
18432001f49Smrg	1.0, 0.375
18532001f49Smrg    },
18632001f49Smrg    {
18732001f49Smrg	0.0, 0.50
18832001f49Smrg    },
18932001f49Smrg    {
19032001f49Smrg	1.0, 0.50
19132001f49Smrg    },
19232001f49Smrg    {
19332001f49Smrg	0.0, 0.625
19432001f49Smrg    },
19532001f49Smrg    {
19632001f49Smrg	1.0, 0.625
19732001f49Smrg    },
19832001f49Smrg    {
19932001f49Smrg	0.0, 0.75
20032001f49Smrg    },
20132001f49Smrg    {
20232001f49Smrg	1.0, 0.75
20332001f49Smrg    },
20432001f49Smrg    {
20532001f49Smrg	0.0, 0.875
20632001f49Smrg    },
20732001f49Smrg    {
20832001f49Smrg	1.0, 0.875
20932001f49Smrg    },
21032001f49Smrg    {
21132001f49Smrg	0.0, 1.0
21232001f49Smrg    },
21332001f49Smrg    {
21432001f49Smrg	1.0, 1.0
21532001f49Smrg    }
21632001f49Smrg};
21732001f49Smrgfloat scp[18][3] = {
21832001f49Smrg    {
21932001f49Smrg	1.000000, 0.000000, 0.000000
22032001f49Smrg    },
22132001f49Smrg    {
22232001f49Smrg	1.000000, 0.000000, 5.000000
22332001f49Smrg    },
22432001f49Smrg    {
22532001f49Smrg	0.707107, 0.707107, 0.000000
22632001f49Smrg    },
22732001f49Smrg    {
22832001f49Smrg	0.707107, 0.707107, 5.000000
22932001f49Smrg    },
23032001f49Smrg    {
23132001f49Smrg	0.000000, 1.000000, 0.000000
23232001f49Smrg    },
23332001f49Smrg    {
23432001f49Smrg	0.000000, 1.000000, 5.000000
23532001f49Smrg    },
23632001f49Smrg    {
23732001f49Smrg	-0.707107, 0.707107, 0.000000
23832001f49Smrg    },
23932001f49Smrg    {
24032001f49Smrg	-0.707107, 0.707107, 5.000000
24132001f49Smrg    },
24232001f49Smrg    {
24332001f49Smrg	-1.000000, 0.000000, 0.000000
24432001f49Smrg    },
24532001f49Smrg    {
24632001f49Smrg	-1.000000, 0.000000, 5.000000
24732001f49Smrg    },
24832001f49Smrg    {
24932001f49Smrg	-0.707107, -0.707107, 0.000000
25032001f49Smrg    },
25132001f49Smrg    {
25232001f49Smrg	-0.707107, -0.707107, 5.000000
25332001f49Smrg    },
25432001f49Smrg    {
25532001f49Smrg	0.000000, -1.000000, 0.000000
25632001f49Smrg    },
25732001f49Smrg    {
25832001f49Smrg	0.000000, -1.000000, 5.000000
25932001f49Smrg    },
26032001f49Smrg    {
26132001f49Smrg	0.707107, -0.707107, 0.000000
26232001f49Smrg    },
26332001f49Smrg    {
26432001f49Smrg	0.707107, -0.707107, 5.000000
26532001f49Smrg    },
26632001f49Smrg    {
26732001f49Smrg	1.000000, 0.000000, 0.000000
26832001f49Smrg    },
26932001f49Smrg    {
27032001f49Smrg	1.000000, 0.000000, 5.000000
27132001f49Smrg    }
27232001f49Smrg};
27332001f49Smrgfloat dcp[18][3] = {
27432001f49Smrg    {
27532001f49Smrg	1.000000, 0.000000, 0.000000
27632001f49Smrg    },
27732001f49Smrg    {
27832001f49Smrg	1.000000, 0.000000, 7.000000
27932001f49Smrg    },
28032001f49Smrg    {
28132001f49Smrg	0.707107, 0.707107, 0.000000
28232001f49Smrg    },
28332001f49Smrg    {
28432001f49Smrg	0.707107, 0.707107, 7.000000
28532001f49Smrg    },
28632001f49Smrg    {
28732001f49Smrg	0.000000, 1.000000, 0.000000
28832001f49Smrg    },
28932001f49Smrg    {
29032001f49Smrg	0.000000, 1.000000, 7.000000
29132001f49Smrg    },
29232001f49Smrg    {
29332001f49Smrg	-0.707107, 0.707107, 0.000000
29432001f49Smrg    },
29532001f49Smrg    {
29632001f49Smrg	-0.707107, 0.707107, 7.000000
29732001f49Smrg    },
29832001f49Smrg    {
29932001f49Smrg	-1.000000, 0.000000, 0.000000
30032001f49Smrg    },
30132001f49Smrg    {
30232001f49Smrg	-1.000000, 0.000000, 7.000000
30332001f49Smrg    },
30432001f49Smrg    {
30532001f49Smrg	-0.707107, -0.707107, 0.000000
30632001f49Smrg    },
30732001f49Smrg    {
30832001f49Smrg	-0.707107, -0.707107, 7.000000
30932001f49Smrg    },
31032001f49Smrg    {
31132001f49Smrg	0.000000, -1.000000, 0.000000
31232001f49Smrg    },
31332001f49Smrg    {
31432001f49Smrg	0.000000, -1.000000, 7.000000
31532001f49Smrg    },
31632001f49Smrg    {
31732001f49Smrg	0.707107, -0.707107, 0.000000
31832001f49Smrg    },
31932001f49Smrg    {
32032001f49Smrg	0.707107, -0.707107, 7.000000
32132001f49Smrg    },
32232001f49Smrg    {
32332001f49Smrg	1.000000, 0.000000, 0.000000
32432001f49Smrg    },
32532001f49Smrg    {
32632001f49Smrg	1.000000, 0.000000, 7.000000
32732001f49Smrg    }
32832001f49Smrg};
32932001f49Smrgfloat ep[7][9][3] = {
33032001f49Smrg    {
33132001f49Smrg	{
33232001f49Smrg	    1.000000, 0.000000, 0.000000
33332001f49Smrg	},
33432001f49Smrg	{
33532001f49Smrg	    0.707107, 0.707107, 0.000000
33632001f49Smrg	},
33732001f49Smrg	{
33832001f49Smrg	    0.000000, 1.000000, 0.000000
33932001f49Smrg	},
34032001f49Smrg	{
34132001f49Smrg	    -0.707107, 0.707107, 0.000000
34232001f49Smrg	},
34332001f49Smrg	{
34432001f49Smrg	    -1.000000, 0.000000, 0.000000
34532001f49Smrg	},
34632001f49Smrg	{
34732001f49Smrg	    -0.707107, -0.707107, 0.000000
34832001f49Smrg	},
34932001f49Smrg	{
35032001f49Smrg	    0.000000, -1.000000, 0.000000
35132001f49Smrg	},
35232001f49Smrg	{
35332001f49Smrg	    0.707107, -0.707107, 0.000000
35432001f49Smrg	},
35532001f49Smrg	{
35632001f49Smrg	    1.000000, 0.000000, 0.000000
35732001f49Smrg	}
35832001f49Smrg    },
35932001f49Smrg    {
36032001f49Smrg	{
36132001f49Smrg	    1.000000, 0.034074, 0.258819
36232001f49Smrg	},
36332001f49Smrg	{
36432001f49Smrg	    0.707107, 0.717087, 0.075806
36532001f49Smrg	},
36632001f49Smrg	{
36732001f49Smrg	    0.000000, 1.000000, 0.000000
36832001f49Smrg	},
36932001f49Smrg	{
37032001f49Smrg	    -0.707107, 0.717087, 0.075806
37132001f49Smrg	},
37232001f49Smrg	{
37332001f49Smrg	    -1.000000, 0.034074, 0.258819
37432001f49Smrg	},
37532001f49Smrg	{
37632001f49Smrg	    -0.707107, -0.648939, 0.441832
37732001f49Smrg	},
37832001f49Smrg	{
37932001f49Smrg	    0.000000, -0.931852, 0.517638
38032001f49Smrg	},
38132001f49Smrg	{
38232001f49Smrg	    0.707107, -0.648939, 0.441832
38332001f49Smrg	},
38432001f49Smrg	{
38532001f49Smrg	    1.000000, 0.034074, 0.258819
38632001f49Smrg	}
38732001f49Smrg    },
38832001f49Smrg    {
38932001f49Smrg	{
39032001f49Smrg	    1.000000, 0.133975, 0.500000
39132001f49Smrg	},
39232001f49Smrg	{
39332001f49Smrg	    0.707107, 0.746347, 0.146447
39432001f49Smrg	},
39532001f49Smrg	{
39632001f49Smrg	    0.000000, 1.000000, 0.000000
39732001f49Smrg	},
39832001f49Smrg	{
39932001f49Smrg	    -0.707107, 0.746347, 0.146447
40032001f49Smrg	},
40132001f49Smrg	{
40232001f49Smrg	    -1.000000, 0.133975, 0.500000
40332001f49Smrg	},
40432001f49Smrg	{
40532001f49Smrg	    -0.707107, -0.478398, 0.853553
40632001f49Smrg	},
40732001f49Smrg	{
40832001f49Smrg	    0.000000, -0.732051, 1.000000
40932001f49Smrg	},
41032001f49Smrg	{
41132001f49Smrg	    0.707107, -0.478398, 0.853553
41232001f49Smrg	},
41332001f49Smrg	{
41432001f49Smrg	    1.000000, 0.133975, 0.500000
41532001f49Smrg	}
41632001f49Smrg    },
41732001f49Smrg    {
41832001f49Smrg	{
41932001f49Smrg	    1.000000, 0.292893, 0.707107
42032001f49Smrg	},
42132001f49Smrg	{
42232001f49Smrg	    0.707107, 0.792893, 0.207107
42332001f49Smrg	},
42432001f49Smrg	{
42532001f49Smrg	    0.000000, 1.000000, 0.000000
42632001f49Smrg	},
42732001f49Smrg	{
42832001f49Smrg	    -0.707107, 0.792893, 0.207107
42932001f49Smrg	},
43032001f49Smrg	{
43132001f49Smrg	    -1.000000, 0.292893, 0.707107
43232001f49Smrg	},
43332001f49Smrg	{
43432001f49Smrg	    -0.707107, -0.207107, 1.207107
43532001f49Smrg	},
43632001f49Smrg	{
43732001f49Smrg	    0.000000, -0.414214, 1.414214
43832001f49Smrg	},
43932001f49Smrg	{
44032001f49Smrg	    0.707107, -0.207107, 1.207107
44132001f49Smrg	},
44232001f49Smrg	{
44332001f49Smrg	    1.000000, 0.292893, 0.707107
44432001f49Smrg	}
44532001f49Smrg    },
44632001f49Smrg    {
44732001f49Smrg	{
44832001f49Smrg	    1.000000, 0.500000, 0.866025
44932001f49Smrg	},
45032001f49Smrg	{
45132001f49Smrg	    0.707107, 0.853553, 0.253653
45232001f49Smrg	},
45332001f49Smrg	{
45432001f49Smrg	    0.000000, 1.000000, 0.000000
45532001f49Smrg	},
45632001f49Smrg	{
45732001f49Smrg	    -0.707107, 0.853553, 0.253653
45832001f49Smrg	},
45932001f49Smrg	{
46032001f49Smrg	    -1.000000, 0.500000, 0.866025
46132001f49Smrg	},
46232001f49Smrg	{
46332001f49Smrg	    -0.707107, 0.146447, 1.478398
46432001f49Smrg	},
46532001f49Smrg	{
46632001f49Smrg	    0.000000, 0.000000, 1.732051
46732001f49Smrg	},
46832001f49Smrg	{
46932001f49Smrg	    0.707107, 0.146447, 1.478398
47032001f49Smrg	},
47132001f49Smrg	{
47232001f49Smrg	    1.000000, 0.500000, 0.866025
47332001f49Smrg	}
47432001f49Smrg    },
47532001f49Smrg    {
47632001f49Smrg	{
47732001f49Smrg	    1.000000, 0.741181, 0.965926
47832001f49Smrg	},
47932001f49Smrg	{
48032001f49Smrg	    0.707107, 0.924194, 0.282913
48132001f49Smrg	},
48232001f49Smrg	{
48332001f49Smrg	    0.000000, 1.000000, 0.000000
48432001f49Smrg	},
48532001f49Smrg	{
48632001f49Smrg	    -0.707107, 0.924194, 0.282913
48732001f49Smrg	},
48832001f49Smrg	{
48932001f49Smrg	    -1.000000, 0.741181, 0.965926
49032001f49Smrg	},
49132001f49Smrg	{
49232001f49Smrg	    -0.707107, 0.558168, 1.648939
49332001f49Smrg	},
49432001f49Smrg	{
49532001f49Smrg	    0.000000, 0.482362, 1.931852
49632001f49Smrg	},
49732001f49Smrg	{
49832001f49Smrg	    0.707107, 0.558168, 1.648939
49932001f49Smrg	},
50032001f49Smrg	{
50132001f49Smrg	    1.000000, 0.741181, 0.965926
50232001f49Smrg	}
50332001f49Smrg    },
50432001f49Smrg    {
50532001f49Smrg	{
50632001f49Smrg	    1.000000, 1.000000, 1.000000
50732001f49Smrg	},
50832001f49Smrg	{
50932001f49Smrg	    0.707107, 1.000000, 0.292893
51032001f49Smrg	},
51132001f49Smrg	{
51232001f49Smrg	    0.000000, 1.000000, 0.000000
51332001f49Smrg	},
51432001f49Smrg	{
51532001f49Smrg	    -0.707107, 1.000000, 0.292893
51632001f49Smrg	},
51732001f49Smrg	{
51832001f49Smrg	    -1.000000, 1.000000, 1.000000
51932001f49Smrg	},
52032001f49Smrg	{
52132001f49Smrg	    -0.707107, 1.000000, 1.707107
52232001f49Smrg	},
52332001f49Smrg	{
52432001f49Smrg	    0.000000, 1.000000, 2.000000
52532001f49Smrg	},
52632001f49Smrg	{
52732001f49Smrg	    0.707107, 1.000000, 1.707107
52832001f49Smrg	},
52932001f49Smrg	{
53032001f49Smrg	    1.000000, 1.000000, 1.000000
53132001f49Smrg	}
53232001f49Smrg    }
53332001f49Smrg};
53432001f49Smrgfloat en[7][9][3] = {
53532001f49Smrg    {
53632001f49Smrg	{
53732001f49Smrg	    1.000000, 0.000000, 0.000000
53832001f49Smrg	},
53932001f49Smrg	{
54032001f49Smrg	    0.707107, 0.707107, 0.000000
54132001f49Smrg	},
54232001f49Smrg	{
54332001f49Smrg	    0.000000, 1.000000, 0.000000
54432001f49Smrg	},
54532001f49Smrg	{
54632001f49Smrg	    -0.707107, 0.707107, 0.000000
54732001f49Smrg	},
54832001f49Smrg	{
54932001f49Smrg	    -1.000000, 0.000000, 0.000000
55032001f49Smrg	},
55132001f49Smrg	{
55232001f49Smrg	    -0.707107, -0.707107, 0.000000
55332001f49Smrg	},
55432001f49Smrg	{
55532001f49Smrg	    0.000000, -1.000000, 0.000000
55632001f49Smrg	},
55732001f49Smrg	{
55832001f49Smrg	    0.707107, -0.707107, 0.000000
55932001f49Smrg	},
56032001f49Smrg	{
56132001f49Smrg	    1.000000, 0.000000, 0.000000
56232001f49Smrg	}
56332001f49Smrg    },
56432001f49Smrg    {
56532001f49Smrg	{
56632001f49Smrg	    1.000000, 0.000000, 0.000000
56732001f49Smrg	},
56832001f49Smrg	{
56932001f49Smrg	    0.707107, 0.683013, -0.183013
57032001f49Smrg	},
57132001f49Smrg	{
57232001f49Smrg	    0.000000, 0.965926, -0.258819
57332001f49Smrg	},
57432001f49Smrg	{
57532001f49Smrg	    -0.707107, 0.683013, -0.183013
57632001f49Smrg	},
57732001f49Smrg	{
57832001f49Smrg	    -1.000000, 0.000000, 0.000000
57932001f49Smrg	},
58032001f49Smrg	{
58132001f49Smrg	    -0.707107, -0.683013, 0.183013
58232001f49Smrg	},
58332001f49Smrg	{
58432001f49Smrg	    0.000000, -0.965926, 0.258819
58532001f49Smrg	},
58632001f49Smrg	{
58732001f49Smrg	    0.707107, -0.683013, 0.183013
58832001f49Smrg	},
58932001f49Smrg	{
59032001f49Smrg	    1.000000, 0.000000, 0.000000
59132001f49Smrg	}
59232001f49Smrg    },
59332001f49Smrg    {
59432001f49Smrg	{
59532001f49Smrg	    1.000000, 0.000000, 0.000000
59632001f49Smrg	},
59732001f49Smrg	{
59832001f49Smrg	    0.707107, 0.612372, -0.353553
59932001f49Smrg	},
60032001f49Smrg	{
60132001f49Smrg	    0.000000, 0.866025, -0.500000
60232001f49Smrg	},
60332001f49Smrg	{
60432001f49Smrg	    -0.707107, 0.612372, -0.353553
60532001f49Smrg	},
60632001f49Smrg	{
60732001f49Smrg	    -1.000000, 0.000000, 0.000000
60832001f49Smrg	},
60932001f49Smrg	{
61032001f49Smrg	    -0.707107, -0.612372, 0.353553
61132001f49Smrg	},
61232001f49Smrg	{
61332001f49Smrg	    0.000000, -0.866025, 0.500000
61432001f49Smrg	},
61532001f49Smrg	{
61632001f49Smrg	    0.707107, -0.612372, 0.353553
61732001f49Smrg	},
61832001f49Smrg	{
61932001f49Smrg	    1.000000, 0.000000, 0.000000
62032001f49Smrg	}
62132001f49Smrg    },
62232001f49Smrg    {
62332001f49Smrg	{
62432001f49Smrg	    1.000000, 0.000000, 0.000000
62532001f49Smrg	},
62632001f49Smrg	{
62732001f49Smrg	   /* These 3 lines added by BEP */
62832001f49Smrg	    0.707107, 0.500000, -0.500000
62932001f49Smrg	},
63032001f49Smrg	{
63132001f49Smrg	    0.000000, 0.707107, -0.707107
63232001f49Smrg	},
63332001f49Smrg	{
63432001f49Smrg	    -0.707107, 0.500000, -0.500000
63532001f49Smrg	},
63632001f49Smrg	{
63732001f49Smrg	    -1.000000, 0.000000, 0.000000
63832001f49Smrg	},
63932001f49Smrg	{
64032001f49Smrg	    -0.707107, -0.500000, 0.500000
64132001f49Smrg	},
64232001f49Smrg	{
64332001f49Smrg	    0.000000, -0.707107, 0.707107
64432001f49Smrg	},
64532001f49Smrg	{
64632001f49Smrg	    0.707107, -0.500000, 0.500000
64732001f49Smrg	},
64832001f49Smrg	{
64932001f49Smrg	    1.000000, 0.000000, 0.000000
65032001f49Smrg	}
65132001f49Smrg    },
65232001f49Smrg    {
65332001f49Smrg	{
65432001f49Smrg	    1.000000, 0.000000, 0.000000
65532001f49Smrg	},
65632001f49Smrg	{
65732001f49Smrg	    0.707107, 0.353553, -0.612372
65832001f49Smrg	},
65932001f49Smrg	{
66032001f49Smrg	    0.000000, 0.500000, -0.866025
66132001f49Smrg	},
66232001f49Smrg	{
66332001f49Smrg	    -0.707107, 0.353553, -0.612372
66432001f49Smrg	},
66532001f49Smrg	{
66632001f49Smrg	    -1.000000, 0.000000, 0.000000
66732001f49Smrg	},
66832001f49Smrg	{
66932001f49Smrg	    -0.707107, -0.353553, 0.612372
67032001f49Smrg	},
67132001f49Smrg	{
67232001f49Smrg	    0.000000, -0.500000, 0.866025
67332001f49Smrg	},
67432001f49Smrg	{
67532001f49Smrg	    0.707107, -0.353553, 0.612372
67632001f49Smrg	},
67732001f49Smrg	{
67832001f49Smrg	    1.000000, 0.000000, 0.000000
67932001f49Smrg	}
68032001f49Smrg    },
68132001f49Smrg    {
68232001f49Smrg	{
68332001f49Smrg	    1.000000, 0.000000, 0.000000
68432001f49Smrg	},
68532001f49Smrg	{
68632001f49Smrg	    0.707107, 0.183013, -0.683013
68732001f49Smrg	},
68832001f49Smrg	{
68932001f49Smrg	    0.000000, 0.258819, -0.965926
69032001f49Smrg	},
69132001f49Smrg	{
69232001f49Smrg	    -0.707107, 0.183013, -0.683013
69332001f49Smrg	},
69432001f49Smrg	{
69532001f49Smrg	    -1.000000, 0.000000, 0.000000
69632001f49Smrg	},
69732001f49Smrg	{
69832001f49Smrg	    -0.707107, -0.183013, 0.683013
69932001f49Smrg	},
70032001f49Smrg	{
70132001f49Smrg	    0.000000, -0.258819, 0.965926
70232001f49Smrg	},
70332001f49Smrg	{
70432001f49Smrg	    0.707107, -0.183013, 0.683013
70532001f49Smrg	},
70632001f49Smrg	{
70732001f49Smrg	    1.000000, 0.000000, 0.000000
70832001f49Smrg	}
70932001f49Smrg    },
71032001f49Smrg    {
71132001f49Smrg	{
71232001f49Smrg	    1.000000, 0.000000, 0.000000
71332001f49Smrg	},
71432001f49Smrg	{
71532001f49Smrg	    0.707107, 0.000000, -0.707107
71632001f49Smrg	},
71732001f49Smrg	{
71832001f49Smrg	    0.000000, 0.000000, -1.000000
71932001f49Smrg	},
72032001f49Smrg	{
72132001f49Smrg	    -0.707107, 0.000000, -0.707107
72232001f49Smrg	},
72332001f49Smrg	{
72432001f49Smrg	    -1.000000, 0.000000, 0.000000
72532001f49Smrg	},
72632001f49Smrg	{
72732001f49Smrg	    -0.707107, 0.000000, 0.707107
72832001f49Smrg	},
72932001f49Smrg	{
73032001f49Smrg	    0.000000, 0.000000, 1.000000
73132001f49Smrg	},
73232001f49Smrg	{
73332001f49Smrg	    0.707107, 0.000000, 0.707107
73432001f49Smrg	},
73532001f49Smrg	{
73632001f49Smrg	    1.000000, 0.000000, 0.000000
73732001f49Smrg	}
73832001f49Smrg    }
73932001f49Smrg};
74032001f49Smrgfloat tep[7][9][2] = {
74132001f49Smrg    {
74232001f49Smrg	{
74332001f49Smrg	    0,     0.0
74432001f49Smrg	},
74532001f49Smrg	{
74632001f49Smrg	    0.125, 0.0
74732001f49Smrg	},
74832001f49Smrg	{
74932001f49Smrg	    0.25,  0.0
75032001f49Smrg	},
75132001f49Smrg	{
75232001f49Smrg	    0.375, 0.0
75332001f49Smrg	},
75432001f49Smrg	{
75532001f49Smrg	    0.5,   0.0
75632001f49Smrg	},
75732001f49Smrg	{
75832001f49Smrg	    0.625, 0.0
75932001f49Smrg	},
76032001f49Smrg	{
76132001f49Smrg	    0.75,  0.0
76232001f49Smrg	},
76332001f49Smrg	{
76432001f49Smrg	    0.875, 0.0
76532001f49Smrg	},
76632001f49Smrg	{
76732001f49Smrg	    1.0,   0.0
76832001f49Smrg	}
76932001f49Smrg    },
77032001f49Smrg    {
77132001f49Smrg	{
77232001f49Smrg	    0,     0.16667
77332001f49Smrg	},
77432001f49Smrg	{
77532001f49Smrg	    0.125, 0.16667
77632001f49Smrg	},
77732001f49Smrg	{
77832001f49Smrg	    0.25,  0.16667
77932001f49Smrg	},
78032001f49Smrg	{
78132001f49Smrg	    0.375, 0.16667
78232001f49Smrg	},
78332001f49Smrg	{
78432001f49Smrg	    0.5,   0.16667
78532001f49Smrg	},
78632001f49Smrg	{
78732001f49Smrg	    0.625, 0.16667
78832001f49Smrg	},
78932001f49Smrg	{
79032001f49Smrg	    0.75,  0.16667
79132001f49Smrg	},
79232001f49Smrg	{
79332001f49Smrg	    0.875, 0.16667
79432001f49Smrg	},
79532001f49Smrg	{
79632001f49Smrg	    1.0,   0.16667
79732001f49Smrg	}
79832001f49Smrg    },
79932001f49Smrg    {
80032001f49Smrg	{
80132001f49Smrg	    0,     0.33333
80232001f49Smrg	},
80332001f49Smrg	{
80432001f49Smrg	    0.125, 0.33333
80532001f49Smrg	},
80632001f49Smrg	{
80732001f49Smrg	    0.25,  0.33333
80832001f49Smrg	},
80932001f49Smrg	{
81032001f49Smrg	    0.375, 0.33333
81132001f49Smrg	},
81232001f49Smrg	{
81332001f49Smrg	    0.5,   0.33333
81432001f49Smrg	},
81532001f49Smrg	{
81632001f49Smrg	    0.625, 0.33333
81732001f49Smrg	},
81832001f49Smrg	{
81932001f49Smrg	    0.75,  0.33333
82032001f49Smrg	},
82132001f49Smrg	{
82232001f49Smrg	    0.875, 0.33333
82332001f49Smrg	},
82432001f49Smrg	{
82532001f49Smrg	    1.0,   0.33333
82632001f49Smrg	}
82732001f49Smrg    },
82832001f49Smrg    {
82932001f49Smrg	{
83032001f49Smrg	    0,     0.5
83132001f49Smrg	},
83232001f49Smrg	{
83332001f49Smrg	    0.125, 0.5
83432001f49Smrg	},
83532001f49Smrg	{
83632001f49Smrg	    0.25,  0.5
83732001f49Smrg	},
83832001f49Smrg	{
83932001f49Smrg	    0.375, 0.5
84032001f49Smrg	},
84132001f49Smrg	{
84232001f49Smrg	    0.5,   0.5
84332001f49Smrg	},
84432001f49Smrg	{
84532001f49Smrg	    0.625, 0.5
84632001f49Smrg	},
84732001f49Smrg	{
84832001f49Smrg	    0.75,  0.5
84932001f49Smrg	},
85032001f49Smrg	{
85132001f49Smrg	    0.875, 0.5
85232001f49Smrg	},
85332001f49Smrg	{
85432001f49Smrg	    1.0,   0.5
85532001f49Smrg	}
85632001f49Smrg    },
85732001f49Smrg    {
85832001f49Smrg	{
85932001f49Smrg	    0,     0.6667
86032001f49Smrg	},
86132001f49Smrg	{
86232001f49Smrg	    0.125, 0.6667
86332001f49Smrg	},
86432001f49Smrg	{
86532001f49Smrg	    0.25,  0.6667
86632001f49Smrg	},
86732001f49Smrg	{
86832001f49Smrg	    0.375, 0.6667
86932001f49Smrg	},
87032001f49Smrg	{
87132001f49Smrg	    0.5,   0.6667
87232001f49Smrg	},
87332001f49Smrg	{
87432001f49Smrg	    0.625, 0.6667
87532001f49Smrg	},
87632001f49Smrg	{
87732001f49Smrg	    0.75,  0.6667
87832001f49Smrg	},
87932001f49Smrg	{
88032001f49Smrg	    0.875, 0.6667
88132001f49Smrg	},
88232001f49Smrg	{
88332001f49Smrg	    1.0,   0.6667
88432001f49Smrg	}
88532001f49Smrg    },
88632001f49Smrg    {
88732001f49Smrg	{
88832001f49Smrg	    0,     0.83333
88932001f49Smrg	},
89032001f49Smrg	{
89132001f49Smrg	    0.125, 0.83333
89232001f49Smrg	},
89332001f49Smrg	{
89432001f49Smrg	    0.25,  0.83333
89532001f49Smrg	},
89632001f49Smrg	{
89732001f49Smrg	    0.375, 0.83333
89832001f49Smrg	},
89932001f49Smrg	{
90032001f49Smrg	    0.5,   0.83333
90132001f49Smrg	},
90232001f49Smrg	{
90332001f49Smrg	    0.625, 0.83333
90432001f49Smrg	},
90532001f49Smrg	{
90632001f49Smrg	    0.75,  0.83333
90732001f49Smrg	},
90832001f49Smrg	{
90932001f49Smrg	    0.875, 0.83333
91032001f49Smrg	},
91132001f49Smrg	{
91232001f49Smrg	    1.0,   0.83333
91332001f49Smrg	}
91432001f49Smrg    },
91532001f49Smrg    {
91632001f49Smrg	{
91732001f49Smrg	    0,     1.0
91832001f49Smrg	},
91932001f49Smrg	{
92032001f49Smrg	    0.125, 1.0
92132001f49Smrg	},
92232001f49Smrg	{
92332001f49Smrg	    0.25,  1.0
92432001f49Smrg	},
92532001f49Smrg	{
92632001f49Smrg	    0.375, 1.0
92732001f49Smrg	},
92832001f49Smrg	{
92932001f49Smrg	    0.5,   1.0
93032001f49Smrg	},
93132001f49Smrg	{
93232001f49Smrg	    0.625, 1.0
93332001f49Smrg	},
93432001f49Smrg	{
93532001f49Smrg	    0.75,  1.0
93632001f49Smrg	},
93732001f49Smrg	{
93832001f49Smrg	    0.875, 1.0
93932001f49Smrg	},
94032001f49Smrg	{
94132001f49Smrg	    1.0,   1.0
94232001f49Smrg	}
94332001f49Smrg    }
94432001f49Smrg};
94532001f49Smrg
94632001f49Smrg
94732001f49Smrgstatic void SetUpAntiAliasedGrayScale(void)
94832001f49Smrg{
94932001f49Smrg    float color;
95032001f49Smrg    GLint i, j;
95132001f49Smrg
95232001f49Smrg    for (i = 0; i < 16; i++) {
95332001f49Smrg	color = (2 * i + 1) / 32.0;
95432001f49Smrg	for (j = 0; j < 16; j++) {
95532001f49Smrg	    glutSetColor(i*16+j, color*j/15.0, color*j/15.0, color*j/15.0);
95632001f49Smrg	}
95732001f49Smrg    }
95832001f49Smrg}
95932001f49Smrg
96032001f49Smrgstatic void BendForward(void)
96132001f49Smrg{
96232001f49Smrg
96332001f49Smrg    glTranslatef(0.0, 1.0, 0.0);
96432001f49Smrg    glRotatef(90.0, 1, 0, 0);
96532001f49Smrg    glTranslatef(0.0, -1.0, 0.0);
96632001f49Smrg}
96732001f49Smrg
96832001f49Smrgstatic void BendLeft(void)
96932001f49Smrg{
97032001f49Smrg
97132001f49Smrg    glRotatef(-90.0, 0, 0, 1);
97232001f49Smrg    glTranslatef(0.0, 1.0, 0.0);
97332001f49Smrg    glRotatef(90.0, 1, 0, 0);
97432001f49Smrg    glTranslatef(0.0, -1.0, 0.0);
97532001f49Smrg}
97632001f49Smrg
97732001f49Smrgstatic void BendRight(void)
97832001f49Smrg{
97932001f49Smrg
98032001f49Smrg    glRotatef(90.0, 0, 0, 1);
98132001f49Smrg    glTranslatef(0.0, 1.0, 0.0);
98232001f49Smrg    glRotatef(90.0, 1, 0, 0);
98332001f49Smrg    glTranslatef(0.0, -1.0, 0.0);
98432001f49Smrg}
98532001f49Smrg
98632001f49Smrgstatic void BuildSingleCylinder(void)
98732001f49Smrg{
98832001f49Smrg
98932001f49Smrg    glNewList(singleCylinder, GL_COMPILE);
99032001f49Smrg
99132001f49Smrg    glBegin(GL_TRIANGLE_STRIP);
99232001f49Smrg       glNormal3fv(scp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(scp[0]);
99332001f49Smrg       glNormal3fv(scp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(scp[1]);
99432001f49Smrg       glNormal3fv(scp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(scp[2]);
99532001f49Smrg       glNormal3fv(scp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(scp[3]);
99632001f49Smrg       glNormal3fv(scp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(scp[4]);
99732001f49Smrg       glNormal3fv(scp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(scp[5]);
99832001f49Smrg       glNormal3fv(scp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(scp[6]);
99932001f49Smrg       glNormal3fv(scp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(scp[7]);
100032001f49Smrg       glNormal3fv(scp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(scp[8]);
100132001f49Smrg       glNormal3fv(scp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(scp[9]);
100232001f49Smrg       glNormal3fv(scp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(scp[10]);
100332001f49Smrg       glNormal3fv(scp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(scp[11]);
100432001f49Smrg       glNormal3fv(scp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(scp[12]);
100532001f49Smrg       glNormal3fv(scp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(scp[13]);
100632001f49Smrg       glNormal3fv(scp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(scp[14]);
100732001f49Smrg       glNormal3fv(scp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(scp[15]);
100832001f49Smrg       glNormal3fv(scp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(scp[16]);
100932001f49Smrg       glNormal3fv(scp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(scp[17]);
101032001f49Smrg    glEnd();
101132001f49Smrg
101232001f49Smrg    glEndList();
101332001f49Smrg}
101432001f49Smrg
101532001f49Smrgstatic void BuildDoubleCylinder(void)
101632001f49Smrg{
101732001f49Smrg
101832001f49Smrg    glNewList(doubleCylinder, GL_COMPILE);
101932001f49Smrg
102032001f49Smrg    glBegin(GL_TRIANGLE_STRIP);
102132001f49Smrg	glNormal3fv(dcp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(dcp[0]);
102232001f49Smrg	glNormal3fv(dcp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(dcp[1]);
102332001f49Smrg	glNormal3fv(dcp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(dcp[2]);
102432001f49Smrg	glNormal3fv(dcp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(dcp[3]);
102532001f49Smrg	glNormal3fv(dcp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(dcp[4]);
102632001f49Smrg	glNormal3fv(dcp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(dcp[5]);
102732001f49Smrg	glNormal3fv(dcp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(dcp[6]);
102832001f49Smrg	glNormal3fv(dcp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(dcp[7]);
102932001f49Smrg	glNormal3fv(dcp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(dcp[8]);
103032001f49Smrg	glNormal3fv(dcp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(dcp[9]);
103132001f49Smrg	glNormal3fv(dcp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(dcp[10]);
103232001f49Smrg	glNormal3fv(dcp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(dcp[11]);
103332001f49Smrg	glNormal3fv(dcp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(dcp[12]);
103432001f49Smrg	glNormal3fv(dcp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(dcp[13]);
103532001f49Smrg	glNormal3fv(dcp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(dcp[14]);
103632001f49Smrg	glNormal3fv(dcp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(dcp[15]);
103732001f49Smrg	glNormal3fv(dcp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(dcp[16]);
103832001f49Smrg	glNormal3fv(dcp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(dcp[17]);
103932001f49Smrg    glEnd();
104032001f49Smrg
104132001f49Smrg    glEndList();
104232001f49Smrg}
104332001f49Smrg
104432001f49Smrgstatic void BuildElbow(void)
104532001f49Smrg{
104632001f49Smrg
104732001f49Smrg    glNewList(elbow, GL_COMPILE);
104832001f49Smrg
104932001f49Smrg    glBegin(GL_TRIANGLE_STRIP);
105032001f49Smrg	glNormal3fv(en[0][0]); glTexCoord2fv(tep[0][0]); glVertex3fv(ep[0][0]);
105132001f49Smrg	glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
105232001f49Smrg	glNormal3fv(en[0][1]); glTexCoord2fv(tep[0][1]); glVertex3fv(ep[0][1]);
105332001f49Smrg	glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
105432001f49Smrg	glNormal3fv(en[0][2]); glTexCoord2fv(tep[0][2]); glVertex3fv(ep[0][2]);
105532001f49Smrg	glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
105632001f49Smrg	glNormal3fv(en[0][3]); glTexCoord2fv(tep[0][3]); glVertex3fv(ep[0][3]);
105732001f49Smrg	glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
105832001f49Smrg	glNormal3fv(en[0][4]); glTexCoord2fv(tep[0][4]); glVertex3fv(ep[0][4]);
105932001f49Smrg	glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
106032001f49Smrg	glNormal3fv(en[0][5]); glTexCoord2fv(tep[0][5]); glVertex3fv(ep[0][5]);
106132001f49Smrg	glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
106232001f49Smrg	glNormal3fv(en[0][6]); glTexCoord2fv(tep[0][6]); glVertex3fv(ep[0][6]);
106332001f49Smrg	glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
106432001f49Smrg	glNormal3fv(en[0][7]); glTexCoord2fv(tep[0][7]); glVertex3fv(ep[0][7]);
106532001f49Smrg	glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
106632001f49Smrg	glNormal3fv(en[0][8]); glTexCoord2fv(tep[0][8]); glVertex3fv(ep[0][8]);
106732001f49Smrg	glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
106832001f49Smrg    glEnd();
106932001f49Smrg    glBegin(GL_TRIANGLE_STRIP);
107032001f49Smrg	glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
107132001f49Smrg	glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
107232001f49Smrg	glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
107332001f49Smrg	glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
107432001f49Smrg	glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
107532001f49Smrg	glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
107632001f49Smrg	glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
107732001f49Smrg	glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
107832001f49Smrg	glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
107932001f49Smrg	glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
108032001f49Smrg	glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
108132001f49Smrg	glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
108232001f49Smrg	glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
108332001f49Smrg	glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
108432001f49Smrg	glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
108532001f49Smrg	glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
108632001f49Smrg	glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
108732001f49Smrg	glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
108832001f49Smrg    glEnd();
108932001f49Smrg    glBegin(GL_TRIANGLE_STRIP);
109032001f49Smrg	glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
109132001f49Smrg	glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
109232001f49Smrg	glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
109332001f49Smrg	glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
109432001f49Smrg	glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
109532001f49Smrg	glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
109632001f49Smrg	glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
109732001f49Smrg	glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
109832001f49Smrg	glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
109932001f49Smrg	glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
110032001f49Smrg	glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
110132001f49Smrg	glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
110232001f49Smrg	glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
110332001f49Smrg	glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
110432001f49Smrg	glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
110532001f49Smrg	glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
110632001f49Smrg	glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
110732001f49Smrg	glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
110832001f49Smrg    glEnd();
110932001f49Smrg    glBegin(GL_TRIANGLE_STRIP);
111032001f49Smrg	glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
111132001f49Smrg	glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
111232001f49Smrg	glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
111332001f49Smrg	glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
111432001f49Smrg	glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
111532001f49Smrg	glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
111632001f49Smrg	glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
111732001f49Smrg	glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
111832001f49Smrg	glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
111932001f49Smrg	glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
112032001f49Smrg	glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
112132001f49Smrg	glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
112232001f49Smrg	glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
112332001f49Smrg	glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
112432001f49Smrg	glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
112532001f49Smrg	glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
112632001f49Smrg	glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
112732001f49Smrg	glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
112832001f49Smrg    glEnd();
112932001f49Smrg    glBegin(GL_TRIANGLE_STRIP);
113032001f49Smrg	glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
113132001f49Smrg	glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
113232001f49Smrg	glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
113332001f49Smrg	glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
113432001f49Smrg	glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
113532001f49Smrg	glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
113632001f49Smrg	glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
113732001f49Smrg	glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
113832001f49Smrg	glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
113932001f49Smrg	glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
114032001f49Smrg	glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
114132001f49Smrg	glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
114232001f49Smrg	glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
114332001f49Smrg	glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
114432001f49Smrg	glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
114532001f49Smrg	glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
114632001f49Smrg	glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
114732001f49Smrg	glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
114832001f49Smrg    glEnd();
114932001f49Smrg    glBegin(GL_TRIANGLE_STRIP);
115032001f49Smrg	glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
115132001f49Smrg	glNormal3fv(en[6][0]); glTexCoord2fv(tep[6][0]); glVertex3fv(ep[6][0]);
115232001f49Smrg	glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
115332001f49Smrg	glNormal3fv(en[6][1]); glTexCoord2fv(tep[6][1]); glVertex3fv(ep[6][1]);
115432001f49Smrg	glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
115532001f49Smrg	glNormal3fv(en[6][2]); glTexCoord2fv(tep[6][2]); glVertex3fv(ep[6][2]);
115632001f49Smrg	glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
115732001f49Smrg	glNormal3fv(en[6][3]); glTexCoord2fv(tep[6][3]); glVertex3fv(ep[6][3]);
115832001f49Smrg	glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
115932001f49Smrg	glNormal3fv(en[6][4]); glTexCoord2fv(tep[6][4]); glVertex3fv(ep[6][4]);
116032001f49Smrg	glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
116132001f49Smrg	glNormal3fv(en[6][5]); glTexCoord2fv(tep[6][5]); glVertex3fv(ep[6][5]);
116232001f49Smrg	glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
116332001f49Smrg	glNormal3fv(en[6][6]); glTexCoord2fv(tep[6][6]); glVertex3fv(ep[6][6]);
116432001f49Smrg	glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
116532001f49Smrg	glNormal3fv(en[6][7]); glTexCoord2fv(tep[6][7]); glVertex3fv(ep[6][7]);
116632001f49Smrg	glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
116732001f49Smrg	glNormal3fv(en[6][8]); glTexCoord2fv(tep[6][8]); glVertex3fv(ep[6][8]);
116832001f49Smrg    glEnd();
116932001f49Smrg
117032001f49Smrg    glEndList();
117132001f49Smrg}
117232001f49Smrg
117332001f49Smrgstatic void BuildLogo(void)
117432001f49Smrg{
117532001f49Smrg
117632001f49Smrg    glNewList(logo, GL_COMPILE);
117732001f49Smrg
117832001f49Smrg    glTranslatef(5.5, -3.5, 4.5);
117932001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
118032001f49Smrg    glCallList(doubleCylinder);
118132001f49Smrg    BendForward();
118232001f49Smrg    glCallList(elbow);
118332001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
118432001f49Smrg    glCallList(doubleCylinder);
118532001f49Smrg    BendForward();
118632001f49Smrg    glCallList(elbow);
118732001f49Smrg    glTranslatef(0.0, 0.0, -5.0);
118832001f49Smrg    glCallList(singleCylinder);
118932001f49Smrg    BendRight();
119032001f49Smrg    glCallList(elbow);
119132001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
119232001f49Smrg    glCallList(doubleCylinder);
119332001f49Smrg    BendForward();
119432001f49Smrg    glCallList(elbow);
119532001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
119632001f49Smrg    glCallList(doubleCylinder);
119732001f49Smrg    BendForward();
119832001f49Smrg    glCallList(elbow);
119932001f49Smrg    glTranslatef(0.0, 0.0, -5.0);
120032001f49Smrg    glCallList(singleCylinder);
120132001f49Smrg    BendLeft();
120232001f49Smrg    glCallList(elbow);
120332001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
120432001f49Smrg    glCallList(doubleCylinder);
120532001f49Smrg    BendForward();
120632001f49Smrg    glCallList(elbow);
120732001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
120832001f49Smrg    glCallList(doubleCylinder);
120932001f49Smrg    BendForward();
121032001f49Smrg    glCallList(elbow);
121132001f49Smrg    glTranslatef(0.0, 0.0, -5.0);
121232001f49Smrg    glCallList(singleCylinder);
121332001f49Smrg    BendRight();
121432001f49Smrg    glCallList(elbow);
121532001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
121632001f49Smrg    glCallList(doubleCylinder);
121732001f49Smrg    BendForward();
121832001f49Smrg    glCallList(elbow);
121932001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
122032001f49Smrg    glCallList(doubleCylinder);
122132001f49Smrg    BendForward();
122232001f49Smrg    glCallList(elbow);
122332001f49Smrg    glTranslatef(0.0, 0.0, -5.0);
122432001f49Smrg    glCallList(singleCylinder);
122532001f49Smrg    BendLeft();
122632001f49Smrg    glCallList(elbow);
122732001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
122832001f49Smrg    glCallList(doubleCylinder);
122932001f49Smrg    BendForward();
123032001f49Smrg    glCallList(elbow);
123132001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
123232001f49Smrg    glCallList(doubleCylinder);
123332001f49Smrg    BendForward();
123432001f49Smrg    glCallList(elbow);
123532001f49Smrg    glTranslatef(0.0, 0.0, -5.0);
123632001f49Smrg    glCallList(singleCylinder);
123732001f49Smrg    BendRight();
123832001f49Smrg    glCallList(elbow);
123932001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
124032001f49Smrg    glCallList(doubleCylinder);
124132001f49Smrg    BendForward();
124232001f49Smrg    glCallList(elbow);
124332001f49Smrg    glTranslatef(0.0, 0.0, -7.0);
124432001f49Smrg    glCallList(doubleCylinder);
124532001f49Smrg    BendForward();
124632001f49Smrg    glCallList(elbow);
124732001f49Smrg    glTranslatef(0.0, 0.0, -5.0);
124832001f49Smrg    glCallList(singleCylinder);
124932001f49Smrg    BendLeft();
125032001f49Smrg    glCallList(elbow);
125132001f49Smrg
125232001f49Smrg    glEndList();
125332001f49Smrg}
125432001f49Smrg
125532001f49Smrgstatic void BuildLists(void)
125632001f49Smrg{
125732001f49Smrg
125832001f49Smrg    singleCylinder = glGenLists(1);
125932001f49Smrg    doubleCylinder = glGenLists(1);
126032001f49Smrg    elbow = glGenLists(1);
126132001f49Smrg    logo = glGenLists(1);
126232001f49Smrg
126332001f49Smrg    BuildSingleCylinder();
126432001f49Smrg    BuildDoubleCylinder();
126532001f49Smrg    BuildElbow();
126632001f49Smrg    BuildLogo();
126732001f49Smrg}
126832001f49Smrg
126932001f49Smrgstatic void Init(void)
127032001f49Smrg{
127132001f49Smrg    static float ambient[] = {0.1, 0.1, 0.1, 1.0};
127232001f49Smrg    static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
127332001f49Smrg    static float position[] = {90.0, 90.0, 150.0, 0.0};
127432001f49Smrg    static float front_mat_shininess[] = {30.0};
127532001f49Smrg    static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
127632001f49Smrg    static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
127732001f49Smrg    static float back_mat_shininess[] = {50.0};
127832001f49Smrg    static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
127932001f49Smrg    static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
128032001f49Smrg    static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
128132001f49Smrg    static float lmodel_twoside[] = {GL_TRUE};
128232001f49Smrg
128332001f49Smrg    glClearColor(0.0, 0.0, 0.0, 0.0);
128432001f49Smrg
128532001f49Smrg    glFrontFace(GL_CW);
128632001f49Smrg
128732001f49Smrg    glEnable(GL_DEPTH_TEST);
128832001f49Smrg
128932001f49Smrg    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
129032001f49Smrg    glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
129132001f49Smrg    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
129232001f49Smrg    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
129332001f49Smrg    glLightfv(GL_LIGHT0, GL_POSITION, position);
129432001f49Smrg    glEnable(GL_LIGHTING);
129532001f49Smrg    glEnable(GL_LIGHT0);
129632001f49Smrg
129732001f49Smrg    glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
129832001f49Smrg    glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
129932001f49Smrg    glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
130032001f49Smrg    glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
130132001f49Smrg    glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
130232001f49Smrg    glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
130332001f49Smrg
130432001f49Smrg    glEnable(GL_CLIP_PLANE0);
130532001f49Smrg
130632001f49Smrg    if (rgb) {
130732001f49Smrg	glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
130832001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
130932001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
131032001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
131132001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
131232001f49Smrg	glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0,
131332001f49Smrg		     GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)checkImage);
131432001f49Smrg	glEnable(GL_TEXTURE_2D);
131532001f49Smrg
131632001f49Smrg	glCullFace(GL_BACK);
131732001f49Smrg	glEnable(GL_CULL_FACE);
131832001f49Smrg    } else {
131932001f49Smrg	SetGreyRamp();
132032001f49Smrg        /* commented out by BrianP because it's the wrong way to handle a 4-bit visual!
132132001f49Smrg	if (doubleBuffer) {
132232001f49Smrg	    colorIndexes[1] = 10;
132332001f49Smrg	    colorIndexes[2] = 15;
132432001f49Smrg	}
132532001f49Smrg        */
132632001f49Smrg	glMaterialiv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
132732001f49Smrg    }
132832001f49Smrg
132932001f49Smrg    BuildLists();
133032001f49Smrg
133132001f49Smrg    dithering = GL_TRUE;
133232001f49Smrg    shade = GL_TRUE;
133332001f49Smrg    doStipple = GL_FALSE;
133432001f49Smrg    polyMode = GL_BACK;
133532001f49Smrg}
133632001f49Smrg
133732001f49Smrgstatic void Reshape(int width, int height)
133832001f49Smrg{
133932001f49Smrg    glViewport(0, 0, (GLint)width, (GLint)height);
134032001f49Smrg
134132001f49Smrg    glMatrixMode(GL_PROJECTION);
134232001f49Smrg    glLoadIdentity();
134332001f49Smrg    gluPerspective(90, 1.0, 1.0, 200.0);
134432001f49Smrg    glMatrixMode(GL_MODELVIEW);
134532001f49Smrg}
134632001f49Smrg
134732001f49Smrgstatic void Key2(int key, int x, int y)
134832001f49Smrg{
134932001f49Smrg    (void) x;
135032001f49Smrg    (void) y;
135132001f49Smrg    switch (key) {
135232001f49Smrg      case GLUT_KEY_LEFT:
135332001f49Smrg	yRotation += 0.5;
135432001f49Smrg	break;
135532001f49Smrg      case GLUT_KEY_RIGHT:
135632001f49Smrg	yRotation -= 0.5;
135732001f49Smrg	break;
135832001f49Smrg      case GLUT_KEY_UP:
135932001f49Smrg	plane[3] += 2.0;
136032001f49Smrg	break;
136132001f49Smrg      case GLUT_KEY_DOWN:
136232001f49Smrg	plane[3] -= 2.0;
136332001f49Smrg	break;
136432001f49Smrg      default:
136532001f49Smrg	return;
136632001f49Smrg    }
136732001f49Smrg
136832001f49Smrg    glutPostRedisplay();
136932001f49Smrg}
137032001f49Smrg
137132001f49Smrgstatic void Key(unsigned char key, int x, int y)
137232001f49Smrg{
137332001f49Smrg    (void) x;
137432001f49Smrg    (void) y;
137532001f49Smrg    switch (key) {
137632001f49Smrg      case 27:
137732001f49Smrg	exit(1);
137832001f49Smrg
137932001f49Smrg      case 'Z':
138032001f49Smrg	zTranslation -= 1.0;
138132001f49Smrg	break;
138232001f49Smrg      case 'z':
138332001f49Smrg	zTranslation += 1.0;
138432001f49Smrg	break;
138532001f49Smrg
138632001f49Smrg      case '1':
138732001f49Smrg	glPolygonMode(polyMode, GL_POINT);
138832001f49Smrg	break;
138932001f49Smrg      case '2':
139032001f49Smrg	glPolygonMode(polyMode, GL_LINE);
139132001f49Smrg	break;
139232001f49Smrg      case '3':
139332001f49Smrg	glPolygonMode(polyMode, GL_FILL);
139432001f49Smrg	break;
139532001f49Smrg      case 'p':
139632001f49Smrg	switch (polyMode) {
139732001f49Smrg	  case GL_BACK:
139832001f49Smrg	    polyMode = GL_FRONT;
139932001f49Smrg            printf("PolygonMode GL_FRONT\n");
140032001f49Smrg	    break;
140132001f49Smrg	  case GL_FRONT:
140232001f49Smrg	    polyMode = GL_FRONT_AND_BACK;
140332001f49Smrg            printf("PolygonMode GL_FRONT_AND_BACK\n");
140432001f49Smrg	    break;
140532001f49Smrg	  case GL_FRONT_AND_BACK:
140632001f49Smrg	    polyMode = GL_BACK;
140732001f49Smrg            printf("PolygonMode GL_BACK\n");
140832001f49Smrg	    break;
140932001f49Smrg          default:
141032001f49Smrg            break;
141132001f49Smrg	}
141232001f49Smrg	break;
141332001f49Smrg
141432001f49Smrg      case '4':
141532001f49Smrg	glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
141632001f49Smrg	break;
141732001f49Smrg      case '5':
141832001f49Smrg	glEnable(GL_POLYGON_SMOOTH);
141932001f49Smrg	if (rgb) {
142032001f49Smrg	    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
142132001f49Smrg	    glEnable(GL_BLEND);
142232001f49Smrg	    glDisable(GL_DEPTH_TEST);
142332001f49Smrg	} else {
142432001f49Smrg	    SetUpAntiAliasedGrayScale();
142532001f49Smrg	}
142632001f49Smrg	break;
142732001f49Smrg      case '6':
142832001f49Smrg	glDisable(GL_POLYGON_SMOOTH);
142932001f49Smrg	if (rgb) {
143032001f49Smrg	    glBlendFunc(GL_ONE, GL_ZERO);
143132001f49Smrg	    glDisable(GL_BLEND);
143232001f49Smrg	    glEnable(GL_DEPTH_TEST);
143332001f49Smrg	} else {
143432001f49Smrg	    SetGreyRamp();
143532001f49Smrg	}
143632001f49Smrg	break;
143732001f49Smrg
143832001f49Smrg      case '8':
143932001f49Smrg	dithering = !dithering;
144032001f49Smrg	(dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
144132001f49Smrg	break;
144232001f49Smrg
144332001f49Smrg      case '9':
144432001f49Smrg	doStipple = !doStipple;
144532001f49Smrg	if (doStipple) {
144632001f49Smrg	    glPolygonStipple(stipple);
144732001f49Smrg	    glEnable(GL_POLYGON_STIPPLE);
144832001f49Smrg	} else {
144932001f49Smrg	    glDisable(GL_POLYGON_STIPPLE);
145032001f49Smrg	}
145132001f49Smrg	break;
145232001f49Smrg
145332001f49Smrg      case '0':
145432001f49Smrg	shade = !shade;
145532001f49Smrg	(shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
145632001f49Smrg	break;
145732001f49Smrg
145832001f49Smrg      case 'q':
145932001f49Smrg	glDisable(GL_CULL_FACE);
146032001f49Smrg        printf("disable culling\n");
146132001f49Smrg	break;
146232001f49Smrg      case 'w':
146332001f49Smrg	glEnable(GL_CULL_FACE);
146432001f49Smrg	glCullFace(GL_FRONT);
146532001f49Smrg        printf("enable front face culling\n");
146632001f49Smrg	break;
146732001f49Smrg      case 'e':
146832001f49Smrg	glEnable(GL_CULL_FACE);
146932001f49Smrg	glCullFace(GL_BACK);
147032001f49Smrg        printf("enable back face culling\n");
147132001f49Smrg	break;
147232001f49Smrg
147332001f49Smrg      case 'r':
147432001f49Smrg	glFrontFace(GL_CW);
147532001f49Smrg	break;
147632001f49Smrg      case 't':
147732001f49Smrg	glFrontFace(GL_CCW);
147832001f49Smrg	break;
147932001f49Smrg      case 'y':
148032001f49Smrg	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
148132001f49Smrg	glPixelStorei(GL_UNPACK_LSB_FIRST, 0);
148232001f49Smrg	glPolygonStipple(stipple);
148332001f49Smrg	break;
148432001f49Smrg      case 'u':
148532001f49Smrg	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
148632001f49Smrg	glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
148732001f49Smrg	glPolygonStipple(stipple);
148832001f49Smrg	break;
148932001f49Smrg
149032001f49Smrg      case 'a':
149132001f49Smrg	glEnable(GL_TEXTURE_2D);
149232001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
149332001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
149432001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
149532001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
149632001f49Smrg	glTexImage2D(GL_TEXTURE_2D, 0, 4, BRICKIMAGEWIDTH,
149732001f49Smrg		     BRICKIMAGEHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,
149832001f49Smrg		     (GLvoid *)brickImage);
149932001f49Smrg	break;
150032001f49Smrg      case 's':
150132001f49Smrg	glEnable(GL_TEXTURE_2D);
150232001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
150332001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
150432001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
150532001f49Smrg	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
150632001f49Smrg	glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH,
150732001f49Smrg		     CHECKIMAGEHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE,
150832001f49Smrg		     (GLvoid *)checkImage);
150932001f49Smrg	break;
151032001f49Smrg      case 'd':
151132001f49Smrg	glDisable(GL_TEXTURE_2D);
151232001f49Smrg	break;
151332001f49Smrg
151432001f49Smrg      case 'f':
151532001f49Smrg	glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
151632001f49Smrg	break;
151732001f49Smrg      case 'g':
151832001f49Smrg	glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
151932001f49Smrg	break;
152032001f49Smrg
152132001f49Smrg      case 'n':
152232001f49Smrg        /* added by BrianP */
152332001f49Smrg        noDraw = !noDraw;
152432001f49Smrg        if (noDraw) {
152532001f49Smrg           glDrawBuffer( GL_NONE );
152632001f49Smrg        }
152732001f49Smrg        else {
152832001f49Smrg           if (doubleBuffer) {
152932001f49Smrg              glDrawBuffer( GL_BACK );
153032001f49Smrg           }
153132001f49Smrg           else {
153232001f49Smrg              glDrawBuffer( GL_FRONT );
153332001f49Smrg           }
153432001f49Smrg        }
153532001f49Smrg        break;
153632001f49Smrg
153732001f49Smrg      case 'l':
153832001f49Smrg         /* Line Smooth - added by BrianP */
153932001f49Smrg         LineSmooth = !LineSmooth;
154032001f49Smrg         if (LineSmooth) {
154132001f49Smrg            glEnable(GL_LINE_SMOOTH);
154232001f49Smrg	    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
154332001f49Smrg            glEnable(GL_BLEND);
154432001f49Smrg         }
154532001f49Smrg         else {
154632001f49Smrg            glDisable(GL_LINE_SMOOTH);
154732001f49Smrg	    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
154832001f49Smrg            glDisable(GL_BLEND);
154932001f49Smrg         }
155032001f49Smrg         break;
155132001f49Smrg      default:
155232001f49Smrg	return;
155332001f49Smrg    }
155432001f49Smrg
155532001f49Smrg    glutPostRedisplay();
155632001f49Smrg}
155732001f49Smrg
155832001f49Smrgstatic void Draw(void)
155932001f49Smrg{
156032001f49Smrg
156132001f49Smrg    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
156232001f49Smrg
156332001f49Smrg    glPushMatrix();
156432001f49Smrg
156532001f49Smrg    glTranslatef(0, 0, zTranslation);
156632001f49Smrg    glRotatef(30.0, 1, 0, 0);
156732001f49Smrg    glRotatef(yRotation, 0, 1, 0);
156832001f49Smrg    glClipPlane(GL_CLIP_PLANE0, plane);
156932001f49Smrg    glCallList(logo);
157032001f49Smrg
157132001f49Smrg    glPopMatrix();
157232001f49Smrg
157332001f49Smrg    glFlush();
157432001f49Smrg
157532001f49Smrg    if (doubleBuffer) {
157632001f49Smrg	glutSwapBuffers();
157732001f49Smrg    }
157832001f49Smrg}
157932001f49Smrg
158032001f49Smrgstatic GLenum Args(int argc, char **argv)
158132001f49Smrg{
158232001f49Smrg    GLint i;
158332001f49Smrg
158432001f49Smrg    rgb = GL_TRUE;
158532001f49Smrg    doubleBuffer = GL_FALSE;
158632001f49Smrg
158732001f49Smrg    for (i = 1; i < argc; i++) {
158832001f49Smrg	if (strcmp(argv[i], "-ci") == 0) {
158932001f49Smrg	    rgb = GL_FALSE;
159032001f49Smrg	} else if (strcmp(argv[i], "-rgb") == 0) {
159132001f49Smrg	    rgb = GL_TRUE;
159232001f49Smrg	} else if (strcmp(argv[i], "-sb") == 0) {
159332001f49Smrg	    doubleBuffer = GL_FALSE;
159432001f49Smrg	} else if (strcmp(argv[i], "-db") == 0) {
159532001f49Smrg	    doubleBuffer = GL_TRUE;
159632001f49Smrg	} else {
159732001f49Smrg	    printf("%s (Bad option).\n", argv[i]);
159832001f49Smrg	    return GL_FALSE;
159932001f49Smrg	}
160032001f49Smrg    }
160132001f49Smrg    return GL_TRUE;
160232001f49Smrg}
160332001f49Smrg
160432001f49Smrgint main(int argc, char **argv)
160532001f49Smrg{
160632001f49Smrg    unsigned int type;
160732001f49Smrg
160832001f49Smrg    glutInit(&argc, argv);
160932001f49Smrg
161032001f49Smrg    if (Args(argc, argv) == GL_FALSE) {
161132001f49Smrg	exit(1);
161232001f49Smrg    }
161332001f49Smrg
161432001f49Smrg    glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
161532001f49Smrg
161632001f49Smrg    type = GLUT_DEPTH;
161732001f49Smrg    type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
161832001f49Smrg    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
161932001f49Smrg    glutInitDisplayMode(type);
162032001f49Smrg
162132001f49Smrg    if (glutCreateWindow("Logo Test") == GL_FALSE) {
162232001f49Smrg	exit(1);
162332001f49Smrg    }
162432001f49Smrg
162532001f49Smrg    InitMap();
162632001f49Smrg
162732001f49Smrg    Init();
162832001f49Smrg
162932001f49Smrg    glutReshapeFunc(Reshape);
163032001f49Smrg    glutKeyboardFunc(Key);
163132001f49Smrg    glutSpecialFunc(Key2);
163232001f49Smrg    glutDisplayFunc(Draw);
163332001f49Smrg    glutMainLoop();
163432001f49Smrg	return 0;
163532001f49Smrg}
1636