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 }
|