2
/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
5
(c) Copyright 1993, Silicon Graphics, Inc.
9
Permission to use, copy, modify, and distribute this software
10
for any purpose and without fee is hereby granted, provided
11
that the above copyright notice appear in all copies and that
12
both the copyright notice and this permission notice appear in
13
supporting documentation, and that the name of Silicon
14
Graphics, Inc. not be used in advertising or publicity
15
pertaining to distribution of the software without specific,
16
written prior permission.
18
THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
19
"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
20
OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
21
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
22
EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
23
ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
24
CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
25
INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
26
SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
27
NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
28
OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29
ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
30
PERFORMANCE OF THIS SOFTWARE.
32
US Government Users Restricted Rights
34
Use, duplication, or disclosure by the Government is subject to
35
restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
36
(c)(1)(ii) of the Rights in Technical Data and Computer
37
Software clause at DFARS 252.227-7013 and/or in similar or
38
successor clauses in the FAR or the DOD or NASA FAR
39
Supplement. Unpublished-- rights reserved under the copyright
40
laws of the United States. Contractor/manufacturer is Silicon
41
Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
44
OpenGL(TM) is a trademark of Silicon Graphics, Inc.
50
/* Some <math.h> files do not define M_PI... */
52
#define M_PI 3.14159265358979323846
55
static GLUquadricObj *quadObj;
57
#define QUAD_OBJ_INIT() { if(!quadObj) initQuadObj(); }
62
quadObj = gluNewQuadric();
64
__glutFatalError("out of memory.");
69
glutWireSphere(GLdouble radius, GLint slices, GLint stacks)
72
gluQuadricDrawStyle(quadObj, GLU_LINE);
73
gluQuadricNormals(quadObj, GLU_SMOOTH);
74
/* If we ever changed/used the texture or orientation state
75
of quadObj, we'd need to change it to the defaults here
76
with gluQuadricTexture and/or gluQuadricOrientation. */
77
gluSphere(quadObj, radius, slices, stacks);
81
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
84
gluQuadricDrawStyle(quadObj, GLU_FILL);
85
gluQuadricNormals(quadObj, GLU_SMOOTH);
86
/* If we ever changed/used the texture or orientation state
87
of quadObj, we'd need to change it to the defaults here
88
with gluQuadricTexture and/or gluQuadricOrientation. */
89
gluSphere(quadObj, radius, slices, stacks);
93
glutWireCone(GLdouble base, GLdouble height,
94
GLint slices, GLint stacks)
97
gluQuadricDrawStyle(quadObj, GLU_LINE);
98
gluQuadricNormals(quadObj, GLU_SMOOTH);
99
/* If we ever changed/used the texture or orientation state
100
of quadObj, we'd need to change it to the defaults here
101
with gluQuadricTexture and/or gluQuadricOrientation. */
102
gluCylinder(quadObj, base, 0.0, height, slices, stacks);
106
glutSolidCone(GLdouble base, GLdouble height,
107
GLint slices, GLint stacks)
110
gluQuadricDrawStyle(quadObj, GLU_FILL);
111
gluQuadricNormals(quadObj, GLU_SMOOTH);
112
/* If we ever changed/used the texture or orientation state
113
of quadObj, we'd need to change it to the defaults here
114
with gluQuadricTexture and/or gluQuadricOrientation. */
115
gluCylinder(quadObj, base, 0.0, height, slices, stacks);
121
drawBox(GLfloat size, GLenum type)
123
static GLfloat n[6][3] =
132
static GLint faces[6][4] =
144
v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
145
v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
146
v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
147
v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
148
v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
149
v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
151
for (i = 5; i >= 0; i--) {
153
glNormal3fv(&n[i][0]);
154
glVertex3fv(&v[faces[i][0]][0]);
155
glVertex3fv(&v[faces[i][1]][0]);
156
glVertex3fv(&v[faces[i][2]][0]);
157
glVertex3fv(&v[faces[i][3]][0]);
164
glutWireCube(GLdouble size)
166
drawBox(size, GL_LINE_LOOP);
170
glutSolidCube(GLdouble size)
172
drawBox(size, GL_QUADS);
178
doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings)
181
GLfloat theta, phi, theta1;
182
GLfloat cosTheta, sinTheta;
183
GLfloat cosTheta1, sinTheta1;
184
GLfloat ringDelta, sideDelta;
186
ringDelta = 2.0 * M_PI / rings;
187
sideDelta = 2.0 * M_PI / nsides;
192
for (i = rings - 1; i >= 0; i--) {
193
theta1 = theta + ringDelta;
194
cosTheta1 = cos(theta1);
195
sinTheta1 = sin(theta1);
196
glBegin(GL_QUAD_STRIP);
198
for (j = nsides; j >= 0; j--) {
199
GLfloat cosPhi, sinPhi, dist;
204
dist = R + r * cosPhi;
206
glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
207
glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
208
glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
209
glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
213
cosTheta = cosTheta1;
214
sinTheta = sinTheta1;
220
glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
221
GLint nsides, GLint rings)
223
glPushAttrib(GL_POLYGON_BIT);
224
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
225
doughnut(innerRadius, outerRadius, nsides, rings);
230
glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
231
GLint nsides, GLint rings)
233
doughnut(innerRadius, outerRadius, nsides, rings);
238
static GLfloat dodec[20][3];
241
initDodecahedron(void)
245
alpha = sqrt(2.0 / (3.0 + sqrt(5.0)));
246
beta = 1.0 + sqrt(6.0 / (3.0 + sqrt(5.0)) -
247
2.0 + 2.0 * sqrt(2.0 / (3.0 + sqrt(5.0))));
249
dodec[0][0] = -alpha; dodec[0][1] = 0; dodec[0][2] = beta;
250
dodec[1][0] = alpha; dodec[1][1] = 0; dodec[1][2] = beta;
251
dodec[2][0] = -1; dodec[2][1] = -1; dodec[2][2] = -1;
252
dodec[3][0] = -1; dodec[3][1] = -1; dodec[3][2] = 1;
253
dodec[4][0] = -1; dodec[4][1] = 1; dodec[4][2] = -1;
254
dodec[5][0] = -1; dodec[5][1] = 1; dodec[5][2] = 1;
255
dodec[6][0] = 1; dodec[6][1] = -1; dodec[6][2] = -1;
256
dodec[7][0] = 1; dodec[7][1] = -1; dodec[7][2] = 1;
257
dodec[8][0] = 1; dodec[8][1] = 1; dodec[8][2] = -1;
258
dodec[9][0] = 1; dodec[9][1] = 1; dodec[9][2] = 1;
259
dodec[10][0] = beta; dodec[10][1] = alpha; dodec[10][2] = 0;
260
dodec[11][0] = beta; dodec[11][1] = -alpha; dodec[11][2] = 0;
261
dodec[12][0] = -beta; dodec[12][1] = alpha; dodec[12][2] = 0;
262
dodec[13][0] = -beta; dodec[13][1] = -alpha; dodec[13][2] = 0;
263
dodec[14][0] = -alpha; dodec[14][1] = 0; dodec[14][2] = -beta;
264
dodec[15][0] = alpha; dodec[15][1] = 0; dodec[15][2] = -beta;
265
dodec[16][0] = 0; dodec[16][1] = beta; dodec[16][2] = alpha;
266
dodec[17][0] = 0; dodec[17][1] = beta; dodec[17][2] = -alpha;
267
dodec[18][0] = 0; dodec[18][1] = -beta; dodec[18][2] = alpha;
268
dodec[19][0] = 0; dodec[19][1] = -beta; dodec[19][2] = -alpha;
273
#define DIFF3(_a,_b,_c) { \
274
(_c)[0] = (_a)[0] - (_b)[0]; \
275
(_c)[1] = (_a)[1] - (_b)[1]; \
276
(_c)[2] = (_a)[2] - (_b)[2]; \
280
crossprod(GLfloat v1[3], GLfloat v2[3], GLfloat prod[3])
282
GLfloat p[3]; /* in case prod == v1 or v2 */
284
p[0] = v1[1] * v2[2] - v2[1] * v1[2];
285
p[1] = v1[2] * v2[0] - v2[2] * v1[0];
286
p[2] = v1[0] * v2[1] - v2[0] * v1[1];
293
normalize(GLfloat v[3])
297
d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
299
__glutWarning("normalize: zero length vector");
309
pentagon(int a, int b, int c, int d, int e, GLenum shadeType)
311
GLfloat n0[3], d1[3], d2[3];
313
DIFF3(dodec[a], dodec[b], d1);
314
DIFF3(dodec[b], dodec[c], d2);
315
crossprod(d1, d2, n0);
320
glVertex3fv(&dodec[a][0]);
321
glVertex3fv(&dodec[b][0]);
322
glVertex3fv(&dodec[c][0]);
323
glVertex3fv(&dodec[d][0]);
324
glVertex3fv(&dodec[e][0]);
329
dodecahedron(GLenum type)
331
static int inited = 0;
337
pentagon(0, 1, 9, 16, 5, type);
338
pentagon(1, 0, 3, 18, 7, type);
339
pentagon(1, 7, 11, 10, 9, type);
340
pentagon(11, 7, 18, 19, 6, type);
341
pentagon(8, 17, 16, 9, 10, type);
342
pentagon(2, 14, 15, 6, 19, type);
343
pentagon(2, 13, 12, 4, 14, type);
344
pentagon(2, 19, 18, 3, 13, type);
345
pentagon(3, 0, 5, 12, 13, type);
346
pentagon(6, 15, 8, 10, 11, type);
347
pentagon(4, 17, 8, 15, 14, type);
348
pentagon(4, 12, 5, 16, 17, type);
353
glutWireDodecahedron(void)
355
dodecahedron(GL_LINE_LOOP);
359
glutSolidDodecahedron(void)
361
dodecahedron(GL_TRIANGLE_FAN);
367
recorditem(GLfloat * n1, GLfloat * n2, GLfloat * n3,
370
GLfloat q0[3], q1[3];
374
crossprod(q0, q1, q1);
386
subdivide(GLfloat * v0, GLfloat * v1, GLfloat * v2,
390
GLfloat w0[3], w1[3], w2[3];
395
for (i = 0; i < depth; i++) {
396
for (j = 0; i + j < depth; j++) {
398
for (n = 0; n < 3; n++) {
399
w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth;
400
w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n])
402
w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n])
405
l = sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]);
409
l = sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]);
413
l = sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]);
417
recorditem(w1, w0, w2, shadeType);
423
drawtriangle(int i, GLfloat data[][3], int ndx[][3],
426
GLfloat *x0, *x1, *x2;
428
x0 = data[ndx[i][0]];
429
x1 = data[ndx[i][1]];
430
x2 = data[ndx[i][2]];
431
subdivide(x0, x1, x2, shadeType);
434
/* octahedron data: The octahedron produced is centered at the
435
origin and has radius 1.0 */
436
static GLfloat odata[6][3] =
446
static int ondex[8][3] =
459
octahedron(GLenum shadeType)
463
for (i = 7; i >= 0; i--) {
464
drawtriangle(i, odata, ondex, shadeType);
470
glutWireOctahedron(void)
472
octahedron(GL_LINE_LOOP);
476
glutSolidOctahedron(void)
478
octahedron(GL_TRIANGLES);
483
/* icosahedron data: These numbers are rigged to make an
484
icosahedron of radius 1.0 */
486
#define X .525731112119133606
487
#define Z .850650808352039932
489
static GLfloat idata[12][3] =
505
static int index[20][3] =
530
icosahedron(GLenum shadeType)
534
for (i = 19; i >= 0; i--) {
535
drawtriangle(i, idata, index, shadeType);
541
glutWireIcosahedron(void)
543
icosahedron(GL_LINE_LOOP);
547
glutSolidIcosahedron(void)
549
icosahedron(GL_TRIANGLES);
554
/* tetrahedron data: */
556
#define T 1.73205080756887729
558
static GLfloat tdata[4][3] =
566
static int tndex[4][3] =
575
tetrahedron(GLenum shadeType)
579
for (i = 3; i >= 0; i--)
580
drawtriangle(i, tdata, tndex, shadeType);
585
glutWireTetrahedron(void)
587
tetrahedron(GL_LINE_LOOP);
591
glutSolidTetrahedron(void)
593
tetrahedron(GL_TRIANGLES);