ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/test.C
(Generate patch)

Comparing libgender/test.C (file contents):
Revision 1.50 by root, Sat Oct 9 11:56:50 2004 UTC vs.
Revision 1.69 by root, Sat Oct 23 02:27:51 2004 UTC

1#include <stdlib.h> 1#include <stdlib.h>
2#include <stdio.h> 2#include <stdio.h>
3#include <string.h> 3#include <string.h>
4#include <math.h> 4#include <math.h>
5 5
6#include "opengl.h"
7
6#include "SDL.h" 8#include "SDL.h"
7#include "SDL_opengl.h" 9#include "SDL_opengl.h"
8 10
9static SDL_Surface *global_image = NULL; 11static SDL_Surface *global_image = NULL;
10static GLuint global_texture = 0; 12static GLuint global_texture = 0;
11 13
12#include "util.h" 14#include "util.h"
13#include "entity.h" 15#include "entity.h"
14#include "txtprt_import.h" 16#include "txtprt_import.h"
15 17
16CGcontext cgc;
17CGprogram vsh, fsh;
18CGparameter mv, mvp, lightpos;
19CGprofile vsh_profile, fsh_profile;
20
21static void CheckCgError (void)
22{
23 CGerror err = cgGetError ();
24
25 if (err != CG_NO_ERROR)
26 {
27 printf("CG error: %s\n", cgGetErrorString (err));
28 exit(1);
29 }
30}
31
32/**********************************************************************/ 18/**********************************************************************/
33 19
34view camera; 20view camera;
35vec3 camera_velocity; 21vec3 camera_velocity;
36float camera_angle = 0, camera_velocity_angle; 22float camera_angle, camera_angle2, camera_velocity_angle, camera_velocity_angle2;
37float camera_velocity_factor = 80; 23float camera_velocity_factor = 80;
38 24
39void 25void
40HotKey_ToggleFullScreen (void) 26HotKey_ToggleFullScreen (void)
41{ 27{
85 { 71 {
86 case SDL_ACTIVEEVENT: 72 case SDL_ACTIVEEVENT:
87 /* See what happened */ 73 /* See what happened */
88 printf ("app %s ", event->active.gain ? "gained" : "lost"); 74 printf ("app %s ", event->active.gain ? "gained" : "lost");
89 if (event->active.state & SDL_APPACTIVE) 75 if (event->active.state & SDL_APPACTIVE)
90 {
91 printf ("active "); 76 printf ("active ");
92 }
93 else if (event->active.state & SDL_APPMOUSEFOCUS) 77 else if (event->active.state & SDL_APPMOUSEFOCUS)
94 {
95 printf ("mouse "); 78 printf ("mouse ");
96 }
97 else if (event->active.state & SDL_APPINPUTFOCUS) 79 else if (event->active.state & SDL_APPINPUTFOCUS)
98 {
99 printf ("input "); 80 printf ("input ");
100 }
101 81
102 printf ("focus\n"); 82 printf ("focus\n");
103 break; 83 break;
104 84
105 case SDL_KEYDOWN: 85 case SDL_KEYDOWN:
106 if (event->key.keysym.sym == SDLK_UP) camera_velocity.z--; 86 if (event->key.keysym.sym == SDLK_UP) camera_velocity.z--;
107 if (event->key.keysym.sym == SDLK_DOWN) camera_velocity.z++; 87 if (event->key.keysym.sym == SDLK_DOWN) camera_velocity.z++;
108 if (event->key.keysym.sym == SDLK_RIGHT) camera_velocity_angle++; 88 if (event->key.keysym.sym == SDLK_RIGHT) camera_velocity_angle++;
109 if (event->key.keysym.sym == SDLK_LEFT) camera_velocity_angle--; 89 if (event->key.keysym.sym == SDLK_LEFT) camera_velocity_angle--;
90 if (event->key.keysym.sym == SDLK_PAGEUP) camera_velocity_angle2++;
91 if (event->key.keysym.sym == SDLK_PAGEDOWN) camera_velocity_angle2--;
110 if (event->key.keysym.sym == SDLK_e) camera_velocity.y--; 92 if (event->key.keysym.sym == SDLK_e) camera_velocity.y--;
111 if (event->key.keysym.sym == SDLK_q) camera_velocity.y++; 93 if (event->key.keysym.sym == SDLK_q) camera_velocity.y++;
112 if (event->key.keysym.sym == SDLK_v) camera_velocity_factor *= 1.5; 94 if (event->key.keysym.sym == SDLK_v) camera_velocity_factor *= 1.5;
113 if (event->key.keysym.sym == SDLK_b) camera_velocity_factor /= 1.5; 95 if (event->key.keysym.sym == SDLK_b) camera_velocity_factor /= 1.5;
114 96
115 if (event->key.keysym.sym == SDLK_ESCAPE) 97 if (event->key.keysym.sym == SDLK_ESCAPE)
116 done = 1; 98 done = 1;
117 99
118 if ((event->key.keysym.sym == SDLK_g) && 100 if ((event->key.keysym.sym == SDLK_g) &&
132 case SDL_KEYUP: 114 case SDL_KEYUP:
133 if (event->key.keysym.sym == SDLK_UP) camera_velocity.z++; 115 if (event->key.keysym.sym == SDLK_UP) camera_velocity.z++;
134 if (event->key.keysym.sym == SDLK_DOWN) camera_velocity.z--; 116 if (event->key.keysym.sym == SDLK_DOWN) camera_velocity.z--;
135 if (event->key.keysym.sym == SDLK_LEFT) camera_velocity_angle++; 117 if (event->key.keysym.sym == SDLK_LEFT) camera_velocity_angle++;
136 if (event->key.keysym.sym == SDLK_RIGHT) camera_velocity_angle--; 118 if (event->key.keysym.sym == SDLK_RIGHT) camera_velocity_angle--;
119 if (event->key.keysym.sym == SDLK_PAGEUP) camera_velocity_angle2--;
120 if (event->key.keysym.sym == SDLK_PAGEDOWN) camera_velocity_angle2++;
137 if (event->key.keysym.sym == SDLK_e) camera_velocity.y++; 121 if (event->key.keysym.sym == SDLK_e) camera_velocity.y++;
138 if (event->key.keysym.sym == SDLK_q) camera_velocity.y--; 122 if (event->key.keysym.sym == SDLK_q) camera_velocity.y--;
139 break; 123 break;
140 124
141 case SDL_QUIT: 125 case SDL_QUIT:
148 132
149void draw_floor (int size, int dx, int dy, int dz) 133void draw_floor (int size, int dx, int dy, int dz)
150{ 134{
151 int x, z, ry; 135 int x, z, ry;
152 136
153 for (x = 0; x < 100; x++) 137 for (x = 0; x < 10; x++)
154 { 138 {
155 for (z = 0; z < 100; z++) 139 for (z = 0; z < 10; z++)
156 { 140 {
157 vector<vertex2d> pts; 141 vector<vertex_t2f_n3f_v3f> pts;
158 pts.push_back (vertex2d (point ( 0, 0, 0), vec3 (0, 1, 0), texc (0, 0))); 142 pts.push_back (vertex_t2f_n3f_v3f (point ( 0, 0, 0), vec3 (0, 1, 0), tex2 (0, 0)));
159 pts.push_back (vertex2d (point ( 0, 0, size), vec3 (0, 1, 0), texc (0, 1))); 143 pts.push_back (vertex_t2f_n3f_v3f (point ( 0, 0, size), vec3 (0, 1, 0), tex2 (0, 1)));
160 pts.push_back (vertex2d (point (size, 0, size), vec3 (0, 1, 0), texc (1, 1))); 144 pts.push_back (vertex_t2f_n3f_v3f (point (size, 0, size), vec3 (0, 1, 0), tex2 (1, 1)));
161 pts.push_back (vertex2d (point (size, 0, 0), vec3 (0, 1, 0), texc (1, 0))); 145 pts.push_back (vertex_t2f_n3f_v3f (point (size, 0, 0), vec3 (0, 1, 0), tex2 (1, 0)));
162 146
163 geometry_quads *q = new geometry_quads; 147 geometry_quads *q = new geometry_quads;
148 q->m = new simple_material;
164 q->set (pts); 149 q->set (pts);
165 entity *e = new entity (q); 150 entity *e = new entity (q);
166 e->move (vec3 (dx + x * size, dy, dz + z * size)); 151 e->move (vec3 (dx + x * size, dy, dz + z * size));
167 e->show (); 152 e->show ();
168 } 153 }
169 } 154 }
170} 155}
171 156
172void draw_test_nurb () { 157void draw_test_nurb ()
158{
173 geometry_nurbs *q = new geometry_nurbs; 159 geometry_nurbs *q = new geometry_nurbs;
174 q->set (); 160 q->set ();
175 entity *e = new entity (q); 161 entity *e = new entity (q);
176 e->move (vec3 (10, 3, -4)); 162 e->move (vec3 (10, 3, -4));
177 e->show (); 163 e->show ();
178} 164}
179 165
166void fisch (vec3 center, GLfloat radius, int depth)
167{
168 entity *planet = new entity (new geometry_sphere (radius));
169 planet->move (center);
170 planet->show ();
171
172 if (--depth)
173 {
174 GLfloat r2 = radius * .1F;
175 GLfloat r3 = radius + r2;
176
177 fisch (center + vec3 (r3, 0, 0), r2, depth);
178 fisch (center + vec3 (0, 0, r3), r2, depth);
179 fisch (center + vec3 (-r3, 0, 0), r2, depth);
180 }
181}
182
183extern void draw_level ();
180int 184int
181RunGLTest (int argc, char *argv[], 185RunGLTest (int argc, char *argv[],
182 int logo, int slowly, int bpp, float gamma, int noframe, int fsaa) 186 int logo, int slowly, int bpp, float gamma, int noframe, int fsaa)
183{ 187{
184 int i; 188 int i;
185 int rgb_size[3]; 189 int rgb_size[3];
186 int w = 640; 190 int w = 640;
187 int h = 480; 191 int h = 480;
188 int done = 0; 192 int done = 0;
189 int frames; 193 int frames;
190 Uint32 start_time, this_time;
191 Uint32 video_flags; 194 Uint32 video_flags;
192 int value; 195 int value;
193 GLenum gl_error; 196 GLenum gl_error;
194 197
195 if (SDL_Init (SDL_INIT_VIDEO) < 0) 198 if (SDL_Init (SDL_INIT_VIDEO) < 0)
240 } 243 }
241 244
242 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, rgb_size[0]); 245 SDL_GL_SetAttribute (SDL_GL_RED_SIZE, rgb_size[0]);
243 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb_size[1]); 246 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, rgb_size[1]);
244 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, rgb_size[2]); 247 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, rgb_size[2]);
245 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 16); 248 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 24);
246 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 249 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
247 250
248 if (fsaa) 251 if (fsaa)
249 { 252 {
250 SDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS, 1); 253 SDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS, 1);
256 fprintf (stderr, "Couldn't set GL mode: %s\n", SDL_GetError ()); 259 fprintf (stderr, "Couldn't set GL mode: %s\n", SDL_GetError ());
257 SDL_Quit (); 260 SDL_Quit ();
258 exit (1); 261 exit (1);
259 } 262 }
260 263
261 printf ("Screen BPP: %d\n", SDL_GetVideoSurface ()->format->BitsPerPixel); 264 //printf ("Screen BPP: %d\n", SDL_GetVideoSurface ()->format->BitsPerPixel);
262 printf ("\n"); 265 //printf ("\n");
263 printf ("Vendor : %s\n", glGetString (GL_VENDOR)); 266 //printf ("Vendor : %s\n", glGetString (GL_VENDOR));
264 printf ("Renderer : %s\n", glGetString (GL_RENDERER)); 267 //printf ("Renderer : %s\n", glGetString (GL_RENDERER));
265 printf ("Version : %s\n", glGetString (GL_VERSION)); 268 //printf ("Version : %s\n", glGetString (GL_VERSION));
266 printf ("Extensions : %s\n", glGetString (GL_EXTENSIONS)); 269 //printf ("Extensions : %s\n", glGetString (GL_EXTENSIONS));
267 printf ("\n"); 270 printf ("\n");
268 271
269 SDL_GL_GetAttribute (SDL_GL_RED_SIZE, &value); 272 SDL_GL_GetAttribute (SDL_GL_RED_SIZE, &value);
270 printf ("SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0], value); 273 printf ("SDL_GL_RED_SIZE: requested %d, got %d\n", rgb_size[0], value);
271 SDL_GL_GetAttribute (SDL_GL_GREEN_SIZE, &value); 274 SDL_GL_GetAttribute (SDL_GL_GREEN_SIZE, &value);
291 294
292 /* Set the gamma for the window */ 295 /* Set the gamma for the window */
293 if (gamma != 0.0) 296 if (gamma != 0.0)
294 SDL_SetGamma (gamma, gamma, gamma); 297 SDL_SetGamma (gamma, gamma, gamma);
295 298
299 entity *planet = new entity (new geometry_sphere (10));
300 planet->move (vec3 (0, 0, -20));
301 planet->show ();
302
303 shader::debdebdebdebug ();//D
304
305#if 1
296 for (int i = 0; i < 1; i++) 306 for (int i = 0; i < 20; i++)
297 { 307 {
298 // load a entity 308 // load a entity
299 txtprt_parser p; 309 txtprt_parser p;
300 geometry *g; 310 geometry *g;
301 try 311 try
310 entity *e = new entity (g); 320 entity *e = new entity (g);
311 e->move (vec3 (i*5, -3, -i*10)); 321 e->move (vec3 (i*5, -3, -i*10));
312 e->show (); 322 e->show ();
313 } 323 }
314 324
325 {
326 fisch (vec3 (0, 0, -2e9), 1e9, 8);
327 //entity *planet = new entity (new geometry_sphere (1e9));
328 //planet->move (vec3 (0, 0, -1.5e9));
329 //planet->show ();
330 }
331
332 {
333 entity *planet = new entity (new geometry_sphere (4e15));
334 planet->move (vec3 (0, 0, 1e17));
335 planet->show ();
336 }
337
315 draw_floor (10, -500, -10, -1000); 338 draw_floor (10, -500, -10, -1000);
339 draw_level ();
316 draw_test_nurb (); 340 //draw_test_nurb ();
341#endif
317 342
343 //camera.orig.x = 108; camera.orig.y = 0; camera.orig.z = -368;
318 camera.orig.x = camera.orig.y = camera.orig.z = 0; 344 camera.orig.x = 0; camera.orig.y = 0; camera.orig.z = 0;
319 camera.p = point (0, 0, 10); 345 camera.p = point (0, 0, 10);
320 camera.d = vec3 (0, 0, -1); 346 camera.d = vec3 (0, 0, -1);
321 camera.u = vec3 (0, 1, 0); 347 camera.u = vec3 (0, 1, 0);
322 camera.w = w; camera.h = h; 348 camera.w = w; camera.h = h;
323 camera.fov = 35; 349 camera.fov = 40.;
324
325 glMatrixMode (GL_MODELVIEW);
326 glLoadIdentity ();
327 350
328 glEnable (GL_CULL_FACE); 351 glEnable (GL_CULL_FACE);
329 glEnable (GL_DEPTH_TEST); 352 glDisable (GL_ALPHA_TEST);
353 glDisable (GL_BLEND);
330 354
331 glShadeModel (GL_SMOOTH); 355 init_shaders ();
332 356
333 glEnable (GL_LIGHTING); 357 osama_material osa_mat;
334 glEnable (GL_LIGHT0);
335
336 cgc = cgCreateContext ();
337
338 vsh_profile = CG_PROFILE_ARBVP1;
339 //if (cgGLIsProfileSupported (CG_PROFILE_VP30)) vsh_profile = CG_PROFILE_VP30;
340 //if (cgGLIsProfileSupported (CG_PROFILE_VP40)) vsh_profile = CG_PROFILE_VP40;
341 fsh_profile = CG_PROFILE_ARBFP1;
342 //if (cgGLIsProfileSupported (CG_PROFILE_FP30)) fsh_profile = CG_PROFILE_FP30;
343 //if (cgGLIsProfileSupported (CG_PROFILE_FP40)) fsh_profile = CG_PROFILE_FP40;
344
345 vsh = cgCreateProgramFromFile (cgc, CG_SOURCE, "vsh.cg", vsh_profile, 0, 0);
346 CheckCgError ();
347 cgGLLoadProgram (vsh);
348 CheckCgError ();
349 mv = cgGetNamedParameter (vsh, "WorldProj");
350 mvp = cgGetNamedParameter (vsh, "WorldViewProj");
351 lightpos = cgGetNamedParameter (vsh, "LightPos");
352 CheckCgError ();
353
354 CGparameter g_Texture; // the texture parameter
355
356
357 fsh = cgCreateProgramFromFile (cgc, CG_SOURCE, "fsh.cg", fsh_profile, 0, 0);
358 Texture t("o.jpg");
359 g_Texture = cgGetNamedParameter(fsh, "Texture"); // the texture cg-warper ;)
360 cgGLSetTextureParameter(g_Texture, t.texture); // Bind the texture number 999 to g_Texture
361 CheckCgError ();
362 cgGLLoadProgram (fsh);
363 CheckCgError ();
364
365 cgGLBindProgram (vsh);
366 CheckCgError ();
367 cgGLBindProgram (fsh);
368 CheckCgError ();
369 358
370 /* Loop until done. */ 359 /* Loop until done. */
371 start_time = SDL_GetTicks ();
372 frames = 0; 360 frames = 0;
373 361
374 while (!done) 362 while (!done)
375 { 363 {
376 char *sdl_error; 364 char *sdl_error;
377 SDL_Event event; 365 SDL_Event event;
378 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
379 camera.p = camera.p - camera.d * (camera_velocity_factor * timer.diff) * camera_velocity.z; 376 camera.p = camera.p - camera.d * (camera_velocity_factor * timer.diff) * camera_velocity.z;
380 camera.p = camera.p - camera.u * (camera_velocity_factor * timer.diff) * camera_velocity.y; 377 camera.p = camera.p - camera.u * (camera_velocity_factor * timer.diff) * camera_velocity.y;
381 camera_angle += 30 * camera_velocity_angle * timer.diff;
382 camera.d.z = -cos (camera_angle * 12 / 180.);
383 camera.d.x = sin (camera_angle * 12 / 180.);
384 378
385 cgGLSetParameter4f (lightpos, camera.p.x, camera.p.y, camera.p.z, 1); 379 osa_mat.begin ();
386
387 glBindTexture (GL_TEXTURE_2D, t.texture);
388 cgGLEnableTextureParameter (g_Texture); // Enable the texture parameter
389
390#if 0
391 static GLfloat ry;
392 ry += 0.001;
393 camera.d.x = cos (ry);
394 camera.d.z = sin (ry);
395 //camera.d.y = sin (ry * 0.1);
396#endif
397 380
398 camera.begin (); 381 camera.begin ();
399 camera.pass (view::DEPTH); 382 camera.render (view::DEPTH);
383 camera.render (view::POSTDEPTH);
400 camera.pass (view::LIGHTED); 384 camera.render (view::LIGHTED);
401 camera.end (); 385 camera.end ();
402 386
403 SDL_GL_SwapBuffers (); 387 SDL_GL_SwapBuffers ();
404 timer.frame (); 388 timer.frame ();
405 389
390 osa_mat.end ();
391
392#if 0
406 /* Check for error conditions. */ 393 /* Check for error conditions. */
407 gl_error = glGetError (); 394 gl_error = glGetError ();
408 395
409 if (gl_error != GL_NO_ERROR) fprintf (stderr, "testgl: OpenGL error: %d\n", gl_error); 396 if (gl_error != GL_NO_ERROR) fprintf (stderr, "testgl: OpenGL error: %d\n", gl_error);
410 397
415 fprintf (stderr, "testgl: SDL error '%s'\n", sdl_error); 402 fprintf (stderr, "testgl: SDL error '%s'\n", sdl_error);
416 SDL_ClearError (); 403 SDL_ClearError ();
417 } 404 }
418 405
419 /* Allow the user to see what's happening */ 406 /* Allow the user to see what's happening */
420 //SDL_Delay (20); 407 //SDL_Delay (40);
408#endif
421 409
422 /* Check if there's a pending event. */ 410 /* Check if there's a pending event. */
423 while (SDL_PollEvent (&event)) 411 while (SDL_PollEvent (&event))
424 done = HandleEvent (&event); 412 done = HandleEvent (&event);
425 413
426 414
427 ++frames; 415 ++frames;
428 } 416 }
429 417
430 /* Print out the frames per second */
431 this_time = SDL_GetTicks ();
432 if (this_time != start_time)
433 {
434 printf ("%2.2f FPS\n",
435 ((float) frames / (this_time - start_time)) * 1000.0);
436 }
437
438 if (global_image) 418 if (global_image)
439 { 419 {
440 SDL_FreeSurface (global_image); 420 SDL_FreeSurface (global_image);
441 global_image = NULL; 421 global_image = NULL;
442 } 422 }
448 428
449 /* Destroy our GL context, etc. */ 429 /* Destroy our GL context, etc. */
450 SDL_Quit (); 430 SDL_Quit ();
451 return (0); 431 return (0);
452} 432}
453
454int 433int
455main (int argc, char *argv[]) 434main (int argc, char *argv[])
456{ 435{
457 int i, logo; 436 int i, logo;
458 int numtests; 437 int numtests;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines