1 //
2 // Computergraphik II
3 // Prof. Dr. Juergen Doellner
4 // Wintersemester 2001/02
5 //
6 // Rahmenprogramm zu Aufgabenzettel 8
7 //
8
9 #ifndef CG_APPLICATION_H
10 #define CG_APPLICATION_H
11
12 #include <GL/glut.h>
13
14 // einige haeufig verwendete Header-Dateien
15 #include <assert.h>
16 #include <iostream.h>
17 #include <math.h>
18
19 class CGApplication {
20 public:
21
22 // Die Klasse "CGApplication" stellt ein Rahmenprogramm bereit,
23 // mit dem sie ihre Aufgaben loesen koennen. Dazu muessen sie
24 // eine Klasse hiervon ableiten, und eine oder mehrere der
25 // weiter unten deklarierten on*()-Methoden ueberschreiben.
26 // Diese Klasse ist ein sogenanntes "Singleton", d.h.: Es kann
27 // immer nur eine einzige Instanz von dieser (oder einer
28 // abgeleiteten) Klasse erzeugt werden!
29 CGApplication();
30 virtual ~CGApplication();
31
32 // Startet die Anwendung und muss im Hauptprogramm aufgerufen werden.
33 void start(const char* windowTitle = "CGApplication",
34 bool doubleBuffering = true,
35 unsigned long windowWidth = 400, unsigned long windowHeight = 400);
36
37 // Diese Methode wird nur einmal beim Start der Anwendung aufgerufen
38 // und dient zur Initialisierung von OpenGL (hier kann z.B. die
39 // Hintergrundfarbe fuer das Anwendungsfenster definiert werden). Sie
40 // kann von einer abgeleiteten Klasse ueberschrieben werden.
41 virtual void onInit();
42
43 // Jedesmal wenn der Fensterinhalt neu gezeichnet werden muss,
44 // wird diese Methode aufgerufen. Sie muss von einer abgeleiteten
45 // Klasse ueberschrieben werden!
46 virtual void onDraw() = 0;
47
48 // Jedesmal wenn sich die Fenstergroesse geaendert hat, wird diese
49 // Methode aufgerufen (die Methode onDraw() wird im Anschluss
50 // automatisch aufgerufen).
51 virtual void onSize(unsigned int newWidth, unsigned int newHeight) = 0;
52
53 // Spezifiziert die beiden Konstanten "LeftMouseButton" und
54 // "RightMouseButton".
55 enum MouseButton { LeftMouseButton, RightMouseButton };
56
57 // Jedesmal wenn eine Maustaste im Fenster gedrueckt wird, wird diese
58 // Methode mit der entsprechenden Taste ("LeftMouseButton" oder
59 // "RightMouseButton") und den zugehoerigen Koordinaten (x und y)
60 // aufgerufen. Die Koordinaten werden als Pixel uebergeben, wobei der
61 // Koordinaten-Ursprung die linke untere Fensterecke ist. Diese
62 // Methode kann von einer abgeleiteten Klasse ueberschrieben werden.
63 virtual void onButton(MouseButton button, int x, int y);
64
65 // Jedesmal wenn die Maus mit gedrueckter Maustaste ueber das Fenster
66 // bewegt wird, wird diese Methode mit den entsprechenden Koordinaten
67 // aufgerufen (siehe auch Methode onButton()). Diese Methode kann von
68 // einer abgeleiteten Klasse ueberschrieben werden.
69 virtual void onMove(int x, int y);
70
71 // Jedesmal wenn eine Taste gedrueckt wird, wird diese Methode
72 // aufgerufen.
73 virtual void onKey(unsigned char key);
74
75
76 // Wird aufgerufen, wenn nichts zu tun ist.
77 virtual void onIdle();
78
79 // Diese Methode sollte nach Beendigung aller Zeichenoperationen fuer
80 // ein Bild (normaler Weise am Ende der Methode onDraw()) aufgerufen
81 // werden, um den Front- mit dem Back-Buffer zu tauschen! Wird dieser
82 // Aufruf ausgelassen, so werden die Zeichenoperationen nicht sichtbar!!!
83 void swapBuffers();
84
85 private:
86 // Verbiete den Copy-Konstruktor und den Zuweisungsoperator, da
87 // diese Klasse ein Singleton ist und somit nicht kopiert werden
88 // darf!
89 CGApplication(const CGApplication&);
90 CGApplication& operator=(const CGApplication&);
91 };
92
93 #endif // CG_APPLICATION_H
94
95