48 lines
1.2 KiB
GDScript3
Raw Normal View History

2024-02-12 16:58:17 +01:00
class_name Camera
2024-01-16 23:01:16 +01:00
extends Camera3D
2024-02-10 00:10:51 +01:00
@export_group("Zoom")
@export var zoom_speed := 0.5
@export var zoom_interpolation := 10.0
@export var zoom_min := 2.0
@export var zoom_max := 8.0
2024-02-05 23:42:04 +01:00
2024-02-10 00:10:51 +01:00
var target_distance: float
2024-02-07 23:02:27 +01:00
2024-01-16 23:01:16 +01:00
func _ready():
2024-02-10 00:10:51 +01:00
target_distance = position.z
2024-01-16 23:01:16 +01:00
Global.camera = self
2024-02-12 11:53:16 +01:00
func _input(event):
if event.is_action_pressed("zoom_in", true):
2024-02-10 00:10:51 +01:00
target_distance -= zoom_speed
on_distance_changed()
2024-02-12 11:53:16 +01:00
get_viewport().set_input_as_handled()
2024-02-10 00:10:51 +01:00
2024-02-12 11:53:16 +01:00
if event.is_action_pressed("zoom_out", true):
2024-02-10 00:10:51 +01:00
target_distance += zoom_speed
on_distance_changed()
2024-02-12 11:53:16 +01:00
get_viewport().set_input_as_handled()
2024-02-07 23:02:27 +01:00
2024-02-10 00:10:51 +01:00
func on_distance_changed():
target_distance = clampf(target_distance, zoom_min, zoom_max)
Global.camera_attributes.dof_blur_far_distance = target_distance + 1.0
2024-02-07 23:02:27 +01:00
2024-02-12 19:35:37 +01:00
func is_below_terrain():
return %CameraRays.occlusion_point.y > global_position.y
2024-02-10 00:10:51 +01:00
func _process(delta):
2024-02-12 16:58:17 +01:00
var distance := target_distance
2024-02-12 19:35:37 +01:00
if %CameraRays.occlusion_distance < target_distance:
distance = %CameraRays.occlusion_distance - 0.5
if is_below_terrain():
position.z = distance
return
2024-02-12 16:58:17 +01:00
if abs(distance - position.z) < 0.01:
2024-02-10 00:10:51 +01:00
return
2024-02-12 16:58:17 +01:00
position.z = lerpf(position.z, distance, zoom_interpolation * delta)