1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <math.h>
5
6 #include "SDL.h"
7
8 #ifdef __MACOS__
9 #define HAVE_OPENGL
10 #endif
11
12 #ifdef HAVE_OPENGL
13
14 #include "SDL_opengl.h"
15
16 /* Undefine this if you want a flat cube instead of a rainbow cube */
17 #define SHADED_CUBE
18
19 /* Define this to be the name of the logo image to use with -logo */
20 #define LOGO_FILE "icon.bmp"
21
22 /* The SDL_OPENGLBLIT interface is deprecated.
23 The code is still available for benchmark purposes though.
24 */
25
26 static SDL_bool USE_DEPRECATED_OPENGLBLIT = SDL_FALSE;
27
28 static SDL_Surface *global_image = NULL;
29 static GLuint global_texture = 0;
30 static GLuint cursor_texture = 0;
31
32 /**********************************************************************/
33
HotKey_ToggleFullScreen(void)34 void HotKey_ToggleFullScreen(void)
35 {
36 SDL_Surface *screen;
37
38 screen = SDL_GetVideoSurface();
39 if ( SDL_WM_ToggleFullScreen(screen) ) {
40 printf("Toggled fullscreen mode - now %s\n",
41 (screen->flags&SDL_FULLSCREEN) ? "fullscreen" : "windowed");
42 } else {
43 printf("Unable to toggle fullscreen mode\n");
44 }
45 }
46
HotKey_ToggleGrab(void)47 void HotKey_ToggleGrab(void)
48 {
49 SDL_GrabMode mode;
50
51 printf("Ctrl-G: toggling input grab!\n");
52 mode = SDL_WM_GrabInput(SDL_GRAB_QUERY);
53 if ( mode == SDL_GRAB_ON ) {
54 printf("Grab was on\n");
55 } else {
56 printf("Grab was off\n");
57 }
58 mode = SDL_WM_GrabInput(!mode);
59 if ( mode == SDL_GRAB_ON ) {
60 printf("Grab is now on\n");
61 } else {
62 printf("Grab is now off\n");
63 }
64 }
65
HotKey_Iconify(void)66 void HotKey_Iconify(void)
67 {
68 printf("Ctrl-Z: iconifying window!\n");
69 SDL_WM_IconifyWindow();
70 }
71
HandleEvent(SDL_Event * event)72 int HandleEvent(SDL_Event *event)
73 {
74 int done;
75
76 done = 0;
77 switch( event->type ) {
78 case SDL_ACTIVEEVENT:
79 /* See what happened */
80 printf( "app %s ", event->active.gain ? "gained" : "lost" );
81 if ( event->active.state & SDL_APPACTIVE ) {
82 printf( "active " );
83 } else if ( event->active.state & SDL_APPMOUSEFOCUS ) {
84 printf( "mouse " );
85 } else if ( event->active.state & SDL_APPINPUTFOCUS ) {
86 printf( "input " );
87 }
88 printf( "focus\n" );
89 break;
90
91
92 case SDL_KEYDOWN:
93 if ( event->key.keysym.sym == SDLK_ESCAPE ) {
94 done = 1;
95 }
96 if ( (event->key.keysym.sym == SDLK_g) &&
97 (event->key.keysym.mod & KMOD_CTRL) ) {
98 HotKey_ToggleGrab();
99 }
100 if ( (event->key.keysym.sym == SDLK_z) &&
101 (event->key.keysym.mod & KMOD_CTRL) ) {
102 HotKey_Iconify();
103 }
104 if ( (event->key.keysym.sym == SDLK_RETURN) &&
105 (event->key.keysym.mod & KMOD_ALT) ) {
106 HotKey_ToggleFullScreen();
107 }
108 printf("key '%s' pressed\n",
109 SDL_GetKeyName(event->key.keysym.sym));
110 break;
111 case SDL_QUIT:
112 done = 1;
113 break;
114 }
115 return(done);
116 }
117
SDL_GL_Enter2DMode()118 void SDL_GL_Enter2DMode()
119 {
120 SDL_Surface *screen = SDL_GetVideoSurface();
121
122 /* Note, there may be other things you need to change,
123 depending on how you have your OpenGL state set up.
124 */
125 glPushAttrib(GL_ENABLE_BIT);
126 glDisable(GL_DEPTH_TEST);
127 glDisable(GL_CULL_FACE);
128 glEnable(GL_TEXTURE_2D);
129
130 /* This allows alpha blending of 2D textures with the scene */
131 glEnable(GL_BLEND);
132 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
133
134 glViewport(0, 0, screen->w, screen->h);
135
136 glMatrixMode(GL_PROJECTION);
137 glPushMatrix();
138 glLoadIdentity();
139
140 glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0);
141
142 glMatrixMode(GL_MODELVIEW);
143 glPushMatrix();
144 glLoadIdentity();
145
146 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
147 }
148
SDL_GL_Leave2DMode()149 void SDL_GL_Leave2DMode()
150 {
151 glMatrixMode(GL_MODELVIEW);
152 glPopMatrix();
153
154 glMatrixMode(GL_PROJECTION);
155 glPopMatrix();
156
157 glPopAttrib();
158 }
159
160 /* Quick utility function for texture creation */
power_of_two(int input)161 static int power_of_two(int input)
162 {
163 int value = 1;
164
165 while ( value < input ) {
166 value <<= 1;
167 }
168 return value;
169 }
170
SDL_GL_LoadTexture(SDL_Surface * surface,GLfloat * texcoord)171 GLuint SDL_GL_LoadTexture(SDL_Surface *surface, GLfloat *texcoord)
172 {
173 GLuint texture;
174 int w, h;
175 SDL_Surface *image;
176 SDL_Rect area;
177 Uint32 saved_flags;
178 Uint8 saved_alpha;
179
180 /* Use the surface width and height expanded to powers of 2 */
181 w = power_of_two(surface->w);
182 h = power_of_two(surface->h);
183 texcoord[0] = 0.0f; /* Min X */
184 texcoord[1] = 0.0f; /* Min Y */
185 texcoord[2] = (GLfloat)surface->w / w; /* Max X */
186 texcoord[3] = (GLfloat)surface->h / h; /* Max Y */
187
188 image = SDL_CreateRGBSurface(
189 SDL_SWSURFACE,
190 w, h,
191 32,
192 #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
193 0x000000FF,
194 0x0000FF00,
195 0x00FF0000,
196 0xFF000000
197 #else
198 0xFF000000,
199 0x00FF0000,
200 0x0000FF00,
201 0x000000FF
202 #endif
203 );
204 if ( image == NULL ) {
205 return 0;
206 }
207
208 /* Save the alpha blending attributes */
209 saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK);
210 saved_alpha = surface->format->alpha;
211 if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
212 SDL_SetAlpha(surface, 0, 0);
213 }
214
215 /* Copy the surface into the GL texture image */
216 area.x = 0;
217 area.y = 0;
218 area.w = surface->w;
219 area.h = surface->h;
220 SDL_BlitSurface(surface, &area, image, &area);
221
222 /* Restore the alpha blending attributes */
223 if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
224 SDL_SetAlpha(surface, saved_flags, saved_alpha);
225 }
226
227 /* Create an OpenGL texture for the image */
228 glGenTextures(1, &texture);
229 glBindTexture(GL_TEXTURE_2D, texture);
230 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
231 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
232 glTexImage2D(GL_TEXTURE_2D,
233 0,
234 GL_RGBA,
235 w, h,
236 0,
237 GL_RGBA,
238 GL_UNSIGNED_BYTE,
239 image->pixels);
240 SDL_FreeSurface(image); /* No longer needed */
241
242 return texture;
243 }
244
DrawLogoCursor(void)245 void DrawLogoCursor(void)
246 {
247 static GLfloat texMinX, texMinY;
248 static GLfloat texMaxX, texMaxY;
249 static int w, h;
250 int x, y;
251
252 if ( ! cursor_texture ) {
253 SDL_Surface *image;
254 GLfloat texcoord[4];
255
256 /* Load the image (could use SDL_image library here) */
257 image = SDL_LoadBMP(LOGO_FILE);
258 if ( image == NULL ) {
259 return;
260 }
261 w = image->w;
262 h = image->h;
263
264 /* Convert the image into an OpenGL texture */
265 cursor_texture = SDL_GL_LoadTexture(image, texcoord);
266
267 /* Make texture coordinates easy to understand */
268 texMinX = texcoord[0];
269 texMinY = texcoord[1];
270 texMaxX = texcoord[2];
271 texMaxY = texcoord[3];
272
273 /* We don't need the original image anymore */
274 SDL_FreeSurface(image);
275
276 /* Make sure that the texture conversion is okay */
277 if ( ! cursor_texture ) {
278 return;
279 }
280 }
281
282 /* Move the image around */
283 SDL_GetMouseState(&x, &y);
284 x -= w/2;
285 y -= h/2;
286
287 /* Show the image on the screen */
288 SDL_GL_Enter2DMode();
289 glBindTexture(GL_TEXTURE_2D, cursor_texture);
290 glBegin(GL_TRIANGLE_STRIP);
291 glTexCoord2f(texMinX, texMinY); glVertex2i(x, y );
292 glTexCoord2f(texMaxX, texMinY); glVertex2i(x+w, y );
293 glTexCoord2f(texMinX, texMaxY); glVertex2i(x, y+h);
294 glTexCoord2f(texMaxX, texMaxY); glVertex2i(x+w, y+h);
295 glEnd();
296 SDL_GL_Leave2DMode();
297 }
298
DrawLogoTexture(void)299 void DrawLogoTexture(void)
300 {
301 static GLfloat texMinX, texMinY;
302 static GLfloat texMaxX, texMaxY;
303 static int x = 0;
304 static int y = 0;
305 static int w, h;
306 static int delta_x = 1;
307 static int delta_y = 1;
308
309 SDL_Surface *screen = SDL_GetVideoSurface();
310
311 if ( ! global_texture ) {
312 SDL_Surface *image;
313 GLfloat texcoord[4];
314
315 /* Load the image (could use SDL_image library here) */
316 image = SDL_LoadBMP(LOGO_FILE);
317 if ( image == NULL ) {
318 return;
319 }
320 w = image->w;
321 h = image->h;
322
323 /* Convert the image into an OpenGL texture */
324 global_texture = SDL_GL_LoadTexture(image, texcoord);
325
326 /* Make texture coordinates easy to understand */
327 texMinX = texcoord[0];
328 texMinY = texcoord[1];
329 texMaxX = texcoord[2];
330 texMaxY = texcoord[3];
331
332 /* We don't need the original image anymore */
333 SDL_FreeSurface(image);
334
335 /* Make sure that the texture conversion is okay */
336 if ( ! global_texture ) {
337 return;
338 }
339 }
340
341 /* Move the image around */
342 x += delta_x;
343 if ( x < 0 ) {
344 x = 0;
345 delta_x = -delta_x;
346 } else
347 if ( (x+w) > screen->w ) {
348 x = screen->w-w;
349 delta_x = -delta_x;
350 }
351 y += delta_y;
352 if ( y < 0 ) {
353 y = 0;
354 delta_y = -delta_y;
355 } else
356 if ( (y+h) > screen->h ) {
357 y = screen->h-h;
358 delta_y = -delta_y;
359 }
360
361 /* Show the image on the screen */
362 SDL_GL_Enter2DMode();
363 glBindTexture(GL_TEXTURE_2D, global_texture);
364 glBegin(GL_TRIANGLE_STRIP);
365 glTexCoord2f(texMinX, texMinY); glVertex2i(x, y );
366 glTexCoord2f(texMaxX, texMinY); glVertex2i(x+w, y );
367 glTexCoord2f(texMinX, texMaxY); glVertex2i(x, y+h);
368 glTexCoord2f(texMaxX, texMaxY); glVertex2i(x+w, y+h);
369 glEnd();
370 SDL_GL_Leave2DMode();
371 }
372
373 /* This code is deprecated, but available for speed comparisons */
DrawLogoBlit(void)374 void DrawLogoBlit(void)
375 {
376 static int x = 0;
377 static int y = 0;
378 static int w, h;
379 static int delta_x = 1;
380 static int delta_y = 1;
381
382 SDL_Rect dst;
383 SDL_Surface *screen = SDL_GetVideoSurface();
384
385 if ( global_image == NULL ) {
386 SDL_Surface *temp;
387
388 /* Load the image (could use SDL_image library here) */
389 temp = SDL_LoadBMP(LOGO_FILE);
390 if ( temp == NULL ) {
391 return;
392 }
393 w = temp->w;
394 h = temp->h;
395
396 /* Convert the image into the screen format */
397 global_image = SDL_CreateRGBSurface(
398 SDL_SWSURFACE,
399 w, h,
400 screen->format->BitsPerPixel,
401 screen->format->Rmask,
402 screen->format->Gmask,
403 screen->format->Bmask,
404 screen->format->Amask);
405 if ( global_image ) {
406 SDL_BlitSurface(temp, NULL, global_image, NULL);
407 }
408 SDL_FreeSurface(temp);
409
410 /* Make sure that the texture conversion is okay */
411 if ( ! global_image ) {
412 return;
413 }
414 }
415
416 /* Move the image around
417 Note that we do not clear the old position. This is because we
418 perform a glClear() which clears the framebuffer and then only
419 update the new area.
420 Note that you can also achieve interesting effects by modifying
421 the screen surface alpha channel. It's set to 255 by default..
422 */
423 x += delta_x;
424 if ( x < 0 ) {
425 x = 0;
426 delta_x = -delta_x;
427 } else
428 if ( (x+w) > screen->w ) {
429 x = screen->w-w;
430 delta_x = -delta_x;
431 }
432 y += delta_y;
433 if ( y < 0 ) {
434 y = 0;
435 delta_y = -delta_y;
436 } else
437 if ( (y+h) > screen->h ) {
438 y = screen->h-h;
439 delta_y = -delta_y;
440 }
441 dst.x = x;
442 dst.y = y;
443 dst.w = w;
444 dst.h = h;
445 SDL_BlitSurface(global_image, NULL, screen, &dst);
446
447 /* Show the image on the screen */
448 SDL_UpdateRects(screen, 1, &dst);
449 }
450
RunGLTest(int argc,char * argv[],int logo,int logocursor,int slowly,int bpp,float gamma,int noframe,int fsaa,int sync,int accel)451 int RunGLTest( int argc, char* argv[],
452 int logo, int logocursor, int slowly, int bpp, float gamma, int noframe, int fsaa, int sync, int accel )
453 {
454 int i;
455 int rgb_size[3];
456 int w = 640;
457 int h = 480;
458 int done = 0;
459 int frames;
460 Uint32 start_time, this_time;
461 float color[8][3]= {{ 1.0, 1.0, 0.0},
462 { 1.0, 0.0, 0.0},
463 { 0.0, 0.0, 0.0},
464 { 0.0, 1.0, 0.0},
465 { 0.0, 1.0, 1.0},
466 { 1.0, 1.0, 1.0},
467 { 1.0, 0.0, 1.0},
468 { 0.0, 0.0, 1.0}};
469 float cube[8][3]= {{ 0.5, 0.5, -0.5},
470 { 0.5, -0.5, -0.5},
471 {-0.5, -0.5, -0.5},
472 {-0.5, 0.5, -0.5},
473 {-0.5, 0.5, 0.5},
474 { 0.5, 0.5, 0.5},
475 { 0.5, -0.5, 0.5},
476 {-0.5, -0.5, 0.5}};
477 Uint32 video_flags;
478 int value;
479
480 if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
481 fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError());
482 exit( 1 );
483 }
484
485 /* See if we should detect the display depth */
486 if ( bpp == 0 ) {
487 if ( SDL_GetVideoInfo()->vfmt->BitsPerPixel <= 8 ) {
488 bpp = 8;
489 } else {
490 bpp = 16; /* More doesn't seem to work */
491 }
492 }
493
494 /* Set the flags we want to use for setting the video mode */
495 if ( logo && USE_DEPRECATED_OPENGLBLIT ) {
496 video_flags = SDL_OPENGLBLIT;
497 } else {
498 video_flags = SDL_OPENGL;
499 }
500 for ( i=1; argv[i]; ++i ) {
501 if ( strcmp(argv[i], "-fullscreen") == 0 ) {
502 video_flags |= SDL_FULLSCREEN;
503 }
504 }
505
506 if (noframe) {
507 video_flags |= SDL_NOFRAME;
508 }
509
510 /* Initialize the display */
511 switch (bpp) {
512 case 8:
513 rgb_size[0] = 3;
514 rgb_size[1] = 3;
515 rgb_size[2] = 2;
516 break;
517 case 15:
518 case 16:
519 rgb_size[0] = 5;
520 rgb_size[1] = 5;
521 rgb_size[2] = 5;
522 break;
523 default:
524 rgb_size[0] = 8;
525 rgb_size[1] = 8;
526 rgb_size[2] = 8;
527 break;
528 }
529 SDL_GL_SetAttribute( SDL_GL_RED_SIZE, rgb_size[0] );
530 SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, rgb_size[1] );
531 SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, rgb_size[2] );
532 SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
533 SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
534 if ( fsaa ) {
535 SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
536 SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, fsaa );
537 }
538 if ( accel ) {
539 SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 );
540 }
541 if ( sync ) {
542 SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 1 );
543 } else {
544 SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 0 );
545 }
546 if ( SDL_SetVideoMode( w, h, bpp, video_flags ) == NULL ) {
547 fprintf(stderr, "Couldn't set GL mode: %s\n", SDL_GetError());
548 SDL_Quit();
549 exit(1);
550 }
551
552 printf("Screen BPP: %d\n", SDL_GetVideoSurface()->format->BitsPerPixel);
553 printf("\n");
554 printf( "Vendor : %s\n", glGetString( GL_VENDOR ) );
555 printf( "Renderer : %s\n", glGetString( GL_RENDERER ) );
556 printf( "Version : %s\n", glGetString( GL_VERSION ) );
557 printf( "Extensions : %s\n", glGetString( GL_EXTENSIONS ) );
558 printf("\n");
559
560 SDL_GL_GetAttribute( SDL_GL_RED_SIZE, &value );
561 printf( "SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0],value);
562 SDL_GL_GetAttribute( SDL_GL_GREEN_SIZE, &value );
563 printf( "SDL_GL_GREEN_SIZE: requested %d, got %d\n", rgb_size[1],value);
564 SDL_GL_GetAttribute( SDL_GL_BLUE_SIZE, &value );
565 printf( "SDL_GL_BLUE_SIZE: requested %d, got %d\n", rgb_size[2],value);
566 SDL_GL_GetAttribute( SDL_GL_DEPTH_SIZE, &value );
567 printf( "SDL_GL_DEPTH_SIZE: requested %d, got %d\n", bpp, value );
568 SDL_GL_GetAttribute( SDL_GL_DOUBLEBUFFER, &value );
569 printf( "SDL_GL_DOUBLEBUFFER: requested 1, got %d\n", value );
570 if ( fsaa ) {
571 SDL_GL_GetAttribute( SDL_GL_MULTISAMPLEBUFFERS, &value );
572 printf("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value );
573 SDL_GL_GetAttribute( SDL_GL_MULTISAMPLESAMPLES, &value );
574 printf("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa, value );
575 }
576 if ( accel ) {
577 SDL_GL_GetAttribute( SDL_GL_ACCELERATED_VISUAL, &value );
578 printf( "SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value );
579 }
580 if ( sync ) {
581 SDL_GL_GetAttribute( SDL_GL_SWAP_CONTROL, &value );
582 printf( "SDL_GL_SWAP_CONTROL: requested 1, got %d\n", value );
583 }
584
585 /* Set the window manager title bar */
586 SDL_WM_SetCaption( "SDL GL test", "testgl" );
587
588 /* Set the gamma for the window */
589 if ( gamma != 0.0 ) {
590 SDL_SetGamma(gamma, gamma, gamma);
591 }
592
593 glViewport( 0, 0, w, h );
594 glMatrixMode( GL_PROJECTION );
595 glLoadIdentity( );
596
597 glOrtho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0 );
598
599 glMatrixMode( GL_MODELVIEW );
600 glLoadIdentity( );
601
602 glEnable(GL_DEPTH_TEST);
603
604 glDepthFunc(GL_LESS);
605
606 glShadeModel(GL_SMOOTH);
607
608 /* Loop until done. */
609 start_time = SDL_GetTicks();
610 frames = 0;
611 while( !done ) {
612 GLenum gl_error;
613 char* sdl_error;
614 SDL_Event event;
615
616 /* Do our drawing, too. */
617 glClearColor( 0.0, 0.0, 0.0, 1.0 );
618 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
619
620 glBegin( GL_QUADS );
621
622 #ifdef SHADED_CUBE
623 glColor3fv(color[0]);
624 glVertex3fv(cube[0]);
625 glColor3fv(color[1]);
626 glVertex3fv(cube[1]);
627 glColor3fv(color[2]);
628 glVertex3fv(cube[2]);
629 glColor3fv(color[3]);
630 glVertex3fv(cube[3]);
631
632 glColor3fv(color[3]);
633 glVertex3fv(cube[3]);
634 glColor3fv(color[4]);
635 glVertex3fv(cube[4]);
636 glColor3fv(color[7]);
637 glVertex3fv(cube[7]);
638 glColor3fv(color[2]);
639 glVertex3fv(cube[2]);
640
641 glColor3fv(color[0]);
642 glVertex3fv(cube[0]);
643 glColor3fv(color[5]);
644 glVertex3fv(cube[5]);
645 glColor3fv(color[6]);
646 glVertex3fv(cube[6]);
647 glColor3fv(color[1]);
648 glVertex3fv(cube[1]);
649
650 glColor3fv(color[5]);
651 glVertex3fv(cube[5]);
652 glColor3fv(color[4]);
653 glVertex3fv(cube[4]);
654 glColor3fv(color[7]);
655 glVertex3fv(cube[7]);
656 glColor3fv(color[6]);
657 glVertex3fv(cube[6]);
658
659 glColor3fv(color[5]);
660 glVertex3fv(cube[5]);
661 glColor3fv(color[0]);
662 glVertex3fv(cube[0]);
663 glColor3fv(color[3]);
664 glVertex3fv(cube[3]);
665 glColor3fv(color[4]);
666 glVertex3fv(cube[4]);
667
668 glColor3fv(color[6]);
669 glVertex3fv(cube[6]);
670 glColor3fv(color[1]);
671 glVertex3fv(cube[1]);
672 glColor3fv(color[2]);
673 glVertex3fv(cube[2]);
674 glColor3fv(color[7]);
675 glVertex3fv(cube[7]);
676 #else /* flat cube */
677 glColor3f(1.0, 0.0, 0.0);
678 glVertex3fv(cube[0]);
679 glVertex3fv(cube[1]);
680 glVertex3fv(cube[2]);
681 glVertex3fv(cube[3]);
682
683 glColor3f(0.0, 1.0, 0.0);
684 glVertex3fv(cube[3]);
685 glVertex3fv(cube[4]);
686 glVertex3fv(cube[7]);
687 glVertex3fv(cube[2]);
688
689 glColor3f(0.0, 0.0, 1.0);
690 glVertex3fv(cube[0]);
691 glVertex3fv(cube[5]);
692 glVertex3fv(cube[6]);
693 glVertex3fv(cube[1]);
694
695 glColor3f(0.0, 1.0, 1.0);
696 glVertex3fv(cube[5]);
697 glVertex3fv(cube[4]);
698 glVertex3fv(cube[7]);
699 glVertex3fv(cube[6]);
700
701 glColor3f(1.0, 1.0, 0.0);
702 glVertex3fv(cube[5]);
703 glVertex3fv(cube[0]);
704 glVertex3fv(cube[3]);
705 glVertex3fv(cube[4]);
706
707 glColor3f(1.0, 0.0, 1.0);
708 glVertex3fv(cube[6]);
709 glVertex3fv(cube[1]);
710 glVertex3fv(cube[2]);
711 glVertex3fv(cube[7]);
712 #endif /* SHADED_CUBE */
713
714 glEnd( );
715
716 glMatrixMode(GL_MODELVIEW);
717 glRotatef(5.0, 1.0, 1.0, 1.0);
718
719 /* Draw 2D logo onto the 3D display */
720 if ( logo ) {
721 if ( USE_DEPRECATED_OPENGLBLIT ) {
722 DrawLogoBlit();
723 } else {
724 DrawLogoTexture();
725 }
726 }
727 if ( logocursor ) {
728 DrawLogoCursor();
729 }
730
731 SDL_GL_SwapBuffers( );
732
733 /* Check for error conditions. */
734 gl_error = glGetError( );
735
736 if( gl_error != GL_NO_ERROR ) {
737 fprintf( stderr, "testgl: OpenGL error: %d\n", gl_error );
738 }
739
740 sdl_error = SDL_GetError( );
741
742 if( sdl_error[0] != '\0' ) {
743 fprintf(stderr, "testgl: SDL error '%s'\n", sdl_error);
744 SDL_ClearError();
745 }
746
747 /* Allow the user to see what's happening */
748 if ( slowly ) {
749 SDL_Delay( 20 );
750 }
751
752 /* Check if there's a pending event. */
753 while( SDL_PollEvent( &event ) ) {
754 done = HandleEvent(&event);
755 }
756 ++frames;
757 }
758
759 /* Print out the frames per second */
760 this_time = SDL_GetTicks();
761 if ( this_time != start_time ) {
762 printf("%2.2f FPS\n",
763 ((float)frames/(this_time-start_time))*1000.0);
764 }
765
766 if ( global_image ) {
767 SDL_FreeSurface(global_image);
768 global_image = NULL;
769 }
770 if ( global_texture ) {
771 glDeleteTextures( 1, &global_texture );
772 global_texture = 0;
773 }
774 if ( cursor_texture ) {
775 glDeleteTextures( 1, &cursor_texture );
776 cursor_texture = 0;
777 }
778
779 /* Destroy our GL context, etc. */
780 SDL_Quit( );
781 return(0);
782 }
783
main(int argc,char * argv[])784 int main(int argc, char *argv[])
785 {
786 int i, logo, logocursor = 0;
787 int numtests;
788 int bpp = 0;
789 int slowly;
790 float gamma = 0.0;
791 int noframe = 0;
792 int fsaa = 0;
793 int accel = 0;
794 int sync = 0;
795
796 logo = 0;
797 slowly = 0;
798 numtests = 1;
799 for ( i=1; argv[i]; ++i ) {
800 if ( strcmp(argv[i], "-twice") == 0 ) {
801 ++numtests;
802 }
803 if ( strcmp(argv[i], "-logo") == 0 ) {
804 logo = 1;
805 USE_DEPRECATED_OPENGLBLIT = SDL_FALSE;
806 }
807 if ( strcmp(argv[i], "-logoblit") == 0 ) {
808 logo = 1;
809 USE_DEPRECATED_OPENGLBLIT = SDL_TRUE;
810 }
811 if ( strcmp(argv[i], "-logocursor") == 0 ) {
812 logocursor = 1;
813 }
814 if ( strcmp(argv[i], "-slow") == 0 ) {
815 slowly = 1;
816 }
817 if ( strcmp(argv[i], "-bpp") == 0 ) {
818 bpp = atoi(argv[++i]);
819 }
820 if ( strcmp(argv[i], "-gamma") == 0 ) {
821 gamma = (float)atof(argv[++i]);
822 }
823 if ( strcmp(argv[i], "-noframe") == 0 ) {
824 noframe = 1;
825 }
826 if ( strcmp(argv[i], "-fsaa") == 0 ) {
827 ++fsaa;
828 }
829 if ( strcmp(argv[i], "-accel") == 0 ) {
830 ++accel;
831 }
832 if ( strcmp(argv[i], "-sync") == 0 ) {
833 ++sync;
834 }
835 if ( strncmp(argv[i], "-h", 2) == 0 ) {
836 printf(
837 "Usage: %s [-twice] [-logo] [-logocursor] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa] [-accel] [-sync] [-fullscreen]\n",
838 argv[0]);
839 exit(0);
840 }
841 }
842 for ( i=0; i<numtests; ++i ) {
843 RunGLTest(argc, argv, logo, logocursor, slowly, bpp, gamma, noframe, fsaa, sync, accel);
844 }
845 return 0;
846 }
847
848 #else /* HAVE_OPENGL */
849
main(int argc,char * argv[])850 int main(int argc, char *argv[])
851 {
852 printf("No OpenGL support on this system\n");
853 return 1;
854 }
855
856 #endif /* HAVE_OPENGL */
857