From c74bfefe92a5bd24fc9bbc4093385e824bfba9fb Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Fri, 18 Apr 2025 15:52:31 -0600 Subject: [PATCH] Lerp framerate logic fixes --- levels/meet_spook_test/meet_spook_test.tscn | 4 +-- levels/player_test/player_test.tscn | 39 +++++++++++++++++++++ project.godot | 2 +- src/equipment/tool.gd | 4 +-- src/equipment/toothbrush/toothbrush.gd | 2 +- src/player/camera_controller.gd | 13 ++++--- src/player/headbob_controller.gd | 5 +-- src/player/player.gd | 5 +-- src/ui/hud/player_hud.tscn | 8 ++--- 9 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 levels/player_test/player_test.tscn diff --git a/levels/meet_spook_test/meet_spook_test.tscn b/levels/meet_spook_test/meet_spook_test.tscn index dce0970..a3c5ff5 100644 --- a/levels/meet_spook_test/meet_spook_test.tscn +++ b/levels/meet_spook_test/meet_spook_test.tscn @@ -9,12 +9,12 @@ [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_eywuc"] -[sub_resource type="Sky" id="Sky_pka60"] +[sub_resource type="Sky" id="Sky_cr4pm"] sky_material = SubResource("ProceduralSkyMaterial_eywuc") [sub_resource type="Environment" id="Environment_nynr7"] background_mode = 2 -sky = SubResource("Sky_pka60") +sky = SubResource("Sky_cr4pm") [sub_resource type="PlaneMesh" id="PlaneMesh_b6st5"] size = Vector2(50, 50) diff --git a/levels/player_test/player_test.tscn b/levels/player_test/player_test.tscn new file mode 100644 index 0000000..7a9697a --- /dev/null +++ b/levels/player_test/player_test.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=7 format=3 uid="uid://tpojpp5ua6u1"] + +[ext_resource type="PackedScene" uid="uid://bwe2jdmvinhqd" path="res://src/player/player.tscn" id="1_qdhe6"] + +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_hda7d"] + +[sub_resource type="Sky" id="Sky_pka60"] +sky_material = SubResource("ProceduralSkyMaterial_hda7d") + +[sub_resource type="Environment" id="Environment_nl4kk"] +background_mode = 2 +sky = SubResource("Sky_pka60") + +[sub_resource type="PlaneMesh" id="PlaneMesh_libd1"] +size = Vector2(50, 50) + +[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_5pddg"] + +[node name="PlayerTest" type="Node3D"] + +[node name="Player" parent="." instance=ExtResource("1_qdhe6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(0.866025, -0.156955, -0.474726, 0.5, 0.271854, 0.82225, 0, -0.949453, 0.31391, 0, 0, 0) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_nl4kk") + +[node name="WorldFloor" type="StaticBody3D" parent="." groups=["PlasticMaterial"]] +collision_layer = 5 +collision_mask = 0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="WorldFloor"] +mesh = SubResource("PlaneMesh_libd1") +skeleton = NodePath("../..") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="WorldFloor"] +shape = SubResource("WorldBoundaryShape3D_5pddg") diff --git a/project.godot b/project.godot index 034c43e..d4d67a5 100644 --- a/project.godot +++ b/project.godot @@ -73,7 +73,7 @@ folder_colors={ config/input/mouse_sensitivity_x=0.45 config/input/mouse_sensitivity_y=0.45 config/input/invert_pitch=false -config/input/mouse_acceleration=30.0 +config/input/mouse_acceleration=42.0 audio/buses/override_bus_layout="user://audio_bus_layout.tres" config/accessibility/enable_screen_shake=true config/accessibility/enable_head_bob=true diff --git a/src/equipment/tool.gd b/src/equipment/tool.gd index 354aa87..36b2c80 100644 --- a/src/equipment/tool.gd +++ b/src/equipment/tool.gd @@ -1,7 +1,7 @@ class_name Tool extends Node3D ## Abstract base class for spraygun types -const HUD_ACCEL := 36.0 +@export var hud_accel := 50.0 var firing := false @@ -36,6 +36,6 @@ func idle() -> void: func _physics_process(delta: float) -> void: if hud_tool: - var weight := clampf(HUD_ACCEL * delta, 0.0, 1.0) + var weight := 1 - exp(-hud_accel * delta) hud_tool.global_basis = global_basis hud_tool.global_position = hud_tool.global_position.lerp(global_position, weight) diff --git a/src/equipment/toothbrush/toothbrush.gd b/src/equipment/toothbrush/toothbrush.gd index d2b8f89..70a61e4 100644 --- a/src/equipment/toothbrush/toothbrush.gd +++ b/src/equipment/toothbrush/toothbrush.gd @@ -43,7 +43,7 @@ func _idle() -> void: func _physics_process(delta: float) -> void: hud_tool.global_basis = global_basis - var weight := clampf(HUD_ACCEL * delta, 0.0, 1.0) + var weight := 1 - exp(-hud_accel * delta) var target_position := resting_position.global_position if raycast.is_colliding(): target_position = raycast.get_collision_point() diff --git a/src/player/camera_controller.gd b/src/player/camera_controller.gd index 177af47..cf4d3f3 100644 --- a/src/player/camera_controller.gd +++ b/src/player/camera_controller.gd @@ -35,9 +35,12 @@ func camera_motion(motion: Vector2) -> void: ) -func _physics_process(_delta: float) -> void: - var mouse_accel: float = Game.settings.mouse_acceleration / 60.0 +func _physics_process(delta: float) -> void: + var mouse_accel: float = Game.settings.mouse_acceleration if player.firing: - mouse_accel = FOCUS_ACCELERATION / 60.0 - rotation.y = lerp_angle(rotation.y, _target.y, mouse_accel) - rotation.x = lerp_angle(rotation.x, _target.x, mouse_accel) + mouse_accel = FOCUS_ACCELERATION + + var weight := 1 - exp(-mouse_accel * delta) + #var weight := mouse_accel / 60.0 + rotation.y = lerp_angle(rotation.y, _target.y, weight) + rotation.x = lerp_angle(rotation.x, _target.x, weight) diff --git a/src/player/headbob_controller.gd b/src/player/headbob_controller.gd index 3f99a7b..77b2633 100644 --- a/src/player/headbob_controller.gd +++ b/src/player/headbob_controller.gd @@ -21,9 +21,10 @@ var timescale: float: func _process(delta: float) -> void: var speed := player.velocity.length() + var weight := 1 - exp(-BLEND_ACCELERATION * delta) if player.is_on_floor(): var timescale_target := speed * VELOCITY_TIMESCALE_FACTOR - timescale = lerpf(timescale, timescale_target, BLEND_ACCELERATION * delta) + timescale = lerpf(timescale, timescale_target, weight) else: timescale = 0.0 @@ -32,6 +33,6 @@ func _process(delta: float) -> void: if player.is_on_floor(): blend_target = speed * VELOCITY_BLEND_FACTOR - blend = lerpf(blend, blend_target, BLEND_ACCELERATION * delta) + blend = lerpf(blend, blend_target, weight) else: blend = 0.0 diff --git a/src/player/player.gd b/src/player/player.gd index ff51900..f3d0759 100644 --- a/src/player/player.gd +++ b/src/player/player.gd @@ -195,8 +195,9 @@ func _physics_process(delta: float) -> void: # Friction var friction := get_friction() - velocity.x = lerpf(velocity.x, 0, friction) - velocity.z = lerpf(velocity.z, 0, friction) + var weight := 1 - exp(-friction * 60 * delta) + velocity.x = lerpf(velocity.x, 0, weight) + velocity.z = lerpf(velocity.z, 0, weight) _was_on_floor = is_on_floor() diff --git a/src/ui/hud/player_hud.tscn b/src/ui/hud/player_hud.tscn index 5e3cd4f..397700f 100644 --- a/src/ui/hud/player_hud.tscn +++ b/src/ui/hud/player_hud.tscn @@ -215,10 +215,10 @@ anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 -offset_left = -400.102 -offset_top = -298.829 -offset_right = -400.102 -offset_bottom = -298.829 +offset_left = -400.498 +offset_top = -299.892 +offset_right = -400.498 +offset_bottom = -299.892 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("4_ud8na")