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
initAttributes()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
printAttributes()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
createSurface(int fullscreen)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
initGL()86 static void initGL ()
87 {
88 Atlantis_Init ();
89 Atlantis_Reshape (gScreen->w, gScreen->h);
90 }
91
drawGL()92 static void drawGL ()
93 {
94 Atlantis_Animate ();
95 Atlantis_Display ();
96 }
97
mainLoop()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
main(int argc,char * argv[])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 }
180