#include #include #include /* GLUT resizeHandler wird in main() registriert und vom glutMainLoop() aus ausgerufen, falls die Größe des Fensters und damit des Viewports geändert wird */ void resizeHandler(int w, int h) { // Setzen des Viewports glViewport(0,0,w,h); // Wechsel zur Projektionsmatrix und deren Modifikation: // Setzen auf eine einfache Orthogonalprojektion glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-22,22,-22,22,-1,1); // Zurück zur Modellmatrix glMatrixMode(GL_MODELVIEW); } /* GLUT redrawHandler wird in main() registriert und immer dann aufgerufen, wenn die Grafik neu gezeichnet werden muss, z.B. implizit nach einem resize */ void redrawHandler() { // Bildschirm und Buffer Löschen glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); // Modellmatrix wird nicht weiter benutzt, bleibt auf // Identitätstransformation (Einheitsmatrix) glLoadIdentity(); // Das Haus des Nikolaus als Line Strip // (was auch sonst ... ;-) glBegin(GL_LINE_STRIP); glColor3f(1,1,1); glVertex3f(-10,-10,0); glVertex3f(10,-10,0); glVertex3f(10,10,0); glVertex3f(-10,10,0); glVertex3f(-10,-10,0); glVertex3f(10,10,0); glVertex3f(0,20,0); glVertex3f(-10,10,0); glVertex3f(10,-10,0); glEnd(); // Zur Hilfe: ein Koordinatensystem aus 2 Linien in // Dunkelgrau glBegin(GL_LINES); glColor3f(0.2,0.2,0.2); glVertex3f(-22,0,0); glVertex3f(22,0,0); glVertex3f(0,-22,0); glVertex3f(0,22,0); glEnd(); // Zeichen-Buffer nach vorn holen glutSwapBuffers(); } int main(int argc,char** argv) { // Initialisierung von GLUT und Erzeugung des Fensters glutInit(&argc,argv); glutInitDisplayMode(GLUT_DEPTH|GLUT_RGBA|GLUT_DOUBLE); glutInitWindowSize(640,640); glutCreateWindow("Das Haus vom Nikolaus ..."); glEnable(GL_DEPTH_TEST); // Registrierung der Handler-Funktionen (siehe oben) glutDisplayFunc(redrawHandler); glutReshapeFunc(resizeHandler); // Die Haupt-Schleife des Programms - ab jetzt wird // alles weitere über den Aufruf der registrierten // Handler-Funktionen gesteuert (inklusive Programm-Exit) glutMainLoop(); return 0; }