Added freelook inertia

This commit is contained in:
Marc Gilleron 2017-08-26 21:55:09 +02:00
parent 9f1e3903df
commit 28e1c88f6e
3 changed files with 30 additions and 18 deletions

View File

@ -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);

View File

@ -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) {

View File

@ -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;