// Computergraphik I // Prof. Dr. Juergen Doellner // Sommersemester 2001 // // Rahmenprogramm fuer Aufgabenzettel 8 #include "cgapplication.h" // Diese Variable enthaelt einen Zeiger auf die aktive Anwendung. static CGApplication* activeCGApplication_ = 0; static CGApplication::MouseButton activeMouseButton_ = CGApplication::LeftMouseButton; CGApplication::CGApplication() { assert(!activeCGApplication_); // Es ist nur eine aktive Anwendung erlaubt!!! activeCGApplication_ = this; } CGApplication::~CGApplication() { activeCGApplication_ = 0; } // Auf diese Ereignisse wird default-maessig nicht reagiert: void CGApplication::onInit() { } void CGApplication::onButton(MouseButton button, MouseButtonEvent event, int x, int y) { } void CGApplication::onMove(MouseButton buttoin, int x, int y) { } void CGApplication::onKey(unsigned char key) { } void CGApplication::onTimer() { } // glut-Callback fuer den Zeichenaufruf static void displayFunc() { assert(activeCGApplication_); activeCGApplication_->onDraw(); } // glut-Callback fuer die Aenderung der Fenstergroesse static void reshapeFunc(int newWidth, int newHeight) { assert(activeCGApplication_); activeCGApplication_->onSize(newWidth, newHeight); } // glut-Callback fuer das Druecken einer Maustaste static void mouseFunc(int button, int state, int x, int y) { assert(activeCGApplication_); y = glutGet(GLenum(GLUT_WINDOW_HEIGHT)) - y; // Koordinaten-Ursprung: links unten!!! activeMouseButton_ = ((button == GLUT_LEFT_BUTTON) ? CGApplication::LeftMouseButton : CGApplication::RightMouseButton); activeCGApplication_->onButton(activeMouseButton_, ((state == GLUT_DOWN) ? CGApplication::MouseButtonDown : CGApplication::MouseButtonUp), x, y); } // glut-Callback fuer das Ziehen bei gedrueckter Maustaste static void motionFunc(int x, int y) { assert(activeCGApplication_); y = glutGet(GLenum(GLUT_WINDOW_HEIGHT)) - y; // Koordinaten-Ursprung: links unten!!! activeCGApplication_->onMove(activeMouseButton_, x, y); } // glut-Callback fuer einen Tastendruck static void keyboardFunc(unsigned char key, int x, int y) { assert(activeCGApplication_); activeCGApplication_->onKey(key); } // glut-Callback fuer ein Timer-Event static void timerFunc(int msecs) { assert(activeCGApplication_); activeCGApplication_->onTimer(); glutTimerFunc(msecs, timerFunc, msecs); } void CGApplication::start(int argc, char* argv[], const char* windowTitle, unsigned int buffers, unsigned int msecsTimer, unsigned long width, unsigned long height) { assert(buffers & ColorBuffer); // Initialisiert Glut glutInit(&argc, argv); // Fordert ein OpenGL-Fenster im RGB-Format mit oder ohne Double-Buffering an: glutInitDisplayMode(GLUT_RGB | ((buffers & DepthBuffer) ? GLUT_DEPTH : 0) | ((buffers & DoubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE) | ((buffers & StencilBuffer) ? GLUT_STENCIL : 0)); // Legt die Fenstergroesse fest: glutInitWindowSize(width, height); // Erzeugt das OpenGL-Fenster mit dem entsprechenden Namen: glutCreateWindow(windowTitle); // Registriere die oben definierten Callbacks fuer die // entsprechenden glut-Ereignisse: glutDisplayFunc(displayFunc); glutReshapeFunc(reshapeFunc); glutMouseFunc(mouseFunc); glutMotionFunc(motionFunc); glutKeyboardFunc(keyboardFunc); if(msecsTimer > 0) { glutTimerFunc(msecsTimer, timerFunc, msecsTimer); } // Zeige das OpenGL-Fenster auf dem Bildschirm an glutShowWindow(); // Rufe die Methode zur Initialisierung von OpenGL auf: onInit(); // Starte die Verarbeitung der glut-Ereignisse: glutMainLoop(); } void CGApplication::needsRedraw() { glutPostRedisplay(); } void CGApplication::swapBuffers() { glutSwapBuffers(); }