fix dragging overlays from other targets

This commit is contained in:
Crispy 2021-05-22 22:01:39 +02:00
parent ac6f31aedf
commit 1c27c7f6b2
2 changed files with 24 additions and 33 deletions

View file

@ -3,13 +3,13 @@ extends Node
signal touch_on # a controller entered signal touch_on # a controller entered
signal touch_off # a controller exited signal touch_off # a controller exited
signal trigger_on # trigger pushed while touching signal trigger_on # trigger pushed while touching
signal trigger_off # trigger released signal trigger_off# trigger released
var _touch_state = false var _touch_state = false
var _trigger_state = false var _trigger_state = false
# controller that currently the trigger down # controller that currently the trigger down
var _active_controller: ARVRController setget ,get_active_controller var _active_controller: String = ""
# reference to the area node thats used for touch # reference to the area node thats used for touch
var _overlay_area = preload("res://addons/openvr_overlay/interaction/OverlayArea.tscn").instance() 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()
@ -58,12 +58,12 @@ func begin_move():
is_moving = true is_moving = true
# store current states to revert after move # store current states to revert after move
_pre_move_target = get_parent().current_target _pre_move_target = get_parent().current_target
_mover_hand_name = _active_controller.name _mover_hand_name = _active_controller
_mover_hand_offsets.pos = get_parent().offsets[_mover_hand_name].pos _mover_hand_offsets.pos = get_parent().offsets[_mover_hand_name].pos
_mover_hand_offsets.rot = get_parent().offsets[_mover_hand_name].rot _mover_hand_offsets.rot = get_parent().offsets[_mover_hand_name].rot
# calculate offsets from active controller to overlay # calculate offsets from active controller to overlay
var controller_t = _active_controller.transform var controller_t = tracker_nodes[_active_controller].transform
var overlay_t = _overlay_area.global_transform var overlay_t = _overlay_area.global_transform
get_parent().offsets[_mover_hand_name].rot = Quat(controller_t.basis).inverse() * Quat(overlay_t.basis) get_parent().offsets[_mover_hand_name].rot = Quat(controller_t.basis).inverse() * Quat(overlay_t.basis)
@ -95,11 +95,11 @@ func finish_move():
#get canvas position of active controller #get canvas position of active controller
func get_canvas_pos() -> Vector2: func get_canvas_pos() -> Vector2:
if _active_controller == null: if _active_controller == "":
return Vector2(-1000, 1000) # offscreen return Vector2(-1000, 1000) # offscreen
var controller_local_pos = _overlay_area.global_transform.xform_inv(\ var controller_local_pos = _overlay_area.global_transform.xform_inv(\
_active_controller.global_transform.origin) tracker_nodes[_active_controller].translation)
var pos = Vector2(controller_local_pos.x, controller_local_pos.y) var pos = Vector2(controller_local_pos.x, controller_local_pos.y)
var overlay_size = OverlayInit.ovr_interface.get_render_targetsize() var overlay_size = OverlayInit.ovr_interface.get_render_targetsize()
@ -143,7 +143,7 @@ func _on_OverlayArea_entered(body: Node) -> void:
return return
_touch_state = true _touch_state = true
if not is_moving: if not is_moving:
_active_controller = body.get_parent() _active_controller = body.get_parent().name
emit_signal("touch_on") emit_signal("touch_on")
@ -151,7 +151,7 @@ func _on_OverlayArea_exited(body: Node) -> void:
if body.get_node("../../..") != self or is_moving: if body.get_node("../../..") != self or is_moving:
return return
# TEMP # TEMP
_active_controller = null # TODO revert to other controller if both were touching (edge case) _active_controller = "" # TODO revert to other controller if both were touching (edge case)
_touch_state = false _touch_state = false
emit_signal("touch_off") emit_signal("touch_off")
@ -168,21 +168,10 @@ func _update_offset():
func _update_target(): func _update_target():
# move _overlay_area # reparent _overlay_area
_overlay_area.get_parent().remove_child(_overlay_area) _overlay_area.get_parent().remove_child(_overlay_area)
tracker_nodes[get_parent().current_target].add_child(_overlay_area) tracker_nodes[get_parent().current_target].add_child(_overlay_area)
# match get_parent().target:
# "head":
# $VR/Head.add_child(_overlay_area)
# "left":
# $VR/LeftHand.add_child(_overlay_area)
# "right":
# $VR/RightHand.add_child(_overlay_area)
# "world":
# $VR.add_child(_overlay_area)
# if is_moving:
# return
_left_is_activator = get_parent().current_target != "left" _left_is_activator = get_parent().current_target != "left"
_right_is_activator = get_parent().current_target != "right" _right_is_activator = get_parent().current_target != "right"
@ -193,21 +182,21 @@ func _update_target():
func _on_RightHand_button_pressed(button: int) -> void: func _on_RightHand_button_pressed(button: int) -> void:
if button == JOY_VR_TRIGGER and _right_is_activator: if button == JOY_VR_TRIGGER and _right_is_activator:
_trigger_on(tracker_nodes.right) _trigger_on("right")
func _on_RightHand_button_release(button: int) -> void: func _on_RightHand_button_release(button: int) -> void:
if button == JOY_VR_TRIGGER and _active_controller == tracker_nodes.right: if button == JOY_VR_TRIGGER and _active_controller == "right":
_trigger_off() _trigger_off()
func _on_LeftHand_button_pressed(button: int) -> void: func _on_LeftHand_button_pressed(button: int) -> void:
if button == JOY_VR_TRIGGER and _left_is_activator: if button == JOY_VR_TRIGGER and _left_is_activator:
_trigger_on(tracker_nodes.left) _trigger_on("left")
func _on_LeftHand_button_release(button: int) -> void: func _on_LeftHand_button_release(button: int) -> void:
if button == JOY_VR_TRIGGER and _active_controller == tracker_nodes.right: if button == JOY_VR_TRIGGER and _active_controller == "left":
_trigger_off() _trigger_off()

View file

@ -21,7 +21,7 @@ var offsets:Dictionary = {
} }
# what's actually tracking # what's actually tracking
var current_target = target setget _set_current_target# most of the time the actual target, but will fall back var current_target: String = "world" setget _set_current_target# most of the time the actual target, but will fall back
var _tracker_id: int = 0 var _tracker_id: int = 0
@ -29,9 +29,10 @@ onready var container = $OverlayViewport/Container
func _ready() -> void: func _ready() -> void:
current_target = target
# TEMP # TEMP
offsets.left.pos = translation offsets[current_target].pos = translation
offsets.left.rot = transform.basis.get_rotation_quat() offsets[current_target].rot = transform.basis.get_rotation_quat()
### ###
ARVRServer.connect("tracker_added", self, "_tracker_changed") ARVRServer.connect("tracker_added", self, "_tracker_changed")
@ -44,6 +45,7 @@ func _ready() -> void:
update_tracker_id() update_tracker_id()
update_offset() update_offset()
emit_signal("target_changed")
set_notify_transform(true) set_notify_transform(true)
@ -93,7 +95,7 @@ func set_target(new: String):
target = new target = new
update_tracker_id() update_tracker_id()
call_deferred("update_offset") call_deferred("update_offset")
emit_signal("target_changed") update_current_target()
func _set_current_target(new: String): # overrides target func _set_current_target(new: String): # overrides target