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
15extern void Atlantis_Init ();
16extern void Atlantis_Reshape (int w, int h);
17extern void Atlantis_Animate ();
18extern void Atlantis_Display ();
19
20static SDL_Surface *gScreen;
21
22static 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
44static 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
67static 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
86static void initGL ()
87{
88    Atlantis_Init ();
89    Atlantis_Reshape (gScreen->w, gScreen->h);
90}
91
92static void drawGL ()
93{
94    Atlantis_Animate ();
95    Atlantis_Display ();
96}
97
98static 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
150int 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