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.
(cherry picked from commit 051f02a3a0
)
This commit is contained in:
parent
683e19306e
commit
9828c6bc86
|
@ -195,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 {
|
||||||
|
@ -2182,14 +2190,14 @@ void SpatialEditorViewport::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)
|
||||||
OS::get_singleton()->set_mouse_mode(OS::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
|
||||||
OS::get_singleton()->set_mouse_mode(OS::MOUSE_MODE_VISIBLE);
|
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
freelook_active = active_now;
|
freelook_active = active_now;
|
||||||
|
|
|
@ -158,6 +158,7 @@ class ViewportRotationControl : public Control {
|
||||||
SpatialEditorViewport *viewport = nullptr;
|
SpatialEditorViewport *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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue