Keep mouse inside 3D viewport rotation widget

Hide and keep the mouse in place when the user oribts the scene via the 3D
rotation widget.
This commit is contained in:
JFonS 2020-04-28 16:41:01 +02:00
parent b62218bbac
commit 051f02a3a0
2 changed files with 11 additions and 3 deletions

View File

@ -51,7 +51,6 @@
#include "scene/gui/subviewport_container.h" #include "scene/gui/subviewport_container.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
#include "scene/resources/surface_tool.h" #include "scene/resources/surface_tool.h"
#include "servers/display_server.h"
#define DISTANCE_DEFAULT 4 #define DISTANCE_DEFAULT 4
@ -196,12 +195,20 @@ void ViewportRotationControl::_gui_input(Ref<InputEvent> p_event) {
_update_focus(); _update_focus();
} }
orbiting = false; orbiting = false;
if (Input::get_singleton()->get_mouse_mode() == Input::MOUSE_MODE_CAPTURED) {
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
Input::get_singleton()->warp_mouse_position(orbiting_mouse_start);
}
} }
} }
const Ref<InputEventMouseMotion> mm = p_event; const Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid()) { if (mm.is_valid()) {
if (orbiting) { if (orbiting) {
if (Input::get_singleton()->get_mouse_mode() == Input::MOUSE_MODE_VISIBLE) {
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
orbiting_mouse_start = mm->get_global_position();
}
viewport->_nav_orbit(mm, viewport->_get_warped_mouse_motion(mm)); viewport->_nav_orbit(mm, viewport->_get_warped_mouse_motion(mm));
focused_axis = -1; focused_axis = -1;
} else { } else {
@ -2210,14 +2217,14 @@ void Node3DEditorViewport::set_freelook_active(bool active_now) {
} }
// Hide mouse like in an FPS (warping doesn't work) // Hide mouse like in an FPS (warping doesn't work)
DisplayServer::get_singleton()->mouse_set_mode(DisplayServer::MOUSE_MODE_CAPTURED); Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
} else if (freelook_active && !active_now) { } else if (freelook_active && !active_now) {
// Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential // Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential
cursor = camera_cursor; cursor = camera_cursor;
// Restore mouse // Restore mouse
DisplayServer::get_singleton()->mouse_set_mode(DisplayServer::MOUSE_MODE_VISIBLE); Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
} }
freelook_active = active_now; freelook_active = active_now;

View File

@ -158,6 +158,7 @@ class ViewportRotationControl : public Control {
Node3DEditorViewport *viewport = nullptr; Node3DEditorViewport *viewport = nullptr;
Vector<Color> axis_colors; Vector<Color> axis_colors;
Vector<int> axis_menu_options; Vector<int> axis_menu_options;
Vector2i orbiting_mouse_start;
bool orbiting = false; bool orbiting = false;
int focused_axis = -2; int focused_axis = -2;