ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/test.C
Revision: 1.34
Committed: Wed Oct 6 01:41:30 2004 UTC (19 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.33: +4 -4 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #include <stdlib.h>
2     #include <stdio.h>
3     #include <string.h>
4     #include <math.h>
5    
6     #include "SDL.h"
7     #include "SDL_opengl.h"
8    
9     static SDL_Surface *global_image = NULL;
10     static GLuint global_texture = 0;
11    
12 root 1.29 #include "util.h"
13 root 1.2 #include "entity.h"
14 root 1.29 #include "txtprt_import.h"
15    
16     CGcontext cgc;
17     CGprogram vsh, fsh;
18 root 1.30 CGparameter mv, mvp, lightpos;
19 root 1.29
20     static void CheckCgError(void)
21     {
22     CGerror err = cgGetError();
23 root 1.2
24 root 1.29 if (err != CG_NO_ERROR)
25     {
26     printf("CG error: %s\n", cgGetErrorString(err));
27     exit(1);
28     }
29     }
30 root 1.4
31 root 1.1 /**********************************************************************/
32    
33 root 1.6 view camera;
34 root 1.18 vec3 camera_velocity;
35 root 1.32 float camera_velocity_factor = 20;
36 root 1.6
37 root 1.1 void
38     HotKey_ToggleFullScreen (void)
39     {
40     SDL_Surface *screen;
41    
42     screen = SDL_GetVideoSurface ();
43     if (SDL_WM_ToggleFullScreen (screen))
44 root 1.5 printf ("Toggled fullscreen mode - now %s\n",
45     (screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
46 root 1.1 else
47 root 1.5 printf ("Unable to toggle fullscreen mode\n");
48 root 1.1 }
49    
50     void
51     HotKey_ToggleGrab (void)
52     {
53     SDL_GrabMode mode;
54    
55     printf ("Ctrl-G: toggling input grab!\n");
56     mode = SDL_WM_GrabInput (SDL_GRAB_QUERY);
57     if (mode == SDL_GRAB_ON)
58 root 1.5 printf ("Grab was on\n");
59 root 1.1 else
60 root 1.5 printf ("Grab was off\n");
61 root 1.1
62     mode = SDL_WM_GrabInput (mode ? SDL_GRAB_OFF : SDL_GRAB_ON);
63     if (mode == SDL_GRAB_ON)
64 root 1.5 printf ("Grab is now on\n");
65 root 1.1 else
66 root 1.5 printf ("Grab is now off\n");
67 root 1.1 }
68    
69     void
70     HotKey_Iconify (void)
71     {
72     printf ("Ctrl-Z: iconifying window!\n");
73     SDL_WM_IconifyWindow ();
74     }
75    
76     int
77     HandleEvent (SDL_Event * event)
78     {
79     int done;
80    
81     done = 0;
82     switch (event->type)
83     {
84     case SDL_ACTIVEEVENT:
85     /* See what happened */
86     printf ("app %s ", event->active.gain ? "gained" : "lost");
87     if (event->active.state & SDL_APPACTIVE)
88     {
89     printf ("active ");
90     }
91     else if (event->active.state & SDL_APPMOUSEFOCUS)
92     {
93     printf ("mouse ");
94     }
95     else if (event->active.state & SDL_APPINPUTFOCUS)
96     {
97     printf ("input ");
98     }
99    
100     printf ("focus\n");
101     break;
102    
103     case SDL_KEYDOWN:
104 root 1.19 if (event->key.keysym.sym == SDLK_UP) camera_velocity.z--;
105     if (event->key.keysym.sym == SDLK_DOWN) camera_velocity.z++;
106     if (event->key.keysym.sym == SDLK_LEFT) camera_velocity.x--;
107     if (event->key.keysym.sym == SDLK_RIGHT) camera_velocity.x++;
108     if (event->key.keysym.sym == SDLK_a) camera_velocity.y--;
109     if (event->key.keysym.sym == SDLK_s) camera_velocity.y++;
110     if (event->key.keysym.sym == SDLK_v) camera_velocity_factor *= 1.5;
111     if (event->key.keysym.sym == SDLK_b) camera_velocity_factor /= 1.5;
112 root 1.6
113 root 1.1 if (event->key.keysym.sym == SDLK_ESCAPE)
114 root 1.6 done = 1;
115 root 1.1
116     if ((event->key.keysym.sym == SDLK_g) &&
117     (event->key.keysym.mod & KMOD_CTRL))
118 root 1.6 HotKey_ToggleGrab ();
119 root 1.1
120     if ((event->key.keysym.sym == SDLK_z) &&
121     (event->key.keysym.mod & KMOD_CTRL))
122 root 1.6 HotKey_Iconify ();
123 root 1.1
124     if ((event->key.keysym.sym == SDLK_RETURN) &&
125     (event->key.keysym.mod & KMOD_ALT))
126 root 1.6 HotKey_ToggleFullScreen ();
127 root 1.1
128     break;
129    
130 root 1.18 case SDL_KEYUP:
131 root 1.19 if (event->key.keysym.sym == SDLK_UP) camera_velocity.z++;
132     if (event->key.keysym.sym == SDLK_DOWN) camera_velocity.z--;
133     if (event->key.keysym.sym == SDLK_LEFT) camera_velocity.x++;
134     if (event->key.keysym.sym == SDLK_RIGHT) camera_velocity.x--;
135     if (event->key.keysym.sym == SDLK_a) camera_velocity.y++;
136     if (event->key.keysym.sym == SDLK_s) camera_velocity.y--;
137 root 1.18 break;
138    
139 root 1.1 case SDL_QUIT:
140     done = 1;
141     break;
142     }
143    
144     return (done);
145     }
146    
147     /* Quick utility function for texture creation */
148     static int
149     power_of_two (int input)
150     {
151     int value = 1;
152    
153     while (value < input)
154     {
155     value <<= 1;
156     }
157     return value;
158     }
159    
160     GLuint
161     SDL_GL_LoadTexture (SDL_Surface * surface, GLfloat * texcoord)
162     {
163     GLuint texture;
164     int w, h;
165     SDL_Surface *image;
166     SDL_Rect area;
167     Uint32 saved_flags;
168     Uint8 saved_alpha;
169    
170     /* Use the surface width and height expanded to powers of 2 */
171     w = power_of_two (surface->w);
172     h = power_of_two (surface->h);
173     texcoord[0] = 0.0f; /* Min X */
174     texcoord[1] = 0.0f; /* Min Y */
175     texcoord[2] = (GLfloat) surface->w / w; /* Max X */
176     texcoord[3] = (GLfloat) surface->h / h; /* Max Y */
177    
178     image = SDL_CreateRGBSurface (SDL_SWSURFACE, w, h, 32,
179     #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
180     0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000
181     #else
182     0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF
183     #endif
184     );
185     if (image == NULL)
186     {
187     return 0;
188     }
189    
190     /* Save the alpha blending attributes */
191     saved_flags = surface->flags & (SDL_SRCALPHA | SDL_RLEACCELOK);
192     saved_alpha = surface->format->alpha;
193     if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA)
194     {
195     SDL_SetAlpha (surface, 0, 0);
196     }
197    
198     /* Copy the surface into the GL texture image */
199     area.x = 0;
200     area.y = 0;
201     area.w = surface->w;
202     area.h = surface->h;
203     SDL_BlitSurface (surface, &area, image, &area);
204    
205     /* Restore the alpha blending attributes */
206     if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA)
207     {
208     SDL_SetAlpha (surface, saved_flags, saved_alpha);
209     }
210    
211     /* Create an OpenGL texture for the image */
212     glGenTextures (1, &texture);
213     glBindTexture (GL_TEXTURE_2D, texture);
214     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
215     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
216     glTexImage2D (GL_TEXTURE_2D,
217     0,
218     GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
219     SDL_FreeSurface (image); /* No longer needed */
220    
221     return texture;
222     }
223    
224     int
225     RunGLTest (int argc, char *argv[],
226     int logo, int slowly, int bpp, float gamma, int noframe, int fsaa)
227     {
228     int i;
229     int rgb_size[3];
230     int w = 640;
231     int h = 480;
232     int done = 0;
233     int frames;
234     Uint32 start_time, this_time;
235 root 1.2 Uint32 video_flags;
236 root 1.1 int value;
237    
238     if (SDL_Init (SDL_INIT_VIDEO) < 0)
239     {
240     fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ());
241     exit (1);
242     }
243    
244     /* See if we should detect the display depth */
245     if (bpp == 0)
246     {
247     if (SDL_GetVideoInfo ()->vfmt->BitsPerPixel <= 8)
248 root 1.3 bpp = 8;
249 root 1.1 else
250 root 1.3 bpp = 16; /* More doesn't seem to work */
251 root 1.1 }
252    
253 root 1.2 video_flags = SDL_OPENGL;
254    
255 root 1.1 for (i = 1; argv[i]; ++i)
256 root 1.3 if (strcmp (argv[1], "-fullscreen") == 0)
257     video_flags |= SDL_FULLSCREEN;
258 root 1.1
259     if (noframe)
260 root 1.3 video_flags |= SDL_NOFRAME;
261 root 1.1
262     /* Initialize the display */
263     switch (bpp)
264     {
265     case 8:
266     rgb_size[0] = 3;
267     rgb_size[1] = 3;
268     rgb_size[2] = 2;
269     break;
270 root 1.3
271 root 1.1 case 15:
272     case 16:
273     rgb_size[0] = 5;
274     rgb_size[1] = 5;
275     rgb_size[2] = 5;
276     break;
277 root 1.3
278 root 1.1 default:
279     rgb_size[0] = 8;
280     rgb_size[1] = 8;
281     rgb_size[2] = 8;
282     break;
283     }
284 root 1.18
285 root 1.1 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, rgb_size[0]);
286     SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb_size[1]);
287     SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, rgb_size[2]);
288     SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 16);
289     SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
290 root 1.3
291 root 1.1 if (fsaa)
292     {
293     SDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS, 1);
294     SDL_GL_SetAttribute (SDL_GL_MULTISAMPLESAMPLES, fsaa);
295     }
296 root 1.3
297 root 1.1 if (SDL_SetVideoMode (w, h, bpp, video_flags) == NULL)
298     {
299     fprintf (stderr, "Couldn't set GL mode: %s\n", SDL_GetError ());
300     SDL_Quit ();
301     exit (1);
302     }
303    
304     printf ("Screen BPP: %d\n", SDL_GetVideoSurface ()->format->BitsPerPixel);
305     printf ("\n");
306     printf ("Vendor : %s\n", glGetString (GL_VENDOR));
307     printf ("Renderer : %s\n", glGetString (GL_RENDERER));
308     printf ("Version : %s\n", glGetString (GL_VERSION));
309     printf ("Extensions : %s\n", glGetString (GL_EXTENSIONS));
310     printf ("\n");
311    
312     SDL_GL_GetAttribute (SDL_GL_RED_SIZE, &value);
313     printf ("SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0], value);
314     SDL_GL_GetAttribute (SDL_GL_GREEN_SIZE, &value);
315     printf ("SDL_GL_GREEN_SIZE: requested %d, got %d\n", rgb_size[1], value);
316     SDL_GL_GetAttribute (SDL_GL_BLUE_SIZE, &value);
317     printf ("SDL_GL_BLUE_SIZE: requested %d, got %d\n", rgb_size[2], value);
318     SDL_GL_GetAttribute (SDL_GL_DEPTH_SIZE, &value);
319     printf ("SDL_GL_DEPTH_SIZE: requested %d, got %d\n", bpp, value);
320     SDL_GL_GetAttribute (SDL_GL_DOUBLEBUFFER, &value);
321     printf ("SDL_GL_DOUBLEBUFFER: requested 1, got %d\n", value);
322 root 1.3
323 root 1.1 if (fsaa)
324     {
325     SDL_GL_GetAttribute (SDL_GL_MULTISAMPLEBUFFERS, &value);
326     printf ("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
327     SDL_GL_GetAttribute (SDL_GL_MULTISAMPLESAMPLES, &value);
328     printf ("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
329     value);
330     }
331    
332     /* Set the window manager title bar */
333 root 1.12 SDL_WM_SetCaption ("libgender rendering test", "gendertest");
334 root 1.1
335     /* Set the gamma for the window */
336     if (gamma != 0.0)
337 root 1.3 SDL_SetGamma (gamma, gamma, gamma);
338 root 1.1
339 root 1.17 // load a entity
340     for (int i = 0; i < 7; i++)
341     {
342     txtprt_parser p;
343 root 1.18 entity_transform *f = new entity_transform;
344 root 1.17 entity *e;
345     try
346     {
347     e = p.read ("test.blasc");
348     } catch (txtprt_i_exception & e)
349     {
350     cout << "ERR: " << e.msg << endl;
351     }
352     f->set (e);
353 root 1.26 f->update (matrix::translation (vec3 (0, -1, -i*5)));
354 root 1.17 f->show ();
355     }
356    
357 root 1.13 camera.orig.x = camera.orig.y = camera.orig.z = 0;
358 root 1.6 camera.p = point (0, 0, 10);
359     camera.d = vec3 (0, 0, -1);
360     camera.u = vec3 (0, 1, 0);
361     camera.w = w; camera.h = h;
362     camera.fov = 90;
363 root 1.1
364     glMatrixMode (GL_MODELVIEW);
365     glLoadIdentity ();
366    
367 root 1.16 glEnable (GL_CULL_FACE);
368 root 1.1 glEnable (GL_DEPTH_TEST);
369 root 1.22
370 root 1.11 glShadeModel (GL_SMOOTH);
371 root 1.6
372 root 1.3 glEnable (GL_LIGHTING);
373 root 1.9 //GLfloat lightc[4] = { 1, 0.1, 0.1, 1 };
374 root 1.6 //glLightf (GL_LIGHT0, GL_QUADRATIC_ATTENUATION);
375 root 1.9 //glLightfv (GL_LIGHT0, GL_DIFFUSE, lightc);
376 root 1.6 glEnable (GL_LIGHT0);
377 root 1.29
378     cgc = cgCreateContext ();
379     vsh = cgCreateProgramFromFile (cgc, CG_SOURCE, "vsh.cg", CG_PROFILE_ARBVP1, 0, 0);
380     CheckCgError ();
381     cgGLLoadProgram (vsh);
382     CheckCgError ();
383     mv = cgGetNamedParameter (vsh, "WorldProj");
384     mvp = cgGetNamedParameter (vsh, "WorldViewProj");
385 root 1.30 lightpos = cgGetNamedParameter (vsh, "LightPos");
386 root 1.29 CheckCgError ();
387    
388     fsh = cgCreateProgramFromFile (cgc, CG_SOURCE, "fsh.cg", CG_PROFILE_ARBFP1, 0, 0);
389 root 1.30 CheckCgError ();
390 root 1.29 cgGLLoadProgram (fsh);
391 root 1.30 CheckCgError ();
392 root 1.29
393     cgGLBindProgram (vsh);
394 root 1.30 CheckCgError ();
395 root 1.29 cgGLBindProgram (fsh);
396 root 1.30 CheckCgError ();
397 root 1.1
398     /* Loop until done. */
399     start_time = SDL_GetTicks ();
400     frames = 0;
401 root 1.16
402 root 1.1 while (!done)
403     {
404     GLenum gl_error;
405     char *sdl_error;
406     SDL_Event event;
407    
408     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
409    
410 root 1.19 camera.p.x += (camera_velocity_factor * camera_velocity.x) * timer.diff;
411     camera.p.y += (camera_velocity_factor * camera_velocity.y) * timer.diff;
412     camera.p.z += (camera_velocity_factor * camera_velocity.z) * timer.diff;
413 root 1.18
414 root 1.30 cgGLSetParameter4f (lightpos, camera.p.x, camera.p.y, camera.p.z, 1);
415 root 1.6
416 root 1.5 #if 0
417 root 1.3 static GLfloat ry;
418 root 1.13 ry += 0.001;
419     camera.d.x = cos (ry);
420     camera.d.z = sin (ry);
421     //camera.d.y = sin (ry * 0.1);
422 root 1.5 #endif
423 root 1.1
424 root 1.34 camera.begin ();
425     camera.pass (view::DEPTH);
426     camera.pass (view::LIGHTED);
427     camera.end ();
428 root 1.1
429     SDL_GL_SwapBuffers ();
430 root 1.15 timer.frame ();
431 root 1.1
432     /* Check for error conditions. */
433     gl_error = glGetError ();
434    
435     if (gl_error != GL_NO_ERROR)
436 root 1.3 fprintf (stderr, "testgl: OpenGL error: %d\n", gl_error);
437 root 1.1
438     sdl_error = SDL_GetError ();
439    
440     if (sdl_error[0] != '\0')
441     {
442     fprintf (stderr, "testgl: SDL error '%s'\n", sdl_error);
443     SDL_ClearError ();
444     }
445    
446     /* Allow the user to see what's happening */
447 root 1.9 //SDL_Delay (20);
448 root 1.1
449     /* Check if there's a pending event. */
450     while (SDL_PollEvent (&event))
451 root 1.18 done = HandleEvent (&event);
452 root 1.20
453 root 1.18
454 root 1.1 ++frames;
455     }
456    
457     /* Print out the frames per second */
458     this_time = SDL_GetTicks ();
459     if (this_time != start_time)
460     {
461     printf ("%2.2f FPS\n",
462     ((float) frames / (this_time - start_time)) * 1000.0);
463     }
464    
465     if (global_image)
466     {
467     SDL_FreeSurface (global_image);
468     global_image = NULL;
469     }
470     if (global_texture)
471     {
472     glDeleteTextures (1, &global_texture);
473     global_texture = 0;
474     }
475    
476     /* Destroy our GL context, etc. */
477     SDL_Quit ();
478     return (0);
479     }
480    
481     int
482     main (int argc, char *argv[])
483     {
484     int i, logo;
485     int numtests;
486     int bpp = 0;
487     int slowly;
488     float gamma = 0.0;
489     int noframe = 0;
490     int fsaa = 0;
491 root 1.4
492 root 1.1 logo = 0;
493     slowly = 0;
494     numtests = 1;
495     for (i = 1; argv[i]; ++i)
496     {
497     if (strcmp (argv[i], "-twice") == 0)
498     {
499     ++numtests;
500     }
501     if (strcmp (argv[i], "-slow") == 0)
502     {
503     slowly = 1;
504     }
505     if (strcmp (argv[i], "-bpp") == 0)
506     {
507     bpp = atoi (argv[++i]);
508     }
509     if (strcmp (argv[i], "-gamma") == 0)
510     {
511     gamma = (float) atof (argv[++i]);
512     }
513     if (strcmp (argv[i], "-noframe") == 0)
514     {
515     noframe = 1;
516     }
517     if (strcmp (argv[i], "-fsaa") == 0)
518     {
519     ++fsaa;
520     }
521     if (strncmp (argv[i], "-h", 2) == 0)
522     {
523     printf
524     ("Usage: %s [-twice] [-logo] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa]\n",
525     argv[0]);
526     exit (0);
527     }
528     }
529 root 1.17
530 root 1.1 for (i = 0; i < numtests; ++i)
531 root 1.17 RunGLTest (argc, argv, logo, slowly, bpp, gamma, noframe, fsaa);
532    
533 root 1.1 return 0;
534     }