1 | #ifdef HAVE_CONFIG_H |
---|
2 | # include "config.h" |
---|
3 | #endif |
---|
4 | |
---|
5 | #ifdef HAVE_GL_GL_H |
---|
6 | # include <GL/gl.h> |
---|
7 | #elif HAVE_OPENGL_GL_H |
---|
8 | # include <OpenGL/gl.h> |
---|
9 | #endif |
---|
10 | #ifdef HAVE_GL_GLU_H |
---|
11 | # include <GL/glu.h> |
---|
12 | #elif HAVE_OPENGL_GLU_H |
---|
13 | # include <OpenGL/glu.h> |
---|
14 | #endif |
---|
15 | #include <SDL.h> |
---|
16 | #include "camera.h" |
---|
17 | #include "events.h" |
---|
18 | #include "globals.h" |
---|
19 | #include "height_quantity.h" |
---|
20 | |
---|
21 | #define MIN(a, b) ((a) < (b) ? (a) : (b)) |
---|
22 | #define MAX(a, b) ((a) > (b) ? (a) : (b)) |
---|
23 | |
---|
24 | int AnugaVis_Step(void){ |
---|
25 | static Uint32 ticks = 0; |
---|
26 | static Uint32 lastframe; |
---|
27 | GLfloat lightpos[4]; |
---|
28 | int i; |
---|
29 | SDL_Event event; |
---|
30 | int more = 1; |
---|
31 | struct height_quantity_simple *height; |
---|
32 | |
---|
33 | /* Animation. */ |
---|
34 | /* FIXME needs to respect pause. */ |
---|
35 | if(ticks == 0) lastframe = ticks = SDL_GetTicks(); |
---|
36 | else ticks = SDL_GetTicks(); |
---|
37 | if(ticks - lastframe >= FRAME_INTERVAL){ |
---|
38 | lastframe = ticks; |
---|
39 | if(anugavis.current_frame < (signed int)anugavis.number_of_timesteps - 1){ |
---|
40 | if(!anugavis.paused) anugavis.current_frame++; |
---|
41 | }else |
---|
42 | anugavis.paused = 1; |
---|
43 | } |
---|
44 | |
---|
45 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
---|
46 | glMatrixMode(GL_MODELVIEW); |
---|
47 | glLoadIdentity(); |
---|
48 | if(anugavis.keys[KEY_ROTATE_LEFT]) camera_yaw(-CAMERA_YAW_STEP); |
---|
49 | if(anugavis.keys[KEY_ROTATE_RIGHT]) camera_yaw(CAMERA_YAW_STEP); |
---|
50 | if(anugavis.keys[KEY_PITCH_UP]) camera_pitch(CAMERA_PITCH_STEP); |
---|
51 | if(anugavis.keys[KEY_PITCH_DOWN]) camera_pitch(-CAMERA_PITCH_STEP); |
---|
52 | if(anugavis.keys[KEY_FORWARD]) camera_track(-CAMERA_TRACK_STEP); |
---|
53 | if(anugavis.keys[KEY_BACKWARD]) camera_track(CAMERA_TRACK_STEP); |
---|
54 | if(anugavis.keys[KEY_STRAFE_LEFT]) camera_strafe(CAMERA_STRAFE_STEP); |
---|
55 | if(anugavis.keys[KEY_STRAFE_RIGHT]) camera_strafe(-CAMERA_STRAFE_STEP); |
---|
56 | gluLookAt(anugavis.eye[0], anugavis.eye[1], anugavis.eye[2], |
---|
57 | anugavis.focus[0], anugavis.focus[1], anugavis.focus[2], |
---|
58 | 0, 0, 1); |
---|
59 | for(i = 0 ; i < 3 ; i++) lightpos[i] = anugavis.eye[i]; |
---|
60 | lightpos[3] = 1.0; |
---|
61 | glLightfv(GL_LIGHT0, GL_POSITION, lightpos); |
---|
62 | for(height = anugavis.heights ; height != NULL ; height = height->next) |
---|
63 | AnugaVis_DrawHeightQuantity(height); |
---|
64 | SDL_GL_SwapBuffers(); |
---|
65 | /* TODO: Add support for moving the camera. */ |
---|
66 | while(SDL_PollEvent(&event)) |
---|
67 | if(event.type == SDL_QUIT) more = 0; |
---|
68 | else if(event.type == SDL_KEYDOWN) |
---|
69 | if(event.key.keysym.mod & (KMOD_LALT | KMOD_RALT)) |
---|
70 | switch(event.key.keysym.sym){ |
---|
71 | case SDLK_UP: anugavis.keys[KEY_FORWARD] = 1; break; |
---|
72 | case SDLK_DOWN: anugavis.keys[KEY_BACKWARD] = 1; break; |
---|
73 | case SDLK_LEFT: anugavis.keys[KEY_STRAFE_LEFT] = 1; break; |
---|
74 | case SDLK_RIGHT: anugavis.keys[KEY_STRAFE_RIGHT] = 1; break; |
---|
75 | default: break; |
---|
76 | } |
---|
77 | else switch(event.key.keysym.sym){ |
---|
78 | case SDLK_z: |
---|
79 | anugavis.current_frame = MAX(anugavis.current_frame - 10, 0); |
---|
80 | break; |
---|
81 | case SDLK_x: |
---|
82 | if(anugavis.current_frame > 0) anugavis.current_frame--; |
---|
83 | break; |
---|
84 | case SDLK_c: |
---|
85 | case SDLK_SPACE: anugavis.paused = !anugavis.paused; break; |
---|
86 | case SDLK_v: |
---|
87 | if(anugavis.current_frame < |
---|
88 | (signed int)anugavis.number_of_timesteps - 1) |
---|
89 | anugavis.current_frame++; |
---|
90 | break; |
---|
91 | case SDLK_b: |
---|
92 | anugavis.current_frame = MIN(anugavis.current_frame + 10, |
---|
93 | (signed int)anugavis.number_of_timesteps |
---|
94 | - 1); |
---|
95 | break; |
---|
96 | case SDLK_ESCAPE: more = 0; break; |
---|
97 | case SDLK_UP: anugavis.keys[KEY_PITCH_UP] = 1; break; |
---|
98 | case SDLK_DOWN: anugavis.keys[KEY_PITCH_DOWN] = 1; break; |
---|
99 | case SDLK_LEFT: anugavis.keys[KEY_ROTATE_LEFT] = 1; break; |
---|
100 | case SDLK_RIGHT: anugavis.keys[KEY_ROTATE_RIGHT] = 1; break; |
---|
101 | default: break; |
---|
102 | } |
---|
103 | else switch(event.key.keysym.sym){ |
---|
104 | case SDLK_UP: |
---|
105 | anugavis.keys[KEY_FORWARD] = 0; |
---|
106 | anugavis.keys[KEY_PITCH_UP] = 0; |
---|
107 | break; |
---|
108 | case SDLK_DOWN: |
---|
109 | anugavis.keys[KEY_BACKWARD] = 0; |
---|
110 | anugavis.keys[KEY_PITCH_DOWN] = 0; |
---|
111 | break; |
---|
112 | case SDLK_LEFT: |
---|
113 | anugavis.keys[KEY_STRAFE_LEFT] = 0; |
---|
114 | anugavis.keys[KEY_ROTATE_LEFT] = 0; |
---|
115 | break; |
---|
116 | case SDLK_RIGHT: |
---|
117 | anugavis.keys[KEY_STRAFE_RIGHT] = 0; |
---|
118 | anugavis.keys[KEY_ROTATE_RIGHT] = 0; |
---|
119 | break; |
---|
120 | default: break; |
---|
121 | } |
---|
122 | return more; |
---|
123 | } |
---|
124 | |
---|
125 | void AnugaVis_Run(void){ |
---|
126 | while(AnugaVis_Step()); |
---|
127 | } |
---|