/* camera.cc This file is part of the Osirion project and is distributed under the terms and conditions of the GNU General Public License version 2 */ #include "common/functions.h" #include "common/osirion.h" #include "game/game.h" #include "gl/osiriongl.h" namespace camera { enum Mode {Free, Track}; Mode mode = Track; const float track_pitch = 15.0f; // default tracking pitch const float offset_inc = 5.0f; // default offset increment float yaw = 90; // current yaw, angle in XZ plane float yaw_offset = 0; // target offset, relative to target yaw float pitch = -90; // current pitch, angle in XY float pitch_offset = track_pitch; // target offset, relative to target pitch float distance = 2.0f; // distance from the eye to the target void draw(float elapsed) { float yaw_target; if (mode == Track) { // track the target yaw_target = game::ship.yaw - yaw_offset; } else { yaw_target = - yaw_offset; } // adjust yaw float d = degreesf(yaw - yaw_target); yaw = degreesf( yaw - d * elapsed) ; // adjust pitch target float pitch_target = 0.0f - pitch_offset; d = degreesf(pitch - pitch_target); pitch = degreesf( pitch - d *elapsed); /* gl::translate(distance, 0.0, 0.0); gl::rotate(-pitch,0, 0, 1.0 ); gl::rotate(-yaw, 0, 1.0f, 0); */ switch (mode) { case Free: gl::translate(1+distance * GAMESCALE, 0.0f, 0.0f); gl::rotate(-pitch, 0, 0, 1.0f); gl::rotate(-yaw, 0, 1.0f, 0); break; case Track: //gl::translate(1+distance* GAMESCALE, -0.5f* GAMESCALE, 0.0f); gl::translate(1+ 2* GAMESCALE, -0.5f* GAMESCALE, 0.0f); gl::rotate(-pitch, 0, 0, 1.0f); gl::rotate(-yaw, 0, 1.0f, 0); break; default: break; } } void rotate_right() { if (mode == Free ) { yaw_offset = degreesf( yaw_offset - offset_inc); } } void rotate_left() { if (mode == Free ) { yaw_offset = degreesf( yaw_offset + offset_inc); } } void rotate_up() { if (mode == Free ) { pitch_offset = pitch_offset + offset_inc; if (pitch_offset > 90.0f) pitch_offset = 90.0f; } } void rotate_down() { if (mode == Free ) { pitch_offset = pitch_offset - offset_inc; if (pitch_offset < -90.0f) pitch_offset = -90.0f; } } void nextmode() { switch(mode) { case Free: mode = Track; yaw_offset = 0; yaw = game::ship.yaw; pitch_offset = track_pitch; break; case Track: mode = Free; yaw_offset = 0; break; default: break; } } } //namespace camera