diff options
Diffstat (limited to 'src/client/camera.cc')
-rw-r--r-- | src/client/camera.cc | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/client/camera.cc b/src/client/camera.cc new file mode 100644 index 0000000..ca60d18 --- /dev/null +++ b/src/client/camera.cc @@ -0,0 +1,107 @@ +/* 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) +{ + // adjust yaw target + float yaw_target = game::ship.yaw - yaw_offset; + 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::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 = degreesf( pitch_offset + offset_inc); + } +} + +void rotate_down() +{ + if (mode == Free ) { + pitch_offset = degreesf( pitch_offset - offset_inc); + } +} + +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 |