mirror of https://github.com/godotengine/godot
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:
parent
b62218bbac
commit
051f02a3a0
|
|
@ -51,7 +51,6 @@
|
|||
#include "scene/gui/subviewport_container.h"
|
||||
#include "scene/resources/packed_scene.h"
|
||||
#include "scene/resources/surface_tool.h"
|
||||
#include "servers/display_server.h"
|
||||
|
||||
#define DISTANCE_DEFAULT 4
|
||||
|
||||
|
|
@ -196,12 +195,20 @@ void ViewportRotationControl::_gui_input(Ref<InputEvent> p_event) {
|
|||
_update_focus();
|
||||
}
|
||||
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;
|
||||
if (mm.is_valid()) {
|
||||
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));
|
||||
focused_axis = -1;
|
||||
} else {
|
||||
|
|
@ -2210,14 +2217,14 @@ void Node3DEditorViewport::set_freelook_active(bool active_now) {
|
|||
}
|
||||
|
||||
// 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) {
|
||||
// Sync camera cursor to cursor to "cut" interpolation jumps due to changing referential
|
||||
cursor = camera_cursor;
|
||||
|
||||
// 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;
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ class ViewportRotationControl : public Control {
|
|||
Node3DEditorViewport *viewport = nullptr;
|
||||
Vector<Color> axis_colors;
|
||||
Vector<int> axis_menu_options;
|
||||
Vector2i orbiting_mouse_start;
|
||||
bool orbiting = false;
|
||||
int focused_axis = -2;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue