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

Last change on this file since 5379 was 5379, checked in by jack, 15 years ago

Got camera zoom working.

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