aboutsummaryrefslogtreecommitdiff
path: root/client/player
diff options
context:
space:
mode:
Diffstat (limited to 'client/player')
-rw-r--r--client/player/follow_camera.gd45
1 files changed, 31 insertions, 14 deletions
diff --git a/client/player/follow_camera.gd b/client/player/follow_camera.gd
index 74355688..f0d5700d 100644
--- a/client/player/follow_camera.gd
+++ b/client/player/follow_camera.gd
@@ -1,19 +1,19 @@
# Undercooked - a game about cooking
# Copyright 2024 nokoe
# Copyright 2024 metamuffin
-#
+#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, version 3 of the License only.
-#
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
-#
+#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
-#
+#
class_name FollowCamera
extends Camera3D
@@ -25,7 +25,10 @@ const ANGLE_UP_MIN: float = 0.5
const ANGLE_UP_MAX: float = 1.2
const LOOK_WEIGHT: float = 8.0
const MOVE_WEIGHT: float = 2.0
-const CAMERA_DISTANCE: float = 10
+const ZOOM_SPEED: float = 10.0
+const ZOOM_WEIGHT: float = 10.0
+const MAX_ZOOM: float = 20.0
+const MIN_ZOOM: float = 2.0
@export var target: Node3D
@@ -34,6 +37,8 @@ var angle: float = 0
var angle_up_target: float = 1
var angle_up: float = 1
var ground: Vector3
+var camera_distance: float = 10.
+var camera_distance_target: float = camera_distance
func _ready():
if target == null:
@@ -46,14 +51,6 @@ func _process(delta):
follow(delta)
func follow(delta):
- var new_transform = transform.looking_at(target.position)
-
- 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)
- ))
-
angle_target += Input.get_axis("rotate_left", "rotate_right") * ROTATE_SPEED * delta
angle = lerp_angle(angle, angle_target, delta * ROTATE_WEIGHT)
@@ -61,5 +58,25 @@ func follow(delta):
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)
+ var offset = Vector3(0, sin(angle_up) * camera_distance, cos(angle_up) * camera_distance).rotated(Vector3.UP, angle)
+
+ var new_transform = transform
+ new_transform.origin = target.position + offset
+ new_transform = new_transform.looking_at(target.position)
+
+ if Global.settings["interpolate_camera_rotation"]["value"]:
+ 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)
+ ))
+ else:
+ transform.basis = new_transform.basis
ground = ground.lerp(target.position, delta * MOVE_WEIGHT)
- position = ground + Vector3(0, sin(angle_up) * CAMERA_DISTANCE, cos(angle_up) * CAMERA_DISTANCE).rotated(Vector3.UP, angle)
+
+ 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)
+
+ position = ground + offset