mirror of
https://github.com/CrispyPin/ovr-utils.git
synced 2025-04-11 15:03:58 +02:00
94 lines
2.7 KiB
GDScript
94 lines
2.7 KiB
GDScript
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())
|
|
|