comparison Xcode/TemplatesForXcodeTiger/SDL OpenGL Application/main.c @ 3331:d44a0a913aa2

Eric Wing to Sam Lots of fixes. Fixed missing power management building. Added template icons to the project templates. DocSet stuff Documentation fixes.. Fixed all the SDLtests. (Lots of tedious work.) It now depends on the static library target for convenience so I am not going to remove it from the SDL xcode project.
author Sam Lantinga <slouken@libsdl.org>
date Thu, 01 Oct 2009 15:30:26 +0000
parents 232e5e00e398
children
comparison
equal deleted inserted replaced
3330:e15bcb04c9b4 3331:d44a0a913aa2
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 }