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

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

Fixed frame controls

File size: 4.0 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
24int 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
125void AnugaVis_Run(void){
126  while(AnugaVis_Step());
127}
Note: See TracBrowser for help on using the repository browser.