/* * (c) Copyright 1993, Silicon Graphics, Inc. * 1993-1995 Microsoft Corporation * * ALL RIGHTS RESERVED * * Please refer to OpenGL/readme.txt for additional information * */ /* * movelight.c * This program demonstrates when to issue lighting and * transformation commands to render a model with a light * which is moved by a modeling transformation (rotate or * translate). The light position is reset after the modeling * transformation is called. The eye position does not change. * * A sphere is drawn using a grey material characteristic. * A single light source illuminates the object. * * Interaction: pressing the left or middle mouse button * alters the modeling transformation (x rotation) by 30 degrees. * The scene is then redrawn with the light in a new position. */ #include "glos.h" #include #include #include void myinit(void); void CALLBACK movelight (AUX_EVENTREC *event); void CALLBACK display(void); void CALLBACK myReshape(GLsizei w, GLsizei h); static int spin = 0; void CALLBACK movelight (AUX_EVENTREC *event) { spin = (spin + 30) % 360; } void myinit (void) { glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); } /* Here is where the light position is reset after the modeling * transformation (glRotated) is called. This places the * light at a new position in world coordinates. The cube * represents the position of the light. */ void CALLBACK display(void) { GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 }; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); glTranslatef (0.0, 0.0, -5.0); glPushMatrix (); glRotated ((GLdouble) spin, 1.0, 0.0, 0.0); glRotated (0.0, 1.0, 0.0, 0.0); glLightfv (GL_LIGHT0, GL_POSITION, position); glTranslated (0.0, 0.0, 1.5); glDisable (GL_LIGHTING); glColor3f (0.0, 1.0, 1.0); auxWireCube (0.1); glEnable (GL_LIGHTING); glPopMatrix (); auxSolidTorus (0.275, 0.85); glPopMatrix (); glFlush (); } void CALLBACK myReshape(GLsizei w, GLsizei h) { h = (h == 0) ? 1 : h; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); } /* Main Loop * Open window with initial window size, title bar, * RGBA display mode, and handle input events. */ int main(int argc, char** argv) { auxInitDisplayMode (AUX_SINGLE | AUX_RGB | AUX_DEPTH16); auxInitPosition (0, 0, 500, 500); auxInitWindow ("Moving Light"); myinit(); auxMouseFunc (AUX_LEFTBUTTON, AUX_MOUSEDOWN, movelight); auxReshapeFunc (myReshape); auxMainLoop(display); return(0); }