Mercurial > sdl-ios-xcode
diff test/testgl.c @ 1662:782fd950bd46 SDL-1.3
Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API.
WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid.
The code is now run through a consistent indent format:
indent -i4 -nut -nsc -br -ce
The headers are being converted to automatically generate doxygen documentation.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 28 May 2006 13:04:16 +0000 |
parents | 14717b52abc0 |
children | 4da1ee79c9af |
line wrap: on
line diff
--- a/test/testgl.c Sun May 21 17:27:13 2006 +0000 +++ b/test/testgl.c Sun May 28 13:04:16 2006 +0000 @@ -25,735 +25,746 @@ /**********************************************************************/ -void HotKey_ToggleFullScreen(void) +void +HotKey_ToggleFullScreen (void) { - SDL_Surface *screen; + 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"); - } + 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) +void +HotKey_ToggleGrab (void) { - SDL_GrabMode mode; + 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"); - } + 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) +void +HotKey_Iconify (void) { - printf("Ctrl-Z: iconifying window!\n"); - SDL_WM_IconifyWindow(); + printf ("Ctrl-Z: iconifying window!\n"); + SDL_WM_IconifyWindow (); } -int HandleEvent(SDL_Event *event) +int +HandleEvent (SDL_Event * event) { - int done; + 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; - + 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); + 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 SDL_GL_Enter2DMode() +void +SDL_GL_Enter2DMode () { - SDL_Surface *screen = SDL_GetVideoSurface(); + SDL_Surface *screen = SDL_GetVideoSurface (); - /* Note, there may be other things you need to change, - depending on how you have your OpenGL state set up. - */ - glPushAttrib(GL_ENABLE_BIT); - glDisable(GL_DEPTH_TEST); - glDisable(GL_CULL_FACE); - glEnable(GL_TEXTURE_2D); + /* Note, there may be other things you need to change, + depending on how you have your OpenGL state set up. + */ + glPushAttrib (GL_ENABLE_BIT); + glDisable (GL_DEPTH_TEST); + glDisable (GL_CULL_FACE); + glEnable (GL_TEXTURE_2D); - /* This allows alpha blending of 2D textures with the scene */ - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + /* This allows alpha blending of 2D textures with the scene */ + glEnable (GL_BLEND); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glViewport(0, 0, screen->w, screen->h); + glViewport (0, 0, screen->w, screen->h); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); + glMatrixMode (GL_PROJECTION); + glPushMatrix (); + glLoadIdentity (); - glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0); + glOrtho (0.0, (GLdouble) screen->w, (GLdouble) screen->h, 0.0, 0.0, 1.0); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); + glMatrixMode (GL_MODELVIEW); + glPushMatrix (); + glLoadIdentity (); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); } -void SDL_GL_Leave2DMode() +void +SDL_GL_Leave2DMode () { - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + glMatrixMode (GL_MODELVIEW); + glPopMatrix (); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); + glMatrixMode (GL_PROJECTION); + glPopMatrix (); - glPopAttrib(); + glPopAttrib (); } /* Quick utility function for texture creation */ -static int power_of_two(int input) +static int +power_of_two (int input) +{ + int value = 1; + + while (value < input) { + value <<= 1; + } + return value; +} + +GLuint +SDL_GL_LoadTexture (SDL_Surface * surface, GLfloat * texcoord) { - int value = 1; + GLuint texture; + int w, h; + SDL_Surface *image; + SDL_Rect area; + Uint32 saved_flags; + Uint8 saved_alpha; + + /* Use the surface width and height expanded to powers of 2 */ + w = power_of_two (surface->w); + h = power_of_two (surface->h); + texcoord[0] = 0.0f; /* Min X */ + texcoord[1] = 0.0f; /* Min Y */ + texcoord[2] = (GLfloat) surface->w / w; /* Max X */ + texcoord[3] = (GLfloat) surface->h / h; /* Max Y */ - while ( value < input ) { - value <<= 1; - } - return value; + image = SDL_CreateRGBSurface (SDL_SWSURFACE, w, h, 32, +#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */ + 0x000000FF, + 0x0000FF00, 0x00FF0000, 0xFF000000 +#else + 0xFF000000, + 0x00FF0000, 0x0000FF00, 0x000000FF +#endif + ); + if (image == NULL) { + return 0; + } + + /* Save the alpha blending attributes */ + saved_flags = surface->flags & (SDL_SRCALPHA | SDL_RLEACCELOK); + saved_alpha = surface->format->alpha; + if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) { + SDL_SetAlpha (surface, 0, 0); + } + + /* Copy the surface into the GL texture image */ + area.x = 0; + area.y = 0; + area.w = surface->w; + area.h = surface->h; + SDL_BlitSurface (surface, &area, image, &area); + + /* Restore the alpha blending attributes */ + if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) { + SDL_SetAlpha (surface, saved_flags, saved_alpha); + } + + /* Create an OpenGL texture for the image */ + glGenTextures (1, &texture); + glBindTexture (GL_TEXTURE_2D, texture); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D (GL_TEXTURE_2D, + 0, + GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); + SDL_FreeSurface (image); /* No longer needed */ + + return texture; } -GLuint SDL_GL_LoadTexture(SDL_Surface *surface, GLfloat *texcoord) +void +DrawLogoCursor (void) { - GLuint texture; - int w, h; - SDL_Surface *image; - SDL_Rect area; - Uint32 saved_flags; - Uint8 saved_alpha; + static GLfloat texMinX, texMinY; + static GLfloat texMaxX, texMaxY; + static int w, h; + int x, y; + + if (!cursor_texture) { + SDL_Surface *image; + GLfloat texcoord[4]; + + /* Load the image (could use SDL_image library here) */ + image = SDL_LoadBMP (LOGO_FILE); + if (image == NULL) { + return; + } + w = image->w; + h = image->h; + + /* Convert the image into an OpenGL texture */ + cursor_texture = SDL_GL_LoadTexture (image, texcoord); + + /* Make texture coordinates easy to understand */ + texMinX = texcoord[0]; + texMinY = texcoord[1]; + texMaxX = texcoord[2]; + texMaxY = texcoord[3]; - /* Use the surface width and height expanded to powers of 2 */ - w = power_of_two(surface->w); - h = power_of_two(surface->h); - texcoord[0] = 0.0f; /* Min X */ - texcoord[1] = 0.0f; /* Min Y */ - texcoord[2] = (GLfloat)surface->w / w; /* Max X */ - texcoord[3] = (GLfloat)surface->h / h; /* Max Y */ + /* We don't need the original image anymore */ + SDL_FreeSurface (image); + + /* Make sure that the texture conversion is okay */ + if (!cursor_texture) { + return; + } + } + + /* Move the image around */ + SDL_GetMouseState (&x, &y); + x -= w / 2; + y -= h / 2; + + /* Show the image on the screen */ + SDL_GL_Enter2DMode (); + glBindTexture (GL_TEXTURE_2D, cursor_texture); + glBegin (GL_TRIANGLE_STRIP); + glTexCoord2f (texMinX, texMinY); + glVertex2i (x, y); + glTexCoord2f (texMaxX, texMinY); + glVertex2i (x + w, y); + glTexCoord2f (texMinX, texMaxY); + glVertex2i (x, y + h); + glTexCoord2f (texMaxX, texMaxY); + glVertex2i (x + w, y + h); + glEnd (); + SDL_GL_Leave2DMode (); +} - image = SDL_CreateRGBSurface( - SDL_SWSURFACE, - w, h, - 32, -#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */ - 0x000000FF, - 0x0000FF00, - 0x00FF0000, - 0xFF000000 -#else - 0xFF000000, - 0x00FF0000, - 0x0000FF00, - 0x000000FF -#endif - ); - if ( image == NULL ) { - return 0; - } +void +DrawLogoTexture (void) +{ + static GLfloat texMinX, texMinY; + static GLfloat texMaxX, texMaxY; + static int x = 0; + static int y = 0; + static int w, h; + static int delta_x = 1; + static int delta_y = 1; + + SDL_Surface *screen = SDL_GetVideoSurface (); + + if (!global_texture) { + SDL_Surface *image; + GLfloat texcoord[4]; - /* Save the alpha blending attributes */ - saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK); - saved_alpha = surface->format->alpha; - if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) { - SDL_SetAlpha(surface, 0, 0); - } + /* Load the image (could use SDL_image library here) */ + image = SDL_LoadBMP (LOGO_FILE); + if (image == NULL) { + return; + } + w = image->w; + h = image->h; + + /* Convert the image into an OpenGL texture */ + global_texture = SDL_GL_LoadTexture (image, texcoord); + + /* Make texture coordinates easy to understand */ + texMinX = texcoord[0]; + texMinY = texcoord[1]; + texMaxX = texcoord[2]; + texMaxY = texcoord[3]; + + /* We don't need the original image anymore */ + SDL_FreeSurface (image); - /* Copy the surface into the GL texture image */ - area.x = 0; - area.y = 0; - area.w = surface->w; - area.h = surface->h; - SDL_BlitSurface(surface, &area, image, &area); - - /* Restore the alpha blending attributes */ - if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) { - SDL_SetAlpha(surface, saved_flags, saved_alpha); - } + /* Make sure that the texture conversion is okay */ + if (!global_texture) { + return; + } + } - /* Create an OpenGL texture for the image */ - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, - 0, - GL_RGBA, - w, h, - 0, - GL_RGBA, - GL_UNSIGNED_BYTE, - image->pixels); - SDL_FreeSurface(image); /* No longer needed */ + /* Move the image around */ + x += delta_x; + if (x < 0) { + x = 0; + delta_x = -delta_x; + } else if ((x + w) > screen->w) { + x = screen->w - w; + delta_x = -delta_x; + } + y += delta_y; + if (y < 0) { + y = 0; + delta_y = -delta_y; + } else if ((y + h) > screen->h) { + y = screen->h - h; + delta_y = -delta_y; + } - return texture; + /* Show the image on the screen */ + SDL_GL_Enter2DMode (); + glBindTexture (GL_TEXTURE_2D, global_texture); + glBegin (GL_TRIANGLE_STRIP); + glTexCoord2f (texMinX, texMinY); + glVertex2i (x, y); + glTexCoord2f (texMaxX, texMinY); + glVertex2i (x + w, y); + glTexCoord2f (texMinX, texMaxY); + glVertex2i (x, y + h); + glTexCoord2f (texMaxX, texMaxY); + glVertex2i (x + w, y + h); + glEnd (); + SDL_GL_Leave2DMode (); } -void DrawLogoCursor(void) +int +RunGLTest (int argc, char *argv[], + int logo, int logocursor, int slowly, int bpp, float gamma, + int noframe, int fsaa, int sync, int accel) { - static GLfloat texMinX, texMinY; - static GLfloat texMaxX, texMaxY; - static int w, h; - int x, y; - - if ( ! cursor_texture ) { - SDL_Surface *image; - GLfloat texcoord[4]; - - /* Load the image (could use SDL_image library here) */ - image = SDL_LoadBMP(LOGO_FILE); - if ( image == NULL ) { - return; - } - w = image->w; - h = image->h; + 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; - /* Convert the image into an OpenGL texture */ - cursor_texture = SDL_GL_LoadTexture(image, texcoord); - - /* Make texture coordinates easy to understand */ - texMinX = texcoord[0]; - texMinY = texcoord[1]; - texMaxX = texcoord[2]; - texMaxY = texcoord[3]; + if (SDL_Init (SDL_INIT_VIDEO) < 0) { + fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ()); + exit (1); + } - /* We don't need the original image anymore */ - SDL_FreeSurface(image); + /* 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 */ + } + } - /* Make sure that the texture conversion is okay */ - if ( ! cursor_texture ) { - return; - } - } + /* Set the flags we want to use for setting the video mode */ + video_flags = SDL_OPENGL; + for (i = 1; argv[i]; ++i) { + if (strcmp (argv[i], "-fullscreen") == 0) { + video_flags |= SDL_FULLSCREEN; + } + } - /* Move the image around */ - SDL_GetMouseState(&x, &y); - x -= w/2; - y -= h/2; + if (noframe) { + video_flags |= SDL_NOFRAME; + } - /* Show the image on the screen */ - SDL_GL_Enter2DMode(); - glBindTexture(GL_TEXTURE_2D, cursor_texture); - glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(texMinX, texMinY); glVertex2i(x, y ); - glTexCoord2f(texMaxX, texMinY); glVertex2i(x+w, y ); - glTexCoord2f(texMinX, texMaxY); glVertex2i(x, y+h); - glTexCoord2f(texMaxX, texMaxY); glVertex2i(x+w, y+h); - glEnd(); - SDL_GL_Leave2DMode(); -} - -void DrawLogoTexture(void) -{ - static GLfloat texMinX, texMinY; - static GLfloat texMaxX, texMaxY; - static int x = 0; - static int y = 0; - static int w, h; - static int delta_x = 1; - static int delta_y = 1; - - SDL_Surface *screen = SDL_GetVideoSurface(); + /* Initialize the display */ + switch (bpp) { + case 8: + rgb_size[0] = 3; + rgb_size[1] = 3; + rgb_size[2] = 2; + 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 (fsaa) { + SDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS, 1); + SDL_GL_SetAttribute (SDL_GL_MULTISAMPLESAMPLES, fsaa); + } + if (accel) { + SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1); + } + if (sync) { + SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); + } else { + SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 0); + } + if (SDL_SetVideoMode (w, h, bpp, video_flags) == NULL) { + fprintf (stderr, "Couldn't set GL mode: %s\n", SDL_GetError ()); + SDL_Quit (); + exit (1); + } - if ( ! global_texture ) { - SDL_Surface *image; - GLfloat texcoord[4]; - - /* Load the image (could use SDL_image library here) */ - image = SDL_LoadBMP(LOGO_FILE); - if ( image == NULL ) { - return; - } - w = image->w; - h = image->h; + 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"); - /* Convert the image into an OpenGL texture */ - global_texture = SDL_GL_LoadTexture(image, texcoord); + 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); + if (fsaa) { + SDL_GL_GetAttribute (SDL_GL_MULTISAMPLEBUFFERS, &value); + printf ("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value); + SDL_GL_GetAttribute (SDL_GL_MULTISAMPLESAMPLES, &value); + printf ("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa, + value); + } + if (accel) { + SDL_GL_GetAttribute (SDL_GL_ACCELERATED_VISUAL, &value); + printf ("SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value); + } + if (sync) { + SDL_GL_GetAttribute (SDL_GL_SWAP_CONTROL, &value); + printf ("SDL_GL_SWAP_CONTROL: requested 1, got %d\n", value); + } - /* Make texture coordinates easy to understand */ - texMinX = texcoord[0]; - texMinY = texcoord[1]; - texMaxX = texcoord[2]; - texMaxY = texcoord[3]; - - /* We don't need the original image anymore */ - SDL_FreeSurface(image); + /* Set the window manager title bar */ + SDL_WM_SetCaption ("SDL GL test", "testgl"); - /* Make sure that the texture conversion is okay */ - if ( ! global_texture ) { - return; - } - } + /* 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; - /* Move the image around */ - x += delta_x; - if ( x < 0 ) { - x = 0; - delta_x = -delta_x; - } else - if ( (x+w) > screen->w ) { - x = screen->w-w; - delta_x = -delta_x; - } - y += delta_y; - if ( y < 0 ) { - y = 0; - delta_y = -delta_y; - } else - if ( (y+h) > screen->h ) { - y = screen->h-h; - delta_y = -delta_y; - } + /* 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]); - /* Show the image on the screen */ - SDL_GL_Enter2DMode(); - glBindTexture(GL_TEXTURE_2D, global_texture); - glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(texMinX, texMinY); glVertex2i(x, y ); - glTexCoord2f(texMaxX, texMinY); glVertex2i(x+w, y ); - glTexCoord2f(texMinX, texMaxY); glVertex2i(x, y+h); - glTexCoord2f(texMaxX, texMaxY); glVertex2i(x+w, y+h); - glEnd(); - SDL_GL_Leave2DMode(); -} + 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]); -int RunGLTest( int argc, char* argv[], - int logo, int logocursor, int slowly, int bpp, float gamma, int noframe, int fsaa, int sync, int accel ) -{ - 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; + 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]); - if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { - fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError()); - exit( 1 ); - } + 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]); - /* 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 */ - } - } + glColor3f (1.0, 1.0, 0.0); + glVertex3fv (cube[5]); + glVertex3fv (cube[0]); + glVertex3fv (cube[3]); + glVertex3fv (cube[4]); - /* Set the flags we want to use for setting the video mode */ - video_flags = SDL_OPENGL; - for ( i=1; argv[i]; ++i ) { - if ( strcmp(argv[i], "-fullscreen") == 0 ) { - video_flags |= SDL_FULLSCREEN; - } - } + glColor3f (1.0, 0.0, 1.0); + glVertex3fv (cube[6]); + glVertex3fv (cube[1]); + glVertex3fv (cube[2]); + glVertex3fv (cube[7]); +#endif /* SHADED_CUBE */ + + glEnd (); - if (noframe) { - video_flags |= SDL_NOFRAME; + glMatrixMode (GL_MODELVIEW); + glRotatef (5.0, 1.0, 1.0, 1.0); + + /* Draw 2D logo onto the 3D display */ + if (logo) { + DrawLogoTexture (); + } + if (logocursor) { + DrawLogoCursor (); } - /* Initialize the display */ - switch (bpp) { - case 8: - rgb_size[0] = 3; - rgb_size[1] = 3; - rgb_size[2] = 2; - 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 ( fsaa ) { - SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 ); - SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, fsaa ); - } - if ( accel ) { - SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 ); - } - if ( sync ) { - SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 1 ); - } else { - SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 0 ); - } - if ( SDL_SetVideoMode( w, h, bpp, video_flags ) == NULL ) { - fprintf(stderr, "Couldn't set GL mode: %s\n", SDL_GetError()); - SDL_Quit(); - exit(1); - } + SDL_GL_SwapBuffers (); - 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"); + /* Check for error conditions. */ + gl_error = glGetError (); + + if (gl_error != GL_NO_ERROR) { + fprintf (stderr, "testgl: OpenGL error: %d\n", gl_error); + } - 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 ); - if ( fsaa ) { - SDL_GL_GetAttribute( SDL_GL_MULTISAMPLEBUFFERS, &value ); - printf("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value ); - SDL_GL_GetAttribute( SDL_GL_MULTISAMPLESAMPLES, &value ); - printf("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa, value ); - } - if ( accel ) { - SDL_GL_GetAttribute( SDL_GL_ACCELERATED_VISUAL, &value ); - printf( "SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value ); - } - if ( sync ) { - SDL_GL_GetAttribute( SDL_GL_SWAP_CONTROL, &value ); - printf( "SDL_GL_SWAP_CONTROL: requested 1, got %d\n", value ); - } - - /* Set the window manager title bar */ - SDL_WM_SetCaption( "SDL GL test", "testgl" ); + sdl_error = SDL_GetError (); - /* 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); + if (sdl_error[0] != '\0') { + fprintf (stderr, "testgl: SDL error '%s'\n", sdl_error); + SDL_ClearError (); + } - 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 ); + /* Allow the user to see what's happening */ + if (slowly) { + SDL_Delay (20); + } -#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]); + /* Check if there's a pending event. */ + while (SDL_PollEvent (&event)) { + done = HandleEvent (&event); + } + ++frames; + } - glColor3fv(color[5]); - glVertex3fv(cube[5]); - glColor3fv(color[0]); - glVertex3fv(cube[0]); - glColor3fv(color[3]); - glVertex3fv(cube[3]); - glColor3fv(color[4]); - glVertex3fv(cube[4]); + /* 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); + } - 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); + if (global_image) { + SDL_FreeSurface (global_image); + global_image = NULL; + } + if (global_texture) { + glDeleteTextures (1, &global_texture); + global_texture = 0; + } + if (cursor_texture) { + glDeleteTextures (1, &cursor_texture); + cursor_texture = 0; + } - /* Draw 2D logo onto the 3D display */ - if ( logo ) { - DrawLogoTexture(); - } - if ( logocursor ) { - DrawLogoCursor(); - } - - 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); - } - - if ( global_image ) { - SDL_FreeSurface(global_image); - global_image = NULL; - } - if ( global_texture ) { - glDeleteTextures( 1, &global_texture ); - global_texture = 0; - } - if ( cursor_texture ) { - glDeleteTextures( 1, &cursor_texture ); - cursor_texture = 0; - } - - /* Destroy our GL context, etc. */ - SDL_Quit( ); - return(0); + /* Destroy our GL context, etc. */ + SDL_Quit (); + return (0); } -int main(int argc, char *argv[]) +int +main (int argc, char *argv[]) { - int i, logo, logocursor = 0; - int numtests; - int bpp = 0; - int slowly; - float gamma = 0.0; - int noframe = 0; - int fsaa = 0; - int accel = 0; - int sync = 0; + int i, logo, logocursor = 0; + int numtests; + int bpp = 0; + int slowly; + float gamma = 0.0; + int noframe = 0; + int fsaa = 0; + int accel = 0; + int sync = 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], "-logocursor") == 0 ) { - logocursor = 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 ( strcmp(argv[i], "-noframe") == 0 ) { - noframe = 1; - } - if ( strcmp(argv[i], "-fsaa") == 0 ) { - ++fsaa; - } - if ( strcmp(argv[i], "-accel") == 0 ) { - ++accel; - } - if ( strcmp(argv[i], "-sync") == 0 ) { - ++sync; - } - if ( strncmp(argv[i], "-h", 2) == 0 ) { - printf( -"Usage: %s [-twice] [-logo] [-logocursor] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa] [-fullscreen]\n", - argv[0]); - exit(0); - } - } - for ( i=0; i<numtests; ++i ) { - RunGLTest(argc, argv, logo, logocursor, slowly, bpp, gamma, noframe, fsaa, sync, accel); - } - return 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], "-logocursor") == 0) { + logocursor = 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 (strcmp (argv[i], "-noframe") == 0) { + noframe = 1; + } + if (strcmp (argv[i], "-fsaa") == 0) { + ++fsaa; + } + if (strcmp (argv[i], "-accel") == 0) { + ++accel; + } + if (strcmp (argv[i], "-sync") == 0) { + ++sync; + } + if (strncmp (argv[i], "-h", 2) == 0) { + printf + ("Usage: %s [-twice] [-logo] [-logocursor] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa] [-fullscreen]\n", + argv[0]); + exit (0); + } + } + for (i = 0; i < numtests; ++i) { + RunGLTest (argc, argv, logo, logocursor, slowly, bpp, gamma, + noframe, fsaa, sync, accel); + } + return 0; } #else /* HAVE_OPENGL */ -int main(int argc, char *argv[]) +int +main (int argc, char *argv[]) { - printf("No OpenGL support on this system\n"); - return 1; + printf ("No OpenGL support on this system\n"); + return 1; } #endif /* HAVE_OPENGL */