diff --git a/addons/godot-xr-tools/functions/function_pickup.gd b/addons/godot-xr-tools/functions/function_pickup.gd index 6b9b5bf2..db4d1d13 100644 --- a/addons/godot-xr-tools/functions/function_pickup.gd +++ b/addons/godot-xr-tools/functions/function_pickup.gd @@ -30,6 +30,10 @@ const DEFAULT_RANGE_MASK := 0b0000_0000_0000_0000_0000_0000_0000_0100 # Constant for worst-case grab distance const MAX_GRAB_DISTANCE2: float = 1000000.0 +# Class for storing copied collision data +class CopiedCollision extends RefCounted: + var collision_shape : CollisionShape3D + var org_transform : Transform3D ## Pickup enabled property @export var enabled : bool = true @@ -81,11 +85,14 @@ var _grab_area : Area3D var _grab_collision : CollisionShape3D var _ranged_area : Area3D var _ranged_collision : CollisionShape3D - +var _active_copied_collisions : Array[CopiedCollision] ## Controller @onready var _controller := XRHelpers.get_xr_controller(self) +## Collision hand (if applicable) +@onready var _collision_hand : XRToolsCollisionHand = XRToolsCollisionHand.find_ancestor(self) + ## Grip threshold (from configuration) @onready var _grip_threshold : float = XRTools.get_grip_threshold() @@ -172,6 +179,7 @@ func _process(delta): # Average velocity of this pickup _velocity_averager.add_transform(delta, global_transform) + _update_copied_collisions() _update_closest_object() @@ -371,6 +379,9 @@ func drop_object() -> void: if not is_instance_valid(picked_up_object): return + # Remove any copied collision objects + _remove_copied_collisions() + # let go of this object picked_up_object.let_go( self, @@ -406,10 +417,56 @@ func _pick_up_object(target: Node3D) -> void: # If object picked up then emit signal if is_instance_valid(picked_up_object): + _copy_collisions() + picked_up_object.request_highlight(self, false) emit_signal("has_picked_up", picked_up_object) +# Copy collision shapes on the held object to our collision hand (if applicable). +# If we're two handing an object, both collision hands will get copies. +func _copy_collisions(): + if not is_instance_valid(_collision_hand): + return + + if not is_instance_valid(picked_up_object) or not picked_up_object is RigidBody3D: + return + + for child in picked_up_object.get_children(): + if child is CollisionShape3D and not child.disabled: + + var copied_collision : CopiedCollision = CopiedCollision.new() + copied_collision.collision_shape = CollisionShape3D.new() + copied_collision.collision_shape.shape = child.shape + copied_collision.org_transform = child.transform + + _collision_hand.add_child(copied_collision.collision_shape, false, Node.INTERNAL_MODE_BACK) + copied_collision.collision_shape.global_transform = picked_up_object.global_transform * \ + copied_collision.org_transform + + _active_copied_collisions.push_back(copied_collision) + + +# Adjust positions of our collisions to match actual location of object +func _update_copied_collisions(): + if is_instance_valid(_collision_hand) and is_instance_valid(picked_up_object): + for copied_collision : CopiedCollision in _active_copied_collisions: + if is_instance_valid(copied_collision.collision_shape): + copied_collision.collision_shape.global_transform = picked_up_object.global_transform * \ + copied_collision.org_transform + + +# Remove copied collision shapes +func _remove_copied_collisions(): + if is_instance_valid(_collision_hand): + for copied_collision : CopiedCollision in _active_copied_collisions: + if is_instance_valid(copied_collision.collision_shape): + _collision_hand.remove_child(copied_collision.collision_shape) + copied_collision.collision_shape.queue_free() + + _active_copied_collisions.clear() + + func _on_button_pressed(p_button) -> void: if p_button == action_button_action and is_instance_valid(picked_up_object): if picked_up_object.has_method("action"): diff --git a/addons/godot-xr-tools/hands/collision_hand.gd b/addons/godot-xr-tools/hands/collision_hand.gd index 594b2767..92cd1532 100644 --- a/addons/godot-xr-tools/hands/collision_hand.gd +++ b/addons/godot-xr-tools/hands/collision_hand.gd @@ -31,7 +31,7 @@ const DEFAULT_LAYER := 0b0000_0000_0000_0010_0000_0000_0000_0000 # - 3:pickable-objects # - 4:wall-walking # - 5:grappling-target -const DEFAULT_MASK := 0b0000_0000_0000_0000_1111_1111_1111_1111 +const DEFAULT_MASK := 0b0000_0000_0000_0101_0000_0000_0001_1111 # How much displacement is required for the hand to start orienting to a surface const ORIENT_DISPLACEMENT := 0.05 @@ -44,6 +44,30 @@ const TELEPORT_DISTANCE := 1.0 @export var mode : CollisionHandMode = CollisionHandMode.COLLIDE +## Links to skeleton that adds finger digits +@export var hand_skeleton : Skeleton3D: + set(value): + if hand_skeleton == value: + return + + if hand_skeleton: + if hand_skeleton.has_signal("skeleton_updated"): + # Godot 4.3+ + hand_skeleton.skeleton_updated.disconnect(_on_skeleton_updated) + else: + hand_skeleton.pose_updated.disconnect(_on_skeleton_updated) + for digit in _digit_collision_shapes: + var shape : CollisionShape3D = _digit_collision_shapes[digit] + remove_child(shape) + shape.queue_free() + _digit_collision_shapes.clear() + + hand_skeleton = value + if hand_skeleton and is_inside_tree(): + _update_hand_skeleton() + + notify_property_list_changed() + # Controller to target (if no target overrides) var _controller : XRController3D @@ -53,6 +77,10 @@ var _target_overrides := [] # Current target (controller or override) var _target : Node3D +# Skeleton collisions +var _palm_collision_shape : CollisionShape3D +var _digit_collision_shapes : Dictionary + ## Target-override class class TargetOverride: @@ -73,8 +101,43 @@ func is_xr_class(name : String) -> bool: return name == "XRToolsCollisionHand" +# Return warnings related to this node +func _get_configuration_warnings() -> PackedStringArray: + var warnings := PackedStringArray() + + # Check palm node + if not _palm_collision_shape: + warnings.push_back("Collision hand scenes are deprecated, use collision node script directly.") + + # Check if skeleton is a child + if hand_skeleton and not is_ancestor_of(hand_skeleton): + warnings.push_back("The hand skeleton node should be within the tree of this node.") + + # Return warnings + return warnings + + # Called when the node enters the scene tree for the first time. func _ready(): + var palm_collision : CollisionShape3D = get_node_or_null("CollisionShape3D") + if not palm_collision: + # We create our object even in editor to supress our warning. + # This allows us to just add an XRToolsCollisionHand node without + # using our scene. + _palm_collision_shape = CollisionShape3D.new() + _palm_collision_shape.name = "Palm" + _palm_collision_shape.shape = \ + preload("res://addons/godot-xr-tools/hands/scenes/collision/hand_palm.shape") + _palm_collision_shape.transform.origin = Vector3(0.0, -0.05, 0.11) + add_child(_palm_collision_shape, false, Node.INTERNAL_MODE_BACK) + elif not Engine.is_editor_hint(): + # Use our existing collision shape node but only in runtime. + # In editor we can check this to provide a deprecation warning. + palm_collision.name = "Palm" + _palm_collision_shape = palm_collision + + _update_hand_skeleton() + # Do not initialise if in the editor if Engine.is_editor_hint(): return @@ -83,6 +146,7 @@ func _ready(): # and boost the physics priority above any grab-drivers or hands. top_level = true process_physics_priority = -90 + sync_to_physics = false # Populate nodes _controller = XRTools.find_xr_ancestor(self, "*", "XRController3D") @@ -135,6 +199,14 @@ static func find_instance(node : Node) -> XRToolsCollisionHand: "*", "XRToolsCollisionHand") as XRToolsCollisionHand +## This function searches an [XRToolsCollisionHand] that is an ancestor +## of the given node. +static func find_ancestor(node : Node) -> XRToolsCollisionHand: + return XRTools.find_xr_ancestor( + node, + "*", + "XRToolsCollisionHand") as XRToolsCollisionHand + ## This function searches from the specified node for the left controller ## [XRToolsCollisionHand] assuming the node is a sibling of the [XROrigin3D]. @@ -229,3 +301,57 @@ func _update_target() -> void: # Use first target override if specified if _target_overrides.size(): _target = _target_overrides[0].target + + +# If a skeleton is set, update. +func _update_hand_skeleton(): + if hand_skeleton: + if hand_skeleton.has_signal("skeleton_updated"): + # Godot 4.3+ + hand_skeleton.skeleton_updated.connect(_on_skeleton_updated) + else: + hand_skeleton.pose_updated.connect(_on_skeleton_updated) + + # Run atleast once to init + _on_skeleton_updated() + + +# Update our finger digits when our skeleton updates +func _on_skeleton_updated(): + if not hand_skeleton: + return + + var bone_count = hand_skeleton.get_bone_count() + for i in bone_count: + var collision_node : CollisionShape3D + var offset : Transform3D + offset.origin = Vector3(0.0, 0.015, 0.0) # move to side of joint + + var bone_name = hand_skeleton.get_bone_name(i) + if bone_name == "Palm_L": + offset.origin = Vector3(-0.02, 0.025, 0.0) # move to side of joint + collision_node = _palm_collision_shape + elif bone_name == "Palm_R": + offset.origin = Vector3(0.02, 0.025, 0.0) # move to side of joint + collision_node = _palm_collision_shape + elif bone_name.contains("Proximal") or bone_name.contains("Intermediate") or \ + bone_name.contains("Distal"): + if _digit_collision_shapes.has(bone_name): + collision_node = _digit_collision_shapes[bone_name] + else: + collision_node = CollisionShape3D.new() + collision_node.name = bone_name + collision_node.shape = \ + preload("res://addons/godot-xr-tools/hands/scenes/collision/hand_digit.shape") + add_child(collision_node, false, Node.INTERNAL_MODE_BACK) + _digit_collision_shapes[bone_name] = collision_node + + if collision_node: + # TODO it would require a far more complex approach, + # but being able to check if our collision shapes can move to their new locations + # would be interesting. + + collision_node.transform = global_transform.inverse() \ + * hand_skeleton.global_transform \ + * hand_skeleton.get_bone_global_pose(i) \ + * offset diff --git a/addons/godot-xr-tools/hands/scenes/collision/collision_hand.tscn b/addons/godot-xr-tools/hands/scenes/collision/collision_hand.tscn new file mode 100644 index 00000000..b6cf12f4 --- /dev/null +++ b/addons/godot-xr-tools/hands/scenes/collision/collision_hand.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://yrg5yt0yvc1q"] + +[ext_resource type="Script" path="res://addons/godot-xr-tools/hands/collision_hand.gd" id="1_vdcct"] + +[node name="XRToolsCollisionHand" type="AnimatableBody3D"] +collision_layer = 131072 +collision_mask = 327711 +sync_to_physics = false +script = ExtResource("1_vdcct") diff --git a/addons/godot-xr-tools/hands/scenes/collision/collision_hand_left.tscn b/addons/godot-xr-tools/hands/scenes/collision/collision_hand_left.tscn index 869d1b68..cb8cee04 100644 --- a/addons/godot-xr-tools/hands/scenes/collision/collision_hand_left.tscn +++ b/addons/godot-xr-tools/hands/scenes/collision/collision_hand_left.tscn @@ -1,9 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://bkv43ec6chcf3"] [ext_resource type="Script" path="res://addons/godot-xr-tools/hands/collision_hand.gd" id="1_t5acd"] - -[sub_resource type="BoxShape3D" id="BoxShape3D_bv7in"] -size = Vector3(0.045, 0.075, 0.1) +[ext_resource type="Shape3D" uid="uid://uc7owi5j7ib0" path="res://addons/godot-xr-tools/hands/scenes/collision/hand_palm.shape" id="2_5wm8j"] [node name="CollisionHandLeft" type="AnimatableBody3D"] collision_layer = 131072 @@ -13,4 +11,4 @@ script = ExtResource("1_t5acd") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, -0.05, 0.11) -shape = SubResource("BoxShape3D_bv7in") +shape = ExtResource("2_5wm8j") diff --git a/addons/godot-xr-tools/hands/scenes/collision/collision_hand_right.tscn b/addons/godot-xr-tools/hands/scenes/collision/collision_hand_right.tscn index e68a9cde..57faa211 100644 --- a/addons/godot-xr-tools/hands/scenes/collision/collision_hand_right.tscn +++ b/addons/godot-xr-tools/hands/scenes/collision/collision_hand_right.tscn @@ -1,9 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://c3uoohvnshach"] [ext_resource type="Script" path="res://addons/godot-xr-tools/hands/collision_hand.gd" id="1_so3hf"] - -[sub_resource type="BoxShape3D" id="BoxShape3D_fc2ij"] -size = Vector3(0.045, 0.075, 0.1) +[ext_resource type="Shape3D" uid="uid://uc7owi5j7ib0" path="res://addons/godot-xr-tools/hands/scenes/collision/hand_palm.shape" id="2_vvxfo"] [node name="CollisionHandRight" type="AnimatableBody3D"] collision_layer = 131072 @@ -13,4 +11,4 @@ script = ExtResource("1_so3hf") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, -0.05, 0.11) -shape = SubResource("BoxShape3D_fc2ij") +shape = ExtResource("2_vvxfo") diff --git a/addons/godot-xr-tools/hands/scenes/collision/hand_digit.shape b/addons/godot-xr-tools/hands/scenes/collision/hand_digit.shape new file mode 100644 index 00000000..9345820e Binary files /dev/null and b/addons/godot-xr-tools/hands/scenes/collision/hand_digit.shape differ diff --git a/addons/godot-xr-tools/hands/scenes/collision/hand_palm.shape b/addons/godot-xr-tools/hands/scenes/collision/hand_palm.shape new file mode 100644 index 00000000..7a7aa1ea Binary files /dev/null and b/addons/godot-xr-tools/hands/scenes/collision/hand_palm.shape differ diff --git a/addons/godot-xr-tools/hands/textures/african_baseColor.png.import b/addons/godot-xr-tools/hands/textures/african_baseColor.png.import index be520188..a72974aa 100644 --- a/addons/godot-xr-tools/hands/textures/african_baseColor.png.import +++ b/addons/godot-xr-tools/hands/textures/african_baseColor.png.import @@ -3,25 +3,27 @@ importer="texture" type="CompressedTexture2D" uid="uid://cs7m7m0k2506g" -path="res://.godot/imported/african_baseColor.png-c1a63b2c85973a5f7673482d994697e9.ctex" +path.s3tc="res://.godot/imported/african_baseColor.png-c1a63b2c85973a5f7673482d994697e9.s3tc.ctex" +path.etc2="res://.godot/imported/african_baseColor.png-c1a63b2c85973a5f7673482d994697e9.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://addons/godot-xr-tools/hands/textures/african_baseColor.png" -dest_files=["res://.godot/imported/african_baseColor.png-c1a63b2c85973a5f7673482d994697e9.ctex"] +dest_files=["res://.godot/imported/african_baseColor.png-c1a63b2c85973a5f7673482d994697e9.s3tc.ctex", "res://.godot/imported/african_baseColor.png-c1a63b2c85973a5f7673482d994697e9.etc2.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=false +mipmaps/generate=true mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -31,4 +33,4 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=1 +detect_3d/compress_to=0 diff --git a/addons/godot-xr-tools/hands/textures/african_realistic_baseColor.png.import b/addons/godot-xr-tools/hands/textures/african_realistic_baseColor.png.import index 9ab4c6d4..08480660 100644 --- a/addons/godot-xr-tools/hands/textures/african_realistic_baseColor.png.import +++ b/addons/godot-xr-tools/hands/textures/african_realistic_baseColor.png.import @@ -3,25 +3,27 @@ importer="texture" type="CompressedTexture2D" uid="uid://dk8o82rjww802" -path="res://.godot/imported/african_realistic_baseColor.png-67cf0f3230115c16edbeaf7b76430f7c.ctex" +path.s3tc="res://.godot/imported/african_realistic_baseColor.png-67cf0f3230115c16edbeaf7b76430f7c.s3tc.ctex" +path.etc2="res://.godot/imported/african_realistic_baseColor.png-67cf0f3230115c16edbeaf7b76430f7c.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://addons/godot-xr-tools/hands/textures/african_realistic_baseColor.png" -dest_files=["res://.godot/imported/african_realistic_baseColor.png-67cf0f3230115c16edbeaf7b76430f7c.ctex"] +dest_files=["res://.godot/imported/african_realistic_baseColor.png-67cf0f3230115c16edbeaf7b76430f7c.s3tc.ctex", "res://.godot/imported/african_realistic_baseColor.png-67cf0f3230115c16edbeaf7b76430f7c.etc2.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=false +mipmaps/generate=true mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -31,4 +33,4 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=1 +detect_3d/compress_to=0 diff --git a/addons/godot-xr-tools/hands/textures/caucasian_realistic_baseColor.png.import b/addons/godot-xr-tools/hands/textures/caucasian_realistic_baseColor.png.import index 877755be..1004c4bb 100644 --- a/addons/godot-xr-tools/hands/textures/caucasian_realistic_baseColor.png.import +++ b/addons/godot-xr-tools/hands/textures/caucasian_realistic_baseColor.png.import @@ -3,25 +3,27 @@ importer="texture" type="CompressedTexture2D" uid="uid://n1xq4cm67o07" -path="res://.godot/imported/caucasian_realistic_baseColor.png-6d28d56c1e76917b749358861074492c.ctex" +path.s3tc="res://.godot/imported/caucasian_realistic_baseColor.png-6d28d56c1e76917b749358861074492c.s3tc.ctex" +path.etc2="res://.godot/imported/caucasian_realistic_baseColor.png-6d28d56c1e76917b749358861074492c.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://addons/godot-xr-tools/hands/textures/caucasian_realistic_baseColor.png" -dest_files=["res://.godot/imported/caucasian_realistic_baseColor.png-6d28d56c1e76917b749358861074492c.ctex"] +dest_files=["res://.godot/imported/caucasian_realistic_baseColor.png-6d28d56c1e76917b749358861074492c.s3tc.ctex", "res://.godot/imported/caucasian_realistic_baseColor.png-6d28d56c1e76917b749358861074492c.etc2.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=false +mipmaps/generate=true mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -31,4 +33,4 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=1 +detect_3d/compress_to=0 diff --git a/addons/godot-xr-tools/hands/textures/glove_african_dark_camo.png.import b/addons/godot-xr-tools/hands/textures/glove_african_dark_camo.png.import index f3ad84f5..4dde059d 100644 --- a/addons/godot-xr-tools/hands/textures/glove_african_dark_camo.png.import +++ b/addons/godot-xr-tools/hands/textures/glove_african_dark_camo.png.import @@ -3,25 +3,27 @@ importer="texture" type="CompressedTexture2D" uid="uid://cocorrka3dtq3" -path="res://.godot/imported/glove_african_dark_camo.png-3a526d8d251e73995f6fd3ba5cdd0b4e.ctex" +path.s3tc="res://.godot/imported/glove_african_dark_camo.png-3a526d8d251e73995f6fd3ba5cdd0b4e.s3tc.ctex" +path.etc2="res://.godot/imported/glove_african_dark_camo.png-3a526d8d251e73995f6fd3ba5cdd0b4e.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://addons/godot-xr-tools/hands/textures/glove_african_dark_camo.png" -dest_files=["res://.godot/imported/glove_african_dark_camo.png-3a526d8d251e73995f6fd3ba5cdd0b4e.ctex"] +dest_files=["res://.godot/imported/glove_african_dark_camo.png-3a526d8d251e73995f6fd3ba5cdd0b4e.s3tc.ctex", "res://.godot/imported/glove_african_dark_camo.png-3a526d8d251e73995f6fd3ba5cdd0b4e.etc2.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=false +mipmaps/generate=true mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -31,4 +33,4 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=1 +detect_3d/compress_to=0 diff --git a/addons/godot-xr-tools/hands/textures/hands_normal.png.import b/addons/godot-xr-tools/hands/textures/hands_normal.png.import index 998156c7..1b5d9c89 100644 --- a/addons/godot-xr-tools/hands/textures/hands_normal.png.import +++ b/addons/godot-xr-tools/hands/textures/hands_normal.png.import @@ -3,32 +3,34 @@ importer="texture" type="CompressedTexture2D" uid="uid://b6tgv6ucbgv3r" -path="res://.godot/imported/hands_normal.png-291c7217751274bfe1199e3de899450f.ctex" +path.s3tc="res://.godot/imported/hands_normal.png-291c7217751274bfe1199e3de899450f.s3tc.ctex" +path.etc2="res://.godot/imported/hands_normal.png-291c7217751274bfe1199e3de899450f.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://addons/godot-xr-tools/hands/textures/hands_normal.png" -dest_files=["res://.godot/imported/hands_normal.png-291c7217751274bfe1199e3de899450f.ctex"] +dest_files=["res://.godot/imported/hands_normal.png-291c7217751274bfe1199e3de899450f.s3tc.ctex", "res://.godot/imported/hands_normal.png-291c7217751274bfe1199e3de899450f.etc2.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/normal_map=0 +compress/normal_map=1 compress/channel_pack=0 -mipmaps/generate=false +mipmaps/generate=true mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" +roughness/mode=1 +roughness/src_normal="res://addons/godot-xr-tools/hands/textures/hands_normal.png" process/fix_alpha_border=true process/premult_alpha=false process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=1 +detect_3d/compress_to=0 diff --git a/addons/godot-xr-tools/objects/grab_points/grab.gd b/addons/godot-xr-tools/objects/grab_points/grab.gd index 0ee42d88..d749b35a 100644 --- a/addons/godot-xr-tools/objects/grab_points/grab.gd +++ b/addons/godot-xr-tools/objects/grab_points/grab.gd @@ -39,6 +39,9 @@ var drive_aim : float = 0.0 ## Has target arrived at grab point var _arrived : bool = false +## Collision exceptions we manage +var _collision_exceptions : Array[PhysicsBody3D] + ## Initialize the grab func _init( @@ -75,8 +78,7 @@ func _init( # Apply collision exceptions if collision_hand: - what.add_collision_exception_with(collision_hand) - collision_hand.add_collision_exception_with(what) + _add_collision_exceptions(what) ## Set the target as arrived at the grab-point @@ -133,10 +135,19 @@ func release() -> void: # Clear any hand pose _clear_hand_pose() - # Remove collision exceptions - if is_instance_valid(collision_hand): - what.remove_collision_exception_with(collision_hand) - collision_hand.remove_collision_exception_with(what) + # Remove collision exceptions with a small delay + if is_instance_valid(collision_hand) and not _collision_exceptions.is_empty(): + # We need to make a copy of our array else it will be passed by reference. + var copy : Array[PhysicsBody3D] + for exc in _collision_exceptions: + copy.push_back(exc) + _collision_exceptions.clear() + + # Delay removing our exceptions to give the object time to fall away + collision_hand.get_tree().create_timer(0.5).timeout \ + .connect(_remove_collision_exceptions \ + .bind(copy) \ + .bind(collision_hand)) # Report the release print_verbose("%s> released by %s", [what.name, by.name]) @@ -169,3 +180,51 @@ func _clear_hand_pose() -> void: # Remove hand snapping hand.remove_target_override(hand_point) + + +# Add collision exceptions for the grabbed object and any of its children +func _add_collision_exceptions(from : Node): + if not is_instance_valid(collision_hand): + return + + if not is_instance_valid(from): + return + + # If this is a physics body, add an exception + if from is PhysicsBody3D: + print_debug("Add collision exception for ", from.name) + # Make sure we don't collide with what we're holding + _collision_exceptions.push_back(from) + collision_hand.add_collision_exception_with(from) + from.add_collision_exception_with(collision_hand) + + # Check all children + for child in from.get_children(): + _add_collision_exceptions(child) + + +# Remove the exceptions in our passed array. We call this with a small delay +# to give an object a chance to drop away from the hand before it starts +# colliding. +# It is possible that another object is picked up in the meanwhile +# and we thus fill _collision_exceptions with new content. +# Hence using a copy of this list at the time of dropping the object. +# +# Note, this is static because our grab object gets destroyed before this code gets run. +static func _remove_collision_exceptions( \ + on_collision_hand : XRToolsCollisionHand, \ + exceptions : Array[PhysicsBody3D]): + if not is_instance_valid(on_collision_hand): + return + + # This can be improved by checking if we're still colliding and only + # removing those objects from our exception list that are not. + # If any are left, we can restart a new timer. + # This will also allow us to use a much smaller timer interval + + # For now we'll remove all. + + for body : PhysicsBody3D in exceptions: + if is_instance_valid(body): + on_collision_hand.remove_collision_exception_with(body) + body.remove_collision_exception_with(on_collision_hand) diff --git a/addons/godot-xr-tools/user_settings/user_settings_ui.tscn b/addons/godot-xr-tools/user_settings/user_settings_ui.tscn index f051d9ad..417e6cb2 100644 --- a/addons/godot-xr-tools/user_settings/user_settings_ui.tscn +++ b/addons/godot-xr-tools/user_settings/user_settings_ui.tscn @@ -118,7 +118,7 @@ size_flags_horizontal = 3 min_value = 1.0 max_value = 2.5 step = 0.05 -value = 1.0 +value = 1.5 [node name="HSeparator" type="HSeparator" parent="Player/PlayerVBox"] layout_mode = 2 diff --git a/addons/godot-xr-tools/xr/start_xr.gd b/addons/godot-xr-tools/xr/start_xr.gd index 80714f01..b3ce096e 100644 --- a/addons/godot-xr-tools/xr/start_xr.gd +++ b/addons/godot-xr-tools/xr/start_xr.gd @@ -28,6 +28,10 @@ signal xr_ended signal xr_failed_to_initialize +## XR active flag +static var _xr_active : bool = false + + ## Optional viewport to control @export var viewport : Viewport @@ -54,9 +58,6 @@ var xr_frame_rate : float = 0 # Is a WebXR is_session_supported query running var _webxr_session_query : bool = false -## XR active flag -static var _xr_active : bool = false - # Handle auto-initialization when ready func _ready() -> void: diff --git a/scenes/main_menu/main_menu_level.tscn b/scenes/main_menu/main_menu_level.tscn index f0c5d6ec..615f0791 100644 --- a/scenes/main_menu/main_menu_level.tscn +++ b/scenes/main_menu/main_menu_level.tscn @@ -42,65 +42,65 @@ [ext_resource type="Texture2D" uid="uid://cr1l4g7btdyht" path="res://scenes/origin_gravity_demo/origin_gravity_demo.png" id="32_c4n1q"] [ext_resource type="Texture2D" uid="uid://dhd30j0xpcxoi" path="res://scenes/sphere_world_demo/sphere_world_demo.png" id="34_xw8ig"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_vj83u"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_fhr03"] animation = &"Grip" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_wyexy"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_j085u"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ddwb8"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ig3ph"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_L", "Armature/Skeleton3D:Little_Intermediate_L", "Armature/Skeleton3D:Little_Metacarpal_L", "Armature/Skeleton3D:Little_Proximal_L", "Armature/Skeleton3D:Middle_Distal_L", "Armature/Skeleton3D:Middle_Intermediate_L", "Armature/Skeleton3D:Middle_Metacarpal_L", "Armature/Skeleton3D:Middle_Proximal_L", "Armature/Skeleton3D:Ring_Distal_L", "Armature/Skeleton3D:Ring_Intermediate_L", "Armature/Skeleton3D:Ring_Metacarpal_L", "Armature/Skeleton3D:Ring_Proximal_L", "Armature/Skeleton3D:Thumb_Distal_L", "Armature/Skeleton3D:Thumb_Metacarpal_L", "Armature/Skeleton3D:Thumb_Proximal_L", "Armature/Skeleton:Little_Distal_L", "Armature/Skeleton:Little_Intermediate_L", "Armature/Skeleton:Little_Proximal_L", "Armature/Skeleton:Middle_Distal_L", "Armature/Skeleton:Middle_Intermediate_L", "Armature/Skeleton:Middle_Proximal_L", "Armature/Skeleton:Ring_Distal_L", "Armature/Skeleton:Ring_Intermediate_L", "Armature/Skeleton:Ring_Proximal_L", "Armature/Skeleton:Thumb_Distal_L", "Armature/Skeleton:Thumb_Proximal_L"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_jb6pp"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_vt8vm"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ul4yl"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_rl103"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_L", "Armature/Skeleton3D:Index_Intermediate_L", "Armature/Skeleton3D:Index_Metacarpal_L", "Armature/Skeleton3D:Index_Proximal_L", "Armature/Skeleton:Index_Distal_L", "Armature/Skeleton:Index_Intermediate_L", "Armature/Skeleton:Index_Proximal_L"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_o0q24"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_32y8o"] graph_offset = Vector2(-536, 11) -nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_vj83u") +nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_fhr03") nodes/ClosedHand1/position = Vector2(-600, 300) -nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_wyexy") +nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_j085u") nodes/ClosedHand2/position = Vector2(-360, 300) -nodes/Grip/node = SubResource("AnimationNodeBlend2_ddwb8") +nodes/Grip/node = SubResource("AnimationNodeBlend2_ig3ph") nodes/Grip/position = Vector2(0, 20) -nodes/OpenHand/node = SubResource("AnimationNodeAnimation_jb6pp") +nodes/OpenHand/node = SubResource("AnimationNodeAnimation_vt8vm") nodes/OpenHand/position = Vector2(-600, 100) -nodes/Trigger/node = SubResource("AnimationNodeBlend2_ul4yl") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_rl103") nodes/Trigger/position = Vector2(-360, 20) node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_6o27q"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_xw518"] animation = &"Grip" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_y6awy"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_f0bph"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_a4xth"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_s6bkv"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_R", "Armature/Skeleton3D:Little_Intermediate_R", "Armature/Skeleton3D:Little_Metacarpal_R", "Armature/Skeleton3D:Little_Proximal_R", "Armature/Skeleton3D:Middle_Distal_R", "Armature/Skeleton3D:Middle_Intermediate_R", "Armature/Skeleton3D:Middle_Metacarpal_R", "Armature/Skeleton3D:Middle_Proximal_R", "Armature/Skeleton3D:Ring_Distal_R", "Armature/Skeleton3D:Ring_Intermediate_R", "Armature/Skeleton3D:Ring_Metacarpal_R", "Armature/Skeleton3D:Ring_Proximal_R", "Armature/Skeleton3D:Thumb_Distal_R", "Armature/Skeleton3D:Thumb_Metacarpal_R", "Armature/Skeleton3D:Thumb_Proximal_R", "Armature/Skeleton:Little_Distal_R", "Armature/Skeleton:Little_Intermediate_R", "Armature/Skeleton:Little_Proximal_R", "Armature/Skeleton:Middle_Distal_R", "Armature/Skeleton:Middle_Intermediate_R", "Armature/Skeleton:Middle_Proximal_R", "Armature/Skeleton:Ring_Distal_R", "Armature/Skeleton:Ring_Intermediate_R", "Armature/Skeleton:Ring_Proximal_R", "Armature/Skeleton:Thumb_Distal_R", "Armature/Skeleton:Thumb_Proximal_R"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_x86ld"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_emhc7"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_jlv0k"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_0xlcy"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_R", "Armature/Skeleton3D:Index_Intermediate_R", "Armature/Skeleton3D:Index_Metacarpal_R", "Armature/Skeleton3D:Index_Proximal_R", "Armature/Skeleton:Index_Distal_R", "Armature/Skeleton:Index_Intermediate_R", "Armature/Skeleton:Index_Proximal_R"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_gnohk"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_fkgie"] graph_offset = Vector2(-552.664, 107.301) -nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_6o27q") +nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_xw518") nodes/ClosedHand1/position = Vector2(-600, 300) -nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_y6awy") +nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_f0bph") nodes/ClosedHand2/position = Vector2(-360, 300) -nodes/Grip/node = SubResource("AnimationNodeBlend2_a4xth") +nodes/Grip/node = SubResource("AnimationNodeBlend2_s6bkv") nodes/Grip/position = Vector2(0, 40) -nodes/OpenHand/node = SubResource("AnimationNodeAnimation_x86ld") +nodes/OpenHand/node = SubResource("AnimationNodeAnimation_emhc7") nodes/OpenHand/position = Vector2(-600, 100) -nodes/Trigger/node = SubResource("AnimationNodeBlend2_jlv0k") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_0xlcy") nodes/Trigger/position = Vector2(-360, 40) node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] @@ -120,29 +120,8 @@ auto_inner_radius = 0.5 [node name="LeftHand" parent="XROrigin3D/LeftHand" index="0" instance=ExtResource("23_pr05t")] -[node name="Skeleton3D" parent="XROrigin3D/LeftHand/LeftHand/Hand_low_L/Armature" index="0"] -bones/1/rotation = Quaternion(0.323537, -2.56577e-05, -0.0272204, 0.945824) -bones/2/rotation = Quaternion(-0.0904441, -0.0415175, -0.166293, 0.981042) -bones/3/rotation = Quaternion(-0.0466199, 0.020971, 0.0103276, 0.998639) -bones/5/rotation = Quaternion(-0.00128455, -0.0116081, -0.0168259, 0.99979) -bones/6/rotation = Quaternion(0.102925, -0.00993208, -0.00794417, 0.994608) -bones/7/rotation = Quaternion(-0.012859, -0.0236108, -0.323258, 0.945929) -bones/8/rotation = Quaternion(0.0120575, -0.00929194, -0.247472, 0.968775) -bones/10/rotation = Quaternion(-0.0357539, -0.000400032, 0.00636764, 0.99934) -bones/11/rotation = Quaternion(-0.00264964, -0.00114471, -0.125992, 0.992027) -bones/12/rotation = Quaternion(0.0394225, 0.00193393, -0.228074, 0.972843) -bones/13/rotation = Quaternion(-0.0123395, -0.00881294, -0.280669, 0.959685) -bones/15/rotation = Quaternion(-0.0702656, 0.0101908, -0.0243307, 0.99718) -bones/16/rotation = Quaternion(-0.0320634, -0.00223624, -0.0686366, 0.997124) -bones/17/rotation = Quaternion(0.0253452, 0.00812462, -0.249005, 0.968136) -bones/18/rotation = Quaternion(0.00252232, 0.00788073, -0.243204, 0.96994) -bones/20/rotation = Quaternion(-0.0917369, 0.0203027, -0.010183, 0.995524) -bones/21/rotation = Quaternion(-0.0625182, -0.00022572, -0.115393, 0.991351) -bones/22/rotation = Quaternion(0.0585786, 0.0216483, -0.269905, 0.96086) -bones/23/rotation = Quaternion(0.00687177, -0.00357275, -0.211953, 0.977249) - [node name="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/LeftHand/LeftHand/Hand_low_L/Armature/Skeleton3D" index="1"] -transform = Transform3D(0.54083, 0.840813, -0.0231736, -0.0826267, 0.0805243, 0.993322, 0.837064, -0.535303, 0.113023, 0.039902, 0.0402828, -0.150096) +transform = Transform3D(0.54083, 0.840812, -0.0231736, -0.0826267, 0.0805244, 0.993322, 0.837063, -0.535304, 0.113024, 0.0399019, 0.0402829, -0.150096) bone_name = "Index_Tip_L" bone_idx = 9 @@ -151,7 +130,7 @@ transform = Transform3D(0.999999, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) [node name="AnimationTree" parent="XROrigin3D/LeftHand/LeftHand" index="1"] root_node = NodePath("../Hand_low_L") -tree_root = SubResource("AnimationNodeBlendTree_o0q24") +tree_root = SubResource("AnimationNodeBlendTree_32y8o") [node name="FunctionPoseDetector" parent="XROrigin3D/LeftHand" index="1" instance=ExtResource("5_xgcrx")] @@ -164,32 +143,11 @@ strafe = true [node name="RightHand" parent="XROrigin3D/RightHand" index="0" instance=ExtResource("25_2b81d")] -[node name="Skeleton3D" parent="XROrigin3D/RightHand/RightHand/Hand_low_R/Armature" index="0"] -bones/1/rotation = Quaternion(0.323537, 2.56577e-05, 0.0272204, 0.945824) -bones/2/rotation = Quaternion(-0.0904441, 0.0415175, 0.166293, 0.981042) -bones/3/rotation = Quaternion(-0.0466199, -0.020971, -0.0103276, 0.998639) -bones/5/rotation = Quaternion(-0.00128455, 0.0116081, 0.0168259, 0.99979) -bones/6/rotation = Quaternion(0.102925, 0.00993208, 0.00794419, 0.994608) -bones/7/rotation = Quaternion(-0.012859, 0.0236108, 0.323258, 0.945929) -bones/8/rotation = Quaternion(0.0120575, 0.00929193, 0.247472, 0.968775) -bones/10/rotation = Quaternion(-0.0357539, 0.000400032, -0.00636763, 0.99934) -bones/11/rotation = Quaternion(-0.00264964, 0.00114471, 0.125992, 0.992027) -bones/12/rotation = Quaternion(0.0394225, -0.00193393, 0.228074, 0.972843) -bones/13/rotation = Quaternion(-0.0123395, 0.00881294, 0.280669, 0.959685) -bones/15/rotation = Quaternion(-0.0702656, -0.0101908, 0.0243307, 0.99718) -bones/16/rotation = Quaternion(-0.0320634, 0.00223624, 0.0686366, 0.997124) -bones/17/rotation = Quaternion(0.0253452, -0.00812462, 0.249005, 0.968136) -bones/18/rotation = Quaternion(0.00252233, -0.00788073, 0.243204, 0.96994) -bones/20/rotation = Quaternion(-0.0917369, -0.0203027, 0.010183, 0.995524) -bones/21/rotation = Quaternion(-0.0625182, 0.000225721, 0.115393, 0.991351) -bones/22/rotation = Quaternion(0.0585786, -0.0216483, 0.269905, 0.96086) -bones/23/rotation = Quaternion(0.00687177, 0.00357275, 0.211953, 0.977249) - [node name="mesh_Hand_low_R" parent="XROrigin3D/RightHand/RightHand/Hand_low_R/Armature/Skeleton3D" index="0"] surface_material_override/0 = ExtResource("26_id1x7") [node name="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/RightHand/RightHand/Hand_low_R/Armature/Skeleton3D" index="1"] -transform = Transform3D(0.540829, -0.840813, 0.0231736, 0.0826268, 0.0805242, 0.993322, -0.837064, -0.535303, 0.113024, -0.039902, 0.0402828, -0.150096) +transform = Transform3D(0.54083, -0.840812, 0.0231736, 0.0826267, 0.0805244, 0.993322, -0.837063, -0.535304, 0.113024, -0.0399019, 0.0402829, -0.150096) bone_name = "Index_Tip_R" bone_idx = 9 @@ -198,7 +156,7 @@ transform = Transform3D(0.999999, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) [node name="AnimationTree" parent="XROrigin3D/RightHand/RightHand" index="1"] root_node = NodePath("../Hand_low_R") -tree_root = SubResource("AnimationNodeBlendTree_gnohk") +tree_root = SubResource("AnimationNodeBlendTree_fkgie") [node name="FunctionPoseDetector" parent="XROrigin3D/RightHand" index="1" instance=ExtResource("5_xgcrx")] diff --git a/scenes/main_menu/objects/settings_ui.tscn b/scenes/main_menu/objects/settings_ui.tscn index 0aaee7c0..13a8d810 100644 --- a/scenes/main_menu/objects/settings_ui.tscn +++ b/scenes/main_menu/objects/settings_ui.tscn @@ -27,6 +27,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.015) screen_size = Vector2(0.625, 0.625) scene = ExtResource("2") viewport_size = Vector2(250, 250) +scene_properties_keys = PackedStringArray("settings_ui_content.gd") [node name="CSGCylinder" type="CSGCylinder3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0) diff --git a/scenes/pickable_demo/objects/grab_cube.gd b/scenes/pickable_demo/objects/grab_cube.gd index a206462c..c37849ee 100644 --- a/scenes/pickable_demo/objects/grab_cube.gd +++ b/scenes/pickable_demo/objects/grab_cube.gd @@ -1,3 +1,4 @@ +@tool extends XRToolsPickable diff --git a/scenes/pickable_demo/objects/knife.gd b/scenes/pickable_demo/objects/knife.gd index 39e86b7b..12e1905a 100644 --- a/scenes/pickable_demo/objects/knife.gd +++ b/scenes/pickable_demo/objects/knife.gd @@ -1,3 +1,4 @@ +@tool extends XRToolsPickable diff --git a/scenes/pickable_demo/objects/snap_tray.gd b/scenes/pickable_demo/objects/snap_tray.gd index 52d47303..d920343e 100644 --- a/scenes/pickable_demo/objects/snap_tray.gd +++ b/scenes/pickable_demo/objects/snap_tray.gd @@ -1,3 +1,4 @@ +@tool extends XRToolsPickable diff --git a/scenes/pickable_demo/pickable_demo.tscn b/scenes/pickable_demo/pickable_demo.tscn index f9f27d0f..bf531b29 100644 --- a/scenes/pickable_demo/pickable_demo.tscn +++ b/scenes/pickable_demo/pickable_demo.tscn @@ -1,17 +1,18 @@ -[gd_scene load_steps=44 format=3 uid="uid://0c76wodjd7rm"] +[gd_scene load_steps=45 format=3 uid="uid://0c76wodjd7rm"] [ext_resource type="PackedScene" uid="uid://qbmx03iibuuu" path="res://addons/godot-xr-tools/staging/scene_base.tscn" id="1"] -[ext_resource type="PackedScene" uid="uid://bdwmserhqai5h" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/left_physics_hand_low.tscn" id="2_8wi6c"] [ext_resource type="Script" path="res://scenes/demo_scene_base.gd" id="2_kjksy"] +[ext_resource type="PackedScene" uid="uid://yrg5yt0yvc1q" path="res://addons/godot-xr-tools/hands/scenes/collision/collision_hand.tscn" id="3_m7tr4"] [ext_resource type="PackedScene" uid="uid://bjcxf427un2wp" path="res://addons/godot-xr-tools/player/poke/poke.tscn" id="4_iyttx"] [ext_resource type="PackedScene" uid="uid://3a6wjr3a13vd" path="res://assets/meshes/teleport/teleport.tscn" id="5"] -[ext_resource type="PackedScene" uid="uid://btf05hjpw6k05" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/right_physics_hand_low.tscn" id="5_laayj"] [ext_resource type="Texture2D" uid="uid://ckw6nliyayo6a" path="res://scenes/main_menu/return to main menu.png" id="6"] [ext_resource type="PackedScene" uid="uid://bl2nuu3qhlb5k" path="res://addons/godot-xr-tools/functions/movement_direct.tscn" id="7"] [ext_resource type="PackedScene" uid="uid://bwr0eqi231lf0" path="res://assets/meshes/control_pad/control_pad_location_left.tscn" id="7_fdgf8"] [ext_resource type="PackedScene" uid="uid://cqhw276realc" path="res://addons/godot-xr-tools/functions/function_pointer.tscn" id="7_kskan"] +[ext_resource type="PackedScene" uid="uid://b4kad2kuba1yn" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/left_hand_low.tscn" id="7_ywaf6"] [ext_resource type="PackedScene" uid="uid://b4ysuy43poobf" path="res://addons/godot-xr-tools/functions/function_pickup.tscn" id="8"] [ext_resource type="PackedScene" uid="uid://diyu06cw06syv" path="res://addons/godot-xr-tools/player/player_body.tscn" id="9"] +[ext_resource type="PackedScene" uid="uid://raeeicvvindd" path="res://addons/godot-xr-tools/hands/scenes/highpoly/right_hand.tscn" id="9_v8epv"] [ext_resource type="PackedScene" uid="uid://b6bk2pj8vbj28" path="res://addons/godot-xr-tools/functions/movement_turn.tscn" id="10"] [ext_resource type="PackedScene" uid="uid://1mb16xioom74" path="res://scenes/pickable_demo/objects/belt_snap_zone.tscn" id="10_5odnk"] [ext_resource type="PackedScene" uid="uid://cf024hg5alcif" path="res://scenes/pickable_demo/objects/snap_toy_red.tscn" id="11"] @@ -32,243 +33,131 @@ [ext_resource type="Script" path="res://addons/godot-xr-tools/objects/return_to_snap_zone.gd" id="19_iqmkd"] [ext_resource type="PackedScene" uid="uid://bmjemjgtnpkpo" path="res://assets/3dmodelscc0/models/scenes/sniper_rifle.tscn" id="25_xgu4l"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_olecg"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_lk0rx"] animation = &"Grip" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_xckkj"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_byatp"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_847k5"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_lh7tw"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_L", "Armature/Skeleton3D:Little_Intermediate_L", "Armature/Skeleton3D:Little_Metacarpal_L", "Armature/Skeleton3D:Little_Proximal_L", "Armature/Skeleton3D:Middle_Distal_L", "Armature/Skeleton3D:Middle_Intermediate_L", "Armature/Skeleton3D:Middle_Metacarpal_L", "Armature/Skeleton3D:Middle_Proximal_L", "Armature/Skeleton3D:Ring_Distal_L", "Armature/Skeleton3D:Ring_Intermediate_L", "Armature/Skeleton3D:Ring_Metacarpal_L", "Armature/Skeleton3D:Ring_Proximal_L", "Armature/Skeleton3D:Thumb_Distal_L", "Armature/Skeleton3D:Thumb_Metacarpal_L", "Armature/Skeleton3D:Thumb_Proximal_L", "Armature/Skeleton:Little_Distal_L", "Armature/Skeleton:Little_Intermediate_L", "Armature/Skeleton:Little_Proximal_L", "Armature/Skeleton:Middle_Distal_L", "Armature/Skeleton:Middle_Intermediate_L", "Armature/Skeleton:Middle_Proximal_L", "Armature/Skeleton:Ring_Distal_L", "Armature/Skeleton:Ring_Intermediate_L", "Armature/Skeleton:Ring_Proximal_L", "Armature/Skeleton:Thumb_Distal_L", "Armature/Skeleton:Thumb_Proximal_L"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_04giv"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_0hde5"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_quply"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_1myux"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_L", "Armature/Skeleton3D:Index_Intermediate_L", "Armature/Skeleton3D:Index_Metacarpal_L", "Armature/Skeleton3D:Index_Proximal_L", "Armature/Skeleton:Index_Distal_L", "Armature/Skeleton:Index_Intermediate_L", "Armature/Skeleton:Index_Proximal_L"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_cldmv"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_add5h"] graph_offset = Vector2(-536, 11) -nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_olecg") +nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_lk0rx") nodes/ClosedHand1/position = Vector2(-600, 300) -nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_xckkj") +nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_byatp") nodes/ClosedHand2/position = Vector2(-360, 300) -nodes/Grip/node = SubResource("AnimationNodeBlend2_847k5") +nodes/Grip/node = SubResource("AnimationNodeBlend2_lh7tw") nodes/Grip/position = Vector2(0, 20) -nodes/OpenHand/node = SubResource("AnimationNodeAnimation_04giv") +nodes/OpenHand/node = SubResource("AnimationNodeAnimation_0hde5") nodes/OpenHand/position = Vector2(-600, 100) -nodes/Trigger/node = SubResource("AnimationNodeBlend2_quply") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_1myux") nodes/Trigger/position = Vector2(-360, 20) node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_m1a1d"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_0loxr"] animation = &"Grip" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ohxnk"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_brc6o"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_f54fa"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_kiqrg"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_R", "Armature/Skeleton3D:Little_Intermediate_R", "Armature/Skeleton3D:Little_Metacarpal_R", "Armature/Skeleton3D:Little_Proximal_R", "Armature/Skeleton3D:Middle_Distal_R", "Armature/Skeleton3D:Middle_Intermediate_R", "Armature/Skeleton3D:Middle_Metacarpal_R", "Armature/Skeleton3D:Middle_Proximal_R", "Armature/Skeleton3D:Ring_Distal_R", "Armature/Skeleton3D:Ring_Intermediate_R", "Armature/Skeleton3D:Ring_Metacarpal_R", "Armature/Skeleton3D:Ring_Proximal_R", "Armature/Skeleton3D:Thumb_Distal_R", "Armature/Skeleton3D:Thumb_Metacarpal_R", "Armature/Skeleton3D:Thumb_Proximal_R", "Armature/Skeleton:Little_Distal_R", "Armature/Skeleton:Little_Intermediate_R", "Armature/Skeleton:Little_Proximal_R", "Armature/Skeleton:Middle_Distal_R", "Armature/Skeleton:Middle_Intermediate_R", "Armature/Skeleton:Middle_Proximal_R", "Armature/Skeleton:Ring_Distal_R", "Armature/Skeleton:Ring_Intermediate_R", "Armature/Skeleton:Ring_Proximal_R", "Armature/Skeleton:Thumb_Distal_R", "Armature/Skeleton:Thumb_Proximal_R"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_updnm"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_a6vop"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_yeryn"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_utpbw"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_R", "Armature/Skeleton3D:Index_Intermediate_R", "Armature/Skeleton3D:Index_Metacarpal_R", "Armature/Skeleton3D:Index_Proximal_R", "Armature/Skeleton:Index_Distal_R", "Armature/Skeleton:Index_Intermediate_R", "Armature/Skeleton:Index_Proximal_R"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_l3p6r"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_utbhi"] graph_offset = Vector2(-552.664, 107.301) -nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_m1a1d") +nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_0loxr") nodes/ClosedHand1/position = Vector2(-600, 300) -nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_ohxnk") +nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_brc6o") nodes/ClosedHand2/position = Vector2(-360, 300) -nodes/Grip/node = SubResource("AnimationNodeBlend2_f54fa") +nodes/Grip/node = SubResource("AnimationNodeBlend2_kiqrg") nodes/Grip/position = Vector2(0, 40) -nodes/OpenHand/node = SubResource("AnimationNodeAnimation_updnm") +nodes/OpenHand/node = SubResource("AnimationNodeAnimation_a6vop") nodes/OpenHand/position = Vector2(-600, 100) -nodes/Trigger/node = SubResource("AnimationNodeBlend2_yeryn") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_utpbw") nodes/Trigger/position = Vector2(-360, 40) node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] [node name="PickableDemo" instance=ExtResource("1")] script = ExtResource("2_kjksy") -[node name="LeftPhysicsHand" parent="XROrigin3D/LeftHand" index="0" instance=ExtResource("2_8wi6c")] +[node name="XRToolsCollisionHand" parent="XROrigin3D/LeftHand" index="0" node_paths=PackedStringArray("hand_skeleton") instance=ExtResource("3_m7tr4")] +hand_skeleton = NodePath("LeftHand/Hand_Nails_low_L/Armature/Skeleton3D") -[node name="BoneRoot" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="1"] -transform = Transform3D(1, -1.83077e-05, 1.52659e-08, 1.52668e-08, 0.00166774, 0.999999, -1.83077e-05, -0.999999, 0.00166774, 3.86425e-08, -1.86975e-05, 0.0271756) +[node name="LeftHand" parent="XROrigin3D/LeftHand/XRToolsCollisionHand" index="0" instance=ExtResource("7_ywaf6")] -[node name="BoneThumbMetacarpal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="2"] -transform = Transform3D(0.998519, 0.0514604, -0.0176509, -0.0176509, 0.613334, 0.789626, 0.0514604, -0.788145, 0.613334, 0.00999954, 0.0200266, 3.59323e-05) - -[node name="BoneThumbProximal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="3"] -transform = Transform3D(0.921479, 0.383957, -0.0587629, -0.124051, 0.434264, 0.892203, 0.368086, -0.814857, 0.447796, 0.012311, 0.0475754, -0.0353648) - -[node name="BoneThumbDistal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="4"] -transform = Transform3D(0.930159, 0.366843, 0.0151707, -0.154036, 0.352396, 0.923087, 0.333282, -0.860954, 0.384292, 0.0284939, 0.0658787, -0.0697092) - -[node name="BoneIndexMetacarpal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="5"] -transform = Transform3D(0.999165, 0.0336563, -0.0231681, 0.0231985, -0.000511136, 0.999731, 0.0336354, -0.999433, -0.00129148, -0.0100005, 0.0224317, 3.59286e-05) - -[node name="BoneIndexProximal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="6"] -transform = Transform3D(0.997821, 0.0419385, -0.0509327, 0.041317, 0.204662, 0.97796, 0.0514381, -0.977934, 0.202483, -0.00729559, 0.0223907, -0.0802861) - -[node name="BoneIndexMiddle" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="7"] -transform = Transform3D(0.759852, 0.644453, -0.0854741, -0.040588, 0.178251, 0.983147, 0.648828, -0.743577, 0.161602, -0.00569704, 0.0301916, -0.117561) - -[node name="BoneIndexDistal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="8"] -transform = Transform3D(0.356468, 0.927111, -0.115741, -0.109286, 0.164404, 0.98032, 0.927894, -0.336804, 0.159925, 0.0145038, 0.035779, -0.140869) - -[node name="BoneMiddleMetacarpal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="9"] -transform = Transform3D(0.999918, -0.0127165, -0.00125617, 0.000365488, -0.0698023, 0.997561, -0.0127732, -0.99748, -0.069792, -0.0100005, 0.00355416, 3.59286e-05) - -[node name="BoneMiddleProximal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="10"] -transform = Transform3D(0.971345, 0.237654, -0.00293003, 0.020734, -0.0724503, 0.997156, 0.236766, -0.968644, -0.0753018, -0.0110237, -0.00206236, -0.0802245) - -[node name="BoneMiddleMiddle" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="11"] -transform = Transform3D(0.764922, 0.643162, -0.0351718, 0.0290328, 0.0201225, 0.999376, 0.643468, -0.765466, -0.00328068, -0.000328436, -0.00532287, -0.123817) - -[node name="BoneMiddleDistal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="12"] -transform = Transform3D(0.297115, 0.954531, -0.0243817, 0.0374455, 0.0138672, 0.999202, 0.954107, -0.297791, -0.0316227, 0.0205207, -0.00467056, -0.148631) - -[node name="BoneRingMetacarpal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="13"] -transform = Transform3D(0.998609, 0.0470739, 0.0237408, -0.0169882, -0.138981, 0.990149, 0.0499097, -0.989175, -0.137988, -0.0100005, -0.0130734, 3.59304e-05) - -[node name="BoneRingProximal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="14"] -transform = Transform3D(0.982964, 0.181854, 0.0266581, 0.0109494, -0.202722, 0.979175, 0.183471, -0.962202, -0.20126, -0.00651963, -0.0233502, -0.0731075) - -[node name="BoneRingMiddle" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="15"] -transform = Transform3D(0.772579, 0.634602, 0.0200163, 0.0794843, -0.127948, 0.98859, 0.629923, -0.762174, -0.149291, 0.000778387, -0.0314857, -0.111722) - -[node name="BoneRingDistal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="16"] -transform = Transform3D(0.381388, 0.924068, 0.025339, 0.114105, -0.0742598, 0.990689, 0.917346, -0.374946, -0.133762, 0.0184188, -0.0350424, -0.132908) - -[node name="BonePinkyMetacarpal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="17"] -transform = Transform3D(0.998969, 0.0165318, 0.0422887, -0.0385953, -0.181427, 0.982647, 0.0239172, -0.983265, -0.180601, -4.58211e-07, -0.0299734, 3.59304e-05) - -[node name="BonePinkyProximal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="18"] -transform = Transform3D(0.969212, 0.239305, 0.0579745, 0.0185536, -0.305761, 0.951928, 0.245527, -0.921544, -0.300787, 0.00108587, -0.0418952, -0.0645756) - -[node name="BonePinkyMiddle" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="19"] -transform = Transform3D(0.699331, 0.713815, 0.0374603, 0.103947, -0.153407, 0.982681, 0.707199, -0.683325, -0.181481, 0.00901248, -0.0520231, -0.0951004) - -[node name="BonePinkyDistal" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="20"] -transform = Transform3D(0.34089, 0.939845, 0.0220292, 0.162162, -0.081867, 0.983362, 0.926011, -0.331646, -0.180315, 0.0218786, -0.0547881, -0.107417) - -[node name="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D" index="21"] +[node name="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/LeftHand/XRToolsCollisionHand/LeftHand/Hand_Nails_low_L/Armature/Skeleton3D" index="1"] transform = Transform3D(0.54083, 0.840812, -0.0231736, -0.0826267, 0.0805244, 0.993322, 0.837063, -0.535304, 0.113024, 0.0399019, 0.0402829, -0.150096) bone_name = "Index_Tip_L" bone_idx = 9 -[node name="Poke" parent="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L/Armature/Skeleton3D/BoneAttachment3D" index="0" instance=ExtResource("4_iyttx")] +[node name="Poke" parent="XROrigin3D/LeftHand/XRToolsCollisionHand/LeftHand/Hand_Nails_low_L/Armature/Skeleton3D/BoneAttachment3D" index="0" instance=ExtResource("4_iyttx")] layer = 0 mask = 4194304 push_bodies = false -[node name="AnimationTree" parent="XROrigin3D/LeftHand/LeftPhysicsHand" index="1"] -tree_root = SubResource("AnimationNodeBlendTree_cldmv") +[node name="AnimationTree" parent="XROrigin3D/LeftHand/XRToolsCollisionHand/LeftHand" index="1"] +root_node = NodePath("../Hand_Nails_low_L") +tree_root = SubResource("AnimationNodeBlendTree_add5h") -[node name="MovementDirect" parent="XROrigin3D/LeftHand" index="1" instance=ExtResource("7")] +[node name="MovementDirect" parent="XROrigin3D/LeftHand/XRToolsCollisionHand" index="1" instance=ExtResource("7")] strafe = true -[node name="FunctionPickup" parent="XROrigin3D/LeftHand" index="2" instance=ExtResource("8")] +[node name="FunctionPickup" parent="XROrigin3D/LeftHand/XRToolsCollisionHand" index="2" instance=ExtResource("8")] grab_distance = 0.1 ranged_angle = 10.0 -[node name="ControlPadLocationLeft" parent="XROrigin3D/LeftHand" index="3" instance=ExtResource("7_fdgf8")] - -[node name="RightPhysicsHand" parent="XROrigin3D/RightHand" index="0" instance=ExtResource("5_laayj")] - -[node name="BoneRoot" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="1"] -transform = Transform3D(1, 1.83077e-05, -1.52659e-08, -1.52668e-08, 0.00166774, 0.999999, 1.83077e-05, -0.999999, 0.00166774, -3.86425e-08, -1.86975e-05, 0.0271756) - -[node name="BoneThumbMetacarpal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="2"] -transform = Transform3D(0.998519, -0.0514604, 0.0176509, 0.0176509, 0.613334, 0.789626, -0.0514604, -0.788145, 0.613334, -0.00999954, 0.0200266, 3.59323e-05) - -[node name="BoneThumbProximal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="3"] -transform = Transform3D(0.921479, -0.383957, 0.0587629, 0.124051, 0.434264, 0.892203, -0.368086, -0.814857, 0.447796, -0.012311, 0.0475754, -0.0353648) - -[node name="BoneThumbDistal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="4"] -transform = Transform3D(0.930159, -0.366843, -0.0151707, 0.154036, 0.352396, 0.923087, -0.333282, -0.860954, 0.384292, -0.0284939, 0.0658787, -0.0697092) - -[node name="BoneIndexMetacarpal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="5"] -transform = Transform3D(0.999165, -0.0336563, 0.0231681, -0.0231985, -0.000511136, 0.999731, -0.0336354, -0.999433, -0.00129148, 0.0100005, 0.0224317, 3.59286e-05) - -[node name="BoneIndexProximal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="6"] -transform = Transform3D(0.997821, -0.0419385, 0.0509327, -0.041317, 0.204662, 0.97796, -0.0514382, -0.977934, 0.202483, 0.00729559, 0.0223907, -0.0802861) - -[node name="BoneIndexMiddle" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="7"] -transform = Transform3D(0.759852, -0.644453, 0.0854741, 0.040588, 0.178251, 0.983147, -0.648828, -0.743577, 0.161602, 0.00569704, 0.0301916, -0.117561) - -[node name="BoneIndexDistal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="8"] -transform = Transform3D(0.356468, -0.927111, 0.115741, 0.109286, 0.164404, 0.98032, -0.927894, -0.336804, 0.159925, -0.0145038, 0.035779, -0.140869) - -[node name="BoneMiddleMetacarpal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="9"] -transform = Transform3D(0.999918, 0.0127165, 0.00125616, -0.000365489, -0.0698023, 0.997561, 0.0127732, -0.99748, -0.069792, 0.0100005, 0.00355416, 3.59286e-05) - -[node name="BoneMiddleProximal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="10"] -transform = Transform3D(0.971345, -0.237654, 0.00293003, -0.020734, -0.0724503, 0.997156, -0.236766, -0.968644, -0.0753018, 0.0110237, -0.00206236, -0.0802245) - -[node name="BoneMiddleMiddle" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="11"] -transform = Transform3D(0.764922, -0.643162, 0.0351718, -0.0290328, 0.0201225, 0.999376, -0.643468, -0.765466, -0.00328068, 0.000328433, -0.00532287, -0.123817) - -[node name="BoneMiddleDistal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="12"] -transform = Transform3D(0.297115, -0.95453, 0.0243817, -0.0374455, 0.0138672, 0.999202, -0.954107, -0.297791, -0.0316227, -0.0205208, -0.00467056, -0.148631) - -[node name="BoneRingMetacarpal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="13"] -transform = Transform3D(0.998609, -0.0470739, -0.0237408, 0.0169882, -0.138981, 0.990149, -0.0499097, -0.989175, -0.137988, 0.0100005, -0.0130734, 3.59304e-05) - -[node name="BoneRingProximal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="14"] -transform = Transform3D(0.982964, -0.181854, -0.0266581, -0.0109494, -0.202722, 0.979175, -0.183471, -0.962202, -0.20126, 0.00651963, -0.0233502, -0.0731075) - -[node name="BoneRingMiddle" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="15"] -transform = Transform3D(0.772579, -0.634602, -0.0200163, -0.0794843, -0.127948, 0.98859, -0.629923, -0.762174, -0.149291, -0.000778387, -0.0314857, -0.111722) - -[node name="BoneRingDistal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="16"] -transform = Transform3D(0.381388, -0.924068, -0.025339, -0.114105, -0.0742598, 0.990689, -0.917346, -0.374946, -0.133762, -0.0184188, -0.0350424, -0.132908) - -[node name="BonePinkyMetacarpal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="17"] -transform = Transform3D(0.998969, -0.0165318, -0.0422887, 0.0385953, -0.181427, 0.982647, -0.0239172, -0.983265, -0.180601, 4.58211e-07, -0.0299734, 3.59304e-05) - -[node name="BonePinkyProximal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="18"] -transform = Transform3D(0.969212, -0.239305, -0.0579745, -0.0185536, -0.305761, 0.951928, -0.245527, -0.921544, -0.300787, -0.00108587, -0.0418952, -0.0645756) +[node name="ControlPadLocationLeft" parent="XROrigin3D/LeftHand/XRToolsCollisionHand" index="3" instance=ExtResource("7_fdgf8")] -[node name="BonePinkyMiddle" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="19"] -transform = Transform3D(0.699331, -0.713815, -0.0374603, -0.103947, -0.153407, 0.982681, -0.707199, -0.683325, -0.181481, -0.00901248, -0.0520231, -0.0951004) +[node name="XRToolsCollisionHand" parent="XROrigin3D/RightHand" index="0" node_paths=PackedStringArray("hand_skeleton") instance=ExtResource("3_m7tr4")] +hand_skeleton = NodePath("RightHand/Hand_Nails_R/Armature/Skeleton3D") -[node name="BonePinkyDistal" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="20"] -transform = Transform3D(0.34089, -0.939845, -0.0220292, -0.162162, -0.081867, 0.983362, -0.926011, -0.331646, -0.180315, -0.0218786, -0.0547881, -0.107417) +[node name="RightHand" parent="XROrigin3D/RightHand/XRToolsCollisionHand" index="0" instance=ExtResource("9_v8epv")] -[node name="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D" index="21"] +[node name="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/RightHand/XRToolsCollisionHand/RightHand/Hand_Nails_R/Armature/Skeleton3D" index="1"] transform = Transform3D(0.54083, -0.840812, 0.0231736, 0.0826267, 0.0805244, 0.993322, -0.837063, -0.535304, 0.113024, -0.0399019, 0.0402829, -0.150096) bone_name = "Index_Tip_R" bone_idx = 9 -[node name="Poke" parent="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R/Armature/Skeleton3D/BoneAttachment3D" index="0" instance=ExtResource("4_iyttx")] +[node name="Poke" parent="XROrigin3D/RightHand/XRToolsCollisionHand/RightHand/Hand_Nails_R/Armature/Skeleton3D/BoneAttachment3D" index="0" instance=ExtResource("4_iyttx")] layer = 0 mask = 4194304 push_bodies = false -[node name="AnimationTree" parent="XROrigin3D/RightHand/RightPhysicsHand" index="1"] -tree_root = SubResource("AnimationNodeBlendTree_l3p6r") +[node name="AnimationTree" parent="XROrigin3D/RightHand/XRToolsCollisionHand/RightHand" index="1"] +root_node = NodePath("../Hand_Nails_R") +tree_root = SubResource("AnimationNodeBlendTree_utbhi") -[node name="MovementDirect" parent="XROrigin3D/RightHand" index="1" instance=ExtResource("7")] +[node name="MovementDirect" parent="XROrigin3D/RightHand/XRToolsCollisionHand" index="1" instance=ExtResource("7")] -[node name="MovementTurn" parent="XROrigin3D/RightHand" index="2" instance=ExtResource("10")] +[node name="MovementTurn" parent="XROrigin3D/RightHand/XRToolsCollisionHand" index="2" instance=ExtResource("10")] -[node name="FunctionPickup" parent="XROrigin3D/RightHand" index="3" instance=ExtResource("8")] +[node name="FunctionPickup" parent="XROrigin3D/RightHand/XRToolsCollisionHand" index="3" instance=ExtResource("8")] grab_distance = 0.1 ranged_angle = 10.0 -[node name="FunctionPointer" parent="XROrigin3D/RightHand" index="4" instance=ExtResource("7_kskan")] +[node name="FunctionPointer" parent="XROrigin3D/RightHand/XRToolsCollisionHand" index="4" instance=ExtResource("7_kskan")] show_laser = 2 laser_length = 1 -[node name="ControlPadLocationRight" parent="XROrigin3D/RightHand" index="5" instance=ExtResource("11_dk12d")] +[node name="ControlPadLocationRight" parent="XROrigin3D/RightHand/XRToolsCollisionHand" index="5" instance=ExtResource("11_dk12d")] [node name="PlayerBody" parent="XROrigin3D" index="3" instance=ExtResource("9")] @@ -294,9 +183,6 @@ transform = Transform3D(0.707107, 0, -0.707107, 0, 1, 0, 0.707107, 0, 0.707107, [node name="Teleport" parent="." index="2" instance=ExtResource("5")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 4) title = ExtResource("6") -spawn_point_name = "" -spawn_point_position = Vector3(0, 0, 0) -spawn_point_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) [node name="Instructions" parent="." index="3" instance=ExtResource("12_282ma")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, -5) @@ -393,8 +279,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.6, 0.929682, -2.26355) [node name="SnapToyYellow" parent="SnapToys" index="3" instance=ExtResource("12")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.8, 0.929682, -2.26355) -[editable path="XROrigin3D/LeftHand/LeftPhysicsHand"] -[editable path="XROrigin3D/LeftHand/LeftPhysicsHand/Hand_Nails_low_L"] -[editable path="XROrigin3D/RightHand/RightPhysicsHand"] -[editable path="XROrigin3D/RightHand/RightPhysicsHand/Hand_Nails_low_R"] +[editable path="XROrigin3D/LeftHand/XRToolsCollisionHand/LeftHand"] +[editable path="XROrigin3D/LeftHand/XRToolsCollisionHand/LeftHand/Hand_Nails_low_L"] +[editable path="XROrigin3D/RightHand/XRToolsCollisionHand/RightHand"] +[editable path="XROrigin3D/RightHand/XRToolsCollisionHand/RightHand/Hand_Nails_R"] [editable path="Table1/TeacupStand"]