ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/test.C
Revision: 1.71
Committed: Fri Oct 29 15:58:50 2004 UTC (19 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.70: +3 -5 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <math.h>
5
6 #include "opengl.h"
7
8 #include "SDL.h"
9 #include "SDL_opengl.h"
10
11 static SDL_Surface *global_image = NULL;
12 static GLuint global_texture = 0;
13
14 #include "util.h"
15 #include "entity.h"
16 #include "txtprt_import.h"
17
18 #include "shader.h"
19
20 /**********************************************************************/
21
22 view camera;
23 vec3 camera_velocity;
24 float camera_angle, camera_angle2, camera_velocity_angle, camera_velocity_angle2;
25 float camera_velocity_factor = 80;
26
27 void
28 HotKey_ToggleFullScreen (void)
29 {
30 SDL_Surface *screen;
31
32 screen = SDL_GetVideoSurface ();
33 if (SDL_WM_ToggleFullScreen (screen))
34 printf ("Toggled fullscreen mode - now %s\n",
35 (screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
36 else
37 printf ("Unable to toggle fullscreen mode\n");
38 }
39
40 void
41 HotKey_ToggleGrab (void)
42 {
43 SDL_GrabMode mode;
44
45 printf ("Ctrl-G: toggling input grab!\n");
46 mode = SDL_WM_GrabInput (SDL_GRAB_QUERY);
47 if (mode == SDL_GRAB_ON)
48 printf ("Grab was on\n");
49 else
50 printf ("Grab was off\n");
51
52 mode = SDL_WM_GrabInput (mode ? SDL_GRAB_OFF : SDL_GRAB_ON);
53 if (mode == SDL_GRAB_ON)
54 printf ("Grab is now on\n");
55 else
56 printf ("Grab is now off\n");
57 }
58
59 void
60 HotKey_Iconify (void)
61 {
62 printf ("Ctrl-Z: iconifying window!\n");
63 SDL_WM_IconifyWindow ();
64 }
65
66 int
67 HandleEvent (SDL_Event * event)
68 {
69 int done;
70
71 done = 0;
72 switch (event->type)
73 {
74 case SDL_ACTIVEEVENT:
75 /* See what happened */
76 printf ("app %s ", event->active.gain ? "gained" : "lost");
77 if (event->active.state & SDL_APPACTIVE)
78 printf ("active ");
79 else if (event->active.state & SDL_APPMOUSEFOCUS)
80 printf ("mouse ");
81 else if (event->active.state & SDL_APPINPUTFOCUS)
82 printf ("input ");
83
84 printf ("focus\n");
85 break;
86
87 case SDL_KEYDOWN:
88 if (event->key.keysym.sym == SDLK_UP) camera_velocity.z--;
89 if (event->key.keysym.sym == SDLK_DOWN) camera_velocity.z++;
90 if (event->key.keysym.sym == SDLK_RIGHT) camera_velocity_angle++;
91 if (event->key.keysym.sym == SDLK_LEFT) camera_velocity_angle--;
92 if (event->key.keysym.sym == SDLK_PAGEUP) camera_velocity_angle2++;
93 if (event->key.keysym.sym == SDLK_PAGEDOWN) camera_velocity_angle2--;
94 if (event->key.keysym.sym == SDLK_e) camera_velocity.y--;
95 if (event->key.keysym.sym == SDLK_q) camera_velocity.y++;
96 if (event->key.keysym.sym == SDLK_v) camera_velocity_factor *= 1.5;
97 if (event->key.keysym.sym == SDLK_b) camera_velocity_factor /= 1.5;
98
99 if (event->key.keysym.sym == SDLK_ESCAPE)
100 done = 1;
101
102 if ((event->key.keysym.sym == SDLK_g) &&
103 (event->key.keysym.mod & KMOD_CTRL))
104 HotKey_ToggleGrab ();
105
106 if ((event->key.keysym.sym == SDLK_z) &&
107 (event->key.keysym.mod & KMOD_CTRL))
108 HotKey_Iconify ();
109
110 if ((event->key.keysym.sym == SDLK_RETURN) &&
111 (event->key.keysym.mod & KMOD_ALT))
112 HotKey_ToggleFullScreen ();
113
114 break;
115
116 case SDL_KEYUP:
117 if (event->key.keysym.sym == SDLK_UP) camera_velocity.z++;
118 if (event->key.keysym.sym == SDLK_DOWN) camera_velocity.z--;
119 if (event->key.keysym.sym == SDLK_LEFT) camera_velocity_angle++;
120 if (event->key.keysym.sym == SDLK_RIGHT) camera_velocity_angle--;
121 if (event->key.keysym.sym == SDLK_PAGEUP) camera_velocity_angle2--;
122 if (event->key.keysym.sym == SDLK_PAGEDOWN) camera_velocity_angle2++;
123 if (event->key.keysym.sym == SDLK_e) camera_velocity.y++;
124 if (event->key.keysym.sym == SDLK_q) camera_velocity.y--;
125 break;
126
127 case SDL_QUIT:
128 done = 1;
129 break;
130 }
131
132 return (done);
133 }
134
135 void draw_floor (int size, int dx, int dy, int dz)
136 {
137 int x, z, ry;
138
139 for (x = 0; x < 10; x++)
140 {
141 for (z = 0; z < 10; z++)
142 {
143 vector<vertex_t2f_n3f_v3f> pts;
144 pts.push_back (vertex_t2f_n3f_v3f (point ( 0, 0, 0), vec3 (0, 1, 0), tex2 (0, 0)));
145 pts.push_back (vertex_t2f_n3f_v3f (point ( 0, 0, size), vec3 (0, 1, 0), tex2 (0, 1)));
146 pts.push_back (vertex_t2f_n3f_v3f (point (size, 0, size), vec3 (0, 1, 0), tex2 (1, 1)));
147 pts.push_back (vertex_t2f_n3f_v3f (point (size, 0, 0), vec3 (0, 1, 0), tex2 (1, 0)));
148
149 geometry_quads *q = new geometry_quads;
150 q->m = new simple_material;
151 q->set (pts);
152 entity *e = new entity (q);
153 e->move (vec3 (dx + x * size, dy, dz + z * size));
154 e->show ();
155 }
156 }
157 }
158
159 void draw_test_nurb ()
160 {
161 geometry_nurbs *q = new geometry_nurbs;
162 q->set ();
163 entity *e = new entity (q);
164 e->move (vec3 (10, 3, -4));
165 e->show ();
166 }
167
168 void fisch (vec3 center, GLfloat radius, int depth)
169 {
170 entity *planet = new entity (new geometry_sphere (radius));
171 planet->move (center);
172 planet->show ();
173
174 if (--depth)
175 {
176 GLfloat r2 = radius * .1F;
177 GLfloat r3 = radius + r2;
178
179 fisch (center + vec3 (r3, 0, 0), r2, depth);
180 fisch (center + vec3 (0, 0, r3), r2, depth);
181 fisch (center + vec3 (-r3, 0, 0), r2, depth);
182 }
183 }
184
185 extern void draw_level ();
186 int
187 RunGLTest (int argc, char *argv[],
188 int logo, int slowly, int bpp, float gamma, int noframe, int fsaa)
189 {
190 int i;
191 int rgb_size[3];
192 int w = 640;
193 int h = 480;
194 int done = 0;
195 int frames;
196 Uint32 video_flags;
197 int value;
198 GLenum gl_error;
199
200 if (SDL_Init (SDL_INIT_VIDEO) < 0)
201 {
202 fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ());
203 exit (1);
204 }
205
206 /* See if we should detect the display depth */
207 if (bpp == 0)
208 {
209 if (SDL_GetVideoInfo ()->vfmt->BitsPerPixel <= 8)
210 bpp = 8;
211 else
212 bpp = 16; /* More doesn't seem to work */
213 }
214
215 video_flags = SDL_OPENGL;
216
217 for (i = 1; argv[i]; ++i)
218 if (strcmp (argv[1], "-fullscreen") == 0)
219 video_flags |= SDL_FULLSCREEN;
220
221 if (noframe)
222 video_flags |= SDL_NOFRAME;
223
224 /* Initialize the display */
225 switch (bpp)
226 {
227 case 8:
228 rgb_size[0] = 3;
229 rgb_size[1] = 3;
230 rgb_size[2] = 2;
231 break;
232
233 case 15:
234 case 16:
235 rgb_size[0] = 5;
236 rgb_size[1] = 5;
237 rgb_size[2] = 5;
238 break;
239
240 default:
241 rgb_size[0] = 8;
242 rgb_size[1] = 8;
243 rgb_size[2] = 8;
244 break;
245 }
246
247 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, rgb_size[0]);
248 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb_size[1]);
249 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, rgb_size[2]);
250 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 24);
251 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
252
253 if (fsaa)
254 {
255 SDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS, 1);
256 SDL_GL_SetAttribute (SDL_GL_MULTISAMPLESAMPLES, fsaa);
257 }
258
259 if (SDL_SetVideoMode (w, h, bpp, video_flags) == NULL)
260 {
261 fprintf (stderr, "Couldn't set GL mode: %s\n", SDL_GetError ());
262 SDL_Quit ();
263 exit (1);
264 }
265
266 //printf ("Screen BPP: %d\n", SDL_GetVideoSurface ()->format->BitsPerPixel);
267 //printf ("\n");
268 //printf ("Vendor : %s\n", glGetString (GL_VENDOR));
269 //printf ("Renderer : %s\n", glGetString (GL_RENDERER));
270 //printf ("Version : %s\n", glGetString (GL_VERSION));
271 //printf ("Extensions : %s\n", glGetString (GL_EXTENSIONS));
272 printf ("\n");
273
274 SDL_GL_GetAttribute (SDL_GL_RED_SIZE, &value);
275 printf ("SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0], value);
276 SDL_GL_GetAttribute (SDL_GL_GREEN_SIZE, &value);
277 printf ("SDL_GL_GREEN_SIZE: requested %d, got %d\n", rgb_size[1], value);
278 SDL_GL_GetAttribute (SDL_GL_BLUE_SIZE, &value);
279 printf ("SDL_GL_BLUE_SIZE: requested %d, got %d\n", rgb_size[2], value);
280 SDL_GL_GetAttribute (SDL_GL_DEPTH_SIZE, &value);
281 printf ("SDL_GL_DEPTH_SIZE: requested %d, got %d\n", bpp, value);
282 SDL_GL_GetAttribute (SDL_GL_DOUBLEBUFFER, &value);
283 printf ("SDL_GL_DOUBLEBUFFER: requested 1, got %d\n", value);
284
285 if (fsaa)
286 {
287 SDL_GL_GetAttribute (SDL_GL_MULTISAMPLEBUFFERS, &value);
288 printf ("SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
289 SDL_GL_GetAttribute (SDL_GL_MULTISAMPLESAMPLES, &value);
290 printf ("SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
291 value);
292 }
293
294 /* Set the window manager title bar */
295 SDL_WM_SetCaption ("libgender rendering test", "gendertest");
296
297 /* Set the gamma for the window */
298 if (gamma != 0.0)
299 SDL_SetGamma (gamma, gamma, gamma);
300
301 entity *planet = new entity (new geometry_sphere (10));
302 planet->move (vec3 (0, 0, -20));
303 planet->show ();
304
305 shader::debdebdebdebug ();//D
306
307 #if 1
308 for (int i = 0; i < 20; i++)
309 {
310 // load a entity
311 txtprt_parser p;
312 geometry *g;
313 try
314 {
315 g = p.read ("test.blasc");
316 }
317 catch (txtprt_i_exception & e)
318 {
319 cout << "ERR: " << e.msg << endl;
320 }
321
322 entity *e = new entity (g);
323 e->move (vec3 (i*5, -3, -i*10));
324 e->show ();
325 }
326
327 {
328 fisch (vec3 (0, 0, -2e9), 1e9, 8);
329 //entity *planet = new entity (new geometry_sphere (1e9));
330 //planet->move (vec3 (0, 0, -1.5e9));
331 //planet->show ();
332 }
333
334 {
335 entity *planet = new entity (new geometry_sphere (4e15));
336 planet->move (vec3 (0, 0, 1e17));
337 planet->show ();
338 }
339
340 draw_floor (10, -500, -10, -1000);
341 draw_level ();
342 //draw_test_nurb ();
343 #endif
344
345 //camera.orig.x = 108; camera.orig.y = 0; camera.orig.z = -368;
346 camera.orig.x = 0; camera.orig.y = 0; camera.orig.z = 0;
347 camera.p = point (0, 0, 10);
348 camera.d = vec3 (0, 0, -1);
349 camera.u = vec3 (0, 1, 0);
350 camera.w = w; camera.h = h;
351 camera.fov = 40.;
352
353 glEnable (GL_CULL_FACE);
354 glDisable (GL_ALPHA_TEST);
355 glDisable (GL_BLEND);
356
357 test_material test_mat;
358
359 /* Loop until done. */
360 frames = 0;
361
362 while (!done)
363 {
364 char *sdl_error;
365 SDL_Event event;
366
367 camera_angle += 180 * camera_velocity_angle * timer.diff;
368 camera_angle2 += 180 * camera_velocity_angle2 * timer.diff;
369
370 vec3 geradeaus = matrix::rotation (-camera_angle, vec3 (0, 1, 0)) * vec3 (0, 0, -1);
371 vec3 right = matrix::rotation (90., vec3 (0, 1, 0)) * geradeaus;
372
373 camera.d = matrix::rotation (camera_angle2, right) * geradeaus;
374 camera.u = cross (camera.d, right);
375
376 camera.p = camera.p - camera.d * (camera_velocity_factor * timer.diff) * camera_velocity.z;
377 camera.p = camera.p - camera.u * (camera_velocity_factor * timer.diff) * camera_velocity.y;
378
379 test_mat.enable ();
380
381 camera.begin ();
382 camera.render (view::DEPTH);
383 camera.render (view::POSTDEPTH);
384 camera.render (view::LIGHTED);
385 camera.end ();
386
387 SDL_GL_SwapBuffers ();
388 timer.frame ();
389
390 test_mat.disable ();
391
392 #if 0
393 /* Check for error conditions. */
394 gl_error = glGetError ();
395
396 if (gl_error != GL_NO_ERROR) fprintf (stderr, "testgl: OpenGL error: %d\n", gl_error);
397
398 sdl_error = SDL_GetError ();
399
400 if (sdl_error[0] != '\0')
401 {
402 fprintf (stderr, "testgl: SDL error '%s'\n", sdl_error);
403 SDL_ClearError ();
404 }
405
406 /* Allow the user to see what's happening */
407 //SDL_Delay (40);
408 #endif
409
410 /* Check if there's a pending event. */
411 while (SDL_PollEvent (&event))
412 done = HandleEvent (&event);
413
414
415 ++frames;
416 }
417
418 if (global_image)
419 {
420 SDL_FreeSurface (global_image);
421 global_image = NULL;
422 }
423 if (global_texture)
424 {
425 glDeleteTextures (1, &global_texture);
426 global_texture = 0;
427 }
428
429 /* Destroy our GL context, etc. */
430 SDL_Quit ();
431 return (0);
432 }
433 int
434 main (int argc, char *argv[])
435 {
436 int i, logo;
437 int numtests;
438 int bpp = 0;
439 int slowly;
440 float gamma = 0.0;
441 int noframe = 0;
442 int fsaa = 0;
443
444 logo = 0;
445 slowly = 0;
446 numtests = 1;
447 for (i = 1; argv[i]; ++i)
448 {
449 if (strcmp (argv[i], "-twice") == 0)
450 {
451 ++numtests;
452 }
453 if (strcmp (argv[i], "-slow") == 0)
454 {
455 slowly = 1;
456 }
457 if (strcmp (argv[i], "-bpp") == 0)
458 {
459 bpp = atoi (argv[++i]);
460 }
461 if (strcmp (argv[i], "-gamma") == 0)
462 {
463 gamma = (float) atof (argv[++i]);
464 }
465 if (strcmp (argv[i], "-noframe") == 0)
466 {
467 noframe = 1;
468 }
469 if (strcmp (argv[i], "-fsaa") == 0)
470 {
471 ++fsaa;
472 }
473 if (strncmp (argv[i], "-h", 2) == 0)
474 {
475 printf
476 ("Usage: %s [-twice] [-logo] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa]\n",
477 argv[0]);
478 exit (0);
479 }
480 }
481
482 for (i = 0; i < numtests; ++i)
483 RunGLTest (argc, argv, logo, slowly, bpp, gamma, noframe, fsaa);
484
485 return 0;
486 }