From cedcc2444e196f7440cc3fb8eff86ce138ff6605 Mon Sep 17 00:00:00 2001 From: Giganzo <158825920+Giganzo@users.noreply.github.com> Date: Sun, 9 Feb 2025 14:22:24 +0100 Subject: [PATCH] Add changeable freelook speed in Game Window --- editor/plugins/game_view_plugin.cpp | 1 + scene/debugger/scene_debugger.cpp | 18 +++++++++++++++++- scene/debugger/scene_debugger.h | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/editor/plugins/game_view_plugin.cpp b/editor/plugins/game_view_plugin.cpp index a6d73cf9e153..5a76ccabf756 100644 --- a/editor/plugins/game_view_plugin.cpp +++ b/editor/plugins/game_view_plugin.cpp @@ -64,6 +64,7 @@ void GameViewDebugger::_session_started(Ref p_session) { settings["editors/panning/warped_mouse_panning"] = EDITOR_GET("editors/panning/warped_mouse_panning"); settings["editors/panning/2d_editor_pan_speed"] = EDITOR_GET("editors/panning/2d_editor_pan_speed"); settings["canvas_item_editor/pan_view"] = DebuggerMarshalls::serialize_key_shortcut(ED_GET_SHORTCUT("canvas_item_editor/pan_view")); + settings["editors/3d/freelook/freelook_base_speed"] = EDITOR_GET("editors/3d/freelook/freelook_base_speed"); setup_data.append(settings); p_session->send_message("scene:runtime_node_select_setup", setup_data); diff --git a/scene/debugger/scene_debugger.cpp b/scene/debugger/scene_debugger.cpp index 64087cdaf296..c620c5fd5c80 100644 --- a/scene/debugger/scene_debugger.cpp +++ b/scene/debugger/scene_debugger.cpp @@ -1261,6 +1261,8 @@ void RuntimeNodeSelect::_setup(const Dictionary &p_settings) { #ifndef _3D_DISABLED cursor = Cursor(); + freelook_speed = p_settings.get("editors/3d/freelook/freelook_base_speed", FREELOOK_BASE_SPEED); + /// 3D Selection Box Generation // Copied from the Node3DEditor implementation. @@ -1443,7 +1445,7 @@ void RuntimeNodeSelect::_process_frame() { direction -= up; } - real_t speed = FREELOOK_BASE_SPEED; + real_t speed = freelook_speed; if (input->is_physical_key_pressed(Key::SHIFT)) { speed *= 3.0; } @@ -1959,6 +1961,8 @@ bool RuntimeNodeSelect::_handle_3d_input(const Ref &p_event) { case MouseButton::WHEEL_UP: { if (!camera_freelook) { _cursor_scale_distance(1.0 / zoom_factor); + } else { + _scale_freelook_speed(zoom_factor); } return true; @@ -1966,6 +1970,8 @@ bool RuntimeNodeSelect::_handle_3d_input(const Ref &p_event) { case MouseButton::WHEEL_DOWN: { if (!camera_freelook) { _cursor_scale_distance(zoom_factor); + } else { + _scale_freelook_speed(1.0 / zoom_factor); } return true; @@ -2064,6 +2070,16 @@ void RuntimeNodeSelect::_cursor_scale_distance(real_t p_scale) { SceneTree::get_singleton()->get_root()->set_camera_3d_override_transform(_get_cursor_transform()); } +void RuntimeNodeSelect::_scale_freelook_speed(real_t p_scale) { + real_t min_speed = MAX(CAMERA_ZNEAR * 4, VIEW_3D_MIN_ZOOM); + real_t max_speed = MIN(CAMERA_ZFAR / 4, VIEW_3D_MAX_ZOOM); + if (unlikely(min_speed > max_speed)) { + freelook_speed = (min_speed + max_speed) / 2; + } else { + freelook_speed = CLAMP(freelook_speed * p_scale, min_speed, max_speed); + } +} + void RuntimeNodeSelect::_cursor_look(Ref p_event) { Window *root = SceneTree::get_singleton()->get_root(); const Vector2 relative = Input::get_singleton()->warp_mouse_motion(p_event, Rect2(Vector2(), root->get_size())); diff --git a/scene/debugger/scene_debugger.h b/scene/debugger/scene_debugger.h index 4542d7fc908a..5a56ea9d99b7 100644 --- a/scene/debugger/scene_debugger.h +++ b/scene/debugger/scene_debugger.h @@ -255,6 +255,7 @@ class RuntimeNodeSelect : public Object { bool camera_first_override = true; bool camera_freelook = false; + real_t freelook_speed = FREELOOK_BASE_SPEED; Vector2 previous_mouse_position; @@ -309,6 +310,7 @@ class RuntimeNodeSelect : public Object { bool _handle_3d_input(const Ref &p_event); void _set_camera_freelook_enabled(bool p_enabled); void _cursor_scale_distance(real_t p_scale); + void _scale_freelook_speed(real_t p_scale); void _cursor_look(Ref p_event); void _cursor_pan(Ref p_event); void _cursor_orbit(Ref p_event);