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 * quadric.c 40 * This program demonstrates the use of some of the gluQuadric* 41 * routines. Quadric objects are created with some quadric 42 * properties and the callback routine to handle errors. 43 * Note that the cylinder has no top or bottom and the circle 44 * has a hole in it. 45 */ 46#include "glut_wrap.h" 47#include <stdio.h> 48#include <stdlib.h> 49 50GLuint startList; 51 52static void GLAPIENTRY errorCallback(GLenum errorCode) 53{ 54 const GLubyte *estring; 55 56 estring = gluErrorString(errorCode); 57 fprintf(stderr, "Quadric Error: %s\n", estring); 58 exit(0); 59} 60 61static void init(void) 62{ 63 GLUquadricObj *qobj; 64 GLfloat mat_ambient[] = { 0.5, 0.5, 0.5, 1.0 }; 65 GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; 66 GLfloat mat_shininess[] = { 50.0 }; 67 GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; 68 GLfloat model_ambient[] = { 0.5, 0.5, 0.5, 1.0 }; 69 70 glClearColor(0.0, 0.0, 0.0, 0.0); 71 72 glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); 73 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 74 glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 75 glLightfv(GL_LIGHT0, GL_POSITION, light_position); 76 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient); 77 78 glEnable(GL_LIGHTING); 79 glEnable(GL_LIGHT0); 80 glEnable(GL_DEPTH_TEST); 81 82/* Create 4 display lists, each with a different quadric object. 83 * Different drawing styles and surface normal specifications 84 * are demonstrated. 85 */ 86 startList = glGenLists(4); 87 qobj = gluNewQuadric(); 88 gluQuadricCallback(qobj, GLU_ERROR, errorCallback); 89 90 gluQuadricDrawStyle(qobj, GLU_FILL); /* smooth shaded */ 91 gluQuadricNormals(qobj, GLU_SMOOTH); 92 glNewList(startList, GL_COMPILE); 93 gluSphere(qobj, 0.75, 15, 10); 94 glEndList(); 95 96 gluQuadricDrawStyle(qobj, GLU_FILL); /* flat shaded */ 97 gluQuadricNormals(qobj, GLU_FLAT); 98 glNewList(startList+1, GL_COMPILE); 99 gluCylinder(qobj, 0.5, 0.3, 1.0, 15, 5); 100 glEndList(); 101 102 gluQuadricDrawStyle(qobj, GLU_LINE); /* all polygons wireframe */ 103 gluQuadricNormals(qobj, GLU_NONE); 104 glNewList(startList+2, GL_COMPILE); 105 gluDisk(qobj, 0.25, 1.0, 20, 4); 106 glEndList(); 107 108 gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); /* boundary only */ 109 gluQuadricNormals(qobj, GLU_NONE); 110 glNewList(startList+3, GL_COMPILE); 111 gluPartialDisk(qobj, 0.0, 1.0, 20, 4, 0.0, 225.0); 112 glEndList(); 113 114 gluDeleteQuadric(qobj); 115} 116 117static void display(void) 118{ 119 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 120 glPushMatrix(); 121 122 glEnable(GL_LIGHTING); 123 glShadeModel (GL_SMOOTH); 124 glTranslatef(-1.0, -1.0, 0.0); 125 glCallList(startList); 126 127 glShadeModel (GL_FLAT); 128 glTranslatef(0.0, 2.0, 0.0); 129 glPushMatrix(); 130 glRotatef(300.0, 1.0, 0.0, 0.0); 131 glCallList(startList+1); 132 glPopMatrix(); 133 134 glDisable(GL_LIGHTING); 135 glColor3f(0.0, 1.0, 1.0); 136 glTranslatef(2.0, -2.0, 0.0); 137 glCallList(startList+2); 138 139 glColor3f(1.0, 1.0, 0.0); 140 glTranslatef(0.0, 2.0, 0.0); 141 glCallList(startList+3); 142 143 glPopMatrix(); 144 glFlush(); 145} 146 147static void reshape (int w, int h) 148{ 149 glViewport(0, 0, (GLsizei) w, (GLsizei) h); 150 glMatrixMode(GL_PROJECTION); 151 glLoadIdentity(); 152 if (w <= h) 153 glOrtho(-2.5, 2.5, -2.5*(GLfloat)h/(GLfloat)w, 154 2.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0); 155 else 156 glOrtho(-2.5*(GLfloat)w/(GLfloat)h, 157 2.5*(GLfloat)w/(GLfloat)h, -2.5, 2.5, -10.0, 10.0); 158 glMatrixMode(GL_MODELVIEW); 159 glLoadIdentity(); 160} 161 162/* ARGSUSED1 */ 163static void keyboard(unsigned char key, int x, int y) 164{ 165 switch (key) { 166 case 27: 167 exit(0); 168 break; 169 } 170} 171 172int main(int argc, char** argv) 173{ 174 glutInit(&argc, argv); 175 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 176 glutInitWindowSize(500, 500); 177 glutInitWindowPosition(100, 100); 178 glutCreateWindow(argv[0]); 179 init(); 180 glutDisplayFunc(display); 181 glutReshapeFunc(reshape); 182 glutKeyboardFunc(keyboard); 183 glutMainLoop(); 184 return 0; 185} 186