#ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_GL_GL_H # include #elif HAVE_OPENGL_GL_H # include #endif #ifdef HAVE_GL_GLU_H # include #elif HAVE_OPENGL_GLU_H # include #endif #include #include "camera.h" #include "events.h" #include "globals.h" #include "height_quantity.h" /* Called for each SDL_KEYDOWN or SDL_KEYUP event. Returns 1 if we're not stopping, else 0. */ static int handleInput(const SDL_Event *event){ int more = 1; if(event->type == SDL_KEYDOWN) if(event->key.keysym.mod & KMOD_ALT) switch(event->key.keysym.sym){ case SDLK_UP: anugavis.keys[KEY_FORWARD] = 1; break; case SDLK_DOWN: anugavis.keys[KEY_BACKWARD] = 1; break; case SDLK_LEFT: anugavis.keys[KEY_STRAFE_LEFT] = 1; break; case SDLK_RIGHT: anugavis.keys[KEY_STRAFE_RIGHT] = 1; break; default: break; } else if(event->key.keysym.mod & KMOD_SHIFT) switch(event->key.keysym.sym){ case SDLK_UP: anugavis.keys[KEY_ZOOM_IN] = 1; break; case SDLK_DOWN: anugavis.keys[KEY_ZOOM_OUT] = 1; break; default: break; } else switch(event->key.keysym.sym){ case SDLK_z: anugavis.current_frame = MAX(anugavis.current_frame - 10, 0); break; case SDLK_x: if(anugavis.current_frame > 0) anugavis.current_frame--; break; case SDLK_c: case SDLK_SPACE: anugavis.paused = !anugavis.paused; break; case SDLK_v: if(anugavis.current_frame < (signed int)anugavis.number_of_timesteps - 1) anugavis.current_frame++; break; case SDLK_b: anugavis.current_frame = MIN(anugavis.current_frame + 10, (signed int)anugavis.number_of_timesteps - 1); break; case SDLK_h: camera_home(); break; case SDLK_ESCAPE: more = 0; break; case SDLK_UP: anugavis.keys[KEY_PITCH_UP] = 1; break; case SDLK_DOWN: anugavis.keys[KEY_PITCH_DOWN] = 1; break; case SDLK_LEFT: anugavis.keys[KEY_ROTATE_LEFT] = 1; break; case SDLK_RIGHT: anugavis.keys[KEY_ROTATE_RIGHT] = 1; break; default: break; } else if(event->type == SDL_KEYUP) switch(event->key.keysym.sym){ case SDLK_UP: anugavis.keys[KEY_FORWARD] = 0; anugavis.keys[KEY_PITCH_UP] = 0; anugavis.keys[KEY_ZOOM_IN] = 0; break; case SDLK_DOWN: anugavis.keys[KEY_BACKWARD] = 0; anugavis.keys[KEY_PITCH_DOWN] = 0; anugavis.keys[KEY_ZOOM_OUT] = 0; break; case SDLK_LEFT: anugavis.keys[KEY_STRAFE_LEFT] = 0; anugavis.keys[KEY_ROTATE_LEFT] = 0; break; case SDLK_RIGHT: anugavis.keys[KEY_STRAFE_RIGHT] = 0; anugavis.keys[KEY_ROTATE_RIGHT] = 0; break; default: break; } return more; } int AnugaVis_Step(void){ static Uint32 ticks = 0; static Uint32 lastframe; GLfloat lightpos[4]; int i; SDL_Event event; int more = 1; struct height_quantity_simple *height; /* Animation. */ if(ticks == 0) lastframe = ticks = SDL_GetTicks(); else ticks = SDL_GetTicks(); if(ticks - lastframe < TARGET_FRAME_RATE) return more; lastframe = ticks; if(anugavis.current_frame < (signed int)anugavis.number_of_timesteps - 1){ if(!anugavis.paused) anugavis.current_frame++; }else anugavis.paused = 1; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if(anugavis.keys[KEY_ROTATE_LEFT]) camera_yaw(-CAMERA_YAW_STEP); if(anugavis.keys[KEY_ROTATE_RIGHT]) camera_yaw(CAMERA_YAW_STEP); if(anugavis.keys[KEY_PITCH_UP]) camera_pitch(CAMERA_PITCH_STEP); if(anugavis.keys[KEY_PITCH_DOWN]) camera_pitch(-CAMERA_PITCH_STEP); if(anugavis.keys[KEY_FORWARD]) camera_track(-CAMERA_TRACK_STEP * anugavis.diagonal); if(anugavis.keys[KEY_BACKWARD]) camera_track(CAMERA_TRACK_STEP * anugavis.diagonal); if(anugavis.keys[KEY_STRAFE_LEFT]) camera_strafe(CAMERA_STRAFE_STEP * anugavis.diagonal); if(anugavis.keys[KEY_STRAFE_RIGHT]) camera_strafe(-CAMERA_STRAFE_STEP * anugavis.diagonal); if(anugavis.keys[KEY_ZOOM_IN]) camera_zoom(CAMERA_ZOOM_STEP * anugavis.diagonal); if(anugavis.keys[KEY_ZOOM_OUT]) camera_zoom(-CAMERA_ZOOM_STEP * anugavis.diagonal); gluLookAt(anugavis.eye[0], anugavis.eye[1], anugavis.eye[2], anugavis.focus[0], anugavis.focus[1], anugavis.focus[2], 0, 0, 1); for(i = 0 ; i < 3 ; i++) lightpos[i] = anugavis.eye[i]; lightpos[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, lightpos); for(height = anugavis.heights ; height != NULL ; height = height->next) AnugaVis_DrawHeightQuantity(height); SDL_GL_SwapBuffers(); while(SDL_PollEvent(&event)) if(event.type == SDL_QUIT) more = 0; else if((event.type == SDL_KEYDOWN) || (event.type == SDL_KEYUP)) more = handleInput(&event); return more; } void AnugaVis_Run(void){ while(AnugaVis_Step()); }