Browse Source

Add changeable freelook speed in Game Window

Giganzo 6 months ago
parent
commit
cedcc2444e

+ 1 - 0
editor/plugins/game_view_plugin.cpp

@@ -64,6 +64,7 @@ void GameViewDebugger::_session_started(Ref<EditorDebuggerSession> 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);
 

+ 17 - 1
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<InputEvent> &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<InputEvent> &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<InputEventWithModifiers> 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()));

+ 2 - 0
scene/debugger/scene_debugger.h

@@ -255,6 +255,7 @@ private:
 
 	bool camera_first_override = true;
 	bool camera_freelook = false;
+	real_t freelook_speed = FREELOOK_BASE_SPEED;
 
 	Vector2 previous_mouse_position;
 
@@ -309,6 +310,7 @@ private:
 	bool _handle_3d_input(const Ref<InputEvent> &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<InputEventWithModifiers> p_event);
 	void _cursor_pan(Ref<InputEventWithModifiers> p_event);
 	void _cursor_orbit(Ref<InputEventWithModifiers> p_event);