diff --git a/ovr-utils/Main.tscn b/ovr-utils/Main.tscn index bbf257c..81f4853 100644 --- a/ovr-utils/Main.tscn +++ b/ovr-utils/Main.tscn @@ -25,6 +25,9 @@ overlay_scene = ExtResource( 5 ) [node name="OverlayInteraction" parent="OverlayInstance UI demo" instance=ExtResource( 8 )] +[node name="head" parent="OverlayInstance UI demo/OverlayInteraction/VR" index="2"] +current = true + [node name="XYZ Widget" parent="." instance=ExtResource( 4 )] [node name="OverlayInstance Battery" parent="." instance=ExtResource( 1 )] diff --git a/ovr-utils/addons/openvr_overlay/interaction/overlay_interaction.gd b/ovr-utils/addons/openvr_overlay/interaction/overlay_interaction.gd index c196fde..454b3d7 100644 --- a/ovr-utils/addons/openvr_overlay/interaction/overlay_interaction.gd +++ b/ovr-utils/addons/openvr_overlay/interaction/overlay_interaction.gd @@ -5,21 +5,22 @@ signal touch_off # a controller exited signal trigger_on # trigger pushed while touching signal trigger_off # trigger released -var _touch_state = false setget ,get_touch_state -var _trigger_state = false setget ,get_trigger_state +var _touch_state = false +var _trigger_state = false # controller that currently the trigger down var _active_controller: ARVRController setget ,get_active_controller # reference to the area node thats used for touch var _overlay_area = preload("res://addons/openvr_overlay/interaction/OverlayArea.tscn").instance() -var _cursor_node = preload("res://addons/openvr_overlay/interaction/Cursor.tscn").instance() +var _cursor_node = preload("res://addons/openvr_overlay/interaction/Cursor.tscn").instance() var _right_is_activator = false -var _left_is_activator = false +var _left_is_activator = false var is_moving := false var _pre_move_target = ""# what offset is being changed var _mover_hand_name = ""# left or right, which hand is grabbing (/active controller) -var _mover_hand_offsets = {"pos": Vector3(), "rot": Vector3()} # original offsets for grabbing hand +var _mover_hand_offsets = {"pos": Vector3(), "rot": Quat()} # original offsets for grabbing hand + onready var viewport: Viewport = get_node("../OverlayViewport") onready var tracker_nodes = { @@ -31,8 +32,9 @@ onready var tracker_nodes = { func _ready() -> void: + viewport.add_child(_cursor_node) + add_child(_overlay_area) - get_node("../OverlayViewport").add_child(_cursor_node) _overlay_area.connect("body_entered", self, "_on_OverlayArea_entered") _overlay_area.connect("body_exited", self, "_on_OverlayArea_exited") @@ -54,33 +56,41 @@ func begin_move(): print("Could not begin moving overlay, no controller active. ", get_parent().name) return is_moving = true + # store current states to revert after move _pre_move_target = get_parent().current_target _mover_hand_name = _active_controller.name - _mover_hand_offsets.pos = get_parent().translation - _mover_hand_offsets.rot = get_parent().rotation + _mover_hand_offsets.pos = get_parent().offsets[_mover_hand_name].pos + _mover_hand_offsets.rot = get_parent().offsets[_mover_hand_name].rot - # offset from active controller to overlay - var global_rot = _overlay_area.global_transform.basis.get_rotation_quat() - var hand_rot = _active_controller.transform.basis.get_rotation_quat() - get_parent().offsets[_mover_hand_name].rot = hand_rot.inverse() * global_rot + # calculate offsets from active controller to overlay + var controller_t = _active_controller.transform + var overlay_t = _overlay_area.global_transform - get_parent().offsets[_mover_hand_name].pos = _active_controller.transform.xform_inv(_overlay_area.global_transform.origin) + get_parent().offsets[_mover_hand_name].rot = Quat(controller_t.basis).inverse() * Quat(overlay_t.basis) + get_parent().offsets[_mover_hand_name].pos = controller_t.xform_inv(overlay_t.origin) get_parent().current_target = _mover_hand_name func finish_move(): - is_moving = false - var new_pos = tracker_nodes[_pre_move_target].transform.xform_inv(_overlay_area.global_transform.origin) + # calculate and apply the new offsets + var new_target_t = tracker_nodes[_pre_move_target].transform + var ovelay_t = _overlay_area.global_transform - var new_rot = tracker_nodes[_pre_move_target].transform.basis.get_rotation_quat().inverse() * _overlay_area.global_transform.basis.get_rotation_quat() + var new_pos = new_target_t.xform_inv(ovelay_t.origin) + var new_rot = Quat(new_target_t.basis).inverse() * Quat(ovelay_t.basis) + get_parent().offsets[_pre_move_target].pos = new_pos + get_parent().offsets[_pre_move_target].rot = new_rot + # revert the grabbing hands offsets in case it's used as a fallback + get_parent().offsets[_mover_hand_name].pos = _mover_hand_offsets.pos + get_parent().offsets[_mover_hand_name].rot = _mover_hand_offsets.rot + + # reset current_target (parent handles fallback) get_parent().update_current_target() - get_parent().update_tracker_id() - get_parent().offsets[get_parent().current_target].pos = new_pos - get_parent().offsets[get_parent().current_target].rot = new_rot - get_parent().update_offset() + _update_target() + is_moving = false #get canvas position of active controller diff --git a/ovr-utils/addons/openvr_overlay/move_overlay.gd b/ovr-utils/addons/openvr_overlay/move_overlay.gd index 26152c2..0d519eb 100644 --- a/ovr-utils/addons/openvr_overlay/move_overlay.gd +++ b/ovr-utils/addons/openvr_overlay/move_overlay.gd @@ -1,6 +1,5 @@ extends Control - var ihandler func _ready() -> void: @@ -8,10 +7,8 @@ func _ready() -> void: func _on_DragButton_button_down() -> void: - if ihandler: - ihandler.begin_move() + ihandler.begin_move() func _on_DragButton_button_up() -> void: - if ihandler: - ihandler.finish_move() + ihandler.finish_move() diff --git a/ovr-utils/addons/openvr_overlay/overlay_instance.gd b/ovr-utils/addons/openvr_overlay/overlay_instance.gd index d9eb1ee..423cf17 100644 --- a/ovr-utils/addons/openvr_overlay/overlay_instance.gd +++ b/ovr-utils/addons/openvr_overlay/overlay_instance.gd @@ -1,4 +1,3 @@ -class_name OverlayInstance extends Spatial signal width_changed @@ -7,6 +6,7 @@ signal target_changed const TARGETS = ["head", "left", "right", "world"] export (String, "head", "left", "right", "world") var target = "left" setget set_target + export var overlay_scene =\ preload("res://addons/openvr_overlay/MissingOverlay.tscn") setget set_overlay_scene export var width_meters = 0.4 setget set_width_in_meters @@ -17,7 +17,6 @@ export var offsets:Dictionary = { "right": {"pos": Vector3(), "rot": Quat()}, "world": {"pos": Vector3(), "rot": Quat()} } -# also contains temp offset that is created when dragged # what's actually tracking var current_target = target setget _set_current_target# most of the time the actual target, but will fall back @@ -75,10 +74,11 @@ func update_offset() -> void: func update_current_target(): - current_target = target + _set_current_target(target) # TODO fallback if not found + func _tracker_changed(tracker_name: String, type: int, id: int): update_tracker_id() update_offset() diff --git a/ovr-utils/project.godot b/ovr-utils/project.godot index 613bdaf..b2bec3c 100644 --- a/ovr-utils/project.godot +++ b/ovr-utils/project.godot @@ -8,16 +8,6 @@ config_version=4 -_global_script_classes=[ { -"base": "Spatial", -"class": "OverlayInstance", -"language": "GDScript", -"path": "res://addons/openvr_overlay/overlay_instance.gd" -} ] -_global_script_class_icons={ -"OverlayInstance": "" -} - [application] config/name="ovr-utils"