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