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