/*************************************************************************** Teapot.c ------------------- copyright : (C) 2000 by Thomas Ruge email : Thomas.Ruge@web.de ***************************************************************************/ #include #include #include // Zustandsvariablen // Mausbewewung int mousemotion; int mousex, mousey; // Initialisierung Modellorientierung GLfloat xangle = 4; /* in Drehung um */ GLfloat yangle = 120; //Modellposition GLfloat posx = 0, posy = 0, posz = 0; //Callback Funktion: Reaktion auf Mausclicks void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { mousemotion = 1; mousex = x; mousey = y; } if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) { mousemotion = 0; } } //Callback Funktion: Reaktion auf Mausbewegung void motion(int x, int y) { if (mousemotion) { xangle = xangle - (y - mousey); yangle = yangle - (x - mousex); mousex = x; mousey = y; // Szene neu zeichnen glutPostRedisplay(); } } //Callback Funktion: Reaktion auf Tastendruck void keyb( unsigned char keyPressed, int x, int y ) { switch( keyPressed ) { case 'l': // Licht aktivieren glEnable(GL_LIGHTING); glutPostRedisplay(); break; case 'o': // Licht deaktivieren glDisable(GL_LIGHTING); glutPostRedisplay(); break; } } //neue Modellposition berechnen void recalcModelPos(void) { // glPopMatrix(); // glPushMatrix(); glLoadIdentity(); glTranslatef(posx, posy, posz); glRotatef(xangle, 1.0, 0.0, 0.0); glRotatef(yangle, 0.0, 1.0, 0.0); } void DrawScene(void) { recalcModelPos(); // Puffer löschen glClearColor (0.5, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Teekanne malen glutSolidTeapot(0.6); // Vordergrund- und Hintergrundpuffer wechseln glutSwapBuffers(); } //eigene Initialisierungsfunktion void myinit() { GLfloat light_position[] = {0.0, 0.0, -1.0, 0.0 }; //erstes GL-Light setzen glLightfv( GL_LIGHT0, GL_POSITION, light_position ); glEnable(GL_LIGHT0); //Z-Puffer aktivieren glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); } int main(int argc, char *argv[]) { //GLUT initialisieren, Fenster setzen glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); // eigene Initialisierungen myinit(); //Callbacks setzen: Reaktion auf Mausklicks und -bewegungen, Tastaturaktivitäten glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyb); //Callback zum Zeichnen der GL-Funktion glutDisplayFunc(DrawScene); glutMainLoop(); return EXIT_SUCCESS; }