aboutsummaryrefslogtreecommitdiff
path: root/Gem/develop/include/Gem/Gem/Manager.h
blob: cbca8bad621bba03af6348fd2fd68f7cdb93c79e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
/*-----------------------------------------------------------------
  LOG
  GEM - Graphics Environment for Multimedia

  The base functions and structures
  Also includes gemwin header file

  Copyright (c) 1997-2000 Mark Danks.mark@danks.org
  Copyright (c) Günther Geiger. geiger@epy.co.at
  Copyright (c) 2001-2011 IOhannes m zmölnig. forum::für::umläute. IEM. zmoelnig@iem.at
  For information on usage and redistribution, and for a DISCLAIMER OF ALL
  WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.

  -----------------------------------------------------------------*/

#ifndef _INCLUDE__GEM_GEM_MANAGER_H_
#define _INCLUDE__GEM_GEM_MANAGER_H_

#include "Gem/GemGL.h"
#include "Utils/GLUtil.h"

#include "Gem/ExportDef.h"

#include <string>

struct _symbol;

class gemhead;
class GemState;
class WindowInfo;

namespace gem
{
class Context;
};

/*-----------------------------------------------------------------
  -------------------------------------------------------------------
  CLASS
  GemMan

  A static class to create windows, etc.

  DESCRIPTION

  -----------------------------------------------------------------*/
class GEM_EXTERN GemMan
{
public:

  //////////
  // Should only be called once (usually by GemSetup)
  static void       initGem(void);

  //////////
  static void       addObj(gemhead *obj, float priority);

  //////////
  static void       removeObj(gemhead *obj, float priority);

  //////////
  // Is there a window.
  static int        windowExists(void);

  //////////
  // Are we rendering.
  static int        getRenderState(void);

  //////////
  // is there a context (has its meaning under X)
  static void         createContext(char* disp);
  static int        contextExists(void);

  //////////
  // If an object needs to know if the window changed.
  // This is important for display lists.
  static int        windowNumber(void);

  //////////
  // reset to the initial state
  static void       resetState(void);

  //////////
  // Just send out one frame (if double buffered, will swap buffers)
  static void       render(void *);

  static void       renderChain(struct _symbol *head, bool start);
  static void       renderChain(struct _symbol *head, GemState *state);


  //////////
  // Start a clock to do rendering.
  static void       startRendering(void);

  //////////
  // Stop the clock to do rendering.
  static void       stopRendering(void);

  //////////
  // Create the window with the current parameters
  static int        createWindow(char* disp = 0);

  //////////
  // Destroy the window
  static void       destroyWindow(void);
  // Destroy the window after a minimal delay
  static void       destroyWindowSoon(void);

  //////////
  // Swap the buffers.
  // If single buffered, just clears the window
  static void       swapBuffers(void);

  //////////
  // Set the frame rate
  static void       frameRate(float framespersecond);
  //////////
  // Get the frame rate
  static float      getFramerate(void);

  static int        getProfileLevel(void);

  static void getDimen(int*width, int*height);
  static void getRealDimen(int*width, int*height);
  static void getOffset(int*x, int*y);

  //////////
  // Turn on/off lighting
  static void       lightingOnOff(int state);

  //////////
  // Turn on/off cursor
  static void         cursorOnOff(int state);

  //////////
  // Turn on/off topmost position
  static void         topmostOnOff(int state);


  //////////
  // Request a lighting value - it is yours until you free it.
  // The return can be 0, in which there are too many lights
  // [in] specific - If you want a specific light.  == 0 means that you don't care.
  static GLenum     requestLight(int specific = 0);

  //////////
  // Free a lighting value
  static void       freeLight(GLenum lightNum);

  //////////
  // Print out information
  static void       printInfo(void);

  //////////
  static void       fillGemState(GemState &);

  static int       texture_rectangle_supported;

  enum GemStackId { STACKMODELVIEW, STACKCOLOR, STACKTEXTURE, STACKPROJECTION };
  static GLint     maxStackDepth[4]; // for push/pop of matrix-stacks


  static float     m_perspect[6];       // values for the perspective matrix
  static float     m_lookat[9]; // values for the lookat matrix

  // LATER make this private (right now it is needed in gem2pdp)
  static int       m_buffer;            // single(1) or double(2)

private:

  //////////
  // computer and window information
  static std::string m_title;             // title to be displayed
  static int       m_fullscreen;        // fullscreen (1) or not (0!)
  static int
  m_menuBar;           // hide (0), show(1), hide but autoshow(-1)
  static int       m_secondscreen;      // set the second screen
  static int       m_height;            // window height
  static int       m_width;             // window width
  static int
  m_w;                 // the real window width (reported by gemCreateWindow())
  static int       m_h;                 // the real window height
  static int       m_xoffset;           // window offset (x)
  static int       m_yoffset;           // window offset (y)

  static int       m_border;            // window border
  static int       m_stereo;            // stereoscopic

  static int
  m_profile;           // off(0), on(1), w/o image caching(2)
  static int       m_rendering;

  static float     m_fog;                       // fog density
  enum FOG_TYPE
  { FOG_OFF = 0, FOG_LINEAR, FOG_EXP, FOG_EXP2 };
  static FOG_TYPE  m_fogMode;           // what kind of fog we have
  static GLfloat   m_fogColor[4];       // colour of the fog
  static float     m_fogStart;          // start of the linear fog
  static float     m_fogEnd;            // start of the linear fog

  static float
  m_motionBlur;        // motion-blur factor in double-buffer mode

  static float     fps;
  static int       fsaa;
  static bool      pleaseDestroy;

#ifndef GEM_MULTICONTEXT
  //////////
  // Changing these variables is likely to crash GEM
  // This is current rendering window information
  // The window is created and destroyed by the user, so
  //            if there is no window, this will contain NULL pointers.
  static WindowInfo   &getWindowInfo(void);

  //////////
  // Changing these variables is likely to crash GEM
  // This is constant rendering window information
  // This window is always available (although not visible)
  static WindowInfo   &getConstWindowInfo(void);
#endif /* GEM_MULTICONTEXT */
  static int        createConstWindow(char* disp = 0);

  // gemwin is allowed to modifying "global" window attributes
  friend class gemwin;
  friend class gem::Context;

  static GLfloat    m_clear_color[4];   // the frame buffer clear
  static GLbitfield m_clear_mask;               // the clear bitmask
  static GLfloat    m_mat_ambient[4];   // default ambient material
  static GLfloat    m_mat_specular[4];  // default specular material
  static GLfloat    m_mat_shininess;    // default shininess material

  static GLfloat    m_stereoSep;                // stereo separation
  static GLfloat    m_stereoFocal;              // distance to focal point
  static bool
  m_stereoLine;               // draw a line between 2 stereo-screens

  static double
  m_lastRenderTime;   // the time of the last rendered frame

  // gemwin should not touch the following member variables and member functions
  static int        m_windowState;
  static int        m_windowNumber;
  static int        m_windowContext;
  static int        m_cursor;
  static int        m_topmost;

  static void       windowInit(void);
  static void       windowCleanup(void);
  static void       resetValues(void);

  static void resizeCallback(int xsize, int ysize, void*);
  static void dispatchWinmessCallback(void);

  //////////
  // check for supported openGL extensions we might need
  static void checkOpenGLExtensions(void);
};

#endif