class_name HudInstrument extends Control # Shared base for the HUD's procedural instruments (heading tape, attitude # indicator, gauges): the exponential-smoothing weight calc and the # angle-aware lerp helper they all use. Each instrument still owns its own # _process (smoothing 1-2 distinct fields) and _draw (entirely bespoke). const SMOOTHING := 12.0 # _draw does real work (text shaping, building point arrays); nobody can # perceive an instrument repainting faster than this, so redraws are paced # to it independently of the render frame rate — value smoothing itself # still runs every _process call, only the (expensive) repaint is throttled. const REDRAW_INTERVAL := 1.0 / 60.0 var _time_since_redraw := 0.0 static func lerp_angle_deg(from: float, to: float, weight: float) -> float: return rad_to_deg(lerp_angle(deg_to_rad(from), deg_to_rad(to), weight)) # Shortest signed distance from `from` to `to` in degrees, wrapped to # [-180, 180]. Use this (never a plain subtraction) to decide whether an # angle that wraps around (heading, roll) has moved enough to redraw — # a naive delta gives a false-large jump at the 0/360 boundary. static func angle_delta_deg(from: float, to: float) -> float: return wrapf(to - from, -180.0, 180.0) func _smoothing_weight(delta: float) -> float: return 1.0 - exp(-SMOOTHING * delta) # frame-rate independent # Call instead of queue_redraw() directly once a subclass's _process has # decided the smoothed value moved enough to warrant a repaint. func _throttled_redraw(delta: float) -> void: _time_since_redraw += delta if _time_since_redraw >= REDRAW_INTERVAL: _time_since_redraw = 0.0 queue_redraw()