/* * Copyright (c) 1996-1999 Silicon Graphics, Inc. All rights reserved. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE * POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* shadeModel.c - open a window, clear the background, and render a * line, a triangle fan and a quad strip using flat/smooth shading. * * SPACE key - toggle between flat/smooth shading * ESCAPE key - exit program */ #include /* includes gl.h, glu.h */ #include #include /* Function Prototypes */ GLvoid initgfx( GLvoid ); GLvoid keyboard( GLubyte, GLint, GLint ); GLvoid drawScene( GLvoid ); void printHelp( char * ); /* Global Definitions */ #define KEY_ESC 27 /* ascii value for the escape key */ static GLint flatShading = GL_FALSE; void main( int argc, char *argv[] ) { GLsizei width, height; glutInit( &argc, argv ); width = glutGet( GLUT_SCREEN_WIDTH ); height = glutGet( GLUT_SCREEN_HEIGHT ); glutInitWindowPosition( width / 4, height / 4 ); glutInitWindowSize( width / 2, height / 2 ); glutInitDisplayMode( GLUT_RGBA ); glutCreateWindow( argv[0] ); initgfx(); glutKeyboardFunc( keyboard ); glutDisplayFunc( drawScene ); printHelp( argv[0] ); glutMainLoop(); } void printHelp( char *progname ) { fprintf(stdout, "\n%s - demonstrates shading models\n\n" "SPACE Key - toggle between flat/smooth shading\n" "Escape Key - exit the program\n\n", progname); } GLvoid initgfx( GLvoid ) { glClearColor( 0.0, 0.0, 1.0, 1.0 ); glOrtho( 0.0, 1.0, 0.0, 1.0, -1.0, 1.0 ); } GLvoid keyboard( GLubyte key, GLint x, GLint y ) { static GLboolean flat = GL_FALSE; switch (key) { case ' ': flatShading = !flatShading; if (flatShading) glShadeModel(GL_FLAT); else glShadeModel(GL_SMOOTH); glutPostRedisplay(); break; case KEY_ESC: /* Exit whenever the Escape key is pressed */ exit(0); } } GLvoid drawScene( GLvoid ) { static GLfloat blackColor[] = { 0.0f, 0.0f, 0.0f }; static GLfloat redColor[] = { 1.0f, 0.0f, 0.0f }; static GLfloat purpleColor[] = { 1.0f, 0.0f, 1.0f }; static GLfloat yellowColor[] = { 1.0f, 1.0f, 0.0f }; static GLfloat whiteColor[] = { 1.0f, 1.0f, 1.0f }; static GLfloat darkgreenColor[] = { 0.0f, 0.5f, 0.0f }; glClear( GL_COLOR_BUFFER_BIT ); /* Draw a point */ glBegin( GL_POINTS ); glColor3fv( whiteColor ); glVertex2f( 0.3f, 0.85f ); glColor3f( 1.0f, 0.50f, 0.0f ); /* Orange */ glVertex2f( 3.0f, 9.65f ); /* This point is clipped */ glEnd(); /* Gouraud shade a line */ glBegin( GL_LINES ); glColor3f( 1.0f, 0.0f, 0.0f ); /* Red */ glVertex2f( 0.1f, 0.1f ); glColor3fv( yellowColor ); glVertex2f( 0.2f, 0.9f ); glEnd(); /* Gouraud shade a polygon */ glBegin( GL_POLYGON ); glColor3fv( purpleColor ); glVertex2f( 0.5f, 0.1f ); glColor3fv( redColor ); glVertex2f( 1.0f, 0.4f ); glColor3fv( blackColor ); glVertex2f( 0.9f, 1.0f ); glColor3fv( darkgreenColor ); glVertex2f( 0.3f, 0.8f ); glColor3fv( whiteColor ); glVertex2f( 0.1f, 0.5f ); glEnd(); /* Draw a triangle fan */ glBegin( GL_TRIANGLE_FAN ); glColor3fv( blackColor ); glVertex2f( 0.4f, 0.4f ); glColor3fv( redColor ); glVertex2f( 0.3f, 0.4f ); glColor3f( 0.0f, 0.0f, 1.0f ); /* blue */ glVertex2f( 0.4f, 0.5f ); glColor3fv( yellowColor ); glVertex2f( 0.5f, 0.5f ); glColor3fv( whiteColor ); glVertex2f( 0.5f, 0.4f ); glColor3fv( darkgreenColor ); glVertex2f( 0.4f, 0.3f ); glEnd(); glFlush(); }