diff --git a/client/camera/Camera.gd b/client/camera/Camera.gd index 62c96b7..8f7e2ad 100644 --- a/client/camera/Camera.gd +++ b/client/camera/Camera.gd @@ -8,9 +8,16 @@ extends Camera3D @export var follow_enabled: bool @export var follow_speed: float +@export_group("Shake") +@export var shake_strength := 1.0 +@export var shake_decay := 0.8 +@export var shake_noise: Noise + +var trauma := 0.0 +var trauma_time := 0.0 + func _ready(): Global.camera = self - look_at(pivot_node.position) func _process(delta): if Global.player == null: @@ -21,12 +28,19 @@ func _process(delta): else: follow_node.position = Global.player.position -# @export var shake_strength: float -# var noise = FastNoiseLite.new() -# func shake(time): -# var trauma_sq := 1.0 -# var h_offset := noise.get_noise_2d(time, 0) * trauma_sq * shake_strength -# var v_offset := noise.get_noise_2d(time, 1) * trauma_sq * shake_strength -# rotate_x(noise.get_noise_2d(time, 2) * trauma_sq * shake_strength) -# rotate_y(noise.get_noise_2d(time, 3) * trauma_sq * shake_strength) -# rotate_z(noise.get_noise_2d(time, 4) * trauma_sq * shake_strength) + if trauma: + trauma = max(trauma - shake_decay * delta, 0) + trauma_time += 4096 * delta + _shake(trauma_time) + else: + look_at(pivot_node.global_position) + trauma_time = 0 + +func _shake(time): + var trauma_sq := trauma * trauma + rotation.x += shake_noise.get_noise_2d(time, 0) * trauma_sq * shake_strength + rotation.y += shake_noise.get_noise_2d(time, 1) * trauma_sq * shake_strength + rotation.z += shake_noise.get_noise_2d(time, 2) * trauma_sq * shake_strength + +func add_shake(amount: float): + trauma = min(trauma + amount, 1.0)