Files

83 lines
1.9 KiB
GDScript

class_name CockpitCameraController
extends Node3D
const CameraLookCommand = preload(
"res://game/application/vehicle/camera_look_command.gd"
)
const VehicleTelemetry = preload("res://game/application/dive/vehicle_telemetry.gd")
@export var minimum_pitch_radians := -0.30
@export var maximum_pitch_radians := 0.20
@export var maximum_yaw_radians := deg_to_rad(30.0)
@export var feedback_response := 4.5
@export var maximum_feedback_pitch_radians := deg_to_rad(18.0)
@export var maximum_feedback_roll_radians := deg_to_rad(16.0) * 0.55
var _look_yaw := 0.0
var _look_pitch := -0.04
var _feedback_pitch := 0.0
var _feedback_roll := 0.0
var _target_feedback_pitch := 0.0
var _target_feedback_roll := 0.0
func apply_look(command: CameraLookCommand) -> void:
if command == null or not command.validation_error().is_empty():
return
if command.recenter_requested:
_look_yaw = 0.0
_look_pitch = -0.04
else:
_look_yaw = clampf(
_look_yaw + command.yaw_delta_radians,
-maximum_yaw_radians,
maximum_yaw_radians
)
_look_pitch = clampf(
_look_pitch + command.pitch_delta_radians,
minimum_pitch_radians,
maximum_pitch_radians
)
_apply_rotation()
func present_telemetry(telemetry: VehicleTelemetry) -> void:
if telemetry == null:
return
_target_feedback_pitch = (
-telemetry.vertical_effort * maximum_feedback_pitch_radians
)
_target_feedback_roll = (
-telemetry.steering_effort * maximum_feedback_roll_radians
)
func look_yaw_radians() -> float:
return _look_yaw
func look_pitch_radians() -> float:
return _look_pitch
func _process(delta: float) -> void:
_feedback_pitch = lerpf(
_feedback_pitch,
_target_feedback_pitch,
1.0 - exp(-feedback_response * delta)
)
_feedback_roll = lerpf(
_feedback_roll,
_target_feedback_roll,
1.0 - exp(-feedback_response * delta)
)
_apply_rotation()
func _apply_rotation() -> void:
rotation = Vector3(
_look_pitch + _feedback_pitch,
_look_yaw,
_feedback_roll
)