Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 4276 was 4245, checked in by patrick, 20 years ago

orxonox/trunk: merged back the md2_loader branche manualy (a full merge was impossible).

File size: 8.6 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->bDisplayFPS = false;
34  this->minFPS = 9999;
35  this->maxFPS = 0;
36  this->setClassName ("GraphicsEngine");
37
38  this->fullscreen = false;
39
40  this->initVideo();
41
42  this->listModes();
43}
44
45/**
46   \brief The Pointer to this GraphicsEngine
47*/
48GraphicsEngine* GraphicsEngine::singletonRef = NULL;
49
50/**
51   \returns A pointer to this GraphicsEngine
52*/
53GraphicsEngine* GraphicsEngine::getInstance()
54{
55  if (!GraphicsEngine::singletonRef)
56    GraphicsEngine::singletonRef = new GraphicsEngine();
57  return GraphicsEngine::singletonRef;
58}
59
60
61/**
62   \brief destructs the graphicsEngine.
63*/
64GraphicsEngine::~GraphicsEngine () 
65{
66  // delete what has to be deleted here
67}
68
69/**
70   \brief initializes the Video for openGL.
71
72   This has to be done only once when starting orxonox.
73*/
74int GraphicsEngine::initVideo()
75{
76  // initialize SDL_VIDEO
77  if (SDL_Init(SDL_INIT_VIDEO) == -1)
78    {
79      PRINTF(1)("could not initialize SDL Video\n");
80      //      return -1;
81    }
82  // initialize SDL_GL-settings
83  this->setGLattribs();
84
85  // setting the Video Flags.
86  this->videoFlags = SDL_OPENGL | SDL_HWPALETTE | SDL_RESIZABLE | SDL_DOUBLEBUF;
87
88  /* query SDL for information about our video hardware */
89  const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo ();
90  if( videoInfo == NULL)
91    {
92      PRINTF(1)("Failed getting Video Info :%s\n", SDL_GetError()); 
93      SDL_Quit ();
94    }
95  if( videoInfo->hw_available)
96    this->videoFlags |= SDL_HWSURFACE;
97  else 
98    this->videoFlags |= SDL_SWSURFACE;
99  /*
100  if(VideoInfo -> blit_hw)
101    VideoFlags |= SDL_HWACCEL;
102  */
103
104  // setting up the Resolution
105  this->setResolution(800, 600, 16);
106 
107  // Set window labeling
108  SDL_WM_SetCaption ("Orxonox " PACKAGE_VERSION, "Orxonox " PACKAGE_VERSION);
109 
110  // TO DO: Create a cool icon and use it here
111  char* loadPic = new char[strlen(ResourceManager::getInstance()->getDataDir())+ 100];
112  sprintf(loadPic, "%s%s", ResourceManager::getInstance()->getDataDir(),  "pictures/orxonox-icon32x32.bmp");
113  SDL_WM_SetIcon(SDL_LoadBMP(loadPic), NULL); 
114  delete loadPic;
115  // Enable default GL stuff
116  glEnable(GL_DEPTH_TEST);
117}
118
119/**
120   \brief Sets the GL-attributes
121*/
122int GraphicsEngine::setGLattribs(void)
123{
124  // Set video mode
125  // TO DO: parse arguments for settings
126  //SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
127  //SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
128  //SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
129  //SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
130 
131
132  SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );   
133  SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16);   
134  SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 0); 
135  SDL_GL_SetAttribute( SDL_GL_ACCUM_RED_SIZE, 0);
136  SDL_GL_SetAttribute( SDL_GL_ACCUM_GREEN_SIZE, 0);
137  SDL_GL_SetAttribute( SDL_GL_ACCUM_BLUE_SIZE, 0);
138  SDL_GL_SetAttribute( SDL_GL_ACCUM_ALPHA_SIZE, 0);
139}
140
141/**
142   \brief sets the Resolution of the Screen to display the Graphics to.
143   \param width The width of the window
144   \param height The height of the window
145   \param bpp bits per pixel
146*/
147int GraphicsEngine::setResolution(int width, int height, int bpp)
148{
149  Uint32 fullscreenFlag;
150  this->resolutionX = width;
151  this->resolutionY = height;
152  this->bitsPerPixel = bpp;
153  if (this->fullscreen)
154    fullscreenFlag = SDL_FULLSCREEN;
155  else
156    fullscreenFlag = 0;
157 
158  printf ("ok\n");
159  if((this->screen = SDL_SetVideoMode(this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags | fullscreenFlag)) == NULL)
160    {
161      PRINTF(1)("Could not SDL_SetVideoMode(%d, %d, %d, %d): %s\n", this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags, SDL_GetError());
162      SDL_Quit();
163      //    return -1;
164    }
165}
166
167void GraphicsEngine::setFullscreen(bool fullscreen)
168{
169  this->fullscreen = fullscreen;
170  this->setResolution(this->resolutionX, this->resolutionY, this->bitsPerPixel);
171}
172
173/**
174   \brief Signalhandler, for when the resolution has changed
175   \param resizeInfo SDL information about the size of the new screen size
176*/
177int GraphicsEngine::resolutionChanged(SDL_ResizeEvent* resizeInfo)
178{
179  this->setResolution(resizeInfo->w, resizeInfo->h, this->bitsPerPixel);
180}
181
182/**
183   \brief if Textures should be enabled
184*/
185bool GraphicsEngine::texturesEnabled = true;
186
187
188
189/**
190   \brief entering 2D Mode
191   
192   this is a GL-Projection-mode, that is orthogonal, for placing the font in fron of everything else
193*/
194void GraphicsEngine::enter2DMode(void)
195{
196  GraphicsEngine::storeMatrices();
197  SDL_Surface *screen = SDL_GetVideoSurface();
198 
199  /* Note, there may be other things you need to change,
200     depending on how you have your OpenGL state set up.
201  */
202  glPushAttrib(GL_ENABLE_BIT);
203  glDisable(GL_DEPTH_TEST);
204  glDisable(GL_CULL_FACE);
205  glDisable(GL_LIGHTING);  // will be set back when leaving 2D-mode
206  glEnable(GL_TEXTURE_2D);
207
208  /* This allows alpha blending of 2D textures with the scene */
209  glEnable(GL_BLEND);
210  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
211 
212  glViewport(0, 0, screen->w, screen->h);
213 
214  glMatrixMode(GL_PROJECTION);
215  glPushMatrix();
216  glLoadIdentity();
217 
218  glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0);
219 
220  glMatrixMode(GL_MODELVIEW);
221  glPushMatrix();
222  glLoadIdentity();
223 
224  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
225}
226
227/**
228   \brief leaves the 2DMode again also \see Font::enter2DMode(void)
229*/
230void GraphicsEngine::leave2DMode(void)
231{
232  glMatrixMode(GL_MODELVIEW);
233  glPopMatrix();
234 
235  glMatrixMode(GL_PROJECTION);
236  glPopMatrix();
237 
238  glPopAttrib();
239}
240
241/**
242   \brief stores the GL_matrices
243*/
244void GraphicsEngine::storeMatrices(void)
245{
246  glGetDoublev(GL_PROJECTION_MATRIX, GraphicsEngine::projMat);
247  glGetDoublev(GL_MODELVIEW_MATRIX, GraphicsEngine::modMat);
248  glGetIntegerv(GL_VIEWPORT, GraphicsEngine::viewPort);
249}
250
251//! the stored ModelView Matrix.
252GLdouble GraphicsEngine::modMat[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
253//! the stored Projection Matrix
254GLdouble GraphicsEngine::projMat[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
255//! The ViewPort
256GLint GraphicsEngine::viewPort[4] = {0,0,0,0};
257
258
259
260/**
261   \brief outputs all the Fullscreen modes.
262*/
263void GraphicsEngine::listModes(void)
264{
265  /* Get available fullscreen/hardware modes */
266  this->videoModes=SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
267 
268  /* Check is there are any modes available */
269  if(this->videoModes == (SDL_Rect **)0){
270    PRINTF(1)("No modes available!\n");
271    exit(-1);
272  }
273 
274  /* Check if our resolution is restricted */
275  if(this->videoModes == (SDL_Rect **)-1){
276    PRINTF(2)("All resolutions available.\n");
277  }
278  else{
279    /* Print valid modes */
280    PRINT(0)("Available Resoulution Modes are\n");
281    for(int i = 0; this->videoModes[i]; ++i)
282      PRINT(4)(" |  %d x %d\n", this->videoModes[i]->w, this->videoModes[i]->h);
283  }
284}
285
286
287void GraphicsEngine::tick(float dt)
288{
289        if( unlikely(this->bDisplayFPS))
290        {
291          this->currentFPS = 1.0/dt;
292      if( unlikely(this->currentFPS > this->maxFPS)) this->maxFPS = this->currentFPS;
293          if( unlikely(this->currentFPS < this->minFPS)) this->minFPS = this->currentFPS;
294         
295          char tmpChar1[20];
296          sprintf(tmpChar1, "Current:  %4.0f", this->currentFPS);
297          this->geTextCFPS->setText(tmpChar1);
298          char tmpChar2[20];
299          sprintf(tmpChar2, "Max:    %4.0f", this->maxFPS);
300          this->geTextMaxFPS->setText(tmpChar2);
301          char tmpChar3[20];
302          sprintf(tmpChar3, "Min:    %4.0f", this->minFPS);
303          this->geTextMinFPS->setText(tmpChar3);
304        }
305}
306 
307void GraphicsEngine::displayFPS(bool display)
308{
309        if( display)
310        {
311                this->geTextCFPS = TextEngine::getInstance()->createText("fonts/druid.ttf", 35, TEXT_DYNAMIC, 0, 255, 0);
312                this->geTextCFPS->setAlignment(TEXT_ALIGN_LEFT);
313                this->geTextCFPS->setPosition(5, 500);
314                this->geTextMaxFPS = TextEngine::getInstance()->createText("fonts/druid.ttf", 35, TEXT_DYNAMIC, 0, 255, 0);
315                this->geTextMaxFPS->setAlignment(TEXT_ALIGN_LEFT);
316                this->geTextMaxFPS->setPosition(5, 530);
317                this->geTextMinFPS = TextEngine::getInstance()->createText("fonts/druid.ttf", 35, TEXT_DYNAMIC, 0, 255, 0);
318                this->geTextMinFPS->setAlignment(TEXT_ALIGN_LEFT);
319                this->geTextMinFPS->setPosition(5, 560);       
320        }
321        this->bDisplayFPS = display;
322}
323
324 
Note: See TracBrowser for help on using the repository browser.