66 lines
2.0 KiB
GDScript3
66 lines
2.0 KiB
GDScript3
|
extends Node3D
|
||
|
|
||
|
const Finger = preload ("res://lib/utils/touch/finger.gd")
|
||
|
|
||
|
## Record<Finger.Type, Area3D>
|
||
|
var finger_areas: Dictionary
|
||
|
|
||
|
## Record<TouchBody3D, Array<Finger.Type>>
|
||
|
var bodies_entered = {}
|
||
|
var hand_left: Node3D
|
||
|
var hand_right: Node3D
|
||
|
|
||
|
@onready var console = get_node("/root/Main/Console")
|
||
|
|
||
|
func _init(hand_left: OpenXRHand, hand_right: OpenXRHand, finger_areas: Dictionary):
|
||
|
self.finger_areas = finger_areas
|
||
|
self.hand_left = hand_left.get_node("left_hand/Armature_001/Skeleton3D/vr_glove_left_slim")
|
||
|
self.hand_right = hand_right.get_node("right_hand/Armature/Skeleton3D/vr_glove_right_slim")
|
||
|
|
||
|
func _ready():
|
||
|
for finger_type in finger_areas.keys():
|
||
|
|
||
|
finger_areas[finger_type].area_entered.connect(func(body):
|
||
|
if body is TouchBody3D:
|
||
|
_on_body_entered(finger_type, body)
|
||
|
)
|
||
|
|
||
|
finger_areas[finger_type].area_exited.connect(func(body):
|
||
|
if body is TouchBody3D:
|
||
|
_on_body_exited(finger_type, body)
|
||
|
)
|
||
|
|
||
|
func _physics_process(_delta):
|
||
|
hand_left.position = Vector3.ZERO
|
||
|
hand_right.position = Vector3.ZERO
|
||
|
|
||
|
for body in bodies_entered.keys():
|
||
|
var fingers = bodies_entered[body]
|
||
|
|
||
|
for finger in fingers:
|
||
|
if finger == Finger.Type.INDEX_LEFT:
|
||
|
var start_pos = finger_areas[finger].global_position
|
||
|
var end_pos = body.to_global(body.plane.project(body.to_local(start_pos)))
|
||
|
|
||
|
hand_left.global_position = end_pos + (hand_left.global_position - start_pos)
|
||
|
|
||
|
elif finger == Finger.Type.INDEX_RIGHT:
|
||
|
var start_pos = finger_areas[finger].global_position
|
||
|
var end_pos = body.to_global(body.plane.project(body.to_local(start_pos)))
|
||
|
|
||
|
hand_right.global_position = end_pos + (hand_right.global_position - start_pos)
|
||
|
|
||
|
func _on_body_entered(finger_type, body):
|
||
|
if bodies_entered.has(body):
|
||
|
if !bodies_entered[body].has(finger_type):
|
||
|
bodies_entered[body].append(finger_type)
|
||
|
else:
|
||
|
bodies_entered[body] = [finger_type]
|
||
|
|
||
|
func _on_body_exited(finger_type, body):
|
||
|
if bodies_entered.has(body):
|
||
|
if bodies_entered[body].has(finger_type):
|
||
|
bodies_entered[body].erase(finger_type)
|
||
|
|
||
|
if bodies_entered[body].size() == 0:
|
||
|
bodies_entered.erase(body)
|