/* * 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. */ /* perspective.c - open a window and clear the background. * Set up callbacks to handle keyboard input. * Model some objects. Use perspective projection. * * F1 key - print help information * SPACE key - generates a random background color * key - toggle smooth/flat shading * Escape Key - exit program */ #include /* includes gl.h, glu.h */ #include #include #include "checkerror.h" #include "random.h" /* Function Prototypes */ GLvoid initgfx( GLvoid ); GLvoid keyboard( GLubyte, GLint, GLint ); GLvoid specialkeys( GLint, GLint, GLint ); GLvoid drawScene( GLvoid ); void printHelp( char * ); /* Global Variables */ static char *progname; /* Global Definitions */ #define KEY_ESC 27 /* ascii value for the escape key */ void main( int argc, char *argv[] ) { GLsizei width, height; glutInit( &argc, argv ); /* create a window that is 1/4 the size of the screen, * and position it in the middle of the screen. */ 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 ); glutSpecialFunc( specialkeys ); glutDisplayFunc( drawScene ); progname = argv[0]; printHelp( progname ); glutMainLoop(); } void printHelp( char *progname ) { fprintf(stdout, "\n%s - model some objects using a perspective projection\n\n" "F1 key - print help information\n" "SPACE Key - generates a random background color\n" " key - toggle smooth/flat shading\n" "Escape Key - exit the program\n\n", progname); } GLvoid initgfx( GLvoid ) { /* set clear color to blue */ glClearColor( 0.0f, 0.0f, 1.0f, 1.0f ); glMatrixMode( GL_PROJECTION ); gluPerspective( 45.0f, 1.0f, 3.0f, 7.0f ); glMatrixMode( GL_MODELVIEW ); } GLvoid keyboard( GLubyte key, GLint x, GLint y ) { static GLboolean flat = GL_FALSE; switch (key) { case ' ': /* SPACE key */ /* generate a random background color */ glClearColor( RANDOM(), RANDOM(), RANDOM(), 1.0f ); glutPostRedisplay(); break; case 's': /* s key */ /* toggle between smooth and flat shading */ flat = !flat; if (flat) glShadeModel( GL_FLAT ); else glShadeModel( GL_SMOOTH ); glutPostRedisplay(); break; case KEY_ESC: /* Exit when the Escape key is pressed */ exit(0); } } GLvoid specialkeys( GLint key, GLint x, GLint y ) { switch (key) { case GLUT_KEY_F1: /* Function key #1 */ /* print help information */ printHelp( progname ); break; } } GLvoid drawScene( GLvoid ) { static GLfloat red[] = { 1.0f, 0.0f, 0.0f }; static GLfloat yellow[] = { 1.0f, 1.0f, 0.0f }; static GLfloat blue[] = { 0.0f, 0.0f, 1.0f }; static GLfloat green[] = { 0.0f, 1.0f, 0.0f }; static GLfloat darkgreen[] = { 0.0f, 0.25f, 0.0f }; /* left window */ static GLfloat v0[] = { -0.4f, 0.8f }; static GLfloat v1[] = { -0.4f, 0.4f }; static GLfloat v2[] = { -0.3f, 0.8f }; static GLfloat v3[] = { -0.3f, 0.4f }; static GLfloat v4[] = { -0.2f, 0.8f }; static GLfloat v5[] = { -0.2f, 0.4f }; /* right window */ static GLfloat v6[] = { 0.2f, 0.8f }; static GLfloat v7[] = { 0.2f, 0.4f }; static GLfloat v8[] = { 0.3f, 0.8f }; static GLfloat v9[] = { 0.3f, 0.4f }; static GLfloat v10[] = { 0.4f, 0.8f }; static GLfloat v11[] = { 0.4f, 0.4f }; glClear( GL_COLOR_BUFFER_BIT ); glPushMatrix(); /* move inside the viewing volume */ glTranslatef( 0.0f, 0.0f, -4.0f ); /* draw the ground in different shades of green */ glBegin( GL_POLYGON ); glColor3fv( green ); glVertex2f( -2.0f, -2.0f ); glVertex2f( 2.0f, -2.0f ); glColor3fv( darkgreen ); glVertex2f( 2.0f, 0.0f ); glVertex2f( -2.0f, 0.0f ); glEnd(); /* draw the house */ glColor3f( 1.0f, 1.0f, 1.0f ); /* white */ glRectf( -0.5f, -0.5f, 0.5f, 1.0f ); /* draw the door */ glColor3f( 0.5f, 0.2f, 0.1f ); /* brown */ glRectf( -0.2f, -0.5f, 0.2f, 0.2f ); /* draw the roof */ glBegin( GL_TRIANGLES ); glColor3f( 0.0f, 0.0f, 0.0f ); /* black */ glVertex2f( -0.5f, 1.0f ); glVertex2f( 0.5f, 1.0f ); glVertex2f( 0.0f, 1.5f ); glEnd(); /* draw 2 quadrilateral strip to make a window */ glBegin( GL_QUAD_STRIP ); glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2fv (v0); glColor3f( 0.9f, 0.0f, 1.0f ); glVertex2fv (v1); glColor3f( 0.8f, 0.1f, 0.0f ); glVertex2fv (v2); glColor3f( 0.7f, 0.2f, 1.0f ); glVertex2fv (v3); glColor3f( 0.6f, 0.3f, 0.0f ); glVertex2fv (v4); glColor3f( 0.5f, 0.4f, 1.0f ); glVertex2fv (v5); glColor3f( 0.4f, 0.5f, 0.0f ); glEnd(); /* draw 2 quadrilateral strip to make a window */ glBegin( GL_QUAD_STRIP ); glVertex2fv (v6); glColor3f( 0.3f, 0.6f, 1.0f ); glVertex2fv (v7); glColor3f( 0.2f, 0.7f, 0.0f ); glVertex2fv (v8); glColor3f( 0.1f, 0.8f, 1.0f ); glVertex2fv (v9); glColor3f( 0.0f, 0.9f, 0.0f ); glVertex2fv (v10); glColor3f( 0.0f, 1.0f, 1.0f ); glVertex2fv (v11); glEnd(); /* Draw a triangle fan for the sun */ glBegin( GL_TRIANGLE_FAN ); glColor3f( 1.0f, 1.0f, 1.0f ); glVertex2f( 1.5f, 1.5f ); glColor3fv( yellow ); glVertex2f( 1.5f, 1.3f ); glVertex2f( 1.7f, 1.4f ); glVertex2f( 1.7f, 1.6f ); glVertex2f( 1.5f, 1.7f ); glVertex2f( 1.3f, 1.6f ); glVertex2f( 1.3f, 1.4f ); glVertex2f( 1.5f, 1.3f ); glEnd(); /* draw a flower in the foreground */ glTranslatef( 1.0f, -1.0f, 1.0f ); /* draw the stem with 2 leaves */ glColor3fv( darkgreen ); glBegin( GL_LINES ); glVertex2f( 0.0f, 0.0f ); /* stem */ glVertex2f( 0.0f, 0.25f ); glVertex2f( 0.0f, 0.1f ); /* leaf */ glVertex2f( 0.05f, 0.15f ); glVertex2f( 0.0f, 0.05f ); /* leaf */ glVertex2f( -0.05f, 0.2f ); glEnd(); /* move to the top of the stem */ glTranslatef( 0.0f, 0.25f, 0.0f ); /* use a triangle fan for the flower head */ glBegin( GL_TRIANGLE_FAN ); glColor3f( 1.0f, 1.0f, 1.0f ); glVertex2f( 0.0f, 0.0f ); glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, -0.03f ); glVertex2f( 0.03f, -0.02f ); glVertex2f( 0.03f, 0.02f ); glVertex2f( 0.0f, 0.03f ); glVertex2f( -0.03f, 0.02f ); glVertex2f( -0.03f, -0.02f ); glVertex2f( 0.0f, -0.03f ); glEnd(); glPopMatrix(); checkError( "drawScene" ); glFlush(); }