Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/test/sdl_opengl_test/sdl_opengl_test.cc @ 10301

Last change on this file since 10301 was 9932, checked in by stefalie, 18 years ago

test: updated tutorial stuff…

File size: 5.2 KB
Line 
1/*
2* Original Tutorial by Jeff Molofee
3* (ported to Linux/SDL by Ti Leggett '01)
4*
5* Visit Jeff at http://nehe.gamedev.net/
6*/
7
8#include <GL/gl.h>
9#include <GL/glu.h>
10#include "SDL.h"
11
12/* screen width, height, and bit depth */
13#define SCREEN_WIDTH  640
14#define SCREEN_HEIGHT 480
15#define SCREEN_BPP     32
16
17/* This is our SDL surface */
18SDL_Surface *surface;
19
20/* Prototype declaration */
21int resizeWindow(int width, int height);
22int drawGLScene();
23
24
25int main( int argc, char **argv )
26{
27  /*================================ SDL INIT ============================================ */
28  // Wir automatisch in der GraphicsEngine gemacht
29  // siehe src/lib/graphics/graphics_engine.cc
30
31  /* Flags to pass to SDL_SetVideoMode */
32  int videoFlags;
33  /* main loop variable */
34  int done = false;
35  /* used to collect events */
36  SDL_Event event;
37  /* this holds some info about our display */
38  const SDL_VideoInfo *videoInfo;
39
40
41  /* initialize SDL */
42  if (SDL_Init( SDL_INIT_VIDEO ) < 0)
43  {
44    fprintf(stderr, "Video initialization failed: %s\n", SDL_GetError());
45    exit(1);
46  }
47
48  /* Fetch the video info */
49  videoInfo = SDL_GetVideoInfo();
50
51  if(!videoInfo)
52  {
53    fprintf(stderr, "Video query failed: %s\n", SDL_GetError());
54    exit(1);
55  }
56
57  /* the flags to pass to SDL_SetVideoMode */
58  videoFlags  = SDL_OPENGL;          /* Enable OpenGL in SDL */
59  videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */
60  videoFlags |= SDL_HWPALETTE;       /* Store the palette in hardware */
61  videoFlags |= SDL_RESIZABLE;       /* Enable window resizing */
62
63  /* This checks to see if surfaces can be stored in memory */
64  if(videoInfo->hw_available)
65    videoFlags |= SDL_HWSURFACE;
66  else
67    videoFlags |= SDL_SWSURFACE;
68
69  /* This checks if hardware blits can be done */
70  if (videoInfo->blit_hw)
71    videoFlags |= SDL_HWACCEL;
72
73  /* Sets up OpenGL double buffering */
74  SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
75
76  /* get a SDL surface */
77  surface = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,
78                              videoFlags );
79
80  /* Verify there is a surface */
81  if(!surface)
82  {
83    fprintf(stderr,  "Video mode set failed: %s\n", SDL_GetError());
84    exit(1);
85  }
86
87  /* initialize OpenGL */
88  /* Set the background black */
89  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
90
91  /* Enables Depth Testing */
92  glEnable( GL_DEPTH_TEST );
93
94
95  /* resize the initial window */
96  resizeWindow(SCREEN_WIDTH, SCREEN_HEIGHT);
97
98
99  /*================================ MAIN-LOOP ============================================ */
100  // Entspricht der Orxonox-Main-Loop in
101  // src/story_entities/game_world.cc:291
102  // ( void GameWorld::run() )
103
104
105  /* wait for events */
106  while(!done)
107  {
108    /* handle the events in the queue */
109
110    while(SDL_PollEvent(&event))
111    {
112      switch( event.type )
113      {
114      case SDL_VIDEORESIZE:
115        /* handle resize event */
116        surface = SDL_SetVideoMode(event.resize.w, event.resize.h, 16, videoFlags);
117        if(!surface)
118        {
119          fprintf(stderr, "Could not get a surface after resize: %s\n", SDL_GetError());
120          exit(1);
121        }
122        resizeWindow(event.resize.w, event.resize.h);
123        break;
124      case SDL_QUIT:
125        /* handle quit requests */
126        done = true;
127        break;
128      default:
129        break;
130      }
131    }
132
133    // hier wird das ganze gezeichnet!
134    drawGLScene();
135  }
136
137  /* clean up the window */
138  SDL_Quit( );
139
140  /* Should never get here */
141  return( 0 );
142}
143
144
145/* Here goes our drawing code */
146int drawGLScene()
147{
148  /* rotational vars for the triangle and quad, respectively */
149  static GLfloat rtri;
150  /* These are to calculate our fps */
151  static GLint T0     = 0;
152  static GLint Frames = 0;
153
154
155  /* Clear The Screen And The Depth Buffer */
156  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
157
158
159  /* ================================== WorldEntity zeichnen ======================================== */
160  // das ist der code, der in eine WorldEntity::draw() funktion passen wuerde
161
162
163  /* ================================== WorldEntity zeichnen fertig ================================ */
164
165
166  /* Draw it to the screen */
167   SDL_GL_SwapBuffers();
168
169  /* Gather our frames per second */
170  Frames++;
171  {
172    GLint t = SDL_GetTicks();
173    if (t - T0 >= 5000) {
174      GLfloat seconds = (t - T0) / 1000.0;
175      GLfloat fps = Frames / seconds;
176      printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
177      T0 = t;
178      Frames = 0;
179    }
180  }
181
182  /* Increase The Rotation Variable For The Triangle ( NEW ) */
183  rtri  += 0.2f;
184
185  return(true);
186}
187
188
189
190/* function to reset our viewport after a window resize */
191int resizeWindow(int width, int height)
192{
193  /* Height / width ration */
194  GLfloat ratio;
195
196  /* Protect against a divide by zero */
197  if(height == 0)
198    height = 1;
199
200  ratio = (GLfloat)width / (GLfloat)height;
201
202  /* Setup our viewport. */
203  glViewport(0, 0, (GLsizei)width, (GLsizei)height);
204
205  /* change to the projection matrix and set our viewing volume. */
206  glMatrixMode(GL_PROJECTION);
207  glLoadIdentity();
208
209  /* Set our perspective */
210  gluPerspective(90.0f, ratio, 0.1f, 100.0f);
211
212  /* Make sure we're chaning the model view and not the projection */
213  glMatrixMode(GL_MODELVIEW);
214
215  /* Reset The View */
216  glLoadIdentity();
217
218  return(true);
219}
220
221
Note: See TracBrowser for help on using the repository browser.