immersive-home/lib/utils/touch/collide.gd

66 lines
2.0 KiB
GDScript3
Raw Normal View History

2024-02-27 17:39:47 +02:00
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)