aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-03 16:54:53 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-03 16:54:53 +0200
commit074c37aae5b25844a9e85e89b30893042c9e6059 (patch)
tree62b0bd04cf5857f62f646a8d5c243e8ec7d3f8a1
parente994feebe11e4c1d8b7f3825f2e1c9bbd2069e82 (diff)
downloadhurrycurry-074c37aae5b25844a9e85e89b30893042c9e6059.tar
hurrycurry-074c37aae5b25844a9e85e89b30893042c9e6059.tar.bz2
hurrycurry-074c37aae5b25844a9e85e89b30893042c9e6059.tar.zst
correct interpolation (except angles)
-rw-r--r--client/game.gd2
-rw-r--r--client/global.gd8
-rw-r--r--client/map/items/item.gd2
-rw-r--r--client/menu/overlay.gd6
-rw-r--r--client/player/follow_camera.gd14
-rw-r--r--client/player/player.gd4
6 files changed, 22 insertions, 14 deletions
diff --git a/client/game.gd b/client/game.gd
index 3102c84d..98c8986b 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -204,7 +204,7 @@ func _ready():
mp.hide_score.connect($Overlay.hide)
func _process(delta):
- marker.position = lerp(marker.position, marker_target, delta * 40.0)
+ marker.position = Global.interpolate(marker.position, marker_target, delta * 30.)
func get_tile_collision(pos: Vector2i) -> bool:
var t = map.get_tile_name(pos)
diff --git a/client/global.gd b/client/global.gd
index 042752cc..2dd5f735 100644
--- a/client/global.gd
+++ b/client/global.gd
@@ -155,3 +155,11 @@ func set_setting(key: String, value):
push_error("Tried to set setting \"%s\", which does not yet exist (missing key)" % key)
return
settings[key].set_value(value)
+
+func interpolate(current, target, dt):
+ return target + (current - target) * exp(-dt)
+
+func interpolate_angle(current, target, dt):
+ if abs(target - current) > PI:
+ target -= PI * 2
+ return target + (current - target) * exp(-dt)
diff --git a/client/map/items/item.gd b/client/map/items/item.gd
index fb55b230..84d3f3fa 100644
--- a/client/map/items/item.gd
+++ b/client/map/items/item.gd
@@ -40,7 +40,7 @@ func _ready():
position = owned_by.global_position
func _process(delta):
- position = lerp(position, owned_by.global_position, delta * 30.0)
+ position = Global.interpolate(position, owned_by.global_position, delta * 30.0)
func progress(p: float, warn: bool):
progress_instance.visible = true
diff --git a/client/menu/overlay.gd b/client/menu/overlay.gd
index 89bbeb24..58e1415c 100644
--- a/client/menu/overlay.gd
+++ b/client/menu/overlay.gd
@@ -34,9 +34,9 @@ func update(failed_: int, completed_: int, points_: int, time: float):
timer.start()
func _process(delta):
- failed_label.scale = lerp(failed_label.scale, Vector2(1, 1), delta * 4.)
- completed_label.scale = lerp(completed_label.scale, Vector2(1, 1), delta * 4.)
- points_label.scale = lerp(points_label.scale, Vector2(1, 1), delta * 4.)
+ failed_label.scale = Global.interpolate(failed_label.scale, Vector2(1, 1), delta * 4.)
+ completed_label.scale = Global.interpolate(completed_label.scale, Vector2(1, 1), delta * 4.)
+ points_label.scale = Global.interpolate(points_label.scale, Vector2(1, 1), delta * 4.)
var seconds: float = floor(timer.time_left)
seconds_label.text = str(int(seconds))
decimals_label.text = "%01d" % int((timer.time_left - seconds) * 10)
diff --git a/client/player/follow_camera.gd b/client/player/follow_camera.gd
index 19ecc65a..db939a0b 100644
--- a/client/player/follow_camera.gd
+++ b/client/player/follow_camera.gd
@@ -60,13 +60,13 @@ func follow(delta):
angle_target += Input.get_axis("rotate_left", "rotate_right") * (
ROTATE_SPEED * delta * (-1 if Global.get_setting("invert_camera") else 1)
)
- angle = lerp_angle(angle, angle_target, delta * ROTATE_WEIGHT)
+ angle = Global.interpolate_angle(angle, angle_target, delta * ROTATE_WEIGHT)
angle_up_target += Input.get_axis("rotate_down", "rotate_up") * (
ROTATE_UP_SPEED * delta * (-1 if Global.get_setting("invert_camera") else 1)
)
angle_up_target = clamp(angle_up_target, ANGLE_UP_MIN, ANGLE_UP_MAX)
- angle_up = lerp_angle(angle_up, angle_up_target, delta * ROTATE_UP_WEIGHT)
+ angle_up = Global.interpolate_angle(angle_up, angle_up_target, delta * ROTATE_UP_WEIGHT)
var offset = Vector3(0, sin(angle_up) * camera_distance, cos(angle_up) * camera_distance).rotated(Vector3.UP, angle)
@@ -76,17 +76,17 @@ func follow(delta):
if Global.get_setting("interpolate_camera_rotation"):
transform.basis = Basis.from_euler(Vector3(
- lerp_angle(transform.basis.get_euler().x, new_transform.basis.get_euler().x, delta * LOOK_WEIGHT),
- lerp_angle(transform.basis.get_euler().y, new_transform.basis.get_euler().y, delta * LOOK_WEIGHT),
- lerp_angle(transform.basis.get_euler().z, new_transform.basis.get_euler().z, delta * LOOK_WEIGHT)
+ Global.interpolate_angle(transform.basis.get_euler().x, new_transform.basis.get_euler().x, delta * LOOK_WEIGHT),
+ Global.interpolate_angle(transform.basis.get_euler().y, new_transform.basis.get_euler().y, delta * LOOK_WEIGHT),
+ Global.interpolate_angle(transform.basis.get_euler().z, new_transform.basis.get_euler().z, delta * LOOK_WEIGHT)
))
else:
transform.basis = new_transform.basis
- ground = ground.lerp(target.position, delta * MOVE_WEIGHT)
+ ground = Global.interpolate(ground, target.position, delta * MOVE_WEIGHT)
camera_distance_target += Input.get_axis("zoom_in", "zoom_out") * ZOOM_SPEED * delta
camera_distance_target = clamp(camera_distance_target, MIN_ZOOM, MAX_ZOOM)
- camera_distance = lerp(camera_distance, camera_distance_target, delta * ZOOM_WEIGHT)
+ camera_distance = Global.interpolate(camera_distance, camera_distance_target, delta * ZOOM_WEIGHT)
position = ground + offset
diff --git a/client/player/player.gd b/client/player/player.gd
index 301f7945..ef977ce6 100644
--- a/client/player/player.gd
+++ b/client/player/player.gd
@@ -116,8 +116,8 @@ func pass_to(player: Player):
func _process(delta):
_anim_angle = fmod(_anim_angle + delta, TAU)
hand_base.position.y = HAND_BASE_POSITION.y + 0.05 * sin(_anim_angle * 3)
- position_anim = lerp(position_anim, position_, delta * 10)
- rotation_anim = lerp_angle(rotation_anim, rotation_, delta * 10)
+ position_anim = Global.interpolate(position_anim, position_, delta * 10)
+ rotation_anim = Global.interpolate_angle(rotation_anim, rotation_, delta * 10)
position.x = position_anim.x
position.z = position_anim.y
rotation.y = rotation_anim