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