diff options
author | toger5 <toger5@hotmail.de> | 2017-09-06 19:53:00 +0200 |
---|---|---|
committer | toger5 <toger5@hotmail.de> | 2017-09-07 15:55:58 +0200 |
commit | b1f804094dfb287629db67d355e27872be48ab9f (patch) | |
tree | cf3081e14ff5109a12dce7e250ffdd3d32e80635 /editor/plugins | |
parent | 44f12be3f42d5b82adfb419e1f9f12d10174002e (diff) |
Modify inertia implementation for freelook and orbit
- freelook now uses position based inertia (holding a key for a
specific time always rults in the same distance traveled independent
of inertia setting)
- orbit inertia now is angle bases. (not transformation based) ->
camera always takes the same path.
- added setting for orbit inertia
- added setting hints for freelook settings.
Diffstat (limited to 'editor/plugins')
-rw-r--r-- | editor/plugins/spatial_editor_plugin.cpp | 67 | ||||
-rw-r--r-- | editor/plugins/spatial_editor_plugin.h | 4 |
2 files changed, 28 insertions, 43 deletions
diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index a5f55835f0..4e42362e13 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -76,40 +76,35 @@ void SpatialEditorViewport::_update_camera(float p_interp_delta) { } else camera->set_perspective(get_fov(), get_znear(), get_zfar()); - Transform new_transform = to_camera_transform(cursor); - Transform old_transform = camera->get_global_transform(); - Transform transform; + float inertia = EDITOR_DEF("editors/3d/orbit_inertia", 0.5); + inertia = MAX(0, inertia); + + Cursor old_camera_cursor = camera_cursor; + camera_cursor = cursor; + + camera_cursor.x_rot = Math::lerp(old_camera_cursor.x_rot, cursor.x_rot, p_interp_delta * (1 / inertia)); + camera_cursor.y_rot = Math::lerp(old_camera_cursor.y_rot, cursor.y_rot, p_interp_delta * (1 / inertia)); bool disable_interp = (Input::get_singleton()->get_mouse_button_mask() & (2 | 4)) || Input::get_singleton()->is_key_pressed(KEY_SHIFT) || Input::get_singleton()->is_key_pressed(KEY_ALT) || Input::get_singleton()->is_key_pressed(KEY_CONTROL); - if (p_interp_delta && !disable_interp) { - //interpolate - float interp_speed = 14; //maybe should be made configuration - transform = old_transform.interpolate_with(new_transform, MIN(1.0, p_interp_delta * interp_speed)); - } else { - transform = new_transform; + if (p_interp_delta == 0 || disable_interp || is_freelook_active()) { + camera_cursor = cursor; } float tolerance = 0.0001; bool equal = true; - for (int i = 0; i < 3; i++) { - if (transform.basis[i].distance_to(old_transform.basis[i]) > tolerance) { - equal = false; - break; - } - } - - if (equal && transform.origin.distance_to(old_transform.origin) > tolerance) { + if (Math::abs(cursor.x_rot - camera_cursor.x_rot) > tolerance || Math::abs(cursor.y_rot - camera_cursor.y_rot) > tolerance) + equal = false; + if (equal && cursor.pos.distance_squared_to(camera_cursor.pos) > tolerance * tolerance) { equal = false; } - - if (equal) { - transform = new_transform; + if (equal && Math::abs(cursor.distance - camera_cursor.distance) < tolerance) { + equal = false; } + print_line(equal ? "true" : "false"); + if (!equal || p_interp_delta == 0 || is_freelook_active()) { - if (!equal || p_interp_delta == 0) { - //print_line(transform); - camera->set_global_transform(transform); + camera->set_global_transform(to_camera_transform(camera_cursor)); update_transform_gizmo_view(); } } @@ -1540,6 +1535,7 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { Vector3 pos = camera_transform.xform(Vector3(0, 0, 0)); Vector3 diff = camera->get_translation() - pos; cursor.pos += diff; + freelook_target_position += diff; name = ""; _update_name(); @@ -1672,7 +1668,7 @@ Point2i SpatialEditorViewport::_get_warped_mouse_motion(const Ref<InputEventMous void SpatialEditorViewport::_update_freelook(real_t delta) { if (!is_freelook_active()) { - freelook_velocity = Vector3(); + freelook_target_position = cursor.pos; return; } @@ -1689,44 +1685,36 @@ void SpatialEditorViewport::_update_freelook(real_t delta) { int key_speed_modifier = Object::cast_to<InputEventKey>(ED_GET_SHORTCUT("spatial_editor/freelook_speed_modifier")->get_shortcut().ptr())->get_scancode(); Vector3 direction; - bool pressed = false; bool speed_modifier = false; const Input &input = *Input::get_singleton(); if (input.is_key_pressed(key_left)) { direction -= right; - pressed = true; } if (input.is_key_pressed(key_right)) { direction += right; - pressed = true; } if (input.is_key_pressed(key_forward)) { direction += forward; - pressed = true; } if (input.is_key_pressed(key_backwards)) { direction -= forward; - pressed = true; } if (input.is_key_pressed(key_up)) { direction += up; - pressed = true; } if (input.is_key_pressed(key_down)) { direction -= up; - pressed = true; } if (input.is_key_pressed(key_speed_modifier)) { speed_modifier = true; } const EditorSettings &s = *EditorSettings::get_singleton(); - real_t inertia = s.get("editors/3d/freelook_inertia"); - if (inertia < 0) - inertia = 0; + real_t inertia = s.get("editors/3d/freelook_inertia"); + inertia = MAX(0, inertia); const real_t base_speed = s.get("editors/3d/freelook_base_speed"); const real_t modifier_speed_factor = s.get("editors/3d/freelook_modifier_speed_factor"); @@ -1734,15 +1722,12 @@ void SpatialEditorViewport::_update_freelook(real_t delta) { if (speed_modifier) speed *= modifier_speed_factor; - 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)); + // 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. - cursor.pos += freelook_velocity * delta; + freelook_target_position += direction * speed; + real_t factor = (1.0 / (inertia + 0.001)) * delta; + cursor.pos = cursor.pos.linear_interpolate(freelook_target_position, CLAMP(factor, 0, 1)); } void SpatialEditorViewport::set_message(String p_message, float p_time) { diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index db5abe2b53..5f3ef2dbee 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -131,7 +131,7 @@ private: float gizmo_scale; bool freelook_active; - Vector3 freelook_velocity; + Vector3 freelook_target_position; PanelContainer *info; Label *info_label; @@ -239,7 +239,7 @@ private: distance = 4; region_select = false; } - } cursor; + } cursor, camera_cursor; void scale_cursor_distance(real_t scale); |