[gd_scene load_steps=4 format=3 uid="uid://byj36o0boo1v2"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="3_te2p8"] [sub_resource type="GDScript" id="GDScript_4kea7"] script/source = "extends Node3D const Pointer = preload (\"res://lib/utils/pointer/pointer.gd\") const Initiator = preload (\"res://lib/utils/pointer/initiator.gd\") const Finger = preload (\"res://lib/utils/touch/finger.gd\") const Touch = preload (\"res://lib/utils/touch/touch.gd\") const Collide = preload (\"res://lib/utils/touch/collide.gd\") const Miniature = preload (\"res://content/system/house/mini/miniature.gd\") @onready var main = $\"/root/Main\" @onready var palm = $XRHandLeft/Palm @onready var quick_actions = $XRHandLeft/Palm/QuickActions @onready var mini_view_button = $XRHandLeft/Palm/QuickActions/MiniView @onready var temperature_button = $XRHandLeft/Palm/QuickActions/Temperature @onready var humidity_button = $XRHandLeft/Palm/QuickActions/Humidity @export var ray_left: RayCast3D @export var ray_right: RayCast3D @export var hand_left: Node3D @export var hand_right: Node3D @onready var bone_attachments_right = [$XRHandRight/IndexTip, $XRHandRight/ThumbTip, $XRHandRight/MiddleTip] @onready var bone_attachments_left = [$XRHandLeft/IndexTip, $XRHandLeft/ThumbTip, $XRHandLeft/MiddleTip] enum Fingers {INDEX, THUMB, MIDDLE} var left_initiator: Initiator = Initiator.new() var right_initiator: Initiator = Initiator.new() var touch: Touch var collide: Collide var left_pointer: Pointer var right_pointer: Pointer var press_distance = 0.03 var grip_distance = 0.03 var pressed_left = false var pressed_right = false var grabbed_left = false var grabbed_right = false func _ready(): var fingers = { Finger.Type.INDEX_RIGHT: $XRHandRight/IndexTip/TouchArea, Finger.Type.INDEX_LEFT: $XRHandLeft/IndexTip/TouchArea, Finger.Type.MIDDLE_RIGHT: $XRHandRight/MiddleTip/TouchArea, Finger.Type.MIDDLE_LEFT: $XRHandLeft/MiddleTip/TouchArea } touch = Touch.new(fingers) collide = Collide.new(hand_left, hand_right, $XRHandLeft/IndexTip/TouchArea, $XRHandRight/IndexTip/TouchArea) add_child(touch) add_child(collide) _ready_hand() mini_view_button.on_button_up.connect(func(): House.body.mini_view.small.value=!House.body.mini_view.small.value ) temperature_button.on_button_up.connect(func(): if House.body.mini_view.heatmap_type.value == Miniature.HeatmapType.TEMPERATURE: House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.NONE else: House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.TEMPERATURE ) humidity_button.on_button_up.connect(func(): if House.body.mini_view.heatmap_type.value == Miniature.HeatmapType.HUMIDITY: House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.NONE else: House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.HUMIDITY ) func _ready_hand(): left_initiator.type = Initiator.Type.HAND_LEFT left_initiator.node = ray_left.get_parent() left_pointer = Pointer.new(left_initiator, ray_left) add_child(left_pointer) right_initiator.type = Initiator.Type.HAND_RIGHT right_initiator.node = ray_right.get_parent() right_pointer = Pointer.new(right_initiator, ray_right) add_child(right_pointer) func _process(_delta): if main.camera.global_transform.basis.z.dot(palm.global_transform.basis.y) > 0.85: if quick_actions.is_inside_tree() == false: palm.add_child(quick_actions) else: if quick_actions.is_inside_tree(): palm.remove_child(quick_actions) func _physics_process(_delta): _process_hand_left(hand_left) _process_hand_right(hand_right) func _process_hand_left(hand: Node3D): var index_tip = bone_attachments_left[Fingers.INDEX].get_node(\"Marker3D\") var thumb_tip = bone_attachments_left[Fingers.THUMB].get_node(\"Marker3D\") var middle_tip = bone_attachments_left[Fingers.MIDDLE].get_node(\"Marker3D\") var _ray = ray_left if hand == hand_left else ray_right var initiator = left_initiator if hand == hand_left else right_initiator var distance_trigger = index_tip.global_position.distance_to(thumb_tip.global_position) var distance_grab = middle_tip.global_position.distance_to(thumb_tip.global_position) var trigger_close = distance_trigger <= press_distance var grab_close = distance_grab <= grip_distance if trigger_close&&!pressed_left: initiator.on_press.emit(Initiator.EventType.TRIGGER) pressed_left = true elif !trigger_close&&pressed_left: initiator.on_release.emit(Initiator.EventType.TRIGGER) pressed_left = false if grab_close&&!grabbed_left: initiator.on_press.emit(Initiator.EventType.GRIP) grabbed_left = true elif !grab_close&&grabbed_left: initiator.on_release.emit(Initiator.EventType.GRIP) grabbed_left = false func _process_hand_right(hand: Node3D): var index_tip = bone_attachments_right[Fingers.INDEX].get_node(\"Marker3D\") var thumb_tip = bone_attachments_right[Fingers.THUMB].get_node(\"Marker3D\") var middle_tip = bone_attachments_right[Fingers.MIDDLE].get_node(\"Marker3D\") var _ray = ray_left if hand == hand_left else ray_right var initiator = left_initiator if hand == hand_left else right_initiator var distance_trigger = index_tip.global_position.distance_to(thumb_tip.global_position) var distance_grab = middle_tip.global_position.distance_to(thumb_tip.global_position) var trigger_close = distance_trigger <= press_distance var grab_close = distance_grab <= grip_distance if trigger_close&&!pressed_right: initiator.on_press.emit(Initiator.EventType.TRIGGER) pressed_right = true elif !trigger_close&&pressed_right: initiator.on_release.emit(Initiator.EventType.TRIGGER) pressed_right = false if grab_close&&!grabbed_right: initiator.on_press.emit(Initiator.EventType.GRIP) grabbed_right = true elif !grab_close&&grabbed_right: initiator.on_release.emit(Initiator.EventType.GRIP) grabbed_right = false " [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_dopke"] radius = 0.001 height = 0.02 [node name="Hands" type="Node3D"] script = SubResource("GDScript_4kea7") [node name="XRHandLeft" type="Node3D" parent="."] transform = Transform3D(0.999999, -1.39628e-11, 0, 9.48119e-12, 0.999999, -4.54747e-13, 0, 0, 0.999999, -0.25, 0, 0) [node name="IndexTip" type="BoneAttachment3D" parent="XRHandLeft"] transform = Transform3D(0.967526, 0.252326, -0.0150302, -0.0150302, 0.116784, 0.993043, 0.252326, -0.960569, 0.116784, -0.00665802, 0.0427913, -0.169868) bone_name = "Index_Tip_L" bone_idx = 9 use_external_skeleton = true external_skeleton = NodePath("") [node name="Marker3D" type="Marker3D" parent="XRHandLeft/IndexTip"] gizmo_extents = 0.02 [node name="TouchArea" type="Area3D" parent="XRHandLeft/IndexTip"] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01) collision_layer = 0 collision_mask = 4 monitorable = false [node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandLeft/IndexTip/TouchArea"] transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0) shape = SubResource("CapsuleShape3D_dopke") [node name="ThumbTip" type="BoneAttachment3D" parent="XRHandLeft"] transform = Transform3D(0.967043, 0.24582, -0.0663439, -0.0663439, 0.494837, 0.86645, 0.24582, -0.833492, 0.494837, 0.0261569, 0.0891964, -0.0934418) bone_name = "Thumb_Tip_L" bone_idx = 4 use_external_skeleton = true external_skeleton = NodePath("") [node name="Marker3D" type="Marker3D" parent="XRHandLeft/ThumbTip"] gizmo_extents = 0.02 [node name="MiddleTip" type="BoneAttachment3D" parent="XRHandLeft"] transform = Transform3D(0.98042, 0.196912, 0.00149799, 0.001498, -0.015065, 0.999885, 0.196912, -0.980305, -0.0150651, -0.00327212, -0.00771424, -0.176318) bone_name = "Middle_Tip_L" bone_idx = 14 use_external_skeleton = true external_skeleton = NodePath("") [node name="Marker3D" type="Marker3D" parent="XRHandLeft/MiddleTip"] gizmo_extents = 0.02 [node name="TouchArea" type="Area3D" parent="XRHandLeft/MiddleTip"] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01) collision_layer = 0 collision_mask = 4 monitorable = false [node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandLeft/MiddleTip/TouchArea"] transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0) shape = SubResource("CapsuleShape3D_dopke") [node name="Palm" type="Node3D" parent="XRHandLeft"] transform = Transform3D(-0.707107, -8.74228e-08, -0.707107, 6.18173e-08, -1, 6.18173e-08, -0.707107, -8.29045e-24, 0.707107, 0.01, -0.04, -5.58794e-09) [node name="QuickActions" type="Node3D" parent="XRHandLeft/Palm"] transform = Transform3D(0.5, -4.47035e-08, -4.37114e-08, 4.37114e-08, -2.18557e-08, 0.5, -4.47035e-08, -0.5, -2.18557e-08, 0.005, 0, 0.005) [node name="MiniView" parent="XRHandLeft/Palm/QuickActions" instance=ExtResource("3_te2p8")] transform = Transform3D(1, -3.55271e-15, -4.33681e-19, 3.55271e-15, 1, 3.5525e-15, -4.33681e-19, -3.55291e-15, 1, -0.0600001, 0, 0) label = "nest_multi_room" icon = true [node name="Temperature" parent="XRHandLeft/Palm/QuickActions" instance=ExtResource("3_te2p8")] label = "device_thermostat" icon = true [node name="Humidity" parent="XRHandLeft/Palm/QuickActions" instance=ExtResource("3_te2p8")] transform = Transform3D(1, 1.73472e-18, 0, 0, 1, 0, 0, 0, 1, 0.0600001, -5.68873e-13, 0) label = "humidity_mid" icon = true [node name="XRHandRight" type="Node3D" parent="."] transform = Transform3D(0.999998, 0, 0, 0, 0.999999, 0, 0, 0, 0.999999, 0.264391, 0, 0) [node name="IndexTip" type="BoneAttachment3D" parent="XRHandRight"] transform = Transform3D(0.967526, -0.252326, 0.0150302, 0.0150302, 0.116784, 0.993043, -0.252326, -0.960569, 0.116784, 0.00665802, 0.0427913, -0.169868) bone_name = "Index_Tip_R" bone_idx = 9 use_external_skeleton = true external_skeleton = NodePath("") [node name="Marker3D" type="Marker3D" parent="XRHandRight/IndexTip"] gizmo_extents = 0.02 [node name="TouchArea" type="Area3D" parent="XRHandRight/IndexTip"] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01) collision_layer = 0 collision_mask = 4 monitorable = false [node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandRight/IndexTip/TouchArea"] transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0) shape = SubResource("CapsuleShape3D_dopke") [node name="ThumbTip" type="BoneAttachment3D" parent="XRHandRight"] transform = Transform3D(0.967042, -0.24582, 0.0663439, 0.0663439, 0.494837, 0.866449, -0.24582, -0.833492, 0.494837, -0.0261569, 0.0891963, -0.0934418) bone_name = "Thumb_Tip_R" bone_idx = 4 use_external_skeleton = true external_skeleton = NodePath("") [node name="Marker3D" type="Marker3D" parent="XRHandRight/ThumbTip"] gizmo_extents = 0.02 [node name="MiddleTip" type="BoneAttachment3D" parent="XRHandRight"] transform = Transform3D(0.98042, -0.196912, -0.00149799, -0.001498, -0.015065, 0.999885, -0.196912, -0.980305, -0.0150651, 0.00327212, -0.00771424, -0.176318) bone_name = "Middle_Tip_R" bone_idx = 14 use_external_skeleton = true external_skeleton = NodePath("") [node name="Marker3D" type="Marker3D" parent="XRHandRight/MiddleTip"] gizmo_extents = 0.02 [node name="TouchArea" type="Area3D" parent="XRHandRight/MiddleTip"] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01) collision_layer = 0 collision_mask = 4 monitorable = false [node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandRight/MiddleTip/TouchArea"] transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0) shape = SubResource("CapsuleShape3D_dopke")