From cffe02f49b66a70d40816ffc8dea42f9e52da57f Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 28 Feb 2015 20:46:53 +0000 Subject: Reimplemented camera handling enabling 360-degree freelook. --- src/client/input.cc | 185 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 118 insertions(+), 67 deletions(-) (limited to 'src/client/input.cc') diff --git a/src/client/input.cc b/src/client/input.cc index 72fa5af..dadc027 100644 --- a/src/client/input.cc +++ b/src/client/input.cc @@ -139,9 +139,6 @@ void func_ui_control(std::string const &args) local_direction = 0.0f; local_pitch = 0.0f; local_roll = 0.0f; - - render::Camera::set_direction(0.0f); - render::Camera::set_pitch(0.0f); } con_print << "mouse control is " << ((input_mousecontrol->value()) ? "on" : "off") << std::endl; @@ -152,7 +149,7 @@ void func_ui_control(std::string const &args) void func_view_next(std::string const &args) { if (!core::localplayer()->view() && core::application()->connected() && core::localcontrol()) { - render::Camera::view_next(); + render::camera().cycle_mode_next(); local_roll = 0; local_pitch = 0; local_direction = 0; @@ -163,7 +160,7 @@ void func_view_next(std::string const &args) void func_view_prev(std::string const &args) { if (!core::localplayer()->view() && core::application()->connected() && core::localcontrol()) { - render::Camera::view_previous(); + render::camera().cycle_mode_previous(); local_roll = 0; local_pitch = 0; local_direction = 0; @@ -348,7 +345,8 @@ void shutdown() void action_press(Key *key) { - switch(key->action()->id()) { + switch(key->action()->id()) + { case Action::None: case Action::Console: return; @@ -411,60 +409,95 @@ void action_press(Key *key) /* -- camera control ------------------------------ */ + case Action::FreeLook: + if (!freelook_control_override) + { + freelook_control_override = true; + freelook_control_override_time = key->pressed(); + + freelook_control_x = mouse_x; + freelook_control_y = mouse_y; + } + break; case Action::LookLeft: - if (render::Camera::mode() == render::Camera::Free) + if (render::camera().mode() == render::Camera::Free) { - render::Camera::set_direction(math::min(key->pressed() - core::application()->time(), 1.0f)); - } else { - render::Camera::set_direction(-math::min(key->pressed() - core::application()->time(), 1.0f)); + render::camera().set_movement_direction(-1.0f); + } + else if ((render::camera().mode() == render::Camera::Track) || (render::camera().mode() == render::Camera::Cockpit)) + { + render::camera().set_freelook_direction(90.0f); } break; case Action::LookRight: - if (render::Camera::mode() == render::Camera::Free) + if (render::camera().mode() == render::Camera::Free) { - render::Camera::set_direction(-math::min(key->pressed() - core::application()->time(), 1.0f)); - } else { - render::Camera::set_direction(math::min(key->pressed() - core::application()->time(), 1.0f)); + render::camera().set_movement_direction(1.0f); + } + else if ((render::camera().mode() == render::Camera::Track) || (render::camera().mode() == render::Camera::Cockpit)) + { + render::camera().set_freelook_direction(-90.0f); } break; case Action::LookUp: - if (render::Camera::mode() == render::Camera::Free) + if (render::camera().mode() == render::Camera::Free) { - render::Camera::set_pitch(math::min(key->pressed() - core::application()->time(), 1.0f)); - } else { - render::Camera::set_pitch(-math::min(key->pressed() - core::application()->time(), 1.0f)); + render::camera().set_movement_pitch(1.0f); + } + else if ((render::camera().mode() == render::Camera::Track) || (render::camera().mode() == render::Camera::Cockpit)) + { + render::camera().set_freelook_pitch(90.0f); } break; case Action::LookDown: - if (render::Camera::mode() == render::Camera::Free) + if (render::camera().mode() == render::Camera::Free) { - render::Camera::set_pitch(-math::min(key->pressed() - core::application()->time(), 1.0f)); - } else { - render::Camera::set_pitch(math::min(key->pressed() - core::application()->time(), 1.0f)); + render::camera().set_movement_pitch(-1.0f); + } + else if ((render::camera().mode() == render::Camera::Track) || (render::camera().mode() == render::Camera::Cockpit)) + { + render::camera().set_freelook_pitch(-90.0f); } break; case Action::ZoomIn: - render::Camera::set_zoom(-0.1f); + if (!core::localplayer()->view()) + { + float m = render::camera().multiplier(); + if (m > 1.0f) + { + m -= 0.1f; + } + else + { + m = 1.0f; + } + render::camera().set_multiplier(m); + } break; case Action::ZoomOut: - render::Camera::set_zoom(+0.1f); - break; - case Action::FreeLook: - if (!freelook_control_override) + if (!core::localplayer()->view()) { - freelook_control_override = true; - freelook_control_override_time = key->pressed(); - - freelook_control_x = mouse_x; - freelook_control_y = mouse_y; + float m = render::camera().multiplier(); + if (m < 5.0f) + { + m += 0.1f; + } + else + { + m = 5.0f; + } + render::camera().set_multiplier(m); } break; - + /* -- fire control -------------------------------- */ case Action::Fire: local_controlflags = local_controlflags | core::EntityControlable::ControlFlagFire; break; + + default: + break; } } @@ -531,15 +564,15 @@ void action_release(Key *key) mouse_control_override_time = 0.0f; if (!input_mousecontrol->value() || (joystick_control && mouse_control && - (render::Camera::mode() == render::Camera::Track || render::Camera::mode() == render::Camera::Cockpit))) { + (render::camera().mode() == render::Camera::Track || render::camera().mode() == render::Camera::Cockpit))) { local_direction = 0.0f; local_pitch = 0.0f; local_roll = 0.0f; local_vstrafe = 0.0f; local_strafe = 0.0f; - render::Camera::set_direction(0.0f); - render::Camera::set_pitch(0.0f); + render::camera().set_movement_direction(0.0f); + render::camera().set_movement_pitch(0.0f); } } break; @@ -547,16 +580,26 @@ void action_release(Key *key) /* -- camera control ------------------------------ */ case Action::LookLeft: - render::Camera::set_direction(0.0f); - break; case Action::LookRight: - render::Camera::set_direction(0.0f); + if (render::camera().mode() == render::Camera::Free) + { + render::camera().set_movement_direction(0.0f); + } + else if ((render::camera().mode() == render::Camera::Track) || (render::camera().mode() == render::Camera::Cockpit)) + { + render::camera().set_freelook_direction(0.0f); + } break; case Action::LookUp: - render::Camera::set_pitch(0.0f); - break; case Action::LookDown: - render::Camera::set_pitch(0.0f); + if (render::camera().mode() == render::Camera::Free) + { + render::camera().set_movement_pitch(0.0f); + } + else if ((render::camera().mode() == render::Camera::Track) || (render::camera().mode() == render::Camera::Cockpit)) + { + render::camera().set_freelook_pitch(0.0f); + } break; case Action::ZoomIn: break; @@ -568,8 +611,8 @@ void action_release(Key *key) freelook_control_override = false; freelook_control_override_time = 0.0f; - render::Camera::set_direction(0.0f); - render::Camera::set_pitch(0.0f); + render::camera().set_freelook_direction(0.0f); + render::camera().set_freelook_pitch(0.0f); } break; @@ -601,8 +644,8 @@ bool console_key_pressed(const Key *key) local_pitch = 0.0f; local_roll = 0.0f; - render::Camera::set_direction(0.0f); - render::Camera::set_pitch(0.0f); + //render::Camera::set_direction(0.0f); + //render::Camera::set_pitch(0.0f); ui::console()->toggle(); return true; @@ -737,7 +780,7 @@ void reset() mouse_direction = 0.0f; mouse_x = render::State::width() / 2; mouse_y = render::State::height() / 2; - render::Camera::reset(); + render::camera().reset(); render::Dust::reset(); mouse_control_override = false; mouse_control_override_time = 0.0f; @@ -951,18 +994,23 @@ void frame() // if freelook_control is true, the mouse controls freelook freelook_control = ui::console()->hidden() && freelook_control_override && (freelook_control_override_time + (input_mousedelay->value() / 1000.0f) < core::application()->time()); - // if mouse control is true, the mouse controls the spacecraft - mouse_control = ui::console()->hidden() && ((input_mousecontrol->value() > 0) || (mouse_control_override && (mouse_control_override_time + (input_mousedelay->value() / 1000.0f) < core::application()->time()) )); + if (!freelook_control) + { + // if mouse control is true, the mouse controls the spacecraft + mouse_control = ui::console()->hidden() && ((input_mousecontrol->value() > 0) || (mouse_control_override && (mouse_control_override_time + (input_mousedelay->value() / 1000.0f) < core::application()->time()) )); - // joystick control takes presedence over mouse control, but not over mouse_control_override - if (mouse_control && joystick_control && ((render::Camera::mode() == render::Camera::Track) || (render::Camera::mode() == render::Camera::Cockpit))) { - if (!(mouse_control_override && (mouse_control_override_time + (input_mousedelay->value() / 1000.0f) < core::application()->time()))) { - mouse_control = false; + // joystick control takes presedence over mouse control, but not over mouse_control_override + if (mouse_control && joystick_control && ((render::camera().mode() == render::Camera::Track) || (render::camera().mode() == render::Camera::Cockpit))) + { + if (!(mouse_control_override && (mouse_control_override_time + (input_mousedelay->value() / 1000.0f) < core::application()->time()))) + { + mouse_control = false; + } } } if (mouse_control || freelook_control ) { - const float aim_square_size = 256.0f; + const float aim_square_size = math::min(render::State::width(), render::State::height()) * 0.5f; int l = mouse_x; int h = mouse_y; @@ -991,7 +1039,7 @@ void frame() if (freelook_control) { // mouse is controling freelook - switch (render::Camera::mode()) + switch (render::camera().mode()) { case render::Camera::Track: case render::Camera::Cockpit: @@ -1007,14 +1055,18 @@ void frame() // disable autopilot override local_controlflags = local_controlflags & ~core::EntityControlable::ControlFlagOverride; } - render::Camera::set_direction(mouse_direction); - render::Camera::set_pitch(mouse_pitch); + + render::camera().set_freelook_direction(180.0f * mouse_direction); + render::camera().set_freelook_pitch(90.0f * mouse_pitch); break; case render::Camera::Free: - render::Camera::set_direction(-mouse_direction * math::absf(mouse_direction)); - render::Camera::set_pitch(-mouse_pitch * math::absf(mouse_pitch)); + render::camera().set_movement_direction(0.0f); + render::camera().set_movement_pitch(0.0f); + + render::camera().set_freelook_direction(180.0f * mouse_direction); + render::camera().set_freelook_pitch(90.0f * mouse_pitch); // disable autopilot override local_controlflags = local_controlflags & ~core::EntityControlable::ControlFlagOverride; @@ -1027,7 +1079,7 @@ void frame() } else if (mouse_control) { // mouse is controling direction - switch (render::Camera::mode()) + switch (render::camera().mode()) { case render::Camera::Track: case render::Camera::Cockpit: @@ -1039,8 +1091,8 @@ void frame() break; case render::Camera::Free: - render::Camera::set_direction(-mouse_direction * math::absf(mouse_direction)); - render::Camera::set_pitch(-mouse_pitch * math::absf(mouse_pitch)); + render::camera().set_movement_direction(mouse_direction); + render::camera().set_movement_pitch(mouse_pitch); // disable autopilot override local_controlflags = local_controlflags & ~core::EntityControlable::ControlFlagOverride; @@ -1053,11 +1105,10 @@ void frame() } } else { - //render::Camera::set_direction(0.0f); - //render::Camera::set_pitch(0.0f); - // disable autopilot override local_controlflags = local_controlflags & ~core::EntityControlable::ControlFlagOverride; + render::camera().set_movement_direction(0.0f); + render::camera().set_movement_pitch(0.0f); } math::clamp(local_direction, -1.0f, 1.0f); @@ -1089,8 +1140,8 @@ void frame() local_afterburner = 0.0f; local_controlflags = core::EntityControlable::ControlFlagNone; - render::Camera::set_direction(0.0f); - render::Camera::set_pitch(0.0f); + //render::Camera::set_direction(0.0f); + //render::Camera::set_pitch(0.0f); } } -- cgit v1.2.3