Files
airplane-mode/scripts/hud.gd

131 lines
3.8 KiB
GDScript

extends CanvasLayer
@export var player_path: NodePath
@export var camera_path: NodePath
@export var vector_scale: float = 2.5
@export var max_radius: float = 140.0
@export var gizmo_margin: Vector2 = Vector2(140, 140)
@export var gizmo_axis_length: float = 55.0
@export var gizmo_axis_width: float = 2.0
@export var velocity_line_width: float = 3.0
@export var show_axis_debug: bool = true
var _velocity_line: Line2D
var _axis_x: Line2D
var _axis_y: Line2D
var _axis_z: Line2D
var _vector_label: Label
var _axis_label: Label
var _player: RigidBody3D
var _camera: Camera3D
func _ready() -> void:
_velocity_line = _get_or_create_velocity_line()
_axis_x = _get_or_create_axis_line("AxisX", Color(0.95, 0.2, 0.2, 0.9))
_axis_y = _get_or_create_axis_line("AxisY", Color(0.2, 0.9, 0.4, 0.9))
_axis_z = _get_or_create_axis_line("AxisZ", Color(0.2, 0.5, 1.0, 0.9))
_vector_label = _get_or_create_vector_label()
_axis_label = _get_or_create_axis_label()
_player = get_node_or_null(player_path)
_camera = get_node_or_null(camera_path)
_axis_label.visible = show_axis_debug
func _process(_delta: float) -> void:
if _player == null or _camera == null:
return
var velocity = _player.linear_velocity
var cam_basis = _camera.global_transform.basis
var local_velocity = cam_basis.inverse() * velocity
var arrow = Vector2(local_velocity.x, -local_velocity.y) * vector_scale
if arrow.length() > max_radius:
arrow = arrow.normalized() * max_radius
var viewport_size = get_viewport().get_visible_rect().size
var center = Vector2(
viewport_size.x - gizmo_margin.x,
viewport_size.y - gizmo_margin.y
)
_velocity_line.points = PackedVector2Array([center, center + arrow])
var player_basis = _player.global_transform.basis
var rel_basis = cam_basis.inverse() * player_basis
_axis_x.points = PackedVector2Array([
center,
center + Vector2(rel_basis.x.x, -rel_basis.x.y) * gizmo_axis_length
])
_axis_y.points = PackedVector2Array([
center,
center + Vector2(rel_basis.y.x, -rel_basis.y.y) * gizmo_axis_length
])
_axis_z.points = PackedVector2Array([
center,
center + Vector2(rel_basis.z.x, -rel_basis.z.y) * gizmo_axis_length
])
_vector_label.text = "Velocity: (%.1f, %.1f, %.1f) m/s | Speed: %.1f" % [
velocity.x,
velocity.y,
velocity.z,
velocity.length(),
]
if show_axis_debug and _axis_label != null:
if _player.has_method("get_axis_debug_text"):
_axis_label.text = _player.get_axis_debug_text()
func _get_or_create_velocity_line() -> Line2D:
var existing: Line2D = get_node_or_null("VelocityLine")
if existing != null:
return existing
var line := Line2D.new()
line.name = "VelocityLine"
line.width = velocity_line_width
line.default_color = Color(1, 0.7, 0.2, 0.9)
line.antialiased = true
add_child(line)
return line
func _get_or_create_axis_line(name: String, color: Color) -> Line2D:
var existing: Line2D = get_node_or_null(name)
if existing != null:
return existing
var line := Line2D.new()
line.name = name
line.width = gizmo_axis_width
line.default_color = color
line.antialiased = true
add_child(line)
return line
func _get_or_create_vector_label() -> Label:
var existing: Label = get_node_or_null("VectorLabel")
if existing != null:
return existing
var label := Label.new()
label.name = "VectorLabel"
label.text = "Velocity:"
label.set_anchors_and_offsets_preset(Control.PRESET_TOP_LEFT)
label.offset_left = 12.0
label.offset_top = 12.0
label.offset_right = 520.0
label.offset_bottom = 40.0
add_child(label)
return label
func _get_or_create_axis_label() -> Label:
var existing: Label = get_node_or_null("AxisLabel")
if existing != null:
return existing
var label := Label.new()
label.name = "AxisLabel"
label.text = "Axis:"
label.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_LEFT)
label.offset_left = 12.0
label.offset_top = -60.0
label.offset_right = 520.0
label.offset_bottom = -12.0
add_child(label)
return label