Changeset 5379


Ignore:
Timestamp:
May 29, 2008, 11:10:25 AM (16 years ago)
Author:
jack
Message:

Got camera zoom working.

Location:
anuga_work/development/anugavis/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • anuga_work/development/anugavis/src/Makefile.am

    r5378 r5379  
    1717                        netcdf_util.c \
    1818                        netcdf_util.h \
    19                         vector.c \
     19                        vector.h \
    2020                        xfunctions.c \
    2121                        xfunctions.h
     
    2626anugavis_simple_SOURCES = anugavis_simple.c
    2727anugavis_simple_CFLAGS = @SDL_CFLAGS@ @GLU_CFLAGS@
    28 anugavis_simple_LDADD = libanugavis.a -lm @SDL_LIBS@ @GLU_LIBS@
     28anugavis_simple_LDADD = libanugavis.a @SDL_LIBS@ @GLU_LIBS@
  • anuga_work/development/anugavis/src/camera.c

    r5339 r5379  
    8080  vadd(anugavis.focus, dir, anugavis.focus);
    8181}
     82
     83void camera_zoom(float dist){
     84  vector releye;
     85  float len;
     86  vsub(anugavis.focus, anugavis.eye, releye);
     87  if((len = vlen(releye)) < dist) return;
     88  vscale(releye, dist/len, releye);
     89  vadd(anugavis.eye, releye, anugavis.eye);
     90}
  • anuga_work/development/anugavis/src/camera.h

    r5339 r5379  
    22#define CAMERA_H
    33
     4/* FIXME camera steps will need to depend on extents. */
    45#define CAMERA_YAW_STEP 0.1
    56#define CAMERA_PITCH_STEP 0.1
    67#define CAMERA_TRACK_STEP 2.0
    78#define CAMERA_STRAFE_STEP 2.0
     9#define CAMERA_ZOOM_STEP 2.0
    810
    911extern void camera_pitch(float theta);
     
    1113extern void camera_track(float dist);
    1214extern void camera_strafe(float dist);
     15extern void camera_zoom(float dist);
    1316
    1417#endif
  • anuga_work/development/anugavis/src/events.c

    r5339 r5379  
    2222#define MAX(a, b) ((a) > (b) ? (a) : (b))
    2323
     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
    2491int AnugaVis_Step(void){
    2592  static Uint32 ticks = 0;
     
    3299
    33100  /* Animation. */
    34   /* FIXME needs to respect pause. */
    35101  if(ticks == 0) lastframe = ticks = SDL_GetTicks();
    36102  else ticks = SDL_GetTicks();
     
    54120  if(anugavis.keys[KEY_STRAFE_LEFT]) camera_strafe(CAMERA_STRAFE_STEP);
    55121  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);
    56124  gluLookAt(anugavis.eye[0], anugavis.eye[1], anugavis.eye[2],
    57125            anugavis.focus[0], anugavis.focus[1], anugavis.focus[2],
     
    63131    AnugaVis_DrawHeightQuantity(height);
    64132  SDL_GL_SwapBuffers();
    65   /* TODO: Add support for moving the camera. */
     133
    66134  while(SDL_PollEvent(&event))
    67135    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       }
     136    else if((event.type == SDL_KEYDOWN) || (event.type == SDL_KEYUP)) more = handleInput(&event);
    122137  return more;
    123138}
  • anuga_work/development/anugavis/src/events.h

    r5339 r5379  
    1212              KEY_PITCH_UP,
    1313              KEY_PITCH_DOWN,
     14              KEY_ZOOM_IN,
     15              KEY_ZOOM_OUT,
    1416              KEY_MAX} KEYS;
    1517
Note: See TracChangeset for help on using the changeset viewer.