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