Mercurial > sdl-ios-xcode
diff test/testgl.c @ 0:74212992fb08
Initial revision
author | Sam Lantinga <slouken@lokigames.com> |
---|---|
date | Thu, 26 Apr 2001 16:45:43 +0000 |
parents | |
children | 0e5d6dd77bda |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/testgl.c Thu Apr 26 16:45:43 2001 +0000 @@ -0,0 +1,519 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> + +#include "SDL.h" + +#ifdef HAVE_OPENGL +#ifdef WIN32 +#include <windows.h> +#endif +#if defined(__APPLE__) && defined(__MACH__) +#include <OpenGL/gl.h> +#else +#include <GL/gl.h> +#endif + +#define SHADED_CUBE + + +void HotKey_ToggleFullScreen(void) +{ + SDL_Surface *screen; + + screen = SDL_GetVideoSurface(); + if ( SDL_WM_ToggleFullScreen(screen) ) { + printf("Toggled fullscreen mode - now %s\n", + (screen->flags&SDL_FULLSCREEN) ? "fullscreen" : "windowed"); + } else { + printf("Unable to toggle fullscreen mode\n"); + } +} + +void HotKey_ToggleGrab(void) +{ + SDL_GrabMode mode; + + printf("Ctrl-G: toggling input grab!\n"); + mode = SDL_WM_GrabInput(SDL_GRAB_QUERY); + if ( mode == SDL_GRAB_ON ) { + printf("Grab was on\n"); + } else { + printf("Grab was off\n"); + } + mode = SDL_WM_GrabInput(!mode); + if ( mode == SDL_GRAB_ON ) { + printf("Grab is now on\n"); + } else { + printf("Grab is now off\n"); + } +} + +void HotKey_Iconify(void) +{ + printf("Ctrl-Z: iconifying window!\n"); + SDL_WM_IconifyWindow(); +} + +int HandleEvent(SDL_Event *event) +{ + int done; + + done = 0; + switch( event->type ) { + case SDL_ACTIVEEVENT: + /* See what happened */ + printf( "app %s ", event->active.gain ? "gained" : "lost" ); + if ( event->active.state & SDL_APPACTIVE ) { + printf( "active " ); + } else if ( event->active.state & SDL_APPMOUSEFOCUS ) { + printf( "mouse " ); + } else if ( event->active.state & SDL_APPINPUTFOCUS ) { + printf( "input " ); + } + printf( "focus\n" ); + break; + + + case SDL_KEYDOWN: + if ( event->key.keysym.sym == SDLK_ESCAPE ) { + done = 1; + } + if ( (event->key.keysym.sym == SDLK_g) && + (event->key.keysym.mod & KMOD_CTRL) ) { + HotKey_ToggleGrab(); + } + if ( (event->key.keysym.sym == SDLK_z) && + (event->key.keysym.mod & KMOD_CTRL) ) { + HotKey_Iconify(); + } + if ( (event->key.keysym.sym == SDLK_RETURN) && + (event->key.keysym.mod & KMOD_ALT) ) { + HotKey_ToggleFullScreen(); + } + printf("key '%s' pressed\n", + SDL_GetKeyName(event->key.keysym.sym)); + break; + case SDL_QUIT: + done = 1; + break; + } + return(done); +} + +void DrawSDLLogo(void) +{ + static SDL_Surface *image = NULL; + static int x = 0; + static int y = 0; + static int delta_x = 1; + static int delta_y = 1; + static Uint32 last_moved = 0; + + SDL_Rect dst; + SDL_Surface *screen; + + if ( image == NULL ) { + SDL_Surface *temp; + + temp = SDL_LoadBMP("icon.bmp"); + if ( temp == NULL ) { + return; + } + image = SDL_CreateRGBSurface( + SDL_SWSURFACE, + temp->w, temp->h, + 32, +#if SDL_BYTEORDER == SDL_LIL_ENDIAN + 0x000000FF, + 0x0000FF00, + 0x00FF0000, + 0xFF000000 +#else + 0xFF000000, + 0x00FF0000, + 0x0000FF00, + 0x000000FF +#endif + ); + if ( image != NULL ) { + SDL_BlitSurface(temp, NULL, image, NULL); + } + SDL_FreeSurface(temp); + if ( image == NULL ) { + return; + } + } + + screen = SDL_GetVideoSurface(); + + /* Show the image on the screen */ + dst.x = x; + dst.y = y; + dst.w = image->w; + dst.h = image->h; + + /* Move it around + Note that we do not clear the old position. This is because we + perform a glClear() which clears the framebuffer and then only + update the new area. + Note that you can also achieve interesting effects by modifying + the screen surface alpha channel. It's set to 255 by default.. + */ + if ( (SDL_GetTicks() - last_moved) > 100 ) { + x += delta_x; + if ( x < 0 ) { + x = 0; + delta_x = -delta_x; + } else + if ( (x+image->w) > screen->w ) { + x = screen->w-image->w; + delta_x = -delta_x; + } + y += delta_y; + if ( y < 0 ) { + y = 0; + delta_y = -delta_y; + } else + if ( (y+image->h) > screen->h ) { + y = screen->h-image->h; + delta_y = -delta_y; + } + SDL_BlitSurface(image, NULL, screen, &dst); + } + SDL_UpdateRects(screen, 1, &dst); +} + +int RunGLTest( int argc, char* argv[], + int logo, int slowly, int bpp, float gamma ) +{ + int i; + int rgb_size[3]; + int w = 640; + int h = 480; + int done = 0; + int frames; + Uint32 start_time, this_time; + float color[8][3]= {{ 1.0, 1.0, 0.0}, + { 1.0, 0.0, 0.0}, + { 0.0, 0.0, 0.0}, + { 0.0, 1.0, 0.0}, + { 0.0, 1.0, 1.0}, + { 1.0, 1.0, 1.0}, + { 1.0, 0.0, 1.0}, + { 0.0, 0.0, 1.0}}; + float cube[8][3]= {{ 0.5, 0.5, -0.5}, + { 0.5, -0.5, -0.5}, + {-0.5, -0.5, -0.5}, + {-0.5, 0.5, -0.5}, + {-0.5, 0.5, 0.5}, + { 0.5, 0.5, 0.5}, + { 0.5, -0.5, 0.5}, + {-0.5, -0.5, 0.5}}; + Uint32 video_flags; + int value; + + if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { + fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError()); + exit( 1 ); + } + + /* See if we should detect the display depth */ + if ( bpp == 0 ) { + if ( SDL_GetVideoInfo()->vfmt->BitsPerPixel <= 8 ) { + bpp = 8; + } else { + bpp = 16; /* More doesn't seem to work */ + } + } + + /* Set the flags we want to use for setting the video mode */ + if ( logo ) { + video_flags = SDL_OPENGLBLIT; + } else { + video_flags = SDL_OPENGL; + } + for ( i=1; argv[i]; ++i ) { + if ( strcmp(argv[1], "-fullscreen") == 0 ) { + video_flags |= SDL_FULLSCREEN; + } + } + + /* Initialize the display */ + switch (bpp) { + case 8: + rgb_size[0] = 2; + rgb_size[1] = 3; + rgb_size[2] = 3; + break; + case 15: + case 16: + rgb_size[0] = 5; + rgb_size[1] = 5; + rgb_size[2] = 5; + break; + default: + rgb_size[0] = 8; + rgb_size[1] = 8; + rgb_size[2] = 8; + break; + } + SDL_GL_SetAttribute( SDL_GL_RED_SIZE, rgb_size[0] ); + SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, rgb_size[1] ); + SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, rgb_size[2] ); + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + if ( SDL_SetVideoMode( w, h, bpp, video_flags ) == NULL ) { + fprintf(stderr, "Couldn't set GL mode: %s\n", SDL_GetError()); + SDL_Quit(); + exit(1); + } + + printf("Screen BPP: %d\n", SDL_GetVideoSurface()->format->BitsPerPixel); + printf("\n"); + printf( "Vendor : %s\n", glGetString( GL_VENDOR ) ); + printf( "Renderer : %s\n", glGetString( GL_RENDERER ) ); + printf( "Version : %s\n", glGetString( GL_VERSION ) ); + printf( "Extensions : %s\n", glGetString( GL_EXTENSIONS ) ); + printf("\n"); + + SDL_GL_GetAttribute( SDL_GL_RED_SIZE, &value ); + printf( "SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0],value); + SDL_GL_GetAttribute( SDL_GL_GREEN_SIZE, &value ); + printf( "SDL_GL_GREEN_SIZE: requested %d, got %d\n", rgb_size[1],value); + SDL_GL_GetAttribute( SDL_GL_BLUE_SIZE, &value ); + printf( "SDL_GL_BLUE_SIZE: requested %d, got %d\n", rgb_size[2],value); + SDL_GL_GetAttribute( SDL_GL_DEPTH_SIZE, &value ); + printf( "SDL_GL_DEPTH_SIZE: requested %d, got %d\n", bpp, value ); + SDL_GL_GetAttribute( SDL_GL_DOUBLEBUFFER, &value ); + printf( "SDL_GL_DOUBLEBUFFER: requested 1, got %d\n", value ); + + /* Set the window manager title bar */ + SDL_WM_SetCaption( "SDL GL test", "testgl" ); + + /* Set the gamma for the window */ + if ( gamma != 0.0 ) { + SDL_SetGamma(gamma, gamma, gamma); + } + + glViewport( 0, 0, w, h ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity( ); + + glOrtho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0 ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity( ); + + glEnable(GL_DEPTH_TEST); + + glDepthFunc(GL_LESS); + + glShadeModel(GL_SMOOTH); + + /* Loop until done. */ + start_time = SDL_GetTicks(); + frames = 0; + while( !done ) { + GLenum gl_error; + char* sdl_error; + SDL_Event event; + + /* Do our drawing, too. */ + glClearColor( 0.0, 0.0, 0.0, 1.0 ); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glBegin( GL_QUADS ); + +#ifdef SHADED_CUBE + glColor3fv(color[0]); + glVertex3fv(cube[0]); + glColor3fv(color[1]); + glVertex3fv(cube[1]); + glColor3fv(color[2]); + glVertex3fv(cube[2]); + glColor3fv(color[3]); + glVertex3fv(cube[3]); + + glColor3fv(color[3]); + glVertex3fv(cube[3]); + glColor3fv(color[4]); + glVertex3fv(cube[4]); + glColor3fv(color[7]); + glVertex3fv(cube[7]); + glColor3fv(color[2]); + glVertex3fv(cube[2]); + + glColor3fv(color[0]); + glVertex3fv(cube[0]); + glColor3fv(color[5]); + glVertex3fv(cube[5]); + glColor3fv(color[6]); + glVertex3fv(cube[6]); + glColor3fv(color[1]); + glVertex3fv(cube[1]); + + glColor3fv(color[5]); + glVertex3fv(cube[5]); + glColor3fv(color[4]); + glVertex3fv(cube[4]); + glColor3fv(color[7]); + glVertex3fv(cube[7]); + glColor3fv(color[6]); + glVertex3fv(cube[6]); + + glColor3fv(color[5]); + glVertex3fv(cube[5]); + glColor3fv(color[0]); + glVertex3fv(cube[0]); + glColor3fv(color[3]); + glVertex3fv(cube[3]); + glColor3fv(color[4]); + glVertex3fv(cube[4]); + + glColor3fv(color[6]); + glVertex3fv(cube[6]); + glColor3fv(color[1]); + glVertex3fv(cube[1]); + glColor3fv(color[2]); + glVertex3fv(cube[2]); + glColor3fv(color[7]); + glVertex3fv(cube[7]); +#else // flat cube + glColor3f(1.0, 0.0, 0.0); + glVertex3fv(cube[0]); + glVertex3fv(cube[1]); + glVertex3fv(cube[2]); + glVertex3fv(cube[3]); + + glColor3f(0.0, 1.0, 0.0); + glVertex3fv(cube[3]); + glVertex3fv(cube[4]); + glVertex3fv(cube[7]); + glVertex3fv(cube[2]); + + glColor3f(0.0, 0.0, 1.0); + glVertex3fv(cube[0]); + glVertex3fv(cube[5]); + glVertex3fv(cube[6]); + glVertex3fv(cube[1]); + + glColor3f(0.0, 1.0, 1.0); + glVertex3fv(cube[5]); + glVertex3fv(cube[4]); + glVertex3fv(cube[7]); + glVertex3fv(cube[6]); + + glColor3f(1.0, 1.0, 0.0); + glVertex3fv(cube[5]); + glVertex3fv(cube[0]); + glVertex3fv(cube[3]); + glVertex3fv(cube[4]); + + glColor3f(1.0, 0.0, 1.0); + glVertex3fv(cube[6]); + glVertex3fv(cube[1]); + glVertex3fv(cube[2]); + glVertex3fv(cube[7]); +#endif /* SHADED_CUBE */ + + glEnd( ); + + glMatrixMode(GL_MODELVIEW); + glRotatef(5.0, 1.0, 1.0, 1.0); + + /* Draw 2D logo onto the 3D display */ + if ( logo ) { + DrawSDLLogo(); + } + + SDL_GL_SwapBuffers( ); + + /* Check for error conditions. */ + gl_error = glGetError( ); + + if( gl_error != GL_NO_ERROR ) { + fprintf( stderr, "testgl: OpenGL error: %d\n", gl_error ); + } + + sdl_error = SDL_GetError( ); + + if( sdl_error[0] != '\0' ) { + fprintf(stderr, "testgl: SDL error '%s'\n", sdl_error); + SDL_ClearError(); + } + + /* Allow the user to see what's happening */ + if ( slowly ) { + SDL_Delay( 20 ); + } + + /* Check if there's a pending event. */ + while( SDL_PollEvent( &event ) ) { + done = HandleEvent(&event); + } + ++frames; + } + + /* Print out the frames per second */ + this_time = SDL_GetTicks(); + if ( this_time != start_time ) { + printf("%2.2f FPS\n", + ((float)frames/(this_time-start_time))*1000.0); + } + + /* Destroy our GL context, etc. */ + SDL_Quit( ); + return(0); +} + +int main(int argc, char *argv[]) +{ + int i, logo; + int numtests; + int bpp = 0; + int slowly; + float gamma = 0.0; + + logo = 0; + slowly = 0; + numtests = 1; + for ( i=1; argv[i]; ++i ) { + if ( strcmp(argv[i], "-twice") == 0 ) { + ++numtests; + } + if ( strcmp(argv[i], "-logo") == 0 ) { + logo = 1; + } + if ( strcmp(argv[i], "-slow") == 0 ) { + slowly = 1; + } + if ( strcmp(argv[i], "-bpp") == 0 ) { + bpp = atoi(argv[++i]); + } + if ( strcmp(argv[i], "-gamma") == 0 ) { + gamma = (float)atof(argv[++i]); + } + if ( strncmp(argv[i], "-h", 2) == 0 ) { + printf( +"Usage: %s [-twice] [-logo] [-slow] [-bpp n] [-gamma n]\n", + argv[0]); + exit(0); + } + } + for ( i=0; i<numtests; ++i ) { + RunGLTest(argc, argv, logo, slowly, bpp, gamma); + } + return 0; +} + +#else /* HAVE_OPENGL */ + +int main(int argc, char *argv[]) +{ + printf("No OpenGL support on this system\n"); + return 1; +} + +#endif /* HAVE_OPENGL */