Added freelook inertia
This commit is contained in:
parent
9f1e3903df
commit
28e1c88f6e
@ -672,6 +672,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
|
|||||||
set("editors/3d/warped_mouse_panning", true);
|
set("editors/3d/warped_mouse_panning", true);
|
||||||
|
|
||||||
set("editors/3d/orbit_sensitivity", 0.4);
|
set("editors/3d/orbit_sensitivity", 0.4);
|
||||||
|
set("editors/3d/freelook_inertia", 3);
|
||||||
|
|
||||||
set("editors/3d/freelook_base_speed", 1);
|
set("editors/3d/freelook_base_speed", 1);
|
||||||
|
|
||||||
|
@ -1608,8 +1608,10 @@ Point2i SpatialEditorViewport::_get_warped_mouse_motion(const Ref<InputEventMous
|
|||||||
|
|
||||||
void SpatialEditorViewport::_update_freelook(real_t delta) {
|
void SpatialEditorViewport::_update_freelook(real_t delta) {
|
||||||
|
|
||||||
if (!is_freelook_active())
|
if (!is_freelook_active()) {
|
||||||
|
freelook_velocity = Vector3();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
|
Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
|
||||||
Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0));
|
Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0));
|
||||||
@ -1623,53 +1625,61 @@ void SpatialEditorViewport::_update_freelook(real_t delta) {
|
|||||||
int key_down = Object::cast_to<InputEventKey>(ED_GET_SHORTCUT("spatial_editor/freelook_down")->get_shortcut().ptr())->get_scancode();
|
int key_down = Object::cast_to<InputEventKey>(ED_GET_SHORTCUT("spatial_editor/freelook_down")->get_shortcut().ptr())->get_scancode();
|
||||||
int key_speed_modifier = Object::cast_to<InputEventKey>(ED_GET_SHORTCUT("spatial_editor/freelook_speed_modifier")->get_shortcut().ptr())->get_scancode();
|
int key_speed_modifier = Object::cast_to<InputEventKey>(ED_GET_SHORTCUT("spatial_editor/freelook_speed_modifier")->get_shortcut().ptr())->get_scancode();
|
||||||
|
|
||||||
Vector3 velocity;
|
Vector3 direction;
|
||||||
bool pressed = false;
|
bool pressed = false;
|
||||||
bool speed_modifier = false;
|
bool speed_modifier = false;
|
||||||
|
|
||||||
const Input &input = *Input::get_singleton();
|
const Input &input = *Input::get_singleton();
|
||||||
|
|
||||||
if (input.is_key_pressed(key_left)) {
|
if (input.is_key_pressed(key_left)) {
|
||||||
velocity -= right;
|
direction -= right;
|
||||||
pressed = true;
|
pressed = true;
|
||||||
}
|
}
|
||||||
if (input.is_key_pressed(key_right)) {
|
if (input.is_key_pressed(key_right)) {
|
||||||
velocity += right;
|
direction += right;
|
||||||
pressed = true;
|
pressed = true;
|
||||||
}
|
}
|
||||||
if (input.is_key_pressed(key_forward)) {
|
if (input.is_key_pressed(key_forward)) {
|
||||||
velocity += forward;
|
direction += forward;
|
||||||
pressed = true;
|
pressed = true;
|
||||||
}
|
}
|
||||||
if (input.is_key_pressed(key_backwards)) {
|
if (input.is_key_pressed(key_backwards)) {
|
||||||
velocity -= forward;
|
direction -= forward;
|
||||||
pressed = true;
|
pressed = true;
|
||||||
}
|
}
|
||||||
if (input.is_key_pressed(key_up)) {
|
if (input.is_key_pressed(key_up)) {
|
||||||
velocity += up;
|
direction += up;
|
||||||
pressed = true;
|
pressed = true;
|
||||||
}
|
}
|
||||||
if (input.is_key_pressed(key_down)) {
|
if (input.is_key_pressed(key_down)) {
|
||||||
velocity -= up;
|
direction -= up;
|
||||||
pressed = true;
|
pressed = true;
|
||||||
}
|
}
|
||||||
if (input.is_key_pressed(key_speed_modifier)) {
|
if (input.is_key_pressed(key_speed_modifier)) {
|
||||||
speed_modifier = true;
|
speed_modifier = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pressed) {
|
const EditorSettings &s = *EditorSettings::get_singleton();
|
||||||
const EditorSettings &s = *EditorSettings::get_singleton();
|
real_t inertia = s.get("editors/3d/freelook_inertia");
|
||||||
const real_t base_speed = s.get("editors/3d/freelook_base_speed");
|
if (inertia < 0)
|
||||||
const real_t modifier_speed_factor = s.get("editors/3d/freelook_modifier_speed_factor");
|
inertia = 0;
|
||||||
|
|
||||||
real_t speed = base_speed * cursor.distance;
|
const real_t base_speed = s.get("editors/3d/freelook_base_speed");
|
||||||
if (speed_modifier)
|
const real_t modifier_speed_factor = s.get("editors/3d/freelook_modifier_speed_factor");
|
||||||
speed *= modifier_speed_factor;
|
|
||||||
|
|
||||||
velocity.normalize();
|
real_t speed = base_speed * cursor.distance;
|
||||||
|
if (speed_modifier)
|
||||||
|
speed *= modifier_speed_factor;
|
||||||
|
|
||||||
cursor.pos += velocity * (speed * delta);
|
Vector3 instant_velocity = direction * speed;
|
||||||
}
|
|
||||||
|
// Higher inertia should increase "lag" (lerp with factor between 0 and 1)
|
||||||
|
// Inertia of zero should produce instant movement (lerp with factor of 1)
|
||||||
|
// Takes reference of 60fps for units, so that inertia of 1 gives approximate lerp factor of 0.5
|
||||||
|
real_t factor = 1.0 / (1.0 + inertia * delta * 60.f);
|
||||||
|
freelook_velocity = freelook_velocity.linear_interpolate(instant_velocity, CLAMP(factor, 0, 1));
|
||||||
|
|
||||||
|
cursor.pos += freelook_velocity * delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpatialEditorViewport::set_message(String p_message, float p_time) {
|
void SpatialEditorViewport::set_message(String p_message, float p_time) {
|
||||||
|
@ -122,6 +122,7 @@ private:
|
|||||||
float gizmo_scale;
|
float gizmo_scale;
|
||||||
|
|
||||||
bool freelook_active;
|
bool freelook_active;
|
||||||
|
Vector3 freelook_velocity;
|
||||||
|
|
||||||
PanelContainer *info;
|
PanelContainer *info;
|
||||||
Label *info_label;
|
Label *info_label;
|
||||||
|
Loading…
Reference in New Issue
Block a user