Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
770 lines (665 loc) · 19.6 KB

testgl.c

File metadata and controls

770 lines (665 loc) · 19.6 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
3
4
5
6
7
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "SDL.h"
May 17, 2006
May 17, 2006
8
9
10
11
#ifdef __MACOS__
#define HAVE_OPENGL
#endif
Apr 26, 2001
Apr 26, 2001
12
#ifdef HAVE_OPENGL
Nov 6, 2001
Nov 6, 2001
13
Oct 25, 2001
Oct 25, 2001
14
#include "SDL_opengl.h"
Apr 26, 2001
Apr 26, 2001
15
Nov 6, 2001
Nov 6, 2001
16
/* Undefine this if you want a flat cube instead of a rainbow cube */
Apr 26, 2001
Apr 26, 2001
17
18
#define SHADED_CUBE
Nov 6, 2001
Nov 6, 2001
19
20
21
/* Define this to be the name of the logo image to use with -logo */
#define LOGO_FILE "icon.bmp"
Sep 16, 2002
Sep 16, 2002
22
23
static SDL_Surface *global_image = NULL;
static GLuint global_texture = 0;
Aug 20, 2004
Aug 20, 2004
24
static GLuint cursor_texture = 0;
Sep 16, 2002
Sep 16, 2002
25
Nov 6, 2001
Nov 6, 2001
26
27
/**********************************************************************/
May 28, 2006
May 28, 2006
28
void
May 29, 2006
May 29, 2006
29
HotKey_ToggleFullScreen(void)
Apr 26, 2001
Apr 26, 2001
30
{
May 28, 2006
May 28, 2006
31
32
SDL_Surface *screen;
May 29, 2006
May 29, 2006
33
34
35
36
screen = SDL_GetVideoSurface();
if (SDL_WM_ToggleFullScreen(screen)) {
printf("Toggled fullscreen mode - now %s\n",
(screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
May 28, 2006
May 28, 2006
37
} else {
May 29, 2006
May 29, 2006
38
printf("Unable to toggle fullscreen mode\n");
May 28, 2006
May 28, 2006
39
}
Apr 26, 2001
Apr 26, 2001
40
41
}
May 28, 2006
May 28, 2006
42
void
May 29, 2006
May 29, 2006
43
HotKey_ToggleGrab(void)
Apr 26, 2001
Apr 26, 2001
44
{
May 28, 2006
May 28, 2006
45
46
SDL_GrabMode mode;
May 29, 2006
May 29, 2006
47
48
printf("Ctrl-G: toggling input grab!\n");
mode = SDL_WM_GrabInput(SDL_GRAB_QUERY);
May 28, 2006
May 28, 2006
49
if (mode == SDL_GRAB_ON) {
May 29, 2006
May 29, 2006
50
printf("Grab was on\n");
May 28, 2006
May 28, 2006
51
} else {
May 29, 2006
May 29, 2006
52
printf("Grab was off\n");
May 28, 2006
May 28, 2006
53
}
May 29, 2006
May 29, 2006
54
mode = SDL_WM_GrabInput(!mode);
May 28, 2006
May 28, 2006
55
if (mode == SDL_GRAB_ON) {
May 29, 2006
May 29, 2006
56
printf("Grab is now on\n");
May 28, 2006
May 28, 2006
57
} else {
May 29, 2006
May 29, 2006
58
printf("Grab is now off\n");
May 28, 2006
May 28, 2006
59
}
Apr 26, 2001
Apr 26, 2001
60
61
}
May 28, 2006
May 28, 2006
62
void
May 29, 2006
May 29, 2006
63
HotKey_Iconify(void)
Apr 26, 2001
Apr 26, 2001
64
{
May 29, 2006
May 29, 2006
65
66
printf("Ctrl-Z: iconifying window!\n");
SDL_WM_IconifyWindow();
Apr 26, 2001
Apr 26, 2001
67
68
}
May 28, 2006
May 28, 2006
69
int
May 29, 2006
May 29, 2006
70
HandleEvent(SDL_Event * event)
Apr 26, 2001
Apr 26, 2001
71
{
May 28, 2006
May 28, 2006
72
73
74
75
76
77
int done;
done = 0;
switch (event->type) {
case SDL_ACTIVEEVENT:
/* See what happened */
May 29, 2006
May 29, 2006
78
printf("app %s ", event->active.gain ? "gained" : "lost");
May 28, 2006
May 28, 2006
79
if (event->active.state & SDL_APPACTIVE) {
May 29, 2006
May 29, 2006
80
printf("active ");
May 28, 2006
May 28, 2006
81
} else if (event->active.state & SDL_APPMOUSEFOCUS) {
May 29, 2006
May 29, 2006
82
printf("mouse ");
May 28, 2006
May 28, 2006
83
} else if (event->active.state & SDL_APPINPUTFOCUS) {
May 29, 2006
May 29, 2006
84
printf("input ");
May 28, 2006
May 28, 2006
85
}
May 29, 2006
May 29, 2006
86
printf("focus\n");
May 28, 2006
May 28, 2006
87
88
89
90
91
92
93
94
95
break;
case SDL_KEYDOWN:
if (event->key.keysym.sym == SDLK_ESCAPE) {
done = 1;
}
if ((event->key.keysym.sym == SDLK_g) &&
(event->key.keysym.mod & KMOD_CTRL)) {
May 29, 2006
May 29, 2006
96
HotKey_ToggleGrab();
May 28, 2006
May 28, 2006
97
98
99
}
if ((event->key.keysym.sym == SDLK_z) &&
(event->key.keysym.mod & KMOD_CTRL)) {
May 29, 2006
May 29, 2006
100
HotKey_Iconify();
May 28, 2006
May 28, 2006
101
102
103
}
if ((event->key.keysym.sym == SDLK_RETURN) &&
(event->key.keysym.mod & KMOD_ALT)) {
May 29, 2006
May 29, 2006
104
HotKey_ToggleFullScreen();
May 28, 2006
May 28, 2006
105
}
May 29, 2006
May 29, 2006
106
printf("key '%s' pressed\n", SDL_GetKeyName(event->key.keysym.sym));
May 28, 2006
May 28, 2006
107
108
109
110
111
112
break;
case SDL_QUIT:
done = 1;
break;
}
return (done);
Apr 26, 2001
Apr 26, 2001
113
114
}
May 28, 2006
May 28, 2006
115
void
May 29, 2006
May 29, 2006
116
SDL_GL_Enter2DMode()
Nov 6, 2001
Nov 6, 2001
117
{
May 29, 2006
May 29, 2006
118
SDL_Surface *screen = SDL_GetVideoSurface();
Nov 6, 2001
Nov 6, 2001
119
May 28, 2006
May 28, 2006
120
121
122
/* Note, there may be other things you need to change,
depending on how you have your OpenGL state set up.
*/
May 29, 2006
May 29, 2006
123
124
125
126
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glEnable(GL_TEXTURE_2D);
Nov 6, 2001
Nov 6, 2001
127
May 28, 2006
May 28, 2006
128
/* This allows alpha blending of 2D textures with the scene */
May 29, 2006
May 29, 2006
129
130
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Nov 22, 2001
Nov 22, 2001
131
May 29, 2006
May 29, 2006
132
glViewport(0, 0, screen->w, screen->h);
Nov 6, 2001
Nov 6, 2001
133
May 29, 2006
May 29, 2006
134
135
136
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
Nov 6, 2001
Nov 6, 2001
137
May 29, 2006
May 29, 2006
138
glOrtho(0.0, (GLdouble) screen->w, (GLdouble) screen->h, 0.0, 0.0, 1.0);
Nov 6, 2001
Nov 6, 2001
139
May 29, 2006
May 29, 2006
140
141
142
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
Nov 6, 2001
Nov 6, 2001
143
May 29, 2006
May 29, 2006
144
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
Nov 6, 2001
Nov 6, 2001
145
146
}
May 28, 2006
May 28, 2006
147
void
May 29, 2006
May 29, 2006
148
SDL_GL_Leave2DMode()
Nov 6, 2001
Nov 6, 2001
149
{
May 29, 2006
May 29, 2006
150
151
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
Nov 6, 2001
Nov 6, 2001
152
May 29, 2006
May 29, 2006
153
154
glMatrixMode(GL_PROJECTION);
glPopMatrix();
Nov 6, 2001
Nov 6, 2001
155
May 29, 2006
May 29, 2006
156
glPopAttrib();
Nov 6, 2001
Nov 6, 2001
157
158
}
Nov 6, 2001
Nov 6, 2001
159
/* Quick utility function for texture creation */
May 28, 2006
May 28, 2006
160
static int
May 29, 2006
May 29, 2006
161
power_of_two(int input)
Nov 6, 2001
Nov 6, 2001
162
{
May 28, 2006
May 28, 2006
163
int value = 1;
Nov 6, 2001
Nov 6, 2001
164
May 28, 2006
May 28, 2006
165
166
167
168
while (value < input) {
value <<= 1;
}
return value;
Nov 6, 2001
Nov 6, 2001
169
170
}
May 28, 2006
May 28, 2006
171
GLuint
May 29, 2006
May 29, 2006
172
SDL_GL_LoadTexture(SDL_Surface * surface, GLfloat * texcoord)
Nov 6, 2001
Nov 6, 2001
173
{
May 28, 2006
May 28, 2006
174
175
176
177
178
179
180
181
GLuint texture;
int w, h;
SDL_Surface *image;
SDL_Rect area;
Uint32 saved_flags;
Uint8 saved_alpha;
/* Use the surface width and height expanded to powers of 2 */
May 29, 2006
May 29, 2006
182
183
w = power_of_two(surface->w);
h = power_of_two(surface->h);
May 28, 2006
May 28, 2006
184
185
186
187
188
texcoord[0] = 0.0f; /* Min X */
texcoord[1] = 0.0f; /* Min Y */
texcoord[2] = (GLfloat) surface->w / w; /* Max X */
texcoord[3] = (GLfloat) surface->h / h; /* Max Y */
May 29, 2006
May 29, 2006
189
image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32,
May 28, 2006
May 28, 2006
190
#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
May 29, 2006
May 29, 2006
191
192
0x000000FF,
0x0000FF00, 0x00FF0000, 0xFF000000
Nov 6, 2001
Nov 6, 2001
193
#else
May 29, 2006
May 29, 2006
194
195
0xFF000000,
0x00FF0000, 0x0000FF00, 0x000000FF
Nov 6, 2001
Nov 6, 2001
196
#endif
May 28, 2006
May 28, 2006
197
198
199
200
201
202
203
204
205
);
if (image == NULL) {
return 0;
}
/* Save the alpha blending attributes */
saved_flags = surface->flags & (SDL_SRCALPHA | SDL_RLEACCELOK);
saved_alpha = surface->format->alpha;
if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) {
May 29, 2006
May 29, 2006
206
SDL_SetAlpha(surface, 0, 0);
May 28, 2006
May 28, 2006
207
208
209
210
211
212
213
}
/* Copy the surface into the GL texture image */
area.x = 0;
area.y = 0;
area.w = surface->w;
area.h = surface->h;
May 29, 2006
May 29, 2006
214
SDL_BlitSurface(surface, &area, image, &area);
May 28, 2006
May 28, 2006
215
216
217
/* Restore the alpha blending attributes */
if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) {
May 29, 2006
May 29, 2006
218
SDL_SetAlpha(surface, saved_flags, saved_alpha);
May 28, 2006
May 28, 2006
219
220
221
}
/* Create an OpenGL texture for the image */
May 29, 2006
May 29, 2006
222
223
224
225
226
227
228
229
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
SDL_FreeSurface(image); /* No longer needed */
May 28, 2006
May 28, 2006
230
231
return texture;
Nov 6, 2001
Nov 6, 2001
232
233
}
May 28, 2006
May 28, 2006
234
void
May 29, 2006
May 29, 2006
235
DrawLogoCursor(void)
Aug 20, 2004
Aug 20, 2004
236
{
May 28, 2006
May 28, 2006
237
238
239
240
241
242
243
244
245
246
static GLfloat texMinX, texMinY;
static GLfloat texMaxX, texMaxY;
static int w, h;
int x, y;
if (!cursor_texture) {
SDL_Surface *image;
GLfloat texcoord[4];
/* Load the image (could use SDL_image library here) */
May 29, 2006
May 29, 2006
247
image = SDL_LoadBMP(LOGO_FILE);
May 28, 2006
May 28, 2006
248
249
250
251
252
253
254
if (image == NULL) {
return;
}
w = image->w;
h = image->h;
/* Convert the image into an OpenGL texture */
May 29, 2006
May 29, 2006
255
cursor_texture = SDL_GL_LoadTexture(image, texcoord);
May 28, 2006
May 28, 2006
256
257
258
259
260
261
262
263
/* Make texture coordinates easy to understand */
texMinX = texcoord[0];
texMinY = texcoord[1];
texMaxX = texcoord[2];
texMaxY = texcoord[3];
/* We don't need the original image anymore */
May 29, 2006
May 29, 2006
264
SDL_FreeSurface(image);
May 28, 2006
May 28, 2006
265
266
267
268
269
270
271
272
/* Make sure that the texture conversion is okay */
if (!cursor_texture) {
return;
}
}
/* Move the image around */
May 29, 2006
May 29, 2006
273
SDL_GetMouseState(&x, &y);
May 28, 2006
May 28, 2006
274
275
276
277
x -= w / 2;
y -= h / 2;
/* Show the image on the screen */
May 29, 2006
May 29, 2006
278
279
280
281
282
283
284
285
286
287
288
289
290
SDL_GL_Enter2DMode();
glBindTexture(GL_TEXTURE_2D, cursor_texture);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(texMinX, texMinY);
glVertex2i(x, y);
glTexCoord2f(texMaxX, texMinY);
glVertex2i(x + w, y);
glTexCoord2f(texMinX, texMaxY);
glVertex2i(x, y + h);
glTexCoord2f(texMaxX, texMaxY);
glVertex2i(x + w, y + h);
glEnd();
SDL_GL_Leave2DMode();
Aug 20, 2004
Aug 20, 2004
291
}
Sep 16, 2002
Sep 16, 2002
292
May 28, 2006
May 28, 2006
293
void
May 29, 2006
May 29, 2006
294
DrawLogoTexture(void)
Nov 6, 2001
Nov 6, 2001
295
{
May 28, 2006
May 28, 2006
296
297
298
299
300
301
302
303
static GLfloat texMinX, texMinY;
static GLfloat texMaxX, texMaxY;
static int x = 0;
static int y = 0;
static int w, h;
static int delta_x = 1;
static int delta_y = 1;
May 29, 2006
May 29, 2006
304
SDL_Surface *screen = SDL_GetVideoSurface();
May 28, 2006
May 28, 2006
305
306
307
308
309
310
if (!global_texture) {
SDL_Surface *image;
GLfloat texcoord[4];
/* Load the image (could use SDL_image library here) */
May 29, 2006
May 29, 2006
311
image = SDL_LoadBMP(LOGO_FILE);
May 28, 2006
May 28, 2006
312
313
314
315
316
317
318
if (image == NULL) {
return;
}
w = image->w;
h = image->h;
/* Convert the image into an OpenGL texture */
May 29, 2006
May 29, 2006
319
global_texture = SDL_GL_LoadTexture(image, texcoord);
May 28, 2006
May 28, 2006
320
321
322
323
324
325
326
327
/* Make texture coordinates easy to understand */
texMinX = texcoord[0];
texMinY = texcoord[1];
texMaxX = texcoord[2];
texMaxY = texcoord[3];
/* We don't need the original image anymore */
May 29, 2006
May 29, 2006
328
SDL_FreeSurface(image);
May 28, 2006
May 28, 2006
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
/* Make sure that the texture conversion is okay */
if (!global_texture) {
return;
}
}
/* Move the image around */
x += delta_x;
if (x < 0) {
x = 0;
delta_x = -delta_x;
} else if ((x + w) > screen->w) {
x = screen->w - w;
delta_x = -delta_x;
}
y += delta_y;
if (y < 0) {
y = 0;
delta_y = -delta_y;
} else if ((y + h) > screen->h) {
y = screen->h - h;
delta_y = -delta_y;
}
/* Show the image on the screen */
May 29, 2006
May 29, 2006
355
356
357
358
359
360
361
362
363
364
365
366
367
SDL_GL_Enter2DMode();
glBindTexture(GL_TEXTURE_2D, global_texture);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(texMinX, texMinY);
glVertex2i(x, y);
glTexCoord2f(texMaxX, texMinY);
glVertex2i(x + w, y);
glTexCoord2f(texMinX, texMaxY);
glVertex2i(x, y + h);
glTexCoord2f(texMaxX, texMaxY);
glVertex2i(x + w, y + h);
glEnd();
SDL_GL_Leave2DMode();
Nov 6, 2001
Nov 6, 2001
368
369
}
May 28, 2006
May 28, 2006
370
int
May 29, 2006
May 29, 2006
371
372
373
RunGLTest(int argc, char *argv[],
int logo, int logocursor, int slowly, int bpp, float gamma,
int noframe, int fsaa, int sync, int accel)
Apr 26, 2001
Apr 26, 2001
374
{
May 28, 2006
May 28, 2006
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
int i;
int rgb_size[3];
int w = 640;
int h = 480;
int done = 0;
int frames;
Uint32 start_time, this_time;
float color[8][3] = { {1.0, 1.0, 0.0},
{1.0, 0.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, 1.0, 0.0},
{0.0, 1.0, 1.0},
{1.0, 1.0, 1.0},
{1.0, 0.0, 1.0},
{0.0, 0.0, 1.0}
};
float cube[8][3] = { {0.5, 0.5, -0.5},
{0.5, -0.5, -0.5},
{-0.5, -0.5, -0.5},
{-0.5, 0.5, -0.5},
{-0.5, 0.5, 0.5},
{0.5, 0.5, 0.5},
{0.5, -0.5, 0.5},
{-0.5, -0.5, 0.5}
};
Uint32 video_flags;
int value;
May 29, 2006
May 29, 2006
403
404
405
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
exit(1);
May 28, 2006
May 28, 2006
406
407
408
409
}
/* See if we should detect the display depth */
if (bpp == 0) {
May 29, 2006
May 29, 2006
410
if (SDL_GetVideoInfo()->vfmt->BitsPerPixel <= 8) {
May 28, 2006
May 28, 2006
411
412
413
bpp = 8;
} else {
bpp = 16; /* More doesn't seem to work */
Mar 28, 2002
Mar 28, 2002
414
}
May 28, 2006
May 28, 2006
415
}
Mar 28, 2002
Mar 28, 2002
416
May 28, 2006
May 28, 2006
417
418
419
/* Set the flags we want to use for setting the video mode */
video_flags = SDL_OPENGL;
for (i = 1; argv[i]; ++i) {
May 29, 2006
May 29, 2006
420
if (strcmp(argv[i], "-fullscreen") == 0) {
May 28, 2006
May 28, 2006
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
video_flags |= SDL_FULLSCREEN;
}
}
if (noframe) {
video_flags |= SDL_NOFRAME;
}
/* Initialize the display */
switch (bpp) {
case 8:
rgb_size[0] = 3;
rgb_size[1] = 3;
rgb_size[2] = 2;
break;
case 15:
case 16:
rgb_size[0] = 5;
rgb_size[1] = 5;
rgb_size[2] = 5;
break;
default:
rgb_size[0] = 8;
rgb_size[1] = 8;
rgb_size[2] = 8;
break;
}
May 29, 2006
May 29, 2006
448
449
450
451
452
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, rgb_size[0]);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, rgb_size[1]);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, rgb_size[2]);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
May 28, 2006
May 28, 2006
453
if (fsaa) {
May 29, 2006
May 29, 2006
454
455
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, fsaa);
May 28, 2006
May 28, 2006
456
457
}
if (accel) {
May 29, 2006
May 29, 2006
458
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
May 28, 2006
May 28, 2006
459
460
}
if (sync) {
May 29, 2006
May 29, 2006
461
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
May 28, 2006
May 28, 2006
462
} else {
May 29, 2006
May 29, 2006
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);
}
if (SDL_SetVideoMode(w, h, bpp, video_flags) == NULL) {
fprintf(stderr, "Couldn't set GL mode: %s\n", SDL_GetError());
SDL_Quit();
exit(1);
}
printf("Screen BPP: %d\n", SDL_GetVideoSurface()->format->BitsPerPixel);
printf("\n");
printf("Vendor : %s\n", glGetString(GL_VENDOR));
printf("Renderer : %s\n", glGetString(GL_RENDERER));
printf("Version : %s\n", glGetString(GL_VERSION));
printf("Extensions : %s\n", glGetString(GL_EXTENSIONS));
printf("\n");
SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &value);
printf("SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0], value);
SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &value);
printf("SDL_GL_GREEN_SIZE: requested %d, got %d\n", rgb_size[1], value);
SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &value);
printf("SDL_GL_BLUE_SIZE: requested %d, got %d\n", rgb_size[2], value);
SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &value);
printf("SDL_GL_DEPTH_SIZE: requested %d, got %d\n", bpp, value);
SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &value);
printf("SDL_GL_DOUBLEBUFFER: requested 1, got %d\n", value);
May 28, 2006
May 28, 2006
489
if (fsaa) {
May 29, 2006
May 29, 2006
490
491
492
493
494
SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &value);
printf("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &value);
printf("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
value);
May 28, 2006
May 28, 2006
495
496
}
if (accel) {
May 29, 2006
May 29, 2006
497
498
SDL_GL_GetAttribute(SDL_GL_ACCELERATED_VISUAL, &value);
printf("SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value);
May 28, 2006
May 28, 2006
499
500
}
if (sync) {
May 29, 2006
May 29, 2006
501
502
SDL_GL_GetAttribute(SDL_GL_SWAP_CONTROL, &value);
printf("SDL_GL_SWAP_CONTROL: requested 1, got %d\n", value);
May 28, 2006
May 28, 2006
503
504
505
}
/* Set the window manager title bar */
May 29, 2006
May 29, 2006
506
SDL_WM_SetCaption("SDL GL test", "testgl");
May 28, 2006
May 28, 2006
507
508
509
/* Set the gamma for the window */
if (gamma != 0.0) {
May 29, 2006
May 29, 2006
510
SDL_SetGamma(gamma, gamma, gamma);
May 28, 2006
May 28, 2006
511
512
}
May 29, 2006
May 29, 2006
513
514
515
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
May 28, 2006
May 28, 2006
516
May 29, 2006
May 29, 2006
517
glOrtho(-2.0, 2.0, -2.0, 2.0, -20.0, 20.0);
May 28, 2006
May 28, 2006
518
May 29, 2006
May 29, 2006
519
520
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
May 28, 2006
May 28, 2006
521
May 29, 2006
May 29, 2006
522
glEnable(GL_DEPTH_TEST);
May 28, 2006
May 28, 2006
523
May 29, 2006
May 29, 2006
524
glDepthFunc(GL_LESS);
May 28, 2006
May 28, 2006
525
May 29, 2006
May 29, 2006
526
glShadeModel(GL_SMOOTH);
May 28, 2006
May 28, 2006
527
528
/* Loop until done. */
May 29, 2006
May 29, 2006
529
start_time = SDL_GetTicks();
May 28, 2006
May 28, 2006
530
531
532
533
534
535
536
frames = 0;
while (!done) {
GLenum gl_error;
char *sdl_error;
SDL_Event event;
/* Do our drawing, too. */
May 29, 2006
May 29, 2006
537
538
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
May 28, 2006
May 28, 2006
539
May 29, 2006
May 29, 2006
540
glBegin(GL_QUADS);
Apr 26, 2001
Apr 26, 2001
541
542
#ifdef SHADED_CUBE
May 29, 2006
May 29, 2006
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
glColor3fv(color[0]);
glVertex3fv(cube[0]);
glColor3fv(color[1]);
glVertex3fv(cube[1]);
glColor3fv(color[2]);
glVertex3fv(cube[2]);
glColor3fv(color[3]);
glVertex3fv(cube[3]);
glColor3fv(color[3]);
glVertex3fv(cube[3]);
glColor3fv(color[4]);
glVertex3fv(cube[4]);
glColor3fv(color[7]);
glVertex3fv(cube[7]);
glColor3fv(color[2]);
glVertex3fv(cube[2]);
glColor3fv(color[0]);
glVertex3fv(cube[0]);
glColor3fv(color[5]);
glVertex3fv(cube[5]);
glColor3fv(color[6]);
glVertex3fv(cube[6]);
glColor3fv(color[1]);
glVertex3fv(cube[1]);
glColor3fv(color[5]);
glVertex3fv(cube[5]);
glColor3fv(color[4]);
glVertex3fv(cube[4]);
glColor3fv(color[7]);
glVertex3fv(cube[7]);
glColor3fv(color[6]);
glVertex3fv(cube[6]);
glColor3fv(color[5]);
glVertex3fv(cube[5]);
glColor3fv(color[0]);
glVertex3fv(cube[0]);
glColor3fv(color[3]);
glVertex3fv(cube[3]);
glColor3fv(color[4]);
glVertex3fv(cube[4]);
glColor3fv(color[6]);
glVertex3fv(cube[6]);
glColor3fv(color[1]);
glVertex3fv(cube[1]);
glColor3fv(color[2]);
glVertex3fv(cube[2]);
glColor3fv(color[7]);
glVertex3fv(cube[7]);
Feb 26, 2006
Feb 26, 2006
596
#else /* flat cube */
May 29, 2006
May 29, 2006
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
glColor3f(1.0, 0.0, 0.0);
glVertex3fv(cube[0]);
glVertex3fv(cube[1]);
glVertex3fv(cube[2]);
glVertex3fv(cube[3]);
glColor3f(0.0, 1.0, 0.0);
glVertex3fv(cube[3]);
glVertex3fv(cube[4]);
glVertex3fv(cube[7]);
glVertex3fv(cube[2]);
glColor3f(0.0, 0.0, 1.0);
glVertex3fv(cube[0]);
glVertex3fv(cube[5]);
glVertex3fv(cube[6]);
glVertex3fv(cube[1]);
glColor3f(0.0, 1.0, 1.0);
glVertex3fv(cube[5]);
glVertex3fv(cube[4]);
glVertex3fv(cube[7]);
glVertex3fv(cube[6]);
glColor3f(1.0, 1.0, 0.0);
glVertex3fv(cube[5]);
glVertex3fv(cube[0]);
glVertex3fv(cube[3]);
glVertex3fv(cube[4]);
glColor3f(1.0, 0.0, 1.0);
glVertex3fv(cube[6]);
glVertex3fv(cube[1]);
glVertex3fv(cube[2]);
glVertex3fv(cube[7]);
Apr 26, 2001
Apr 26, 2001
632
633
#endif /* SHADED_CUBE */
May 29, 2006
May 29, 2006
634
glEnd();
May 28, 2006
May 28, 2006
635
May 29, 2006
May 29, 2006
636
637
glMatrixMode(GL_MODELVIEW);
glRotatef(5.0, 1.0, 1.0, 1.0);
May 28, 2006
May 28, 2006
638
639
640
/* Draw 2D logo onto the 3D display */
if (logo) {
May 29, 2006
May 29, 2006
641
DrawLogoTexture();
May 28, 2006
May 28, 2006
642
643
}
if (logocursor) {
May 29, 2006
May 29, 2006
644
DrawLogoCursor();
May 28, 2006
May 28, 2006
645
646
}
May 29, 2006
May 29, 2006
647
SDL_GL_SwapBuffers();
May 28, 2006
May 28, 2006
648
649
/* Check for error conditions. */
May 29, 2006
May 29, 2006
650
gl_error = glGetError();
May 28, 2006
May 28, 2006
651
652
if (gl_error != GL_NO_ERROR) {
May 29, 2006
May 29, 2006
653
fprintf(stderr, "testgl: OpenGL error: %d\n", gl_error);
May 28, 2006
May 28, 2006
654
655
}
May 29, 2006
May 29, 2006
656
sdl_error = SDL_GetError();
May 28, 2006
May 28, 2006
657
658
if (sdl_error[0] != '\0') {
May 29, 2006
May 29, 2006
659
660
fprintf(stderr, "testgl: SDL error '%s'\n", sdl_error);
SDL_ClearError();
May 28, 2006
May 28, 2006
661
662
663
664
}
/* Allow the user to see what's happening */
if (slowly) {
May 29, 2006
May 29, 2006
665
SDL_Delay(20);
May 28, 2006
May 28, 2006
666
667
668
}
/* Check if there's a pending event. */
May 29, 2006
May 29, 2006
669
670
while (SDL_PollEvent(&event)) {
done = HandleEvent(&event);
May 28, 2006
May 28, 2006
671
672
673
674
675
}
++frames;
}
/* Print out the frames per second */
May 29, 2006
May 29, 2006
676
this_time = SDL_GetTicks();
May 28, 2006
May 28, 2006
677
if (this_time != start_time) {
May 29, 2006
May 29, 2006
678
679
printf("%2.2f FPS\n",
((float) frames / (this_time - start_time)) * 1000.0);
May 28, 2006
May 28, 2006
680
681
682
}
if (global_image) {
May 29, 2006
May 29, 2006
683
SDL_FreeSurface(global_image);
May 28, 2006
May 28, 2006
684
685
686
global_image = NULL;
}
if (global_texture) {
May 29, 2006
May 29, 2006
687
glDeleteTextures(1, &global_texture);
May 28, 2006
May 28, 2006
688
689
690
global_texture = 0;
}
if (cursor_texture) {
May 29, 2006
May 29, 2006
691
glDeleteTextures(1, &cursor_texture);
May 28, 2006
May 28, 2006
692
693
694
695
cursor_texture = 0;
}
/* Destroy our GL context, etc. */
May 29, 2006
May 29, 2006
696
SDL_Quit();
May 28, 2006
May 28, 2006
697
return (0);
Apr 26, 2001
Apr 26, 2001
698
699
}
May 28, 2006
May 28, 2006
700
int
May 29, 2006
May 29, 2006
701
main(int argc, char *argv[])
Apr 26, 2001
Apr 26, 2001
702
{
May 28, 2006
May 28, 2006
703
704
705
706
707
708
709
710
711
712
713
714
715
716
int i, logo, logocursor = 0;
int numtests;
int bpp = 0;
int slowly;
float gamma = 0.0;
int noframe = 0;
int fsaa = 0;
int accel = 0;
int sync = 0;
logo = 0;
slowly = 0;
numtests = 1;
for (i = 1; argv[i]; ++i) {
May 29, 2006
May 29, 2006
717
if (strcmp(argv[i], "-twice") == 0) {
May 28, 2006
May 28, 2006
718
719
++numtests;
}
May 29, 2006
May 29, 2006
720
if (strcmp(argv[i], "-logo") == 0) {
May 28, 2006
May 28, 2006
721
722
logo = 1;
}
May 29, 2006
May 29, 2006
723
if (strcmp(argv[i], "-logocursor") == 0) {
May 28, 2006
May 28, 2006
724
725
logocursor = 1;
}
May 29, 2006
May 29, 2006
726
if (strcmp(argv[i], "-slow") == 0) {
May 28, 2006
May 28, 2006
727
728
slowly = 1;
}
May 29, 2006
May 29, 2006
729
730
if (strcmp(argv[i], "-bpp") == 0) {
bpp = atoi(argv[++i]);
May 28, 2006
May 28, 2006
731
}
May 29, 2006
May 29, 2006
732
733
if (strcmp(argv[i], "-gamma") == 0) {
gamma = (float) atof(argv[++i]);
May 28, 2006
May 28, 2006
734
}
May 29, 2006
May 29, 2006
735
if (strcmp(argv[i], "-noframe") == 0) {
May 28, 2006
May 28, 2006
736
737
noframe = 1;
}
May 29, 2006
May 29, 2006
738
if (strcmp(argv[i], "-fsaa") == 0) {
May 28, 2006
May 28, 2006
739
740
++fsaa;
}
May 29, 2006
May 29, 2006
741
if (strcmp(argv[i], "-accel") == 0) {
May 28, 2006
May 28, 2006
742
743
++accel;
}
May 29, 2006
May 29, 2006
744
if (strcmp(argv[i], "-sync") == 0) {
May 28, 2006
May 28, 2006
745
746
++sync;
}
May 29, 2006
May 29, 2006
747
if (strncmp(argv[i], "-h", 2) == 0) {
May 28, 2006
May 28, 2006
748
printf
Jun 24, 2006
Jun 24, 2006
749
("Usage: %s [-twice] [-logo] [-logocursor] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa] [-accel] [-sync] [-fullscreen]\n",
May 28, 2006
May 28, 2006
750
argv[0]);
May 29, 2006
May 29, 2006
751
exit(0);
May 28, 2006
May 28, 2006
752
753
754
}
}
for (i = 0; i < numtests; ++i) {
May 29, 2006
May 29, 2006
755
756
RunGLTest(argc, argv, logo, logocursor, slowly, bpp, gamma,
noframe, fsaa, sync, accel);
May 28, 2006
May 28, 2006
757
758
}
return 0;
Apr 26, 2001
Apr 26, 2001
759
760
761
762
}
#else /* HAVE_OPENGL */
May 28, 2006
May 28, 2006
763
int
May 29, 2006
May 29, 2006
764
main(int argc, char *argv[])
Apr 26, 2001
Apr 26, 2001
765
{
May 29, 2006
May 29, 2006
766
printf("No OpenGL support on this system\n");
May 28, 2006
May 28, 2006
767
return 1;
Apr 26, 2001
Apr 26, 2001
768
769
770
}
#endif /* HAVE_OPENGL */