@tool class_name PFD extends Node2D @export var euler_attitude_deg: Vector3: set(value): euler_attitude_deg = value horizon_pivot.rotation = deg_to_rad(-value.x) const px_per_deg: float = 6.56 horizon_background.position.y = px_per_deg * clamp(value.y, -30, 30) heading_ticks.rotation = deg_to_rad(-value.z) heading_label.text = "%03d" % (int(round(value.z) + 360) % 360) @export var airspeed: float: set(value): airspeed = value airspeed_label.text = str(int(round(value))) @export var groundspeed: float: set(value): groundspeed = value groundspeed_label.text = str(int(round(value))) @export var altitude: float: set(value): altitude = value var step = 1 altitude_label.text = str(int(step * round(value / step))) @export var climbrate: float = 1000: set(value): climbrate = value climbrate_arrow.scale.y = clamp(value / 1000.0, -1, 1) @onready var horizon_pivot: Node2D = $HorizonMask/HorizonOrigin/Pivot @onready var horizon_background: Node2D = $HorizonMask/HorizonOrigin/Pivot/Background @onready var heading_ticks: Node2D = $HeadingOrigin/Ticks @onready var climbrate_arrow: Node2D = $ClimbrateOrigin/Polygon2D @onready var airspeed_label: Label = $Airspeed @onready var groundspeed_label: Label = $Groundspeed @onready var altitude_label: Label = $Altitude @onready var heading_label: Label = $Heading func update(aircraft: Transform3D, velocity: Vector3): var godot_euler = aircraft.basis.get_euler() euler_attitude_deg = Vector3(godot_euler.z, -godot_euler.x, -godot_euler.y) * rad_to_deg(1) const mps_to_kt = 1.94384 var v_local = aircraft.basis.inverse() * velocity airspeed = max(0, v_local.z) * mps_to_kt var v_horizontal = Vector3(velocity.x, 0, velocity.z) groundspeed = v_horizontal.length() * mps_to_kt const mps_to_fpm = 196.848 climbrate = velocity.y * mps_to_fpm const m_to_ft = 3.2808 altitude = aircraft.origin.y * m_to_ft