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.
48 # include <simgear_config.h>
61 #include "glut_shapes.h"
63 /* Some <math.h> files do not define M_PI... */
65 #define M_PI 3.14159265358979323846
68 static GLUquadricObj *quadObj;
70 #define QUAD_OBJ_INIT() { if(!quadObj) initQuadObj(); }
75 quadObj = gluNewQuadric();
77 /* __glutFatalError("out of memory.") */;
82 glutWireSphere(GLdouble radius, GLint slices, GLint stacks)
85 gluQuadricDrawStyle(quadObj, GLU_LINE);
86 gluQuadricNormals(quadObj, GLU_SMOOTH);
87 /* If we ever changed/used the texture or orientation state
88 of quadObj, we'd need to change it to the defaults here
89 with gluQuadricTexture and/or gluQuadricOrientation. */
90 gluSphere(quadObj, radius, slices, stacks);
94 glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
97 gluQuadricDrawStyle(quadObj, GLU_FILL);
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 gluSphere(quadObj, radius, slices, stacks);
106 glutWireCone(GLdouble base, GLdouble height,
107 GLint slices, GLint stacks)
110 gluQuadricDrawStyle(quadObj, GLU_LINE);
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);
119 glutSolidCone(GLdouble base, GLdouble height,
120 GLint slices, GLint stacks)
123 gluQuadricDrawStyle(quadObj, GLU_FILL);
124 gluQuadricNormals(quadObj, GLU_SMOOTH);
125 /* If we ever changed/used the texture or orientation state
126 of quadObj, we'd need to change it to the defaults here
127 with gluQuadricTexture and/or gluQuadricOrientation. */
128 gluCylinder(quadObj, base, 0.0, height, slices, stacks);
134 drawBox(GLfloat size, GLenum type)
136 static GLfloat n[6][3] =
145 static GLint faces[6][4] =
157 v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
158 v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
159 v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
160 v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
161 v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
162 v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
164 for (i = 5; i >= 0; i--) {
166 glNormal3fv(&n[i][0]);
167 glVertex3fv(&v[faces[i][0]][0]);
168 glVertex3fv(&v[faces[i][1]][0]);
169 glVertex3fv(&v[faces[i][2]][0]);
170 glVertex3fv(&v[faces[i][3]][0]);
177 glutWireCube(GLdouble size)
179 drawBox(size, GL_LINE_LOOP);
183 glutSolidCube(GLdouble size)
185 drawBox(size, GL_QUADS);
191 doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings)
194 GLfloat theta, phi, theta1;
195 GLfloat cosTheta, sinTheta;
196 GLfloat cosTheta1, sinTheta1;
197 GLfloat ringDelta, sideDelta;
199 ringDelta = 2.0 * M_PI / rings;
200 sideDelta = 2.0 * M_PI / nsides;
205 for (i = rings - 1; i >= 0; i--) {
206 theta1 = theta + ringDelta;
207 cosTheta1 = cos(theta1);
208 sinTheta1 = sin(theta1);
209 glBegin(GL_QUAD_STRIP);
211 for (j = nsides; j >= 0; j--) {
212 GLfloat cosPhi, sinPhi, dist;
217 dist = R + r * cosPhi;
219 glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
220 glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
221 glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
222 glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
226 cosTheta = cosTheta1;
227 sinTheta = sinTheta1;
233 glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
234 GLint nsides, GLint rings)
236 glPushAttrib(GL_POLYGON_BIT);
237 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
238 doughnut(innerRadius, outerRadius, nsides, rings);
243 glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
244 GLint nsides, GLint rings)
246 doughnut(innerRadius, outerRadius, nsides, rings);
251 static GLfloat dodec[20][3];
254 initDodecahedron(void)
258 alpha = sqrt(2.0 / (3.0 + sqrt(5.0)));
259 beta = 1.0 + sqrt(6.0 / (3.0 + sqrt(5.0)) -
260 2.0 + 2.0 * sqrt(2.0 / (3.0 + sqrt(5.0))));
262 dodec[0][0] = -alpha; dodec[0][1] = 0; dodec[0][2] = beta;
263 dodec[1][0] = alpha; dodec[1][1] = 0; dodec[1][2] = beta;
264 dodec[2][0] = -1; dodec[2][1] = -1; dodec[2][2] = -1;
265 dodec[3][0] = -1; dodec[3][1] = -1; dodec[3][2] = 1;
266 dodec[4][0] = -1; dodec[4][1] = 1; dodec[4][2] = -1;
267 dodec[5][0] = -1; dodec[5][1] = 1; dodec[5][2] = 1;
268 dodec[6][0] = 1; dodec[6][1] = -1; dodec[6][2] = -1;
269 dodec[7][0] = 1; dodec[7][1] = -1; dodec[7][2] = 1;
270 dodec[8][0] = 1; dodec[8][1] = 1; dodec[8][2] = -1;
271 dodec[9][0] = 1; dodec[9][1] = 1; dodec[9][2] = 1;
272 dodec[10][0] = beta; dodec[10][1] = alpha; dodec[10][2] = 0;
273 dodec[11][0] = beta; dodec[11][1] = -alpha; dodec[11][2] = 0;
274 dodec[12][0] = -beta; dodec[12][1] = alpha; dodec[12][2] = 0;
275 dodec[13][0] = -beta; dodec[13][1] = -alpha; dodec[13][2] = 0;
276 dodec[14][0] = -alpha; dodec[14][1] = 0; dodec[14][2] = -beta;
277 dodec[15][0] = alpha; dodec[15][1] = 0; dodec[15][2] = -beta;
278 dodec[16][0] = 0; dodec[16][1] = beta; dodec[16][2] = alpha;
279 dodec[17][0] = 0; dodec[17][1] = beta; dodec[17][2] = -alpha;
280 dodec[18][0] = 0; dodec[18][1] = -beta; dodec[18][2] = alpha;
281 dodec[19][0] = 0; dodec[19][1] = -beta; dodec[19][2] = -alpha;
286 #define DIFF3(_a,_b,_c) { \
287 (_c)[0] = (_a)[0] - (_b)[0]; \
288 (_c)[1] = (_a)[1] - (_b)[1]; \
289 (_c)[2] = (_a)[2] - (_b)[2]; \
293 crossprod(GLfloat v1[3], GLfloat v2[3], GLfloat prod[3])
295 GLfloat p[3]; /* in case prod == v1 or v2 */
297 p[0] = v1[1] * v2[2] - v2[1] * v1[2];
298 p[1] = v1[2] * v2[0] - v2[2] * v1[0];
299 p[2] = v1[0] * v2[1] - v2[0] * v1[1];
306 normalize(GLfloat v[3])
310 d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
312 /* __glutWarning("normalize: zero length vector"); */
322 pentagon(int a, int b, int c, int d, int e, GLenum shadeType)
324 GLfloat n0[3], d1[3], d2[3];
326 DIFF3(dodec[a], dodec[b], d1);
327 DIFF3(dodec[b], dodec[c], d2);
328 crossprod(d1, d2, n0);
333 glVertex3fv(&dodec[a][0]);
334 glVertex3fv(&dodec[b][0]);
335 glVertex3fv(&dodec[c][0]);
336 glVertex3fv(&dodec[d][0]);
337 glVertex3fv(&dodec[e][0]);
342 dodecahedron(GLenum type)
344 static int inited = 0;
350 pentagon(0, 1, 9, 16, 5, type);
351 pentagon(1, 0, 3, 18, 7, type);
352 pentagon(1, 7, 11, 10, 9, type);
353 pentagon(11, 7, 18, 19, 6, type);
354 pentagon(8, 17, 16, 9, 10, type);
355 pentagon(2, 14, 15, 6, 19, type);
356 pentagon(2, 13, 12, 4, 14, type);
357 pentagon(2, 19, 18, 3, 13, type);
358 pentagon(3, 0, 5, 12, 13, type);
359 pentagon(6, 15, 8, 10, 11, type);
360 pentagon(4, 17, 8, 15, 14, type);
361 pentagon(4, 12, 5, 16, 17, type);
366 glutWireDodecahedron(void)
368 dodecahedron(GL_LINE_LOOP);
372 glutSolidDodecahedron(void)
374 dodecahedron(GL_TRIANGLE_FAN);
380 recorditem(GLfloat * n1, GLfloat * n2, GLfloat * n3,
383 GLfloat q0[3], q1[3];
387 crossprod(q0, q1, q1);
399 subdivide(GLfloat * v0, GLfloat * v1, GLfloat * v2,
403 GLfloat w0[3], w1[3], w2[3];
408 for (i = 0; i < depth; i++) {
409 for (j = 0; i + j < depth; j++) {
411 for (n = 0; n < 3; n++) {
412 w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth;
413 w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n])
415 w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n])
418 l = sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]);
422 l = sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]);
426 l = sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]);
430 recorditem(w1, w0, w2, shadeType);
436 drawtriangle(int i, GLfloat data[][3], int ndx[][3],
439 GLfloat *x0, *x1, *x2;
441 x0 = data[ndx[i][0]];
442 x1 = data[ndx[i][1]];
443 x2 = data[ndx[i][2]];
444 subdivide(x0, x1, x2, shadeType);
447 /* octahedron data: The octahedron produced is centered at the
448 origin and has radius 1.0 */
449 static GLfloat odata[6][3] =
459 static int ondex[8][3] =
472 octahedron(GLenum shadeType)
476 for (i = 7; i >= 0; i--) {
477 drawtriangle(i, odata, ondex, shadeType);
483 glutWireOctahedron(void)
485 octahedron(GL_LINE_LOOP);
489 glutSolidOctahedron(void)
491 octahedron(GL_TRIANGLES);
496 /* icosahedron data: These numbers are rigged to make an
497 icosahedron of radius 1.0 */
499 #define X .525731112119133606
500 #define Z .850650808352039932
502 static GLfloat idata[12][3] =
518 static int index[20][3] =
543 icosahedron(GLenum shadeType)
547 for (i = 19; i >= 0; i--) {
548 drawtriangle(i, idata, index, shadeType);
554 glutWireIcosahedron(void)
556 icosahedron(GL_LINE_LOOP);
560 glutSolidIcosahedron(void)
562 icosahedron(GL_TRIANGLES);
567 /* tetrahedron data: */
569 #define T 1.73205080756887729
571 static GLfloat tdata[4][3] =
579 static int tndex[4][3] =
588 tetrahedron(GLenum shadeType)
592 for (i = 3; i >= 0; i--)
593 drawtriangle(i, tdata, tndex, shadeType);
598 glutWireTetrahedron(void)
600 tetrahedron(GL_LINE_LOOP);
604 glutSolidTetrahedron(void)
606 tetrahedron(GL_TRIANGLES);