Tweak the 3D editor inertia defaults for better responsiveness
The default orbit sensitivity was decreased to account for this change. Rotational inertia (orbit + freelook) was disabled by default due to known issues. This also removes the need for separate manipulation inertia settings, as the default settings are more responsive.
This commit is contained in:
parent
2d1699ef82
commit
e2718b7717
2 changed files with 12 additions and 31 deletions
|
@ -592,18 +592,16 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
|
||||||
_initial_set("editors/3d/navigation/warped_mouse_panning", true);
|
_initial_set("editors/3d/navigation/warped_mouse_panning", true);
|
||||||
|
|
||||||
// 3D: Navigation feel
|
// 3D: Navigation feel
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/orbit_sensitivity", 0.4, "0.0,2,0.01")
|
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/orbit_sensitivity", 0.25, "0.01,2,0.001")
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/orbit_inertia", 0.05, "0.0,1,0.01")
|
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/orbit_inertia", 0.0, "0,1,0.001")
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/translation_inertia", 0.15, "0.0,1,0.01")
|
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/translation_inertia", 0.05, "0,1,0.001")
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/zoom_inertia", 0.075, "0.0,1,0.01")
|
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/zoom_inertia", 0.05, "0,1,0.001")
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/manipulation_orbit_inertia", 0.075, "0.0,1,0.01")
|
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/navigation_feel/manipulation_translation_inertia", 0.075, "0.0,1,0.01")
|
|
||||||
|
|
||||||
// 3D: Freelook
|
// 3D: Freelook
|
||||||
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/freelook/freelook_navigation_scheme", 0, "Default,Partially Axis-Locked (id Tech),Fully Axis-Locked (Minecraft)")
|
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/freelook/freelook_navigation_scheme", 0, "Default,Partially Axis-Locked (id Tech),Fully Axis-Locked (Minecraft)")
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_sensitivity", 0.4, "0.0,2,0.01")
|
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_sensitivity", 0.25, "0.01,2,0.001")
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_inertia", 0.1, "0.0,1,0.01")
|
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_inertia", 0.0, "0,1,0.001")
|
||||||
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_base_speed", 5.0, "0.0,10,0.01")
|
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/3d/freelook/freelook_base_speed", 5.0, "0,10,0.01")
|
||||||
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/freelook/freelook_activation_modifier", 0, "None,Shift,Alt,Meta,Ctrl")
|
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/3d/freelook/freelook_activation_modifier", 0, "None,Shift,Alt,Meta,Ctrl")
|
||||||
_initial_set("editors/3d/freelook/freelook_speed_zoom_link", false);
|
_initial_set("editors/3d/freelook/freelook_speed_zoom_link", false);
|
||||||
|
|
||||||
|
|
|
@ -265,15 +265,13 @@ void Node3DEditorViewport::_update_camera(real_t p_interp_delta) {
|
||||||
if (is_freelook_active()) {
|
if (is_freelook_active()) {
|
||||||
// Higher inertia should increase "lag" (lerp with factor between 0 and 1)
|
// Higher inertia should increase "lag" (lerp with factor between 0 and 1)
|
||||||
// Inertia of zero should produce instant movement (lerp with factor of 1) in this case it returns a really high value and gets clamped to 1.
|
// Inertia of zero should produce instant movement (lerp with factor of 1) in this case it returns a really high value and gets clamped to 1.
|
||||||
real_t inertia = EDITOR_GET("editors/3d/freelook/freelook_inertia");
|
const real_t inertia = EDITOR_GET("editors/3d/freelook/freelook_inertia");
|
||||||
inertia = MAX(0.001, inertia);
|
|
||||||
real_t factor = (1.0 / inertia) * p_interp_delta;
|
real_t factor = (1.0 / inertia) * p_interp_delta;
|
||||||
|
|
||||||
// We interpolate a different point here, because in freelook mode the focus point (cursor.pos) orbits around eye_pos
|
// We interpolate a different point here, because in freelook mode the focus point (cursor.pos) orbits around eye_pos
|
||||||
camera_cursor.eye_pos = old_camera_cursor.eye_pos.lerp(cursor.eye_pos, CLAMP(factor, 0, 1));
|
camera_cursor.eye_pos = old_camera_cursor.eye_pos.lerp(cursor.eye_pos, CLAMP(factor, 0, 1));
|
||||||
|
|
||||||
real_t orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
|
const real_t orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
|
||||||
orbit_inertia = MAX(0.0001, orbit_inertia);
|
|
||||||
camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
|
camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
|
||||||
camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
|
camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
|
||||||
|
|
||||||
|
@ -289,24 +287,9 @@ void Node3DEditorViewport::_update_camera(real_t p_interp_delta) {
|
||||||
camera_cursor.pos = camera_cursor.eye_pos + forward * camera_cursor.distance;
|
camera_cursor.pos = camera_cursor.eye_pos + forward * camera_cursor.distance;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//when not being manipulated, move softly
|
const real_t orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
|
||||||
real_t free_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia");
|
const real_t translation_inertia = EDITOR_GET("editors/3d/navigation_feel/translation_inertia");
|
||||||
real_t free_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/translation_inertia");
|
const real_t zoom_inertia = EDITOR_GET("editors/3d/navigation_feel/zoom_inertia");
|
||||||
//when being manipulated, move more quickly
|
|
||||||
real_t manip_orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_orbit_inertia");
|
|
||||||
real_t manip_translation_inertia = EDITOR_GET("editors/3d/navigation_feel/manipulation_translation_inertia");
|
|
||||||
|
|
||||||
real_t zoom_inertia = EDITOR_GET("editors/3d/navigation_feel/zoom_inertia");
|
|
||||||
|
|
||||||
//determine if being manipulated
|
|
||||||
bool manipulated = Input::get_singleton()->get_mouse_button_mask() & (2 | 4);
|
|
||||||
manipulated |= Input::get_singleton()->is_key_pressed(KEY_SHIFT);
|
|
||||||
manipulated |= Input::get_singleton()->is_key_pressed(KEY_ALT);
|
|
||||||
manipulated |= Input::get_singleton()->is_key_pressed(KEY_CTRL);
|
|
||||||
|
|
||||||
real_t orbit_inertia = MAX(0.00001, manipulated ? manip_orbit_inertia : free_orbit_inertia);
|
|
||||||
real_t translation_inertia = MAX(0.0001, manipulated ? manip_translation_inertia : free_translation_inertia);
|
|
||||||
zoom_inertia = MAX(0.0001, zoom_inertia);
|
|
||||||
|
|
||||||
camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
|
camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
|
||||||
camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
|
camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, MIN(1.f, p_interp_delta * (1 / orbit_inertia)));
|
||||||
|
|
Loading…
Reference in a new issue