/* * 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. */ /* solar5.c - a simple solar system. * * F1 key - print help information * SPACE Key - toggle between solid/wireframe models * Escape Key - exit program */ #include /* includes gl.h, glu.h */ #include #include #include "checkerror.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; static GLboolean filledFlag = GL_TRUE; /* 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 the solar system\n\n" "F1 key - print help information\n" "SPACE key - toggle between solid/wireframe mode\n" "Escape Key - exit the program\n\n", progname); } GLvoid initgfx( GLvoid ) { /* set clear color to black */ glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); glMatrixMode( GL_PROJECTION ); gluPerspective( 45.0f, 1.0f, 1.0f, 20.0f ); glMatrixMode( GL_MODELVIEW ); } GLvoid keyboard( GLubyte key, GLint x, GLint y ) { switch (key) { case ' ': /* toggle fill mode */ filledFlag = !filledFlag; 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 year = 45.0f, day = -90.0; static GLfloat yellow[] = { 1.0f, 1.0f, 0.0f, 1.0f }; static GLfloat blue[] = { 0.0f, 0.0f, 1.0f, 1.0f }; static GLfloat gray[] = { 0.2f, 0.2f, 0.2f, 1.0f }; glClear( GL_COLOR_BUFFER_BIT ); glPushMatrix(); /* move into the viewing volume */ glTranslatef( 0.0f, 0.0f, -10.0f ); /* draw sun */ glPushMatrix(); /* Give the sun a yellow glow */ glColor4fv( yellow ); /* rotate on our own axis */ glRotatef( 90.0f, 1.0f, 0.0f, 0.0f ); if (filledFlag) glutSolidSphere( 0.7f, 15, 15 ); else glutWireSphere( 0.7f, 15, 15 ); glPopMatrix(); glPushMatrix(); /* draw earth */ /* rotate to the right time of year */ glRotatef( year, 0.0f, 1.0f, 0.0f ); /* translate out to our orbit about the sun */ glTranslatef( 3.5f, 0.0f, 0.0f ); glPushMatrix(); /* set color for the earth */ glColor4fv( blue ); /* rotate on our own axis */ glRotatef( 90.0f, 1.0f, 0.0f, 0.0f ); if (filledFlag) glutSolidSphere( 0.4f, 15, 15 ); else glutWireSphere( 0.4f, 15, 15 ); glPopMatrix(); /* draw moon */ glPushMatrix(); /* set color for the moon */ glColor4fv( gray ); /* rotate to the right time of day */ glRotatef( day, 0.0f, 1.0f, 0.0f ); /* translate out to our orbit about the earth */ glTranslatef( 1.0f, 0.0f, 0.0f ); /* rotate on our axis */ glRotatef( 90.0f, 1.0f, 0.0f, 0.0f ); if (filledFlag) glutSolidSphere( 0.2f, 15, 15 ); else glutWireSphere( 0.2f, 15, 15 ); glPopMatrix(); glPopMatrix(); glPopMatrix(); checkError( "drawScene" ); glFlush(); }