23 lines
1.1 KiB
GDScript
23 lines
1.1 KiB
GDScript
class_name FpsCamera
|
|
extends RefCounted
|
|
|
|
var previous_position := Vector3.INF
|
|
var eye_height := 1.65
|
|
|
|
static func mouse(p: Fighter, motion: InputEventMouseMotion, sensitivity: float) -> void:
|
|
p.yaw = wrapf(p.yaw - motion.screen_relative.x * sensitivity, -PI, PI)
|
|
p.pitch = clampf(p.pitch - motion.screen_relative.y * sensitivity, -1.5, 1.5)
|
|
|
|
func begin_physics(p: Fighter) -> void:
|
|
previous_position = p.global_position
|
|
|
|
func render(p: Fighter, dt: float) -> void:
|
|
var base := p.global_position
|
|
if previous_position.is_finite() and previous_position.distance_to(base) < 3:
|
|
base = previous_position.lerp(base, Engine.get_physics_interpolation_fraction())
|
|
eye_height = lerpf(eye_height, 1.0 if p.crouched else 1.65, 1.0 - exp(-dt * 15))
|
|
p.blast_shake = move_toward(p.blast_shake, 0, dt * 1.8)
|
|
var clock := Time.get_ticks_msec() * 0.001
|
|
p.camera.global_position = base + Vector3(sin(clock * 73) * 0.08 * p.blast_shake, eye_height, cos(clock * 59) * 0.04 * p.blast_shake)
|
|
p.camera.global_rotation = Vector3(p.pitch, p.yaw, 0) + Vector3(sin(clock * 61) * 0.014, 0, sin(clock * 47) * 0.018) * p.blast_shake
|