// // Computergraphik I // Prof. Dr. Juergen Doellner // Sommersemester 2001 // // Rahmenprogramm fuer Aufgabenzettel 4 // #ifndef CG_APPLICATION_H #define CG_APPLICATION_H #include // einige haeufig verwendete Header-Dateien #include #include #include #include class CGApplication { public: // Die Klasse "CGApplication" stellt ein Rahmenprogramm bereit, // mit dem sie ihre Aufgaben loesen koennen. Dazu muessen sie // eine Klasse hiervon ableiten, und eine oder mehrere der // weiter unten deklarierten on*()-Methoden ueberschreiben. // Diese Klasse ist ein sogenanntes "Singleton", d.h.: Es kann // immer nur eine einzige Instanz von dieser (oder einer // abgeleiteten) Klasse erzeugt werden! CGApplication(); virtual ~CGApplication(); // Definiere die moeglichen Buffer, die von OpenGL angefordert // werden koennen: enum Buffer { ColorBuffer = 1, DoubleBuffer = 2, StencilBuffer = 4 }; // Startet die Anwendung und muss im Hauptprogramm aufgerufen werden. // buffers: fordere diese Buffer von OpenGL an // msecsTimer: In diesem Intervall (in Millisekunden) sollen // Time-Events erzeugt werden, fuer die dann die // Methode onTimer() aufgerufen wird. Ein Wert von // 0 erzeugt keine Time-Events! void start(int argc, char* argv[], const char* windowTitle = "CGApplication", unsigned int buffers = ColorBuffer | DoubleBuffer, unsigned int msecsTimer = 0, unsigned long windowWidth = 400, unsigned long windowHeight = 400); // Diese Methode wird nur einmal beim Start der Anwendung aufgerufen // und dient zur Initialisierung von OpenGL (hier kann z.B. die // Hintergrundfarbe fuer das Anwendungsfenster definiert werden). Sie // kann von einer abgeleiteten Klasse ueberschrieben werden. virtual void onInit(); // Jedesmal wenn der Fensterinhalt neu gezeichnet werden muss, // wird diese Methode aufgerufen. Sie muss von einer abgeleiteten // Klasse ueberschrieben werden! virtual void onDraw() = 0; // Jedesmal wenn sich die Fenstergroesse geaendert hat, wird diese // Methode aufgerufen (die Methode onDraw() wird im Anschluss // automatisch aufgerufen). Sie muss von einer abgeleiteten Klasse // ueberschrieben werden! virtual void onSize(unsigned int newWidth, unsigned int newHeight) = 0; // Spezifiziert die beiden Konstanten "LeftMouseButton" und // "RightMouseButton". enum MouseButton { LeftMouseButton, RightMouseButton }; // Spezifiziert die beiden Konstanten "MouseButtonDown" und // "MouseButtonUp". enum MouseButtonEvent { MouseButtonDown, MouseButtonUp }; // Jedesmal wenn eine Maustaste im Fenster gedrueckt wird, wird diese // Methode mit der entsprechenden Taste ("LeftMouseButton" oder // "RightMouseButton") und den zugehoerigen Koordinaten (x und y) // aufgerufen. Die Koordinaten werden als Pixel uebergeben, wobei der // Koordinaten-Ursprung die linke untere Fensterecke ist. Diese // Methode kann von einer abgeleiteten Klasse ueberschrieben werden. virtual void onButton(MouseButton button, MouseButtonEvent event, int x, int y); // Jedesmal wenn die Maus mit gedrueckter Maustaste ueber das Fenster // bewegt wird, wird diese Methode mit den entsprechenden Koordinaten // aufgerufen (siehe auch Methode onButton()). Diese Methode kann von // einer abgeleiteten Klasse ueberschrieben werden. virtual void onMove(MouseButton button, int x, int y); // Jedesmal wenn eine Taste gedrueckt wird, wird diese Methode // aufgerufen. virtual void onKey(unsigned char key); // Werden Time-Events angefordert (msecsTimer != 0 in der Methode // start()), so wird bei jedem Time-Event diese Methode aufgerufen: virtual void onTimer(); // Diese Methode erzeugt ein Redraw-Event (so dass die Methode // onDraw() aufgerufen wird). Man sollte diese Methode verwenden // (und nicht direkt onDraw()), um zu signalisieren, dass das Bild // neu gezeichnet werden soll! void needsRedraw(); // Diese Methode sollte nach Beendigung aller Zeichenoperationen fuer // ein Bild (normaler Weise am Ende der Methode onDraw()) aufgerufen // werden, um den Front- mit dem Back-Buffer zu tauschen! Wird dieser // Aufruf ausgelassen, so werden die Zeichenoperationen nicht sichtbar!!! void swapBuffers(); private: // Verbiete den Copy-Konstruktor und den Zuweisungsoperator, da // diese Klasse ein Singleton ist und somit nicht kopiert werden // darf! CGApplication(const CGApplication&); CGApplication& operator=(const CGApplication&); }; #endif // CG_APPLICATION_H