source: anuga_work/development/anugavis/src/events.c @ 5487

Last change on this file since 5487 was 5385, checked in by jack, 16 years ago

Added 'h' to warp the camera back home.

File size: 4.9 KB
Line 
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/* Called for each SDL_KEYDOWN or SDL_KEYUP event. Returns 1 if we're not stopping, else 0. */
22static 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;
57      case SDLK_h: camera_home(); break;
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
89int AnugaVis_Step(void){
90  static Uint32 ticks = 0;
91  static Uint32 lastframe;
92  GLfloat lightpos[4];
93  int i;
94  SDL_Event event;
95  int more = 1;
96  struct height_quantity_simple *height;
97
98  /* Animation. */
99  if(ticks == 0) lastframe = ticks = SDL_GetTicks();
100  else ticks = SDL_GetTicks();
101  if(ticks - lastframe < TARGET_FRAME_RATE) return more;
102
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
109  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
110  glMatrixMode(GL_MODELVIEW);
111  glLoadIdentity();
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);
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);
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);
131  for(i = 0 ; i < 3 ; i++) lightpos[i] = anugavis.eye[i];
132  lightpos[3] = 1.0;
133  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
134  for(height = anugavis.heights ; height != NULL ; height = height->next)
135    AnugaVis_DrawHeightQuantity(height);
136  SDL_GL_SwapBuffers();
137
138  while(SDL_PollEvent(&event))
139    if(event.type == SDL_QUIT) more = 0;
140    else if((event.type == SDL_KEYDOWN) || (event.type == SDL_KEYUP)) more = handleInput(&event);
141  return more;
142}
143
144void AnugaVis_Run(void){
145  while(AnugaVis_Step());
146}
Note: See TracBrowser for help on using the repository browser.