4 * Freeglut geometry rendering methods.
6 * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
7 * Written by Pawel W. Olszta, <olszta@sourceforge.net>
8 * Creation date: Fri Dec 3 1999
10 * Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 #define G_LOG_DOMAIN "freeglut-geometry"
34 #include "../include/GL/freeglut.h"
35 #include "../include/GL/freeglut_internal.h"
38 * TODO BEFORE THE STABLE RELEASE:
40 * Following functions have been contributed by Andreas Umbach. I modified
41 * them a bit to make them use GLib (for memory allocation).
43 * glutWireCube() -- could add normal vectors so that lighting works
44 * glutSolidCube() -- OK
45 * glutWireSphere() -- OK
46 * glutSolidSphere() -- OK
48 * Following functions have been implemented by me:
50 * glutWireCone() -- looks OK
51 * glutSolidCone() -- normals are missing, there are holes in the thing
53 * Those functions need to be implemented, as nothing has been done yet.
54 * For now all of them draw a wire or solid cube, just to mark their presence.
58 * glutWireDodecahedron() --
59 * glutSolidDodecahedron() --
60 * glutWireOctahedron() --
61 * glutSolidOctahedron() --
62 * glutWireTetrahedron() --
63 * glutSolidTetrahedron() --
64 * glutWireIcosahedron() --
65 * glutSolidIcosahedron() --
69 /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
72 * Draws a wireframed cube. Code contributed by Andreas Umbach <marvin@dataway.ch>
74 void FGAPIENTRY glutWireCube( GLdouble dSize )
76 float size = (float) dSize * 0.5f;
78 # define V(a,b,c) glVertex3f( a size, b size, c size );
81 * PWO: I dared to convert the code to use macros...
83 glBegin( GL_LINE_LOOP ); V(-,-,+); V(+,-,+); V(+,+,+); V(-,+,+); glEnd();
84 glBegin( GL_LINE_LOOP ); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-); glEnd();
86 V(-,-,+); V(-,-,-); V(-,+,+); V(-,+,-);
87 V(+,-,+); V(+,-,-); V(+,+,+); V(+,+,-);
94 * Draws a solid cube. Code contributed by Andreas Umbach <marvin@dataway.ch>
96 void FGAPIENTRY glutSolidCube( GLdouble dSize )
98 float size = (float) dSize * 0.5f;
100 # define V(a,b,c) glVertex3f( a size, b size, c size );
101 # define N(a,b,c) glNormal3f( a, b, c );
104 * PWO: Again, I dared to convert the code to use macros...
107 N( 1, 0, 0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+);
108 N( 0, 1, 0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+);
109 N( 0, 0, 1); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+);
110 N(-1, 0, 0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-);
111 N( 0,-1, 0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+);
112 N( 0, 0,-1); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-);
120 * Draws a wire sphere. Code contributed by Andreas Umbach <marvin@dataway.ch>
122 void FGAPIENTRY glutWireSphere( GLdouble dRadius, GLint slices, GLint stacks )
124 float radius = (float) dRadius, phi, psi, dpsi, dphi;
129 * Allocate the vertices array
131 vertex = calloc( sizeof(float), 3 * slices * (stacks - 1) );
134 glScalef( radius, radius, radius );
136 dpsi = M_PI / (stacks + 1);
137 dphi = 2 * M_PI / slices;
140 for( j=0; j<stacks-1; j++ )
144 for( i=0; i<slices; i++ )
146 *(vertex + 3 * j * slices + 3 * i + 0) = sin( phi ) * sin( psi );
147 *(vertex + 3 * j * slices + 3 * i + 1) = cos( phi ) * sin( psi );
148 *(vertex + 3 * j * slices + 3 * i + 2) = cos( psi );
150 glVertex3fv( vertex + 3 * j * slices + 3 * i );
156 for( i=0; i<slices; i++ )
158 glBegin( GL_LINE_STRIP );
159 glNormal3f( 0, 0, 1 );
160 glVertex3f( 0, 0, 1 );
162 for( j=0; j<stacks - 1; j++ )
164 glNormal3fv( vertex + 3 * j * slices + 3 * i );
165 glVertex3fv( vertex + 3 * j * slices + 3 * i );
168 glNormal3f(0, 0, -1);
169 glVertex3f(0, 0, -1);
173 for( j=0; j<stacks-1; j++ )
175 glBegin(GL_LINE_LOOP);
177 for( i=0; i<slices; i++ )
179 glNormal3fv( vertex + 3 * j * slices + 3 * i );
180 glVertex3fv( vertex + 3 * j * slices + 3 * i );
191 * Draws a solid sphere. Code contributed by Andreas Umbach <marvin@dataway.ch>
193 void FGAPIENTRY glutSolidSphere( GLdouble dRadius, GLint slices, GLint stacks )
195 float radius = (float) dRadius, phi, psi, dpsi, dphi;
196 float *next, *tmp, *row;
200 //glScalef( radius, radius, radius );
202 row = calloc( sizeof(float), slices * 3 );
203 next = calloc( sizeof(float), slices * 3 );
205 dpsi = M_PI / (stacks + 1);
206 dphi = 2 * M_PI / slices;
210 /* init first line + do polar cap */
211 glBegin( GL_TRIANGLE_FAN );
212 glNormal3f( 0, 0, 1 );
213 glVertex3f( 0, 0, radius );
215 for( i=0; i<slices; i++ )
217 row[ i * 3 + 0 ] = sin( phi ) * sin( psi );
218 row[ i * 3 + 1 ] = cos( phi ) * sin( psi );
219 row[ i * 3 + 2 ] = cos( psi );
221 glNormal3fv( row + 3 * i );
223 radius * *(row + 3 * i + 0),
224 radius * *(row + 3 * i + 1),
225 radius * *(row + 3 * i + 2)
232 glVertex3f( radius * *(row + 0), radius * *(row + 1), radius * *(row + 2) );
235 for( j=0; j<stacks-1; j++ )
241 glBegin( GL_QUAD_STRIP );
243 /* glBegin(GL_LINE_LOOP); */
244 for( i=0; i<slices; i++ )
246 next[ i * 3 + 0 ] = sin( phi ) * sin( psi );
247 next[ i * 3 + 1 ] = cos( phi ) * sin( psi );
248 next[ i * 3 + 2 ] = cos( psi );
250 glNormal3fv( row + i * 3 );
252 radius * *(row + 3 * i + 0),
253 radius * *(row + 3 * i + 1),
254 radius * *(row + 3 * i + 2)
257 glNormal3fv( next + i * 3 );
259 radius * *(next + 3 * i + 0),
260 radius * *(next + 3 * i + 1),
261 radius * *(next + 3 * i + 2)
268 glVertex3f( radius * *(row + 0), radius * *(row + 1), radius * *(row + 2) );
270 glVertex3f( radius * *(next + 0), radius * *(next + 1), radius * *(next + 2) );
279 glBegin( GL_TRIANGLE_FAN );
280 glNormal3f( 0, 0, -1 );
281 glVertex3f( 0, 0, -radius );
283 glVertex3f( radius * *(row + 0), radius * *(row + 1), radius * *(row + 2) );
285 for( i=slices-1; i>=0; i-- )
287 glNormal3fv(row + 3 * i);
289 radius * *(row + 3 * i + 0),
290 radius * *(row + 3 * i + 1),
291 radius * *(row + 3 * i + 2)
305 void FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks )
307 float alt = (float) height / (float) (stacks + 1);
308 float angle = (float) M_PI / (float) slices * 2.0f;
309 float slope = (float) tan( height / base );
310 float* vertices = NULL;
314 * We need 'slices' points on a circle
316 vertices = calloc( sizeof(float), 2 * (slices + 1) );
318 for( i=0; i<slices+1; i++ )
320 vertices[ i*2 + 0 ] = cos( angle * i );
321 vertices[ i*2 + 1 ] = sin( angle * i );
325 * First the cone's bottom...
327 for( i=0; i<slices; i++ )
329 float scl = height / slope;
331 glBegin( GL_LINE_LOOP );
332 glNormal3f( 0, 0, -1 );
333 glVertex3f( vertices[ (i+0)*2+0 ] * scl, vertices[ (i+0)*2+1 ] * scl, 0 );
334 glVertex3f( vertices[ (i+1)*2+0 ] * scl, vertices[ (i+1)*2+1 ] * scl, 0 );
335 glVertex3f( 0, 0, 0 );
340 * Then all the stacks between the bottom and the top
342 * ekhm jak wektor normalny z trojkata?
344 for( i=0; i<stacks; i++ )
346 float alt_a = i * alt, alt_b = (i + 1) * alt;
347 float scl_a = (height - alt_a) / slope;
348 float scl_b = (height - alt_b) / slope;
350 for( j=0; j<slices; j++ )
352 glBegin( GL_LINE_LOOP );
353 glVertex3f( vertices[(j+0)*2+0] * scl_a, vertices[(j+0)*2+1] * scl_a, alt_a );
354 glVertex3f( vertices[(j+1)*2+0] * scl_a, vertices[(j+1)*2+1] * scl_a, alt_a );
355 glVertex3f( vertices[(j+0)*2+0] * scl_b, vertices[(j+0)*2+1] * scl_b, alt_b );
358 glBegin( GL_LINE_LOOP );
359 glVertex3f( vertices[(j+0)*2+0] * scl_b, vertices[(j+0)*2+1] * scl_b, alt_b );
360 glVertex3f( vertices[(j+1)*2+0] * scl_b, vertices[(j+1)*2+1] * scl_b, alt_b );
361 glVertex3f( vertices[(j+1)*2+0] * scl_a, vertices[(j+1)*2+1] * scl_a, alt_a );
367 * Finally have the top part drawn...
369 for( i=0; i<slices; i++ )
371 float scl = alt / slope;
373 glBegin( GL_LINE_LOOP );
374 glVertex3f( vertices[ (i+0)*2+0 ] * scl, vertices[ (i+0)*2+1 ] * scl, height - alt );
375 glVertex3f( vertices[ (i+1)*2+0 ] * scl, vertices[ (i+1)*2+1 ] * scl, height - alt );
376 glVertex3f( 0, 0, height );
384 void FGAPIENTRY glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks )
386 float alt = (float) height / (float) (stacks + 1);
387 float angle = (float) M_PI / (float) slices * 2.0f;
388 float slope = (float) tan( height / base );
389 float* vertices = NULL;
393 * We need 'slices' points on a circle
395 vertices = calloc( sizeof(float), 2 * (slices + 1) );
397 for( i=0; i<slices+1; i++ )
399 vertices[ i*2 + 0 ] = cos( angle * i );
400 vertices[ i*2 + 1 ] = sin( angle * i );
404 * First the cone's bottom...
406 for( i=0; i<slices; i++ )
408 float scl = height / slope;
410 glBegin( GL_TRIANGLES );
411 glNormal3f( 0, 0, -1 );
412 glVertex3f( vertices[ (i+0)*2+0 ] * scl, vertices[ (i+0)*2+1 ] * scl, 0 );
413 glVertex3f( vertices[ (i+1)*2+0 ] * scl, vertices[ (i+1)*2+1 ] * scl, 0 );
414 glVertex3f( 0, 0, 0 );
419 * Then all the stacks between the bottom and the top
421 * ekhm jak wektor normalny z trojkata?
423 for( i=0; i<stacks; i++ )
425 float alt_a = i * alt, alt_b = (i + 1) * alt;
426 float scl_a = (height - alt_a) / slope;
427 float scl_b = (height - alt_b) / slope;
429 for( j=0; j<slices; j++ )
431 glBegin( GL_TRIANGLES );
432 glVertex3f( vertices[(j+0)*2+0] * scl_a, vertices[(j+0)*2+1] * scl_a, alt_a );
433 glVertex3f( vertices[(j+1)*2+0] * scl_a, vertices[(j+1)*2+1] * scl_a, alt_a );
434 glVertex3f( vertices[(j+0)*2+0] * scl_b, vertices[(j+0)*2+1] * scl_b, alt_b );
437 glBegin( GL_TRIANGLES );
438 glVertex3f( vertices[(j+1)*2+0] * scl_a, vertices[(j+1)*2+1] * scl_a, alt_a );
439 glVertex3f( vertices[(j+1)*2+0] * scl_b, vertices[(j+1)*2+1] * scl_b, alt_b );
440 glVertex3f( vertices[(j+0)*2+0] * scl_b, vertices[(j+0)*2+1] * scl_b, alt_b );
446 * Finally have the top part drawn...
448 for( i=0; i<slices; i++ )
450 float scl = alt / slope;
452 glBegin( GL_TRIANGLES );
453 glVertex3f( vertices[ (i+0)*2+0 ] * scl, vertices[ (i+0)*2+1 ] * scl, height - alt );
454 glVertex3f( vertices[ (i+1)*2+0 ] * scl, vertices[ (i+1)*2+1 ] * scl, height - alt );
455 glVertex3f( 0, 0, height );
463 void FGAPIENTRY glutWireTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings )
465 glutWireSphere( dOuterRadius, 5, 5 );
471 void FGAPIENTRY glutSolidTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings )
473 glutSolidSphere( dOuterRadius, 5, 5 );
479 void FGAPIENTRY glutWireDodecahedron( void )
481 /* Magic Numbers: It is possible to create a dodecahedron by attaching two pentagons to each face of
482 * of a cube. The coordinates of the points are:
483 * (+-x,0, z); (+-1, 1, 1); (0, z, x )
484 * where x = 0.618033989 and z = 1.618033939.
486 glBegin ( GL_LINE_LOOP ) ;
487 glNormal3f ( 0.000000f, 0.525731f, 0.850651f ) ; glVertex3f ( 0.000000f, 1.618034f, 0.618034f ) ; glVertex3f ( -1.0f, 1.0f, 1.0f ) ; glVertex3f ( -0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( 0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( 1.0f, 1.0f, 1.0f ) ;
489 glBegin ( GL_LINE_LOOP ) ;
490 glNormal3f ( 0.000000f, 0.525731f, -0.850651f ) ; glVertex3f ( 0.000000f, 1.618034f, -0.618034f ) ; glVertex3f ( 1.0f, 1.0f, -1.0f ) ; glVertex3f ( 0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( -0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( -1.0f, 1.0f, -1.0f ) ;
492 glBegin ( GL_LINE_LOOP ) ;
493 glNormal3f ( 0.000000f, -0.525731f, 0.850651f ) ; glVertex3f ( 0.000000f, -1.618034f, 0.618034f ) ; glVertex3f ( 1.0f, -1.0f, 1.0f ) ; glVertex3f ( 0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( -0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( -1.0f, -1.0f, 1.0f ) ;
495 glBegin ( GL_LINE_LOOP ) ;
496 glNormal3f ( 0.000000f, -0.525731f, -0.850651f ) ; glVertex3f ( 0.000000f, -1.618034f, -0.618034f ) ; glVertex3f ( -1.0f, -1.0f, -1.0f ) ; glVertex3f ( -0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( 0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( 1.0f, -1.0f, -1.0f ) ;
499 glBegin ( GL_LINE_LOOP ) ;
500 glNormal3f ( 0.850651f, 0.000000f, 0.525731f ) ; glVertex3f ( 0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( 1.0f, -1.0f, 1.0f ) ; glVertex3f ( 1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( 1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( 1.0f, 1.0f, 1.0f ) ;
502 glBegin ( GL_LINE_LOOP ) ;
503 glNormal3f ( -0.850651f, 0.000000f, 0.525731f ) ; glVertex3f ( -0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( -1.0f, 1.0f, 1.0f ) ; glVertex3f ( -1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( -1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( -1.0f, -1.0f, 1.0f ) ;
505 glBegin ( GL_LINE_LOOP ) ;
506 glNormal3f ( 0.850651f, 0.000000f, -0.525731f ) ; glVertex3f ( 0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( 1.0f, 1.0f, -1.0f ) ; glVertex3f ( 1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( 1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( 1.0f, -1.0f, -1.0f ) ;
508 glBegin ( GL_LINE_LOOP ) ;
509 glNormal3f ( -0.850651f, 0.000000f, -0.525731f ) ; glVertex3f ( -0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( -1.0f, -1.0f, -1.0f ) ; glVertex3f ( -1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( -1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( -1.0f, 1.0f, -1.0f ) ;
512 glBegin ( GL_LINE_LOOP ) ;
513 glNormal3f ( 0.525731f, 0.850651f, 0.000000f ) ; glVertex3f ( 1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( 1.0f, 1.0f, -1.0f ) ; glVertex3f ( 0.000000f, 1.618034f, -0.618034f ) ; glVertex3f ( 0.000000f, 1.618034f, 0.618034f ) ; glVertex3f ( 1.0f, 1.0f, 1.0f ) ;
515 glBegin ( GL_LINE_LOOP ) ;
516 glNormal3f ( 0.525731f, -0.850651f, 0.000000f ) ; glVertex3f ( 1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( 1.0f, -1.0f, 1.0f ) ; glVertex3f ( 0.000000f, -1.618034f, 0.618034f ) ; glVertex3f ( 0.000000f, -1.618034f, -0.618034f ) ; glVertex3f ( 1.0f, -1.0f, -1.0f ) ;
518 glBegin ( GL_LINE_LOOP ) ;
519 glNormal3f ( -0.525731f, 0.850651f, 0.000000f ) ; glVertex3f ( -1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( -1.0f, 1.0f, 1.0f ) ; glVertex3f ( 0.000000f, 1.618034f, 0.618034f ) ; glVertex3f ( 0.000000f, 1.618034f, -0.618034f ) ; glVertex3f ( -1.0f, 1.0f, -1.0f ) ;
521 glBegin ( GL_LINE_LOOP ) ;
522 glNormal3f ( -0.525731f, -0.850651f, 0.000000f ) ; glVertex3f ( -1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( -1.0f, -1.0f, -1.0f ) ; glVertex3f ( 0.000000f, -1.618034f, -0.618034f ) ; glVertex3f ( 0.000000f, -1.618034f, 0.618034f ) ; glVertex3f ( -1.0f, -1.0f, 1.0f ) ;
529 void FGAPIENTRY glutSolidDodecahedron( void )
531 /* Magic Numbers: It is possible to create a dodecahedron by attaching two pentagons to each face of
532 * of a cube. The coordinates of the points are:
533 * (+-x,0, z); (+-1, 1, 1); (0, z, x )
534 * where x = 0.618033989 and z = 1.618033939.
536 glBegin ( GL_POLYGON ) ;
537 glNormal3f ( 0.000000f, 0.525731f, 0.850651f ) ; glVertex3f ( 0.000000f, 1.618034f, 0.618034f ) ; glVertex3f ( -1.0f, 1.0f, 1.0f ) ; glVertex3f ( -0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( 0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( 1.0f, 1.0f, 1.0f ) ;
539 glBegin ( GL_POLYGON ) ;
540 glNormal3f ( 0.000000f, 0.525731f, -0.850651f ) ; glVertex3f ( 0.000000f, 1.618034f, -0.618034f ) ; glVertex3f ( 1.0f, 1.0f, -1.0f ) ; glVertex3f ( 0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( -0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( -1.0f, 1.0f, -1.0f ) ;
542 glBegin ( GL_POLYGON ) ;
543 glNormal3f ( 0.000000f, -0.525731f, 0.850651f ) ; glVertex3f ( 0.000000f, -1.618034f, 0.618034f ) ; glVertex3f ( 1.0f, -1.0f, 1.0f ) ; glVertex3f ( 0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( -0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( -1.0f, -1.0f, 1.0f ) ;
545 glBegin ( GL_POLYGON ) ;
546 glNormal3f ( 0.000000f, -0.525731f, -0.850651f ) ; glVertex3f ( 0.000000f, -1.618034f, -0.618034f ) ; glVertex3f ( -1.0f, -1.0f, -1.0f ) ; glVertex3f ( -0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( 0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( 1.0f, -1.0f, -1.0f ) ;
549 glBegin ( GL_POLYGON ) ;
550 glNormal3f ( 0.850651f, 0.000000f, 0.525731f ) ; glVertex3f ( 0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( 1.0f, -1.0f, 1.0f ) ; glVertex3f ( 1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( 1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( 1.0f, 1.0f, 1.0f ) ;
552 glBegin ( GL_POLYGON ) ;
553 glNormal3f ( -0.850651f, 0.000000f, 0.525731f ) ; glVertex3f ( -0.618034f, 0.000000f, 1.618034f ) ; glVertex3f ( -1.0f, 1.0f, 1.0f ) ; glVertex3f ( -1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( -1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( -1.0f, -1.0f, 1.0f ) ;
555 glBegin ( GL_POLYGON ) ;
556 glNormal3f ( 0.850651f, 0.000000f, -0.525731f ) ; glVertex3f ( 0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( 1.0f, 1.0f, -1.0f ) ; glVertex3f ( 1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( 1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( 1.0f, -1.0f, -1.0f ) ;
558 glBegin ( GL_POLYGON ) ;
559 glNormal3f ( -0.850651f, 0.000000f, -0.525731f ) ; glVertex3f ( -0.618034f, 0.000000f, -1.618034f ) ; glVertex3f ( -1.0f, -1.0f, -1.0f ) ; glVertex3f ( -1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( -1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( -1.0f, 1.0f, -1.0f ) ;
562 glBegin ( GL_POLYGON ) ;
563 glNormal3f ( 0.525731f, 0.850651f, 0.000000f ) ; glVertex3f ( 1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( 1.0f, 1.0f, -1.0f ) ; glVertex3f ( 0.000000f, 1.618034f, -0.618034f ) ; glVertex3f ( 0.000000f, 1.618034f, 0.618034f ) ; glVertex3f ( 1.0f, 1.0f, 1.0f ) ;
565 glBegin ( GL_POLYGON ) ;
566 glNormal3f ( 0.525731f, -0.850651f, 0.000000f ) ; glVertex3f ( 1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( 1.0f, -1.0f, 1.0f ) ; glVertex3f ( 0.000000f, -1.618034f, 0.618034f ) ; glVertex3f ( 0.000000f, -1.618034f, -0.618034f ) ; glVertex3f ( 1.0f, -1.0f, -1.0f ) ;
568 glBegin ( GL_POLYGON ) ;
569 glNormal3f ( -0.525731f, 0.850651f, 0.000000f ) ; glVertex3f ( -1.618034f, 0.618034f, 0.000000f ) ; glVertex3f ( -1.0f, 1.0f, 1.0f ) ; glVertex3f ( 0.000000f, 1.618034f, 0.618034f ) ; glVertex3f ( 0.000000f, 1.618034f, -0.618034f ) ; glVertex3f ( -1.0f, 1.0f, -1.0f ) ;
571 glBegin ( GL_POLYGON ) ;
572 glNormal3f ( -0.525731f, -0.850651f, 0.000000f ) ; glVertex3f ( -1.618034f, -0.618034f, 0.000000f ) ; glVertex3f ( -1.0f, -1.0f, -1.0f ) ; glVertex3f ( 0.000000f, -1.618034f, -0.618034f ) ; glVertex3f ( 0.000000f, -1.618034f, 0.618034f ) ; glVertex3f ( -1.0f, -1.0f, 1.0f ) ;
579 void FGAPIENTRY glutWireOctahedron( void )
582 glBegin( GL_LINE_LOOP );
583 glNormal3f( 0.577350f, 0.577350f, 0.577350f); glVertex3f( RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f, RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f, RADIUS );
584 glNormal3f( 0.577350f, 0.577350f,-0.577350f); glVertex3f( RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f, RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f,-RADIUS );
585 glNormal3f( 0.577350f,-0.577350f, 0.577350f); glVertex3f( RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f,-RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f, RADIUS );
586 glNormal3f( 0.577350f,-0.577350f,-0.577350f); glVertex3f( RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f,-RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f,-RADIUS );
587 glNormal3f(-0.577350f, 0.577350f, 0.577350f); glVertex3f(-RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f, RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f, RADIUS );
588 glNormal3f(-0.577350f, 0.577350f,-0.577350f); glVertex3f(-RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f, RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f,-RADIUS );
589 glNormal3f(-0.577350f,-0.577350f, 0.577350f); glVertex3f(-RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f,-RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f, RADIUS );
590 glNormal3f(-0.577350f,-0.577350f,-0.577350f); glVertex3f(-RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f,-RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f,-RADIUS );
598 void FGAPIENTRY glutSolidOctahedron( void )
601 glBegin( GL_TRIANGLES );
602 glNormal3f( 0.577350f, 0.577350f, 0.577350f); glVertex3f( RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f, RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f, RADIUS );
603 glNormal3f( 0.577350f, 0.577350f,-0.577350f); glVertex3f( RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f, RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f,-RADIUS );
604 glNormal3f( 0.577350f,-0.577350f, 0.577350f); glVertex3f( RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f,-RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f, RADIUS );
605 glNormal3f( 0.577350f,-0.577350f,-0.577350f); glVertex3f( RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f,-RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f,-RADIUS );
606 glNormal3f(-0.577350f, 0.577350f, 0.577350f); glVertex3f(-RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f, RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f, RADIUS );
607 glNormal3f(-0.577350f, 0.577350f,-0.577350f); glVertex3f(-RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f, RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f,-RADIUS );
608 glNormal3f(-0.577350f,-0.577350f, 0.577350f); glVertex3f(-RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f,-RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f, RADIUS );
609 glNormal3f(-0.577350f,-0.577350f,-0.577350f); glVertex3f(-RADIUS, 0.0f, 0.0f ); glVertex3f( 0.0f,-RADIUS, 0.0f ); glVertex3f( 0.0f, 0.0f,-RADIUS );
617 void FGAPIENTRY glutWireTetrahedron( void )
619 /* Magic Numbers: r0 = ( 1, 0, 0 )
620 * r1 = ( -1/3, 2 sqrt(2) / 3, 0 )
621 * r2 = ( -1/3, -sqrt(2) / 3, sqrt(6) / 3 )
622 * r3 = ( -1/3, -sqrt(2) / 3, -sqrt(6) / 3 )
623 * |r0| = |r1| = |r2| = |r3| = 1
624 * Distance between any two points is 2 sqrt(6) / 3
626 * Normals: The unit normals are simply the negative of the coordinates of the point not on the surface.
629 float r0[3] = { 1.0f, 0.0f, 0.0f } ;
630 float r1[3] = { -0.333333f, 0.942809f, 0.0f } ;
631 float r2[3] = { -0.333333f, -0.471405f, 0.816497f } ;
632 float r3[3] = { -0.333333f, -0.471405f, -0.816497f } ;
634 glBegin( GL_LINE_LOOP ) ;
635 glNormal3f ( -1.0f, 0.0f, 0.0f ) ; glVertex3fv ( r1 ) ; glVertex3fv ( r3 ) ; glVertex3fv ( r2 ) ;
636 glNormal3f ( 0.333333f, -0.942809f, 0.0f ) ; glVertex3fv ( r0 ) ; glVertex3fv ( r2 ) ; glVertex3fv ( r3 ) ;
637 glNormal3f ( 0.333333f, 0.471405f, -0.816497f ) ; glVertex3fv ( r0 ) ; glVertex3fv ( r3 ) ; glVertex3fv ( r1 ) ;
638 glNormal3f ( 0.333333f, 0.471405f, 0.816497f ) ; glVertex3fv ( r0 ) ; glVertex3fv ( r1 ) ; glVertex3fv ( r2 ) ;
645 void FGAPIENTRY glutSolidTetrahedron( void )
647 /* Magic Numbers: r0 = ( 1, 0, 0 )
648 * r1 = ( -1/3, 2 sqrt(2) / 3, 0 )
649 * r2 = ( -1/3, -sqrt(2) / 3, sqrt(6) / 3 )
650 * r3 = ( -1/3, -sqrt(2) / 3, -sqrt(6) / 3 )
651 * |r0| = |r1| = |r2| = |r3| = 1
652 * Distance between any two points is 2 sqrt(6) / 3
654 * Normals: The unit normals are simply the negative of the coordinates of the point not on the surface.
657 float r0[3] = { 1.0f, 0.0f, 0.0f } ;
658 float r1[3] = { -0.333333f, 0.942809f, 0.0f } ;
659 float r2[3] = { -0.333333f, -0.471405f, 0.816497f } ;
660 float r3[3] = { -0.333333f, -0.471405f, -0.816497f } ;
662 glBegin( GL_TRIANGLES ) ;
663 glNormal3f ( -1.0f, 0.0f, 0.0f ) ; glVertex3fv ( r1 ) ; glVertex3fv ( r3 ) ; glVertex3fv ( r2 ) ;
664 glNormal3f ( 0.333333f, -0.942809f, 0.0f ) ; glVertex3fv ( r0 ) ; glVertex3fv ( r2 ) ; glVertex3fv ( r3 ) ;
665 glNormal3f ( 0.333333f, 0.471405f, -0.816497f ) ; glVertex3fv ( r0 ) ; glVertex3fv ( r3 ) ; glVertex3fv ( r1 ) ;
666 glNormal3f ( 0.333333f, 0.471405f, 0.816497f ) ; glVertex3fv ( r0 ) ; glVertex3fv ( r1 ) ; glVertex3fv ( r2 ) ;
673 float r[12][3] = { { 1.0f, 0.0f, 0.0f },
674 { 0.447214f, 0.894427f, 0.0f }, { 0.447214f, 0.276393f, 0.850651f }, { 0.447214f, -0.723607f, 0.525731f }, { 0.447214f, -0.723607f, -0.525731f }, { 0.447214f, 0.276393f, -0.850651f },
675 { -0.447214f, -0.894427f, 0.0f }, { -0.447214f, -0.276393f, 0.850651f }, { -0.447214f, 0.723607f, 0.525731f }, { -0.447214f, 0.723607f, -0.525731f }, { -0.447214f, -0.276393f, -0.850651f },
676 { -1.0f, 0.0f, 0.0f } } ;
677 int v [20][3] = { { 0, 1, 2 }, { 0, 2, 3 }, { 0, 3, 4 }, { 0, 4, 5 }, { 0, 5, 1 },
678 { 1, 8, 2 }, { 2, 7, 3 }, { 3, 6, 4 }, { 4, 10, 5 }, { 5, 9, 1 },
679 { 1, 9, 8 }, { 2, 8, 7 }, { 3, 7, 6 }, { 4, 6, 10 }, { 5, 10, 9 },
680 { 11, 9, 10 }, { 11, 8, 9 }, { 11, 7, 8 }, { 11, 6, 7 }, { 11, 10, 6 } } ;
682 void FGAPIENTRY glutWireIcosahedron( void )
685 for ( i = 0; i < 20; i++ )
688 normal[0] = ( r[v[i][1]][1] - r[v[i][0]][1] ) * ( r[v[i][2]][2] - r[v[i][0]][2] ) - ( r[v[i][1]][2] - r[v[i][0]][2] ) * ( r[v[i][2]][1] - r[v[i][0]][1] ) ;
689 normal[1] = ( r[v[i][1]][2] - r[v[i][0]][2] ) * ( r[v[i][2]][0] - r[v[i][0]][0] ) - ( r[v[i][1]][0] - r[v[i][0]][0] ) * ( r[v[i][2]][2] - r[v[i][0]][2] ) ;
690 normal[2] = ( r[v[i][1]][0] - r[v[i][0]][0] ) * ( r[v[i][2]][1] - r[v[i][0]][1] ) - ( r[v[i][1]][1] - r[v[i][0]][1] ) * ( r[v[i][2]][0] - r[v[i][0]][0] ) ;
691 glBegin ( GL_LINE_LOOP ) ;
692 glNormal3fv ( normal ) ;
693 glVertex3fv ( r[v[i][0]] ) ;
694 glVertex3fv ( r[v[i][1]] ) ;
695 glVertex3fv ( r[v[i][2]] ) ;
703 void FGAPIENTRY glutSolidIcosahedron( void )
707 glBegin ( GL_TRIANGLES ) ;
708 for ( i = 0; i < 20; i++ )
711 normal[0] = ( r[v[i][1]][1] - r[v[i][0]][1] ) * ( r[v[i][2]][2] - r[v[i][0]][2] ) - ( r[v[i][1]][2] - r[v[i][0]][2] ) * ( r[v[i][2]][1] - r[v[i][0]][1] ) ;
712 normal[1] = ( r[v[i][1]][2] - r[v[i][0]][2] ) * ( r[v[i][2]][0] - r[v[i][0]][0] ) - ( r[v[i][1]][0] - r[v[i][0]][0] ) * ( r[v[i][2]][2] - r[v[i][0]][2] ) ;
713 normal[2] = ( r[v[i][1]][0] - r[v[i][0]][0] ) * ( r[v[i][2]][1] - r[v[i][0]][1] ) - ( r[v[i][1]][1] - r[v[i][0]][1] ) * ( r[v[i][2]][0] - r[v[i][0]][0] ) ;
714 glNormal3fv ( normal ) ;
715 glVertex3fv ( r[v[i][0]] ) ;
716 glVertex3fv ( r[v[i][1]] ) ;
717 glVertex3fv ( r[v[i][2]] ) ;
723 /*** END OF FILE ***/