Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/lib/graphics/graphics_engine.cc @ 4746

Last change on this file since 4746 was 4746, checked in by bensch, 19 years ago

orxonox/trunk: changed (void) → ()

File size: 9.3 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_GRAPHICS
17
18#include "graphics_engine.h"
19#include "resource_manager.h"
20
21#include "debug.h"
22#include "text_engine.h"
23
24using namespace std;
25
26
27/**
28   \brief standard constructor
29   \todo this constructor is not jet implemented - do it
30*/
31GraphicsEngine::GraphicsEngine ()
32{
33  this->setClassID(CL_GRAPHICS_ENGINE, "GraphicsEngine");
34  this->setName("GraphicsEngine");
35  this->bDisplayFPS = false;
36  this->minFPS = 9999;
37  this->maxFPS = 0;
38
39  this->fullscreen = false;
40
41  this->initVideo();
42
43  this->listModes();
44}
45
46/**
47   \brief The Pointer to this GraphicsEngine
48*/
49GraphicsEngine* GraphicsEngine::singletonRef = NULL;
50
51/**
52   \brief destructs the graphicsEngine.
53*/
54GraphicsEngine::~GraphicsEngine ()
55{
56  // delete what has to be deleted here
57}
58
59/**
60   \brief initializes the Video for openGL.
61
62   This has to be done only once when starting orxonox.
63*/
64int GraphicsEngine::initVideo()
65{
66  // initialize SDL_VIDEO
67  if (SDL_Init(SDL_INIT_VIDEO) == -1)
68    {
69      PRINTF(1)("could not initialize SDL Video\n");
70      //      return -1;
71    }
72  // initialize SDL_GL-settings
73  this->setGLattribs();
74
75  // setting the Video Flags.
76  this->videoFlags = SDL_OPENGL | SDL_HWPALETTE | SDL_RESIZABLE | SDL_DOUBLEBUF;
77
78  /* query SDL for information about our video hardware */
79  const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo ();
80  if( videoInfo == NULL)
81    {
82      PRINTF(1)("Failed getting Video Info :%s\n", SDL_GetError());
83      SDL_Quit ();
84    }
85  if( videoInfo->hw_available)
86    this->videoFlags |= SDL_HWSURFACE;
87  else
88    this->videoFlags |= SDL_SWSURFACE;
89  /*
90  if(VideoInfo -> blit_hw)
91    VideoFlags |= SDL_HWACCEL;
92  */
93    // setting up the Resolution
94  this->setResolution(800, 450, 16);
95
96  // TO DO: Create a cool icon and use it here
97  char* loadPic = new char[strlen(ResourceManager::getInstance()->getDataDir())+ 100];
98  sprintf(loadPic, "%s%s", ResourceManager::getInstance()->getDataDir(),  "pictures/orxonox-icon32x32.bmp");
99  SDL_WM_SetIcon(SDL_LoadBMP(loadPic), NULL);
100  delete loadPic;
101  // Enable default GL stuff
102  glEnable(GL_DEPTH_TEST);
103}
104
105
106/**
107 * sets the Window Captions and the Name of the icon.
108 * @param windowName The name of the Window
109 * @param icon The name of the Icon on the Disc
110 */
111void GraphicsEngine::setWindowName(const char* windowName, const char* icon)
112{
113  // Set window labeling
114  SDL_WM_SetCaption (windowName, icon);
115}
116
117
118/**
119   \brief Sets the GL-attributes
120*/
121int GraphicsEngine::setGLattribs()
122{
123  // Set video mode
124  // TO DO: parse arguments for settings
125  //SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
126  //SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
127  //SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
128  //SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
129
130
131  SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
132  SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16);
133  SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 0);
134  SDL_GL_SetAttribute( SDL_GL_ACCUM_RED_SIZE, 0);
135  SDL_GL_SetAttribute( SDL_GL_ACCUM_GREEN_SIZE, 0);
136  SDL_GL_SetAttribute( SDL_GL_ACCUM_BLUE_SIZE, 0);
137  SDL_GL_SetAttribute( SDL_GL_ACCUM_ALPHA_SIZE, 0);
138}
139
140/**
141   \brief sets the Resolution of the Screen to display the Graphics to.
142   \param width The width of the window
143   \param height The height of the window
144   \param bpp bits per pixel
145*/
146int GraphicsEngine::setResolution(int width, int height, int bpp)
147{
148  Uint32 fullscreenFlag;
149  this->resolutionX = width;
150  this->resolutionY = height;
151  this->bitsPerPixel = bpp;
152
153  if (this->fullscreen)
154    fullscreenFlag = SDL_FULLSCREEN;
155  else
156    fullscreenFlag = 0;
157
158  if((this->screen = SDL_SetVideoMode(this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags | fullscreenFlag)) == NULL)
159    {
160      PRINTF(1)("Could not SDL_SetVideoMode(%d, %d, %d, %d): %s\n", this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags, SDL_GetError());
161      SDL_Quit();
162      //    return -1;
163    }
164}
165
166/**
167   \brief sets Fullscreen mode
168   \param fullscreen true if fullscreen, false if windowed
169*/
170void GraphicsEngine::setFullscreen(bool fullscreen)
171{
172  this->fullscreen = fullscreen;
173  this->setResolution(this->resolutionX, this->resolutionY, this->bitsPerPixel);
174}
175
176/**
177   \brief sets the background color
178   \param red the red part of the background
179   \param blue the blue part of the background
180   \param green the green part of the background
181   \param alpha the alpha part of the background
182*/
183void GraphicsEngine::setBackgroundColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
184{
185  glClearColor(red, green, blue, alpha);
186}
187
188
189/**
190   \brief Signalhandler, for when the resolution has changed
191   \param resizeInfo SDL information about the size of the new screen size
192*/
193int GraphicsEngine::resolutionChanged(SDL_ResizeEvent* resizeInfo)
194{
195  this->setResolution(resizeInfo->w, resizeInfo->h, this->bitsPerPixel);
196}
197
198/**
199   \brief if Textures should be enabled
200*/
201bool GraphicsEngine::texturesEnabled = true;
202
203
204
205/**
206   \brief entering 2D Mode
207
208   this is a GL-Projection-mode, that is orthogonal, for placing the font in fron of everything else
209*/
210void GraphicsEngine::enter2DMode()
211{
212  GraphicsEngine::storeMatrices();
213  SDL_Surface *screen = SDL_GetVideoSurface();
214
215  /* Note, there may be other things you need to change,
216     depending on how you have your OpenGL state set up.
217  */
218  glPushAttrib(GL_ENABLE_BIT);
219  glDisable(GL_DEPTH_TEST);
220  glDisable(GL_CULL_FACE);
221  glDisable(GL_LIGHTING);  // will be set back when leaving 2D-mode
222  glEnable(GL_TEXTURE_2D);
223
224  /* This allows alpha blending of 2D textures with the scene */
225  glEnable(GL_BLEND);
226  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
227
228  glViewport(0, 0, screen->w, screen->h);
229
230  glMatrixMode(GL_PROJECTION);
231  glPushMatrix();
232  glLoadIdentity();
233
234  glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0);
235
236  glMatrixMode(GL_MODELVIEW);
237  glPushMatrix();
238  glLoadIdentity();
239
240  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
241}
242
243/**
244   \brief leaves the 2DMode again also \see Font::enter2DMode()
245*/
246void GraphicsEngine::leave2DMode()
247{
248  glMatrixMode(GL_MODELVIEW);
249  glPopMatrix();
250
251  glMatrixMode(GL_PROJECTION);
252  glPopMatrix();
253
254  glPopAttrib();
255}
256
257/**
258   \brief stores the GL_matrices
259*/
260void GraphicsEngine::storeMatrices()
261{
262  glGetDoublev(GL_PROJECTION_MATRIX, GraphicsEngine::projMat);
263  glGetDoublev(GL_MODELVIEW_MATRIX, GraphicsEngine::modMat);
264  glGetIntegerv(GL_VIEWPORT, GraphicsEngine::viewPort);
265}
266
267//! the stored ModelView Matrix.
268GLdouble GraphicsEngine::modMat[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
269//! the stored Projection Matrix
270GLdouble GraphicsEngine::projMat[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
271//! The ViewPort
272GLint GraphicsEngine::viewPort[4] = {0,0,0,0};
273
274
275
276/**
277   \brief outputs all the Fullscreen modes.
278*/
279void GraphicsEngine::listModes()
280{
281  /* Get available fullscreen/hardware modes */
282  this->videoModes=SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
283
284  /* Check is there are any modes available */
285  if(this->videoModes == (SDL_Rect **)0){
286    PRINTF(1)("No modes available!\n");
287    exit(-1);
288  }
289
290  /* Check if our resolution is restricted */
291  if(this->videoModes == (SDL_Rect **)-1){
292    PRINTF(2)("All resolutions available.\n");
293  }
294  else{
295    /* Print valid modes */
296    PRINT(0)("Available Resoulution Modes are\n");
297    for(int i = 0; this->videoModes[i]; ++i)
298      PRINT(4)(" |  %d x %d\n", this->videoModes[i]->w, this->videoModes[i]->h);
299  }
300}
301
302/**
303   \brief ticks the Text
304   \param dt the time passed
305*/
306void GraphicsEngine::tick(float dt)
307{
308  if( unlikely(this->bDisplayFPS))
309    {
310      this->currentFPS = 1.0/dt;
311      if( unlikely(this->currentFPS > this->maxFPS)) this->maxFPS = this->currentFPS;
312      if( unlikely(this->currentFPS < this->minFPS)) this->minFPS = this->currentFPS;
313
314#ifndef NO_TEXT
315      char tmpChar1[20];
316      sprintf(tmpChar1, "Current:  %4.0f", this->currentFPS);
317      this->geTextCFPS->setText(tmpChar1);
318      char tmpChar2[20];
319      sprintf(tmpChar2, "Max:    %4.0f", this->maxFPS);
320      this->geTextMaxFPS->setText(tmpChar2);
321      char tmpChar3[20];
322      sprintf(tmpChar3, "Min:    %4.0f", this->minFPS);
323      this->geTextMinFPS->setText(tmpChar3);
324#endif /* NO_TEXT */
325    }
326}
327
328/**
329   \brief displays the Frames per second
330   \param display if the text should be displayed
331
332   \todo this is dangerous
333*/
334void GraphicsEngine::displayFPS(bool display)
335{
336  if( display)
337    {
338#ifndef NO_TEXT
339      this->geTextCFPS = TextEngine::getInstance()->createText("fonts/arial_black.ttf", 15, TEXT_DYNAMIC, 0, 255, 0);
340      this->geTextCFPS->setAlignment(TEXT_ALIGN_LEFT);
341      this->geTextCFPS->setPosition(5, 500);
342      this->geTextMaxFPS = TextEngine::getInstance()->createText("fonts/arial_black.ttf", 15, TEXT_DYNAMIC, 0, 255, 0);
343      this->geTextMaxFPS->setAlignment(TEXT_ALIGN_LEFT);
344      this->geTextMaxFPS->setPosition(5, 530);
345      this->geTextMinFPS = TextEngine::getInstance()->createText("fonts/arial_black.ttf", 35, TEXT_DYNAMIC, 0, 255, 0);
346      this->geTextMinFPS->setAlignment(TEXT_ALIGN_LEFT);
347      this->geTextMinFPS->setPosition(5, 560);
348#endif /* NO_TEXT */
349    }
350  this->bDisplayFPS = display;
351}
352
353
Note: See TracBrowser for help on using the repository browser.