Mercurial > sdl-ios-xcode
diff Xcode/TemplatesForXcodeTiger/SDL OpenGL Application/main.c @ 3329:232e5e00e398
Added missing templates
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 29 Sep 2009 07:59:23 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Xcode/TemplatesForXcodeTiger/SDL OpenGL Application/main.c Tue Sep 29 07:59:23 2009 +0000 @@ -0,0 +1,179 @@ + +/* Simple program: Create a blank window, wait for keypress, quit. + + Please see the SDL documentation for details on using the SDL API: + /Developer/Documentation/SDL/docs.html +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include "SDL.h" + +extern void Atlantis_Init (); +extern void Atlantis_Reshape (int w, int h); +extern void Atlantis_Animate (); +extern void Atlantis_Display (); + +static SDL_Surface *gScreen; + +static void initAttributes () +{ + // Setup attributes we want for the OpenGL context + + int value; + + // Don't set color bit sizes (SDL_GL_RED_SIZE, etc) + // Mac OS X will always use 8-8-8-8 ARGB for 32-bit screens and + // 5-5-5 RGB for 16-bit screens + + // Request a 16-bit depth buffer (without this, there is no depth buffer) + value = 16; + SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, value); + + + // Request double-buffered OpenGL + // The fact that windows are double-buffered on Mac OS X has no effect + // on OpenGL double buffering. + value = 1; + SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, value); +} + +static void printAttributes () +{ + // Print out attributes of the context we created + int nAttr; + int i; + + int attr[] = { SDL_GL_RED_SIZE, SDL_GL_BLUE_SIZE, SDL_GL_GREEN_SIZE, + SDL_GL_ALPHA_SIZE, SDL_GL_BUFFER_SIZE, SDL_GL_DEPTH_SIZE }; + + char *desc[] = { "Red size: %d bits\n", "Blue size: %d bits\n", "Green size: %d bits\n", + "Alpha size: %d bits\n", "Color buffer size: %d bits\n", + "Depth bufer size: %d bits\n" }; + + nAttr = sizeof(attr) / sizeof(int); + + for (i = 0; i < nAttr; i++) { + + int value; + SDL_GL_GetAttribute (attr[i], &value); + printf (desc[i], value); + } +} + +static void createSurface (int fullscreen) +{ + Uint32 flags = 0; + + flags = SDL_OPENGL; + if (fullscreen) + flags |= SDL_FULLSCREEN; + + // Create window + gScreen = SDL_SetVideoMode (640, 480, 0, flags); + if (gScreen == NULL) { + + fprintf (stderr, "Couldn't set 640x480 OpenGL video mode: %s\n", + SDL_GetError()); + SDL_Quit(); + exit(2); + } +} + +static void initGL () +{ + Atlantis_Init (); + Atlantis_Reshape (gScreen->w, gScreen->h); +} + +static void drawGL () +{ + Atlantis_Animate (); + Atlantis_Display (); +} + +static void mainLoop () +{ + SDL_Event event; + int done = 0; + int fps = 24; + int delay = 1000/fps; + int thenTicks = -1; + int nowTicks; + + while ( !done ) { + + /* Check for events */ + while ( SDL_PollEvent (&event) ) { + switch (event.type) { + + case SDL_MOUSEMOTION: + break; + case SDL_MOUSEBUTTONDOWN: + break; + case SDL_KEYDOWN: + /* Any keypress quits the app... */ + case SDL_QUIT: + done = 1; + break; + default: + break; + } + } + + // Draw at 24 hz + // This approach is not normally recommended - it is better to + // use time-based animation and run as fast as possible + drawGL (); + SDL_GL_SwapBuffers (); + + // Time how long each draw-swap-delay cycle takes + // and adjust delay to get closer to target framerate + if (thenTicks > 0) { + nowTicks = SDL_GetTicks (); + delay += (1000/fps - (nowTicks-thenTicks)); + thenTicks = nowTicks; + if (delay < 0) + delay = 1000/fps; + } + else { + thenTicks = SDL_GetTicks (); + } + + SDL_Delay (delay); + } +} + +int main(int argc, char *argv[]) +{ + // Init SDL video subsystem + if ( SDL_Init (SDL_INIT_VIDEO) < 0 ) { + + fprintf(stderr, "Couldn't initialize SDL: %s\n", + SDL_GetError()); + exit(1); + } + + // Set GL context attributes + initAttributes (); + + // Create GL context + createSurface (0); + + // Get GL context attributes + printAttributes (); + + // Init GL state + initGL (); + + // Draw, get events... + mainLoop (); + + // Cleanup + SDL_Quit(); + + return 0; +}