@@ -1261,7 +1261,18 @@ void RuntimeNodeSelect::_setup(const Dictionary &p_settings) {
12611261#ifndef _3D_DISABLED
12621262 cursor = Cursor ();
12631263
1264- freelook_speed = p_settings.get (" editors/3d/freelook/freelook_base_speed" , FREELOOK_BASE_SPEED);
1264+ camera_fov = p_settings.get (" editors/3d/default_fov" , 70 );
1265+ camera_znear = p_settings.get (" editors/3d/default_z_near" , 0.05 );
1266+ camera_zfar = p_settings.get (" editors/3d/default_z_far" , 4'000 );
1267+
1268+ invert_x_axis = p_settings.get (" editors/3d/navigation/invert_x_axis" , false );
1269+ invert_y_axis = p_settings.get (" editors/3d/navigation/invert_y_axis" , false );
1270+ warped_mouse_panning_3d = p_settings.get (" editors/3d/navigation/warped_mouse_panning" , true );
1271+
1272+ freelook_base_speed = p_settings.get (" editors/3d/freelook/freelook_base_speed" , 5 );
1273+ freelook_sensitivity = Math::deg_to_rad ((real_t )p_settings.get (" editors/3d/freelook/freelook_sensitivity" , 0.25 ));
1274+ orbit_sensitivity = Math::deg_to_rad ((real_t )p_settings.get (" editors/3d/navigation_feel/orbit_sensitivity" , 0.004 ));
1275+ translation_sensitivity = p_settings.get (" editors/3d/navigation_feel/translation_sensitivity" , 1 );
12651276
12661277 // / 3D Selection Box Generation
12671278 // Copied from the Node3DEditor implementation.
@@ -1342,7 +1353,7 @@ void RuntimeNodeSelect::_set_camera_override_enabled(bool p_enabled) {
13421353 _update_view_2d ();
13431354
13441355 SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_transform (_get_cursor_transform ());
1345- SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (CAMERA_BASE_FOV * cursor.fov_scale , CAMERA_ZNEAR, CAMERA_ZFAR );
1356+ SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (camera_fov * cursor.fov_scale , camera_znear, camera_zfar );
13461357 }
13471358#endif // _3D_DISABLED
13481359}
@@ -1445,7 +1456,7 @@ void RuntimeNodeSelect::_process_frame() {
14451456 direction -= up;
14461457 }
14471458
1448- real_t speed = freelook_speed ;
1459+ real_t speed = freelook_base_speed ;
14491460 if (input->is_physical_key_pressed (Key::SHIFT)) {
14501461 speed *= 3.0 ;
14511462 }
@@ -2011,19 +2022,19 @@ bool RuntimeNodeSelect::_handle_3d_input(const Ref<InputEvent> &p_event) {
20112022 switch (k->get_physical_keycode ()) {
20122023 case Key::EQUAL: {
20132024 cursor.fov_scale = CLAMP (cursor.fov_scale - 0.05 , CAMERA_MIN_FOV_SCALE, CAMERA_MAX_FOV_SCALE);
2014- SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (CAMERA_BASE_FOV * cursor.fov_scale , CAMERA_ZNEAR, CAMERA_ZFAR );
2025+ SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (camera_fov * cursor.fov_scale , camera_znear, camera_zfar );
20152026
20162027 return true ;
20172028 } break ;
20182029 case Key::MINUS: {
20192030 cursor.fov_scale = CLAMP (cursor.fov_scale + 0.05 , CAMERA_MIN_FOV_SCALE, CAMERA_MAX_FOV_SCALE);
2020- SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (CAMERA_BASE_FOV * cursor.fov_scale , CAMERA_ZNEAR, CAMERA_ZFAR );
2031+ SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (camera_fov * cursor.fov_scale , camera_znear, camera_zfar );
20212032
20222033 return true ;
20232034 } break ;
20242035 case Key::KEY_0: {
20252036 cursor.fov_scale = 1 ;
2026- SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (CAMERA_BASE_FOV, CAMERA_ZNEAR, CAMERA_ZFAR );
2037+ SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (camera_fov, camera_znear, camera_zfar );
20272038
20282039 return true ;
20292040 } break ;
@@ -2063,33 +2074,37 @@ void RuntimeNodeSelect::_set_camera_freelook_enabled(bool p_enabled) {
20632074}
20642075
20652076void RuntimeNodeSelect::_cursor_scale_distance (real_t p_scale) {
2066- real_t min_distance = MAX (CAMERA_ZNEAR * 4 , VIEW_3D_MIN_ZOOM);
2067- real_t max_distance = MIN (CAMERA_ZFAR / 4 , VIEW_3D_MAX_ZOOM);
2077+ real_t min_distance = MAX (camera_znear * 4 , VIEW_3D_MIN_ZOOM);
2078+ real_t max_distance = MIN (camera_zfar / 4 , VIEW_3D_MAX_ZOOM);
20682079 cursor.distance = CLAMP (cursor.distance * p_scale, min_distance, max_distance);
20692080
20702081 SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_transform (_get_cursor_transform ());
20712082}
20722083
20732084void RuntimeNodeSelect::_scale_freelook_speed (real_t p_scale) {
2074- real_t min_speed = MAX (CAMERA_ZNEAR * 4 , VIEW_3D_MIN_ZOOM);
2075- real_t max_speed = MIN (CAMERA_ZFAR / 4 , VIEW_3D_MAX_ZOOM);
2085+ real_t min_speed = MAX (camera_znear * 4 , VIEW_3D_MIN_ZOOM);
2086+ real_t max_speed = MIN (camera_zfar / 4 , VIEW_3D_MAX_ZOOM);
20762087 if (unlikely (min_speed > max_speed)) {
2077- freelook_speed = (min_speed + max_speed) / 2 ;
2088+ freelook_base_speed = (min_speed + max_speed) / 2 ;
20782089 } else {
2079- freelook_speed = CLAMP (freelook_speed * p_scale, min_speed, max_speed);
2090+ freelook_base_speed = CLAMP (freelook_base_speed * p_scale, min_speed, max_speed);
20802091 }
20812092}
20822093
20832094void RuntimeNodeSelect::_cursor_look (Ref<InputEventWithModifiers> p_event) {
20842095 Window *root = SceneTree::get_singleton ()->get_root ();
2085- const Vector2 relative = Input::get_singleton ()-> warp_mouse_motion (p_event, Rect2 (Vector2 (), root->get_size ()));
2096+ const Vector2 relative = _get_warped_mouse_motion (p_event, Rect2 (Vector2 (), root->get_size ()));
20862097 const Transform3D prev_camera_transform = _get_cursor_transform ();
20872098
2088- cursor.x_rot += relative.y * RADS_PER_PIXEL;
2099+ if (invert_y_axis) {
2100+ cursor.x_rot -= relative.y * freelook_sensitivity;
2101+ } else {
2102+ cursor.x_rot += relative.y * freelook_sensitivity;
2103+ }
20892104 // Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented.
20902105 cursor.x_rot = CLAMP (cursor.x_rot , -1.57 , 1.57 );
20912106
2092- cursor.y_rot += relative.x * RADS_PER_PIXEL ;
2107+ cursor.y_rot += relative.x * freelook_sensitivity ;
20932108
20942109 // Look is like the opposite of Orbit: the focus point rotates around the camera.
20952110 Transform3D camera_transform = _get_cursor_transform ();
@@ -2104,8 +2119,8 @@ void RuntimeNodeSelect::_cursor_look(Ref<InputEventWithModifiers> p_event) {
21042119void RuntimeNodeSelect::_cursor_pan (Ref<InputEventWithModifiers> p_event) {
21052120 Window *root = SceneTree::get_singleton ()->get_root ();
21062121 // Reduce all sides of the area by 1, so warping works when windows are maximized/fullscreen.
2107- const Vector2 relative = Input::get_singleton ()-> warp_mouse_motion (p_event, Rect2 (Vector2 (1 , 1 ), root->get_size () - Vector2 (2 , 2 )));
2108- const real_t pan_speed = 1 / 150.0 ;
2122+ const Vector2 relative = _get_warped_mouse_motion (p_event, Rect2 (Vector2 (1 , 1 ), root->get_size () - Vector2 (2 , 2 )));
2123+ const real_t pan_speed = translation_sensitivity / 150.0 ;
21092124
21102125 Transform3D camera_transform;
21112126 camera_transform.translate_local (cursor.pos );
@@ -2123,17 +2138,35 @@ void RuntimeNodeSelect::_cursor_pan(Ref<InputEventWithModifiers> p_event) {
21232138void RuntimeNodeSelect::_cursor_orbit (Ref<InputEventWithModifiers> p_event) {
21242139 Window *root = SceneTree::get_singleton ()->get_root ();
21252140 // Reduce all sides of the area by 1, so warping works when windows are maximized/fullscreen.
2126- const Vector2 relative = Input::get_singleton ()-> warp_mouse_motion (p_event, Rect2 (Vector2 (1 , 1 ), root->get_size () - Vector2 (2 , 2 )));
2141+ const Vector2 relative = _get_warped_mouse_motion (p_event, Rect2 (Vector2 (1 , 1 ), root->get_size () - Vector2 (2 , 2 )));
21272142
2128- cursor.x_rot += relative.y * RADS_PER_PIXEL;
2143+ if (invert_y_axis) {
2144+ cursor.x_rot -= relative.y * orbit_sensitivity;
2145+ } else {
2146+ cursor.x_rot += relative.y * orbit_sensitivity;
2147+ }
21292148 // Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented.
21302149 cursor.x_rot = CLAMP (cursor.x_rot , -1.57 , 1.57 );
21312150
2132- cursor.y_rot += relative.x * RADS_PER_PIXEL;
2151+ if (invert_x_axis) {
2152+ cursor.y_rot -= relative.x * orbit_sensitivity;
2153+ } else {
2154+ cursor.y_rot += relative.x * orbit_sensitivity;
2155+ }
21332156
21342157 SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_transform (_get_cursor_transform ());
21352158}
21362159
2160+ Point2 RuntimeNodeSelect::_get_warped_mouse_motion (const Ref<InputEventMouseMotion> &p_event, Rect2 p_area) const {
2161+ ERR_FAIL_COND_V (p_event.is_null (), Point2 ());
2162+
2163+ if (warped_mouse_panning_3d) {
2164+ return Input::get_singleton ()->warp_mouse_motion (p_event, p_area);
2165+ }
2166+
2167+ return p_event->get_relative ();
2168+ }
2169+
21372170Transform3D RuntimeNodeSelect::_get_cursor_transform () {
21382171 Transform3D camera_transform;
21392172 camera_transform.translate_local (cursor.pos );
@@ -2158,13 +2191,13 @@ void RuntimeNodeSelect::_reset_camera_3d() {
21582191 cursor.x_rot = -camera->get_global_rotation ().x ;
21592192 cursor.y_rot = -camera->get_global_rotation ().y ;
21602193
2161- cursor.fov_scale = CLAMP (camera->get_fov () / CAMERA_BASE_FOV , CAMERA_MIN_FOV_SCALE, CAMERA_MAX_FOV_SCALE);
2194+ cursor.fov_scale = CLAMP (camera->get_fov () / camera_fov , CAMERA_MIN_FOV_SCALE, CAMERA_MAX_FOV_SCALE);
21622195 } else {
21632196 cursor.fov_scale = 1.0 ;
21642197 }
21652198
21662199 SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_transform (_get_cursor_transform ());
2167- SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (CAMERA_BASE_FOV * cursor.fov_scale , CAMERA_ZNEAR, CAMERA_ZFAR );
2200+ SceneTree::get_singleton ()->get_root ()->set_camera_3d_override_perspective (camera_fov * cursor.fov_scale , camera_znear, camera_zfar );
21682201}
21692202#endif // _3D_DISABLED
21702203#endif
0 commit comments