Files

89 lines
2.8 KiB
GDScript
Raw Permalink Normal View History

2026-07-04 18:22:23 -06:00
extends Node3D
class_name SatelliteWidget3dNode
var sensor_class: String
var used_sensors: Dictionary = {}
var host_vehicle: VehicleNode
var vehicle_3d_node: Node3D
var vehicle_position: Vector3 = Vector3.ZERO
var sat_scene: PackedScene = preload("res://widgets/satellites/satellite.tscn")
var sat_nodes = {}
var need_sat_update: bool = true
var sat_update_timer: float = 0
var sat_update_rate: float = 60.
var lines = []
var GPS_ALT_KM = 20_200
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
GPS_ALT_KM += Constants.EARTH_RADIUS_KM
Signals.vehicle_added.connect(_on_vehicle_added)
Signals.requested_host_vehicle.emit(self)
Signals.sat_position_updated.connect(_on_sat_position_updated)
Signals.position_updated.connect(_on_position_updated)
func _process(delta: float):
sat_update_timer += delta
if sat_update_timer >= sat_update_rate:
sat_update_timer = 0
need_sat_update = true
if host_vehicle != null:
return
Signals.requested_host_vehicle.emit(self)
func _on_vehicle_added(new_vehicle):
host_vehicle = new_vehicle
func set_host_vehicle(new_vehicle):
host_vehicle = new_vehicle
vehicle_3d_node = Node3D.new()
add_child(vehicle_3d_node)
func _on_sat_position_updated(sensor_ip: String, sat_position_data: Array):
if vehicle_3d_node == null:
return
if not need_sat_update:
return
need_sat_update = false
var current_sat_ids = []
for sat_data in sat_position_data:
var sat_id = sat_data[0]
var el_rad = deg_to_rad(sat_data[1])
var az_rad = deg_to_rad(sat_data[2])
current_sat_ids.append(sat_id)
if sat_id not in sat_nodes:
_create_sat_node(sat_id)
_update_sat_position(sat_id, el_rad, az_rad)
for old_sat_id in sat_nodes.keys():
if old_sat_id not in current_sat_ids:
vehicle_3d_node.remove_child(sat_nodes[old_sat_id])
sat_nodes[old_sat_id].queue_free()
sat_nodes.erase(old_sat_id)
func _create_sat_node(sat_id: String):
var new_sat_node = sat_scene.instantiate()
sat_nodes[sat_id] = new_sat_node
vehicle_3d_node.add_child(new_sat_node)
func _update_sat_position(sat_id, el_rad, az_rad):
# vehicle node is rotated to SEZ.
# Az is rotated clockwise from north
# 0 el is horizon. 90 is zenith
var x = sin(el_rad) * cos(az_rad + PI)
var y = sin(el_rad) * sin(az_rad + PI)
var z = cos(el_rad)
var sat_position = Vector3(x, y, z)
var global_sat_position = ((vehicle_position.normalized() + sat_position) * GPS_ALT_KM)
var local_sat_position = global_sat_position - vehicle_position
sat_nodes[sat_id].position = Vector3(local_sat_position.x, local_sat_position.z, local_sat_position.y)
func _on_position_updated(sensor_ip: String, physics_position: Vector3):
if vehicle_3d_node == null:
return
vehicle_position = physics_position
vehicle_3d_node.position = Vector3(physics_position.x, physics_position.z, physics_position.y)