diff options
author | Stijn Buys <ingar@osirion.org> | 2008-05-03 14:47:12 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-05-03 14:47:12 +0000 |
commit | 5d1e18b796d41e035d0d3e828cc6db54ed21a4b6 (patch) | |
tree | d4fc3cd9dd34a5064c6b159309ca9d247081e0d8 /src/client/input.cc | |
parent | 3dedab035c98772fd9607480bddc8ffd9d7dc799 (diff) |
camera handling, Cockpit view
Diffstat (limited to 'src/client/input.cc')
-rw-r--r-- | src/client/input.cc | 124 |
1 files changed, 68 insertions, 56 deletions
diff --git a/src/client/input.cc b/src/client/input.cc index 533ea64..17ca724 100644 --- a/src/client/input.cc +++ b/src/client/input.cc @@ -25,7 +25,7 @@ namespace input { // local controls -float local_turn = 0.0f; +float local_direction = 0.0f; float local_pitch = 0.0f; float local_thrust = 0.0f; float local_roll = 0.0f; @@ -37,6 +37,9 @@ unsigned int last_control = 0; int mouse_x = 0; int mouse_y = 0; +float mouse_pitch; +float mouse_direction; + // true if the mouse is in the deadzone bool mouse_deadzone = false; @@ -63,12 +66,24 @@ void shutdown() void keyreleased(const SDL_keysym &keysym) { switch (keysym.sym) { + case SDLK_LEFT: + camera::set_direction(0.0f); + break; + case SDLK_RIGHT: + camera::set_direction(0.0f); + break; + case SDLK_UP: + camera::set_pitch(0.0f); + break; + case SDLK_DOWN: + camera::set_pitch(0.0f); + break; case SDLK_SPACE: camera::next_mode(); local_roll = 0; local_pitch = 0; - local_turn = 0; + local_direction = 0; break; case SDLK_KP8: // turn down @@ -80,11 +95,11 @@ void keyreleased(const SDL_keysym &keysym) break; case SDLK_KP4: // turn left - local_turn = 0.0f; + local_direction = 0.0f; break; case SDLK_KP6: // turn right - local_turn = 0.0f; + local_direction = 0.0f; break; case SDLK_KP_DIVIDE: // roll left @@ -107,16 +122,16 @@ void keypressed(const SDL_keysym &keysym) { switch (keysym.sym) { case SDLK_LEFT: - camera::key_left(); + camera::set_direction(1.0f); break; case SDLK_RIGHT: - camera::key_right(); + camera::set_direction(-1.0f); break; case SDLK_UP: - camera::key_up(); + camera::set_pitch(1.0f); break; case SDLK_DOWN: - camera::key_down(); + camera::set_pitch(-1.0f); break; case SDLK_KP_PLUS: @@ -136,15 +151,15 @@ void keypressed(const SDL_keysym &keysym) break; case SDLK_KP4: // left - local_turn = 1.0f; + local_direction = 1.0f; break; case SDLK_KP6: // right - local_turn = -1.0f; + local_direction = -1.0f; break; case SDLK_KP5: // level - local_turn = 0; + local_direction = 0; local_pitch = 0; local_roll = 0; break; @@ -183,7 +198,7 @@ void mousebuttonpressed(const SDL_MouseButtonEvent &button) void frame(float seconds) { if (core::localcontrol() && (last_control != core::localcontrol()->id())) { - local_turn = 0.0f; + local_direction = 0.0f; local_pitch = 0.0f; local_roll = 0.0f; local_thrust = core::localcontrol()->thrust(); @@ -249,59 +264,56 @@ void frame(float seconds) } if (!console::visible() && core::application()->connected() && core::localcontrol()) { - - if (local_thrust > 1.0f) - local_thrust = 1.0f; - else if (local_thrust < -2.0 * thruster_offset) - local_thrust = -2.0 * thruster_offset; - - if (camera::mode == camera::Track) { - if (cl_mousecontrol->value()) { - // mouse control when camera is in tracking mode - int deadzone_size = 24; - mouse_deadzone = true; - - // direction - int l = mouse_x - (video::width >> 1); - if (abs(l) < ( deadzone_size >> 1 )) { - // dead zone - local_turn = 0; - } else { - l = (mouse_x - deadzone_size) - ((video::width - deadzone_size) >> 1); - local_turn = float (-l) / (float) ((video::width - deadzone_size) >> 1); - mouse_deadzone = false; - } - - // pitch - int h = mouse_y - (video::height >> 1); - - if (abs(h) < ( deadzone_size >> 1 )) { - // dead zone - local_pitch = 0; - } else { - h = (mouse_y - deadzone_size) - ((video::height - deadzone_size) >> 1); - local_pitch = float (-h) / (float) ((video::height - deadzone_size) >> 1); - mouse_deadzone = false; - } + if (cl_mousecontrol->value()) { + // the mouse will not react if it is in the deadzone + int deadzone_size = 24; + mouse_deadzone = true; + + // direction + int l = mouse_x - (video::width >> 1); + if (abs(l) < ( deadzone_size >> 1 )) { + // dead zone + mouse_direction = 0; } else { - if (local_turn > 1.0f) - local_turn = 1.0f; - else if (local_turn < -1.0f) - local_turn = -1.0f; + l = (mouse_x - deadzone_size) - ((video::width - deadzone_size) >> 1); + mouse_direction = float (-l) / (float) ((video::width - deadzone_size) >> 1); + mouse_deadzone = false; + } - if (local_pitch > 1.0f) - local_pitch = 1.0f; - else if (local_pitch < -1.0f) - local_pitch = -1.0f; + // pitch + int h = mouse_y - (video::height >> 1); + if (abs(h) < ( deadzone_size >> 1 )) { + // dead zone + mouse_pitch = 0; + } else { + h = (mouse_y - deadzone_size) - ((video::height - deadzone_size) >> 1); + mouse_pitch = float (-h) / (float) ((video::height - deadzone_size) >> 1); mouse_deadzone = false; - } + } + + if ((camera::mode == camera::Track) || (camera::mode == camera::Cockpit)) { + local_direction = mouse_direction; + local_pitch = mouse_pitch; + } else if (camera::mode == camera::Free) { + camera::set_direction(-mouse_direction); + camera::set_pitch(-mouse_pitch); + } + + } else { + + math::clamp(local_direction, -1.0f, 1.0f); + math::clamp(local_pitch, -1.0f, 1.0f); + } + + math::clamp(local_thrust, 0.0f, 1.0f); + math::clamp(local_roll, -1.0f, 1.0f); core::localcontrol()->set_thrust(local_thrust); - core::localcontrol()->set_direction(local_turn); + core::localcontrol()->set_direction(local_direction); core::localcontrol()->set_pitch(local_pitch / video::aspect ); core::localcontrol()->set_roll(local_roll); } |