1/* 2 * Copyright (c) 1993-1997, Silicon Graphics, Inc. 3 * ALL RIGHTS RESERVED 4 * Permission to use, copy, modify, and distribute this software for 5 * any purpose and without fee is hereby granted, provided that the above 6 * copyright notice appear in all copies and that both the copyright notice 7 * and this permission notice appear in supporting documentation, and that 8 * the name of Silicon Graphics, Inc. not be used in advertising 9 * or publicity pertaining to distribution of the software without specific, 10 * written prior permission. 11 * 12 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" 13 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, 14 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR 15 * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON 16 * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, 17 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY 18 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, 19 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF 20 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN 21 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON 22 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE 23 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. 24 * 25 * US Government Users Restricted Rights 26 * Use, duplication, or disclosure by the Government is subject to 27 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph 28 * (c)(1)(ii) of the Rights in Technical Data and Computer Software 29 * clause at DFARS 252.227-7013 and/or in similar or successor 30 * clauses in the FAR or the DOD or NASA FAR Supplement. 31 * Unpublished-- rights reserved under the copyright laws of the 32 * United States. Contractor/manufacturer is Silicon Graphics, 33 * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. 34 * 35 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc. 36 */ 37 38/* 39 * torus.c 40 * This program demonstrates the creation of a display list. 41 */ 42 43#include "glut_wrap.h" 44#include <stdio.h> 45#include <math.h> 46#include <stdlib.h> 47 48/* Some <math.h> files do not define M_PI... */ 49#ifndef M_PI 50#define M_PI 3.14159265358979323846 51#endif 52 53GLuint theTorus; 54 55/* Draw a torus */ 56static void torus(int numc, int numt) 57{ 58 int i, j, k; 59 double s, t, x, y, z, twopi; 60 61 twopi = 2 * (double)M_PI; 62 for (i = 0; i < numc; i++) { 63 glBegin(GL_QUAD_STRIP); 64 for (j = 0; j <= numt; j++) { 65 for (k = 1; k >= 0; k--) { 66 s = (i + k) % numc + 0.5; 67 t = j % numt; 68 69 x = (1+.1*cos(s*twopi/numc))*cos(t*twopi/numt); 70 y = (1+.1*cos(s*twopi/numc))*sin(t*twopi/numt); 71 z = .1 * sin(s * twopi / numc); 72 glVertex3f(x, y, z); 73 } 74 } 75 glEnd(); 76 } 77} 78 79/* Create display list with Torus and initialize state */ 80static void init(void) 81{ 82 theTorus = glGenLists (1); 83 glNewList(theTorus, GL_COMPILE); 84 torus(8, 25); 85 glEndList(); 86 87 glShadeModel(GL_FLAT); 88 glClearColor(0.0, 0.0, 0.0, 0.0); 89} 90 91/* Clear window and draw torus */ 92static void display(void) 93{ 94 glClear(GL_COLOR_BUFFER_BIT); 95 glColor3f (1.0, 1.0, 1.0); 96 glCallList(theTorus); 97 glFlush(); 98} 99 100/* Handle window resize */ 101static void reshape(int w, int h) 102{ 103 glViewport(0, 0, (GLsizei) w, (GLsizei) h); 104 glMatrixMode(GL_PROJECTION); 105 glLoadIdentity(); 106 gluPerspective(30, (GLfloat) w/(GLfloat) h, 1.0, 100.0); 107 glMatrixMode(GL_MODELVIEW); 108 glLoadIdentity(); 109 gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); 110} 111 112/* Rotate about x-axis when "x" typed; rotate about y-axis 113 when "y" typed; "i" returns torus to original view */ 114/* ARGSUSED1 */ 115static void keyboard(unsigned char key, int x, int y) 116{ 117 switch (key) { 118 case 'x': 119 case 'X': 120 glRotatef(30.,1.0,0.0,0.0); 121 glutPostRedisplay(); 122 break; 123 case 'y': 124 case 'Y': 125 glRotatef(30.,0.0,1.0,0.0); 126 glutPostRedisplay(); 127 break; 128 case 'i': 129 case 'I': 130 glLoadIdentity(); 131 gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); 132 glutPostRedisplay(); 133 break; 134 case 27: 135 exit(0); 136 break; 137 } 138} 139 140int main(int argc, char **argv) 141{ 142 glutInitWindowSize(200, 200); 143 glutInit(&argc, argv); 144 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 145 glutCreateWindow(argv[0]); 146 init(); 147 glutReshapeFunc(reshape); 148 glutKeyboardFunc(keyboard); 149 glutDisplayFunc(display); 150 glutMainLoop(); 151 return 0; 152} 153