[5261] | 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 |
---|
[5271] | 10 | #ifdef HAVE_GL_GLU_H |
---|
| 11 | # include <GL/glu.h> |
---|
| 12 | #elif HAVE_OPENGL_GLU_H |
---|
| 13 | # include <OpenGL/glu.h> |
---|
| 14 | #endif |
---|
[5261] | 15 | #include <SDL.h> |
---|
[5292] | 16 | #include "camera.h" |
---|
[5261] | 17 | #include "events.h" |
---|
| 18 | #include "globals.h" |
---|
[5271] | 19 | #include "height_quantity.h" |
---|
[5261] | 20 | |
---|
[5379] | 21 | /* Called for each SDL_KEYDOWN or SDL_KEYUP event. Returns 1 if we're not stopping, else 0. */ |
---|
| 22 | static int handleInput(const SDL_Event *event){ |
---|
| 23 | int more = 1; |
---|
| 24 | if(event->type == SDL_KEYDOWN) |
---|
| 25 | if(event->key.keysym.mod & KMOD_ALT) |
---|
| 26 | switch(event->key.keysym.sym){ |
---|
| 27 | case SDLK_UP: anugavis.keys[KEY_FORWARD] = 1; break; |
---|
| 28 | case SDLK_DOWN: anugavis.keys[KEY_BACKWARD] = 1; break; |
---|
| 29 | case SDLK_LEFT: anugavis.keys[KEY_STRAFE_LEFT] = 1; break; |
---|
| 30 | case SDLK_RIGHT: anugavis.keys[KEY_STRAFE_RIGHT] = 1; break; |
---|
| 31 | default: break; |
---|
| 32 | } |
---|
| 33 | else if(event->key.keysym.mod & KMOD_SHIFT) switch(event->key.keysym.sym){ |
---|
| 34 | case SDLK_UP: anugavis.keys[KEY_ZOOM_IN] = 1; break; |
---|
| 35 | case SDLK_DOWN: anugavis.keys[KEY_ZOOM_OUT] = 1; break; |
---|
| 36 | default: break; |
---|
| 37 | } |
---|
| 38 | else switch(event->key.keysym.sym){ |
---|
| 39 | case SDLK_z: |
---|
| 40 | anugavis.current_frame = MAX(anugavis.current_frame - 10, 0); |
---|
| 41 | break; |
---|
| 42 | case SDLK_x: |
---|
| 43 | if(anugavis.current_frame > 0) anugavis.current_frame--; |
---|
| 44 | break; |
---|
| 45 | case SDLK_c: |
---|
| 46 | case SDLK_SPACE: anugavis.paused = !anugavis.paused; break; |
---|
| 47 | case SDLK_v: |
---|
| 48 | if(anugavis.current_frame < |
---|
| 49 | (signed int)anugavis.number_of_timesteps - 1) |
---|
| 50 | anugavis.current_frame++; |
---|
| 51 | break; |
---|
| 52 | case SDLK_b: |
---|
| 53 | anugavis.current_frame = MIN(anugavis.current_frame + 10, |
---|
| 54 | (signed int)anugavis.number_of_timesteps |
---|
| 55 | - 1); |
---|
| 56 | break; |
---|
[5385] | 57 | case SDLK_h: camera_home(); break; |
---|
[5379] | 58 | case SDLK_ESCAPE: more = 0; break; |
---|
| 59 | case SDLK_UP: anugavis.keys[KEY_PITCH_UP] = 1; break; |
---|
| 60 | case SDLK_DOWN: anugavis.keys[KEY_PITCH_DOWN] = 1; break; |
---|
| 61 | case SDLK_LEFT: anugavis.keys[KEY_ROTATE_LEFT] = 1; break; |
---|
| 62 | case SDLK_RIGHT: anugavis.keys[KEY_ROTATE_RIGHT] = 1; break; |
---|
| 63 | default: break; |
---|
| 64 | } |
---|
| 65 | else if(event->type == SDL_KEYUP) switch(event->key.keysym.sym){ |
---|
| 66 | case SDLK_UP: |
---|
| 67 | anugavis.keys[KEY_FORWARD] = 0; |
---|
| 68 | anugavis.keys[KEY_PITCH_UP] = 0; |
---|
| 69 | anugavis.keys[KEY_ZOOM_IN] = 0; |
---|
| 70 | break; |
---|
| 71 | case SDLK_DOWN: |
---|
| 72 | anugavis.keys[KEY_BACKWARD] = 0; |
---|
| 73 | anugavis.keys[KEY_PITCH_DOWN] = 0; |
---|
| 74 | anugavis.keys[KEY_ZOOM_OUT] = 0; |
---|
| 75 | break; |
---|
| 76 | case SDLK_LEFT: |
---|
| 77 | anugavis.keys[KEY_STRAFE_LEFT] = 0; |
---|
| 78 | anugavis.keys[KEY_ROTATE_LEFT] = 0; |
---|
| 79 | break; |
---|
| 80 | case SDLK_RIGHT: |
---|
| 81 | anugavis.keys[KEY_STRAFE_RIGHT] = 0; |
---|
| 82 | anugavis.keys[KEY_ROTATE_RIGHT] = 0; |
---|
| 83 | break; |
---|
| 84 | default: break; |
---|
| 85 | } |
---|
| 86 | return more; |
---|
| 87 | } |
---|
| 88 | |
---|
[5261] | 89 | int AnugaVis_Step(void){ |
---|
[5339] | 90 | static Uint32 ticks = 0; |
---|
| 91 | static Uint32 lastframe; |
---|
[5292] | 92 | GLfloat lightpos[4]; |
---|
| 93 | int i; |
---|
[5261] | 94 | SDL_Event event; |
---|
| 95 | int more = 1; |
---|
[5271] | 96 | struct height_quantity_simple *height; |
---|
[5261] | 97 | |
---|
[5339] | 98 | /* Animation. */ |
---|
| 99 | if(ticks == 0) lastframe = ticks = SDL_GetTicks(); |
---|
| 100 | else ticks = SDL_GetTicks(); |
---|
[5383] | 101 | if(ticks - lastframe < TARGET_FRAME_RATE) return more; |
---|
[5339] | 102 | |
---|
[5383] | 103 | lastframe = ticks; |
---|
| 104 | if(anugavis.current_frame < (signed int)anugavis.number_of_timesteps - 1){ |
---|
| 105 | if(!anugavis.paused) anugavis.current_frame++; |
---|
| 106 | }else |
---|
| 107 | anugavis.paused = 1; |
---|
| 108 | |
---|
[5261] | 109 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
---|
[5271] | 110 | glMatrixMode(GL_MODELVIEW); |
---|
| 111 | glLoadIdentity(); |
---|
[5330] | 112 | if(anugavis.keys[KEY_ROTATE_LEFT]) camera_yaw(-CAMERA_YAW_STEP); |
---|
| 113 | if(anugavis.keys[KEY_ROTATE_RIGHT]) camera_yaw(CAMERA_YAW_STEP); |
---|
| 114 | if(anugavis.keys[KEY_PITCH_UP]) camera_pitch(CAMERA_PITCH_STEP); |
---|
| 115 | if(anugavis.keys[KEY_PITCH_DOWN]) camera_pitch(-CAMERA_PITCH_STEP); |
---|
[5384] | 116 | if(anugavis.keys[KEY_FORWARD]) camera_track(-CAMERA_TRACK_STEP * |
---|
| 117 | anugavis.diagonal); |
---|
| 118 | if(anugavis.keys[KEY_BACKWARD]) camera_track(CAMERA_TRACK_STEP * |
---|
| 119 | anugavis.diagonal); |
---|
| 120 | if(anugavis.keys[KEY_STRAFE_LEFT]) camera_strafe(CAMERA_STRAFE_STEP * |
---|
| 121 | anugavis.diagonal); |
---|
| 122 | if(anugavis.keys[KEY_STRAFE_RIGHT]) camera_strafe(-CAMERA_STRAFE_STEP * |
---|
| 123 | anugavis.diagonal); |
---|
| 124 | if(anugavis.keys[KEY_ZOOM_IN]) camera_zoom(CAMERA_ZOOM_STEP * |
---|
| 125 | anugavis.diagonal); |
---|
| 126 | if(anugavis.keys[KEY_ZOOM_OUT]) camera_zoom(-CAMERA_ZOOM_STEP * |
---|
| 127 | anugavis.diagonal); |
---|
[5271] | 128 | gluLookAt(anugavis.eye[0], anugavis.eye[1], anugavis.eye[2], |
---|
| 129 | anugavis.focus[0], anugavis.focus[1], anugavis.focus[2], |
---|
| 130 | 0, 0, 1); |
---|
[5292] | 131 | for(i = 0 ; i < 3 ; i++) lightpos[i] = anugavis.eye[i]; |
---|
| 132 | lightpos[3] = 1.0; |
---|
| 133 | glLightfv(GL_LIGHT0, GL_POSITION, lightpos); |
---|
[5271] | 134 | for(height = anugavis.heights ; height != NULL ; height = height->next) |
---|
| 135 | AnugaVis_DrawHeightQuantity(height); |
---|
[5261] | 136 | SDL_GL_SwapBuffers(); |
---|
[5379] | 137 | |
---|
[5261] | 138 | while(SDL_PollEvent(&event)) |
---|
[5330] | 139 | if(event.type == SDL_QUIT) more = 0; |
---|
[5379] | 140 | else if((event.type == SDL_KEYDOWN) || (event.type == SDL_KEYUP)) more = handleInput(&event); |
---|
[5261] | 141 | return more; |
---|
| 142 | } |
---|
| 143 | |
---|
| 144 | void AnugaVis_Run(void){ |
---|
| 145 | while(AnugaVis_Step()); |
---|
| 146 | } |
---|