3331
+ − 1
+ − 2 /* Simple program: Create a blank window, wait for keypress, quit.
+ − 3
+ − 4 Please see the SDL documentation for details on using the SDL API:
+ − 5 /Developer/Documentation/SDL/docs.html
+ − 6 */
+ − 7
+ − 8 #include <stdio.h>
+ − 9 #include <stdlib.h>
+ − 10 #include <string.h>
+ − 11 #include <math.h>
+ − 12
+ − 13 #include "SDL.h"
+ − 14
+ − 15 extern void Atlantis_Init ();
+ − 16 extern void Atlantis_Reshape (int w, int h);
+ − 17 extern void Atlantis_Animate ();
+ − 18 extern void Atlantis_Display ();
+ − 19
+ − 20 static SDL_Surface *gScreen;
+ − 21
+ − 22 static void initAttributes ()
+ − 23 {
+ − 24 // Setup attributes we want for the OpenGL context
+ − 25
+ − 26 int value;
+ − 27
+ − 28 // Don't set color bit sizes (SDL_GL_RED_SIZE, etc)
+ − 29 // Mac OS X will always use 8-8-8-8 ARGB for 32-bit screens and
+ − 30 // 5-5-5 RGB for 16-bit screens
+ − 31
+ − 32 // Request a 16-bit depth buffer (without this, there is no depth buffer)
+ − 33 value = 16;
+ − 34 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, value);
+ − 35
+ − 36
+ − 37 // Request double-buffered OpenGL
+ − 38 // The fact that windows are double-buffered on Mac OS X has no effect
+ − 39 // on OpenGL double buffering.
+ − 40 value = 1;
+ − 41 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, value);
+ − 42 }
+ − 43
+ − 44 static void printAttributes ()
+ − 45 {
+ − 46 // Print out attributes of the context we created
+ − 47 int nAttr;
+ − 48 int i;
+ − 49
+ − 50 int attr[] = { SDL_GL_RED_SIZE, SDL_GL_BLUE_SIZE, SDL_GL_GREEN_SIZE,
+ − 51 SDL_GL_ALPHA_SIZE, SDL_GL_BUFFER_SIZE, SDL_GL_DEPTH_SIZE };
+ − 52
+ − 53 char *desc[] = { "Red size: %d bits\n", "Blue size: %d bits\n", "Green size: %d bits\n",
+ − 54 "Alpha size: %d bits\n", "Color buffer size: %d bits\n",
+ − 55 "Depth bufer size: %d bits\n" };
+ − 56
+ − 57 nAttr = sizeof(attr) / sizeof(int);
+ − 58
+ − 59 for (i = 0; i < nAttr; i++) {
+ − 60
+ − 61 int value;
+ − 62 SDL_GL_GetAttribute (attr[i], &value);
+ − 63 printf (desc[i], value);
+ − 64 }
+ − 65 }
+ − 66
+ − 67 static void createSurface (int fullscreen)
+ − 68 {
+ − 69 Uint32 flags = 0;
+ − 70
+ − 71 flags = SDL_OPENGL;
+ − 72 if (fullscreen)
+ − 73 flags |= SDL_FULLSCREEN;
+ − 74
+ − 75 // Create window
+ − 76 gScreen = SDL_SetVideoMode (640, 480, 0, flags);
+ − 77 if (gScreen == NULL) {
+ − 78
+ − 79 fprintf (stderr, "Couldn't set 640x480 OpenGL video mode: %s\n",
+ − 80 SDL_GetError());
+ − 81 SDL_Quit();
+ − 82 exit(2);
+ − 83 }
+ − 84 }
+ − 85
+ − 86 static void initGL ()
+ − 87 {
+ − 88 Atlantis_Init ();
+ − 89 Atlantis_Reshape (gScreen->w, gScreen->h);
+ − 90 }
+ − 91
+ − 92 static void drawGL ()
+ − 93 {
+ − 94 Atlantis_Animate ();
+ − 95 Atlantis_Display ();
+ − 96 }
+ − 97
+ − 98 static void mainLoop ()
+ − 99 {
+ − 100 SDL_Event event;
+ − 101 int done = 0;
+ − 102 int fps = 24;
+ − 103 int delay = 1000/fps;
+ − 104 int thenTicks = -1;
+ − 105 int nowTicks;
+ − 106
+ − 107 while ( !done ) {
+ − 108
+ − 109 /* Check for events */
+ − 110 while ( SDL_PollEvent (&event) ) {
+ − 111 switch (event.type) {
+ − 112
+ − 113 case SDL_MOUSEMOTION:
+ − 114 break;
+ − 115 case SDL_MOUSEBUTTONDOWN:
+ − 116 break;
+ − 117 case SDL_KEYDOWN:
+ − 118 /* Any keypress quits the app... */
+ − 119 case SDL_QUIT:
+ − 120 done = 1;
+ − 121 break;
+ − 122 default:
+ − 123 break;
+ − 124 }
+ − 125 }
+ − 126
+ − 127 // Draw at 24 hz
+ − 128 // This approach is not normally recommended - it is better to
+ − 129 // use time-based animation and run as fast as possible
+ − 130 drawGL ();
+ − 131 SDL_GL_SwapBuffers ();
+ − 132
+ − 133 // Time how long each draw-swap-delay cycle takes
+ − 134 // and adjust delay to get closer to target framerate
+ − 135 if (thenTicks > 0) {
+ − 136 nowTicks = SDL_GetTicks ();
+ − 137 delay += (1000/fps - (nowTicks-thenTicks));
+ − 138 thenTicks = nowTicks;
+ − 139 if (delay < 0)
+ − 140 delay = 1000/fps;
+ − 141 }
+ − 142 else {
+ − 143 thenTicks = SDL_GetTicks ();
+ − 144 }
+ − 145
+ − 146 SDL_Delay (delay);
+ − 147 }
+ − 148 }
+ − 149
+ − 150 int main(int argc, char *argv[])
+ − 151 {
+ − 152 // Init SDL video subsystem
+ − 153 if ( SDL_Init (SDL_INIT_VIDEO) < 0 ) {
+ − 154
+ − 155 fprintf(stderr, "Couldn't initialize SDL: %s\n",
+ − 156 SDL_GetError());
+ − 157 exit(1);
+ − 158 }
+ − 159
+ − 160 // Set GL context attributes
+ − 161 initAttributes ();
+ − 162
+ − 163 // Create GL context
+ − 164 createSurface (0);
+ − 165
+ − 166 // Get GL context attributes
+ − 167 printAttributes ();
+ − 168
+ − 169 // Init GL state
+ − 170 initGL ();
+ − 171
+ − 172 // Draw, get events...
+ − 173 mainLoop ();
+ − 174
+ − 175 // Cleanup
+ − 176 SDL_Quit();
+ − 177
+ − 178 return 0;
+ − 179 }