extends Node enum TARGETS { head, left, right, world } export (TARGETS) var target = TARGETS.head setget _set_target export var overlay_scene = preload("res://addons/openvr_overlay/MissingOverlay.tscn") setget _set_overlay_scene export var offset_pos := Vector3(0, 0, -1) setget _set_offset_pos export var offset_rot: Vector3 setget _set_offset_rot export var width_meters = 0.4 setget _set_width_meters export var fallback_to_hmd = false # fallback is only applied if tracker is not present at startup var _tracker_id: int = 0 setget ,get_tracker_id func _ready() -> void: ARVRServer.connect("tracker_added", self, "_tracker_changed") ARVRServer.connect("tracker_removed", self, "_tracker_changed") $OverlayViewport.overlay_width_in_meters = width_meters $OverlayViewport.size = OverlayInit.ovr_interface.get_render_targetsize() if overlay_scene: $OverlayViewport/PanelContainer.add_child(overlay_scene.instance()) update_tracker_id() update_offset() func update_tracker_id() -> void: _tracker_id = -1 if target in [TARGETS.left, TARGETS.right]: # target is a controller for i in ARVRServer.get_tracker_count(): var tracker = ARVRServer.get_tracker(i) if tracker.get_hand() == target: _tracker_id = int(tracker.get_name().split("_")[-1]) if _tracker_id == -1: # could not find controller, overlay will revert to fallback # only happens if controller is missing on startup, otherwise it will register as being at origin if fallback_to_hmd: _tracker_id = 0 # HMD else: _tracker_id = 63 # World origin func update_offset() -> void: $Offset.translation = offset_pos $Offset.rotation_degrees = offset_rot # print(_tracker_id) match target: TARGETS.head: $OverlayViewport.track_relative_to_device(0, $Offset.transform) TARGETS.world: $OverlayViewport.overlay_position_absolute($Offset.transform) _: $OverlayViewport.track_relative_to_device(_tracker_id, $Offset.transform) func _tracker_changed(tracker_name: String, type: int, id: int): # print("tracker changed: ", tracker_name) update_tracker_id() update_offset() func get_tracker_id() -> int: return _tracker_id func _set_target(new: int): target = new update_tracker_id() update_offset() func _set_offset_pos(pos: Vector3): offset_pos = pos update_offset() func _set_offset_rot(rot: Vector3): offset_rot = rot update_offset() func _set_width_meters(width: float): width_meters = width $OverlayViewport.overlay_width_in_meters = width_meters func _set_overlay_scene(scene: PackedScene): overlay_scene = scene if $OverlayViewport/PanelContainer.get_children(): $OverlayViewport/PanelContainer.get_child(0).queue_free() $OverlayViewport/PanelContainer.add_child(overlay_scene.instance())