Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/lib/graphics/graphics_engine.cc @ 9701

Last change on this file since 9701 was 9685, checked in by bensch, 18 years ago

adapted many classes to the new ClassID System, now comes the hard part… Scripting… then Network… wow this will be so bad :/

File size: 18.1 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 "util/loading/resource_manager.h"
20#include "state.h"
21
22#include "world_entity.h"
23
24#include "render_2d.h"
25#include "text_engine.h"
26#include "light.h"
27#include "shader.h"
28#include "debug.h"
29
30#include "util/preferences.h"
31#include "substring.h"
32#include "text.h"
33
34#include "globals.h"
35#include "texture.h"
36
37#include "effects/graphics_effect.h"
38#include "effects/fog_effect.h"
39#include "effects/lense_flare.h"
40
41#include "shell_command.h"
42
43
44#include "parser/tinyxml/tinyxml.h"
45#include "util/loading/load_param.h"
46#include "util/loading/factory.h"
47
48#ifdef __WIN32__
49 #include "static_model.h"
50#endif
51
52SHELL_COMMAND(wireframe, GraphicsEngine, wireframe);
53SHELL_COMMAND(fps, GraphicsEngine, toggleFPSdisplay);
54
55NewObjectListDefinition(GraphicsEngine);
56
57/**
58 * @brief standard constructor
59 */
60GraphicsEngine::GraphicsEngine ()
61{
62  this->registerObject(this, GraphicsEngine::_objectList);
63  this->setName("GraphicsEngine");
64
65  this->isInit = false;
66
67  this->bDisplayFPS = false;
68  this->bAntialiasing = false;
69  this->bDedicated = false;
70  this->minFPS = 9999;
71  this->maxFPS = 0;
72
73  this->geTextCFPS = NULL;
74  this->geTextMaxFPS = NULL;
75  this->geTextMinFPS = NULL;
76
77  this->fullscreenFlag = 0;
78  this->videoFlags = 0;
79  this->screen = NULL;
80
81  // initialize the Modules
82  TextEngine::getInstance();
83  this->graphicsEffects = NULL;
84
85}
86
87/**
88 * @brief The Pointer to this GraphicsEngine
89 */
90GraphicsEngine* GraphicsEngine::singletonRef = NULL;
91
92/**
93 * @brief destructs the graphicsEngine.
94*/
95GraphicsEngine::~GraphicsEngine ()
96{
97  // delete what has to be deleted here
98  this->displayFPS( false );
99
100  //TextEngine
101  delete TextEngine::getInstance();
102  // render 2D
103  delete Render2D::getInstance();
104
105  SDL_QuitSubSystem(SDL_INIT_VIDEO);
106  //   if (this->screen != NULL)
107  //     SDL_FreeSurface(this->screen);
108
109  GraphicsEngine::singletonRef = NULL;
110}
111
112
113/**
114 * @brief loads the GraphicsEngine Specific Parameters.
115 * @param root: the XML-Element to load the Data From
116 */
117void GraphicsEngine::loadParams(const TiXmlElement* root)
118{
119  LoadParamXML(root, "GraphicsEffect", this, GraphicsEngine, loadGraphicsEffects)
120  .describe("loads a graphics effect");
121}
122
123
124
125
126/**
127 * @param root The XML-element to load GraphicsEffects from
128 */
129void GraphicsEngine::loadGraphicsEffects(const TiXmlElement* root)
130{
131  LOAD_PARAM_START_CYCLE(root, element);
132  {
133    PRINTF(4)("element is: %s\n", element->Value());
134    Factory::fabricate(element);
135  }
136  LOAD_PARAM_END_CYCLE(element);
137}
138
139
140
141/**
142 * @brief initializes the GraphicsEngine with default settings.
143 */
144int GraphicsEngine::init()
145{
146  if (this->isInit)
147    return -1;
148  this->initVideo(640, 480, 16);
149  return 1;
150}
151
152/**
153 * @brief loads the GraphicsEngine's settings from a given ini-file and section
154 * @returns nothing usefull
155 */
156int GraphicsEngine::initFromPreferences()
157{
158  // looking if we are in fullscreen-mode
159  MultiType fullscreen = Preferences::getInstance()->getString(CONFIG_SECTION_VIDEO, CONFIG_NAME_FULLSCREEN, "0");
160
161  if (fullscreen.getBool())
162    this->fullscreenFlag = SDL_FULLSCREEN;
163
164  // looking if we are in fullscreen-mode
165  MultiType textures = Preferences::getInstance()->getString(CONFIG_SECTION_VIDEO_ADVANCED, CONFIG_NAME_TEXTURES, "1");
166  Texture::setTextureEnableState(textures.getBool());
167
168  // check it is a dedicated network node: so no drawings are made
169  MultiType dedicated = Preferences::getInstance()->getString(CONFIG_SECTION_VIDEO, CONFIG_NAME_NO_RENDER, "0");
170  this->bDedicated = dedicated.getBool();
171
172  // searching for a usefull resolution
173  SubString resolution(Preferences::getInstance()->getString(CONFIG_SECTION_VIDEO, CONFIG_NAME_RESOLUTION, "640x480").c_str(), 'x'); ///FIXME
174  //resolution.debug();
175  MultiType x = resolution.getString(0), y = resolution.getString(1);
176  return this->initVideo(x.getInt(), y.getInt(), 16);
177
178  //   GraphicsEffect* fe = new FogEffect(NULL);
179  //   this->loadGraphicsEffect(fe);
180  //   fe->activate();
181  //   PRINTF(0)("--------------------------------------------------------------\n");
182
183  //LenseFlare* ge = new LenseFlare();
184  //this->loadGraphicsEffect(ge);
185
186  //ge->addFlare("pictures/lense_flare/sun.png"); //sun
187  //ge->addFlare("pictures/lense_flare/lens2.png"); //first halo
188  //ge->addFlare("pictures/lense_flare/lens1.png"); //small birst
189  //ge->addFlare("pictures/lense_flare/lens3.png"); //second halo
190  //ge->addFlare("pictures/lense_flare/lens4.png");
191  //ge->addFlare("pictures/lense_flare/lens1.png");
192  //ge->addFlare("pictures/lense_flare/lens3.png");
193
194  //ge->activate();
195}
196
197
198
199/**
200 * @brief initializes the Video for openGL.
201 *
202 * This has to be done only once when starting orxonox.
203 */
204int GraphicsEngine::initVideo(unsigned int resX, unsigned int resY, unsigned int bbp)
205{
206  if (this->isInit)
207    return -1;
208  //   initialize SDL_VIDEO
209  if (SDL_InitSubSystem(SDL_INIT_VIDEO) == -1)
210  {
211    PRINTF(1)("could not initialize SDL Video\n");
212    return -1;
213  }
214  // initialize SDL_GL-settings
215  this->setGLattribs();
216
217  // setting the Video Flags.
218  this->videoFlags = SDL_OPENGL | SDL_HWPALETTE | SDL_RESIZABLE ;
219
220  /* query SDL for information about our video hardware */
221  const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo ();
222  if( videoInfo == NULL)
223  {
224    PRINTF(1)("Failed getting Video Info :%s\n", SDL_GetError());
225    SDL_Quit ();
226  }
227  if( videoInfo->hw_available)
228    this->videoFlags |= SDL_HWSURFACE;
229  else
230    this->videoFlags |= SDL_SWSURFACE;
231  /*
232  if(VideoInfo -> blit_hw)
233    VideoFlags |= SDL_HWACCEL;
234  */
235  // setting up the Resolution
236  this->setResolution(resX, resY, bbp);
237
238  // GRABBING ALL GL-extensions
239  this->grabHardwareSettings();
240
241  // Enable default GL stuff
242  glEnable(GL_DEPTH_TEST);
243
244  Render2D::getInstance();
245
246  this->isInit = true;
247  return 1;
248}
249
250/**
251 * @brief sets the Window Captions and the Name of the icon.
252 * @param windowName The name of the Window
253 * @param icon The name of the Icon on the Disc
254 */
255void GraphicsEngine::setWindowName(const std::string& windowName, const std::string& icon)
256{
257  SDL_Surface* iconSurf = SDL_LoadBMP(icon.c_str());
258  if (iconSurf != NULL)
259  {
260    Uint32 colorkey = SDL_MapRGB(iconSurf->format, 0, 0, 0);
261    SDL_SetColorKey(iconSurf, SDL_SRCCOLORKEY, colorkey);
262    SDL_WM_SetIcon(iconSurf, NULL);
263    SDL_FreeSurface(iconSurf);
264  }
265
266  SDL_WM_SetCaption (windowName.c_str(), icon.c_str());
267}
268
269
270/**
271 * @brief Sets the GL-attributes
272 */
273void GraphicsEngine::setGLattribs()
274{
275  // Set video mode
276  // TO DO: parse arguments for settings
277  //SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
278  //SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
279  //SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
280  //SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
281
282
283  SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
284  SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16);
285  SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 0);
286  SDL_GL_SetAttribute( SDL_GL_ACCUM_RED_SIZE, 0);
287  SDL_GL_SetAttribute( SDL_GL_ACCUM_GREEN_SIZE, 0);
288  SDL_GL_SetAttribute( SDL_GL_ACCUM_BLUE_SIZE, 0);
289  SDL_GL_SetAttribute( SDL_GL_ACCUM_ALPHA_SIZE, 0);
290
291  SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);      //Use at least 5 bits of Red
292  SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);    //Use at least 5 bits of Green
293  SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);     //Use at least 5 bits of Blue
294  SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);   //Use at least 16 bits for the depth buffer
295  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);  //Enable double buffering
296
297  // enable antialiasing?
298  if( this->bAntialiasing)
299  {
300    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,4);
301    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,1);
302  }
303
304  glEnable(GL_CULL_FACE);
305  glCullFace(GL_FRONT);
306}
307
308/**
309 * @brief grabs the Hardware Specifics
310 *
311 * checks for all the different HW-types
312 */
313void GraphicsEngine::grabHardwareSettings()
314{
315  const char* renderer = (const char*) glGetString(GL_RENDERER);
316  const char* vendor   = (const char*) glGetString(GL_VENDOR);
317  const char* version  = (const char*) glGetString(GL_VERSION);
318  const char* extensions = (const char*) glGetString(GL_EXTENSIONS);
319
320  //  printf("%s %s %s\n %s", renderer, vendor, version, extensions);
321
322  if (renderer != NULL)
323  {
324    this->hwRenderer == renderer;
325  }
326  if (vendor != NULL)
327  {
328    this->hwVendor == vendor;
329  }
330  if (version != NULL)
331  {
332    this->hwVersion == version;
333  }
334
335  if (extensions != NULL)
336    this->hwExtensions.split(extensions, " \n\t,");
337
338  PRINT(4)("Running on : vendor: %s,  renderer: %s,  version:%s\n", vendor, renderer, version);
339  PRINT(4)("Extensions:\n");
340  for (unsigned int i = 0; i < this->hwExtensions.size(); i++)
341    PRINT(4)("%d: %s\n", i, this->hwExtensions[i].c_str());
342
343
344  // inizializing GLEW
345  GLenum err = glewInit();
346  if (GLEW_OK != err)
347  {
348    /* Problem: glewInit failed, something is seriously wrong. */
349    PRINTF(1)("%s\n", glewGetErrorString(err));
350  }
351  PRINTF(4)("Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
352}
353
354
355/**
356 * @brief sets the Resolution of the Screen to display the Graphics to.
357 * @param width The width of the window
358 * @param height The height of the window
359 * @param bpp bits per pixel
360 */
361int GraphicsEngine::setResolution(int width, int height, int bpp)
362{
363  this->resolutionX = width;
364  this->resolutionY = height;
365  this->bitsPerPixel = bpp;
366  State::setResolution( width, height);
367
368  if (this->screen != NULL)
369    SDL_FreeSurface(screen);
370  if((this->screen = SDL_SetVideoMode(this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags | this->fullscreenFlag)) == NULL)
371  {
372    PRINTF(1)("Could not SDL_SetVideoMode(%d, %d, %d, %d): %s\n", this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags, SDL_GetError());
373    //    SDL_Quit();
374    //    return -1;
375    return -1;
376  }
377  glViewport(0, 0, width, height);                     // Reset The Current Viewport
378
379#ifdef __WIN32__
380  // REBUILDING TEXTURES (ON WINDOWS CONTEXT SWITCH)
381  const std::list<BaseObject*>* texList = ClassList::getList(CL_TEXTURE);
382  if (texList != NULL)
383  {
384    std::list<BaseObject*>::const_iterator reTex;
385    for (reTex = texList->begin(); reTex != texList->end(); reTex++)
386      dynamic_cast<Texture*>(*reTex)->rebuild();
387  }
388  // REBUILDING MODELS
389  const std::list<BaseObject*>* modelList = ClassList::getList(CL_STATIC_MODEL);
390  if (texList != NULL)
391  {
392    std::list<BaseObject*>::const_iterator reModel;
393    for (reModel = modelList->begin(); reModel != modelList->end(); reModel++)
394      dynamic_cast<StaticModel*>(*reModel)->rebuild();
395  }
396#endif /* __WIN32__ */
397  return 1;
398}
399
400/**
401 * @brief sets Fullscreen mode
402 * @param fullscreen true if fullscreen, false if windowed
403*/
404void GraphicsEngine::setFullscreen(bool fullscreen)
405{
406  if (fullscreen)
407    this->fullscreenFlag = SDL_FULLSCREEN;
408  else
409    this->fullscreenFlag = 0;
410  this->setResolution(this->resolutionX, this->resolutionY, this->bitsPerPixel);
411}
412
413void GraphicsEngine::toggleFullscreen()
414{
415  if (this->fullscreenFlag == SDL_FULLSCREEN)
416    this->fullscreenFlag = 0;
417  else
418    this->fullscreenFlag = SDL_FULLSCREEN;
419  this->setResolution(this->resolutionX, this->resolutionY, this->bitsPerPixel);
420}
421
422
423/**
424 * @brief sets the background color
425 * @param red the red part of the background
426 * @param blue the blue part of the background
427 * @param green the green part of the background
428 * @param alpha the alpha part of the background
429 */
430void GraphicsEngine::setBackgroundColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
431{
432  glClearColor(red, green, blue, alpha);
433}
434
435/**
436 * @brief Signalhandler, for when the resolution has changed
437 * @param resizeInfo SDL information about the size of the new screen size
438 */
439void GraphicsEngine::resolutionChanged(const SDL_ResizeEvent& resizeInfo)
440{
441  this->setResolution(resizeInfo.w, resizeInfo.h, this->bitsPerPixel);
442}
443
444/**
445 * @brief entering 2D Mode
446 * this is a GL-Projection-mode, that is orthogonal, for placing the font in fron of everything else
447 */
448void GraphicsEngine::enter2DMode()
449{
450  //GraphicsEngine::storeMatrices();
451  SDL_Surface *screen = SDL_GetVideoSurface();
452
453  /* Note, there may be other things you need to change,
454     depending on how you have your OpenGL state set up.
455  */
456  glPushAttrib(GL_ENABLE_BIT);
457  glDisable(GL_DEPTH_TEST);
458  glDisable(GL_CULL_FACE);
459  glDisable(GL_LIGHTING);  // will be set back when leaving 2D-mode
460
461  glMatrixMode(GL_PROJECTION);
462  glPushMatrix();
463  glLoadIdentity();
464  glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0);
465
466  glMatrixMode(GL_MODELVIEW);
467  glPushMatrix();
468  glLoadIdentity();
469}
470
471/**
472 * @brief leaves the 2DMode again also @see Font::enter2DMode()
473 */
474void GraphicsEngine::leave2DMode()
475{
476
477  glMatrixMode(GL_MODELVIEW);
478  glPopMatrix();
479
480  glMatrixMode(GL_PROJECTION);
481  glPopMatrix();
482
483  glPopAttrib();
484}
485
486/**
487 * @brief changes to wireframe-mode.
488 */
489void GraphicsEngine::wireframe()
490{
491  glPolygonMode(GL_FRONT, GL_LINE);
492}
493
494/**
495 * @brief stores the GL_matrices
496 */
497void GraphicsEngine::storeMatrices()
498{
499  glGetDoublev(GL_PROJECTION_MATRIX, GraphicsEngine::projMat);
500  glGetDoublev(GL_MODELVIEW_MATRIX, GraphicsEngine::modMat);
501  glGetIntegerv(GL_VIEWPORT, GraphicsEngine::viewPort);
502}
503
504//! the stored ModelView Matrix.
505GLdouble GraphicsEngine::modMat[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
506//! the stored Projection Matrix
507GLdouble GraphicsEngine::projMat[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
508//! The ViewPort
509GLint GraphicsEngine::viewPort[4] = {0,0,0,0};
510
511
512
513/**
514 * @brief outputs all the Fullscreen modes.
515 */
516void GraphicsEngine::listModes()
517{
518  /* Get available fullscreen/hardware modes */
519  this->videoModes=SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
520
521  /* Check is there are any modes available */
522  if(this->videoModes == (SDL_Rect **)0)
523  {
524    PRINTF(1)("No modes available!\n");
525    exit(-1);
526  }
527
528  /* Check if our resolution is restricted */
529  if(this->videoModes == (SDL_Rect **)-1)
530  {
531    PRINTF(2)("All resolutions available.\n");
532  }
533  else
534  {
535    /* Print valid modes */
536    PRINT(0)("Available Resoulution Modes are\n");
537    for(int i = 0; this->videoModes[i]; ++i)
538      PRINT(4)(" |  %d x %d\n", this->videoModes[i]->w, this->videoModes[i]->h);
539  }
540}
541
542/**
543 * @brief checks wether a certain extension is availiable
544 * @param extension the Extension to check for (ex. GL_ARB_texture_env_dot3)
545 * @return true if it is, false otherwise
546 */
547bool GraphicsEngine::hwSupportsEXT(const std::string& extension)
548{
549  for (unsigned int i = 0; i < this->hwExtensions.size(); i++)
550    if ( this->hwExtensions.getString(i) == extension)
551      return true;
552  return false;
553}
554
555/**
556 * @brief updates everything that is to be updated in the GraphicsEngine
557 */
558void GraphicsEngine::update(float dt)
559{
560  Render2D::getInstance()->update(dt);
561}
562
563
564/**
565 * @brief ticks the Text
566 * @param dt the time passed
567 */
568void GraphicsEngine::tick(float dt)
569{
570  if( unlikely(this->bDisplayFPS))
571  {
572    this->currentFPS = 1.0/dt;
573    if( unlikely(this->currentFPS > this->maxFPS)) this->maxFPS = this->currentFPS;
574    if( unlikely(this->currentFPS < this->minFPS)) this->minFPS = this->currentFPS;
575
576#ifndef NO_TEXT
577    char tmpChar1[20];
578    sprintf(tmpChar1, "Current:  %4.0f", this->currentFPS);
579    this->geTextCFPS->setText(tmpChar1);
580    char tmpChar2[20];
581    sprintf(tmpChar2, "Max:    %4.0f", this->maxFPS);
582    this->geTextMaxFPS->setText(tmpChar2);
583    char tmpChar3[20];
584    sprintf(tmpChar3, "Min:    %4.0f", this->minFPS);
585    this->geTextMinFPS->setText(tmpChar3);
586#endif /* NO_TEXT */
587
588  }
589
590  Render2D::getInstance()->tick(dt);
591
592  // tick the graphics effects
593  for (NewObjectList<GraphicsEffect>::const_iterator it = GraphicsEffect::objectList().begin();
594       it != GraphicsEffect::objectList().end();
595       ++it)
596    (*it)->tick(dt);
597}
598
599/**
600 * @brief draws all Elements that should be displayed on the Background.
601 */
602void GraphicsEngine::drawBackgroundElements() const
603{
604  GraphicsEngine::storeMatrices();
605
606  Render2D::getInstance()->draw(E2D_LAYER_BELOW_ALL, E2D_LAYER_BELOW_ALL);
607}
608
609/**
610 * this draws the graphics engines graphics effecs
611 */
612void GraphicsEngine::draw() const
613{
614  if( this->graphicsEffects != NULL)
615  {
616    //draw the graphics effects
617    std::list<BaseObject*>::const_iterator it;
618    for (it = this->graphicsEffects->begin(); it != this->graphicsEffects->end(); it++)
619      dynamic_cast<GraphicsEffect*>(*it)->draw();
620  }
621  Shader::suspendShader();
622  Render2D::getInstance()->draw(E2D_LAYER_BOTTOM, E2D_LAYER_ABOVE_ALL);
623  Shader::restoreShader();
624}
625
626
627void GraphicsEngine::toggleFPSdisplay()
628{
629  this->displayFPS(!this->bDisplayFPS);
630}
631
632
633/**
634 * @brief displays the Frames per second
635 * @param display if the text should be displayed
636*/
637void GraphicsEngine::displayFPS(bool display)
638{
639#ifndef NO_TEXT
640  if( display )
641  {
642    if (this->geTextCFPS == NULL)
643    {
644      this->geTextCFPS = new Text("fonts/arial_black.ttf", 15);
645      this->geTextCFPS->setName("curFPS");
646      this->geTextCFPS->setAlignment(TEXT_ALIGN_LEFT);
647      this->geTextCFPS->setAbsCoor2D(5, 0);
648    }
649    if (this->geTextMaxFPS == NULL)
650    {
651      this->geTextMaxFPS = new Text("fonts/arial_black.ttf", 15);
652      this->geTextMaxFPS->setName("MaxFPS");
653      this->geTextMaxFPS->setAlignment(TEXT_ALIGN_LEFT);
654      this->geTextMaxFPS->setAbsCoor2D(5, 20);
655    }
656    if (this->geTextMinFPS == NULL)
657    {
658      this->geTextMinFPS = new Text("fonts/arial_black.ttf", 15);
659      this->geTextMinFPS->setName("MinFPS");
660      this->geTextMinFPS->setAlignment(TEXT_ALIGN_LEFT);
661      this->geTextMinFPS->setAbsCoor2D(5, 40);
662    }
663  }
664  else
665  {
666    delete this->geTextCFPS;
667    this->geTextCFPS = NULL;
668    delete this->geTextMaxFPS;
669    this->geTextMaxFPS = NULL;
670    delete this->geTextMinFPS;
671    this->geTextMinFPS = NULL;
672  }
673  this->bDisplayFPS = display;
674#else
675  this->bDisplayFPS = false;
676#endif /* NO_TEXT */
677}
678
679
680/**
681 * @brief processes the events for the GraphicsEngine class
682 * @param the event to handle
683 */
684void GraphicsEngine::process(const Event &event)
685{
686  switch (event.type)
687  {
688    case EV_VIDEO_RESIZE:
689    this->resolutionChanged(event.resize);
690    break;
691  }
692}
Note: See TracBrowser for help on using the repository browser.