multiple collisions working, add gizmo asset

This commit is contained in:
hiina 2025-02-11 22:40:34 -07:00
parent d981a41dee
commit 305dfcf3e3
23 changed files with 529 additions and 275 deletions

BIN
assets/Arcane Source 2.glb Normal file

Binary file not shown.

View file

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://c20kawop2lrv"
path="res://.godot/imported/Arcane Source 2.glb-f6a7fde9d1238c67588c278f530e1b1c.scn"
[deps]
source_file="res://assets/Arcane Source 2.glb"
dest_files=["res://.godot/imported/Arcane Source 2.glb-f6a7fde9d1238c67588c278f530e1b1c.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View file

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bfqhksl13a25e"
path.s3tc="res://.godot/imported/Arcane Source 2_CAUTION POSTER.png-9853b52be85f48254dda6933910ea150.s3tc.ctex"
path.etc2="res://.godot/imported/Arcane Source 2_CAUTION POSTER.png-9853b52be85f48254dda6933910ea150.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "ff0c8b64cdfd8364eccff6a0f230ccc5"
}
[deps]
source_file="res://assets/Arcane Source 2_CAUTION POSTER.png"
dest_files=["res://.godot/imported/Arcane Source 2_CAUTION POSTER.png-9853b52be85f48254dda6933910ea150.s3tc.ctex", "res://.godot/imported/Arcane Source 2_CAUTION POSTER.png-9853b52be85f48254dda6933910ea150.etc2.ctex"]
[params]
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=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View file

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ne443mm67bls"
path.s3tc="res://.godot/imported/Arcane Source 2_Crystal.png-a983e350b642f76a540a3c2e3d6c3ed1.s3tc.ctex"
path.etc2="res://.godot/imported/Arcane Source 2_Crystal.png-a983e350b642f76a540a3c2e3d6c3ed1.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "0814fbf90837c30521be18ddc1562b3b"
}
[deps]
source_file="res://assets/Arcane Source 2_Crystal.png"
dest_files=["res://.godot/imported/Arcane Source 2_Crystal.png-a983e350b642f76a540a3c2e3d6c3ed1.s3tc.ctex", "res://.godot/imported/Arcane Source 2_Crystal.png-a983e350b642f76a540a3c2e3d6c3ed1.etc2.ctex"]
[params]
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=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View file

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://wra1moc3143u"
path="res://.godot/imported/Arcane Source 2_Image.png-2d519ab22a9cee886cf4140b42ce8130.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "f3283d06ee27f6a55f5352dc140cb1ae"
}
[deps]
source_file="res://assets/Arcane Source 2_Image.png"
dest_files=["res://.godot/imported/Arcane Source 2_Image.png-2d519ab22a9cee886cf4140b42ce8130.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
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

View file

@ -1,3 +1,3 @@
[xr] [xr]
openxr/enabled=true openxr/enabled=false

View file

@ -58,6 +58,7 @@ trigger_left={
[layer_names] [layer_names]
3d_render/layer_20="particle_collision_proxy"
3d_physics/layer_1="Static World" 3d_physics/layer_1="Static World"
3d_physics/layer_2="Dynamic World" 3d_physics/layer_2="Dynamic World"
3d_physics/layer_3="Pickable Objects" 3d_physics/layer_3="Pickable Objects"

View file

@ -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://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"] [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_uemdn"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_al5fx"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_cetcl"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_eutcj"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_7ad3m"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_p2ig7"]
filter_enabled = true 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"] 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_nedco"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_bdkoa"]
animation = &"Grip 5" animation = &"Grip 5"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_dxfrv"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_aw2tq"]
filter_enabled = true 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"] 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_wvkh4"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_x3j1i"]
graph_offset = Vector2(-536, 11) graph_offset = Vector2(-536, 11)
nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_uemdn") nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_al5fx")
nodes/ClosedHand1/position = Vector2(-600, 300) nodes/ClosedHand1/position = Vector2(-600, 300)
nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_cetcl") nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_eutcj")
nodes/ClosedHand2/position = Vector2(-360, 300) nodes/ClosedHand2/position = Vector2(-360, 300)
nodes/Grip/node = SubResource("AnimationNodeBlend2_7ad3m") nodes/Grip/node = SubResource("AnimationNodeBlend2_p2ig7")
nodes/Grip/position = Vector2(0, 20) nodes/Grip/position = Vector2(0, 20)
nodes/OpenHand/node = SubResource("AnimationNodeAnimation_nedco") nodes/OpenHand/node = SubResource("AnimationNodeAnimation_bdkoa")
nodes/OpenHand/position = Vector2(-600, 100) nodes/OpenHand/position = Vector2(-600, 100)
nodes/Trigger/node = SubResource("AnimationNodeBlend2_dxfrv") nodes/Trigger/node = SubResource("AnimationNodeBlend2_aw2tq")
nodes/Trigger/position = Vector2(-360, 20) nodes/Trigger/position = Vector2(-360, 20)
node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_66tgm"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_yt7kt"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_2dxub"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_afuug"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_b2nhh"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_qraqy"]
filter_enabled = true 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"] 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_xs4y0"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_30nip"]
animation = &"Grip 5" animation = &"Grip 5"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_7l3h6"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ybln8"]
filter_enabled = true 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"] 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_jr1q8"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_tgska"]
graph_offset = Vector2(-552.664, 107.301) graph_offset = Vector2(-552.664, 107.301)
nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_66tgm") nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_yt7kt")
nodes/ClosedHand1/position = Vector2(-600, 300) nodes/ClosedHand1/position = Vector2(-600, 300)
nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_2dxub") nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_afuug")
nodes/ClosedHand2/position = Vector2(-360, 300) nodes/ClosedHand2/position = Vector2(-360, 300)
nodes/Grip/node = SubResource("AnimationNodeBlend2_b2nhh") nodes/Grip/node = SubResource("AnimationNodeBlend2_qraqy")
nodes/Grip/position = Vector2(0, 40) nodes/Grip/position = Vector2(0, 40)
nodes/OpenHand/node = SubResource("AnimationNodeAnimation_xs4y0") nodes/OpenHand/node = SubResource("AnimationNodeAnimation_30nip")
nodes/OpenHand/position = Vector2(-600, 100) nodes/OpenHand/position = Vector2(-600, 100)
nodes/Trigger/node = SubResource("AnimationNodeBlend2_7l3h6") nodes/Trigger/node = SubResource("AnimationNodeBlend2_ybln8")
nodes/Trigger/position = Vector2(-360, 40) nodes/Trigger/position = Vector2(-360, 40)
node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"]
@ -129,7 +129,7 @@ bone_idx = 9
transform = Transform3D(0.999999, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) transform = Transform3D(0.999999, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
[node name="AnimationTree" parent="XROrigin3D/LeftHand/LeftHand" index="1"] [node name="AnimationTree" parent="XROrigin3D/LeftHand/LeftHand" index="1"]
tree_root = SubResource("AnimationNodeBlendTree_wvkh4") tree_root = SubResource("AnimationNodeBlendTree_x3j1i")
[node name="FunctionPoseDetector" parent="XROrigin3D/LeftHand" index="1" instance=ExtResource("5_xgcrx")] [node name="FunctionPoseDetector" parent="XROrigin3D/LeftHand" index="1" instance=ExtResource("5_xgcrx")]
@ -144,24 +144,7 @@ strafe = true
[node name="Skeleton3D" parent="XROrigin3D/RightHand/RightHand/Hand_low_R/Armature" index="0"] [node name="Skeleton3D" parent="XROrigin3D/RightHand/RightHand/Hand_low_R/Armature" index="0"]
bones/1/rotation = Quaternion(0.323537, 2.56588e-05, 0.0272204, 0.945824) bones/1/rotation = Quaternion(0.323537, 2.56588e-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.000225722, 0.115393, 0.991351) bones/21/rotation = Quaternion(-0.0625182, 0.000225722, 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"] [node name="mesh_Hand_low_R" parent="XROrigin3D/RightHand/RightHand/Hand_low_R/Armature/Skeleton3D" index="0"]
surface_material_override/0 = ExtResource("26_id1x7") surface_material_override/0 = ExtResource("26_id1x7")
@ -176,7 +159,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"] [node name="AnimationTree" parent="XROrigin3D/RightHand/RightHand" index="1"]
root_node = NodePath("../Hand_low_R") root_node = NodePath("../Hand_low_R")
tree_root = SubResource("AnimationNodeBlendTree_jr1q8") tree_root = SubResource("AnimationNodeBlendTree_tgska")
[node name="FunctionPoseDetector" parent="XROrigin3D/RightHand" index="1" instance=ExtResource("5_xgcrx")] [node name="FunctionPoseDetector" parent="XROrigin3D/RightHand" index="1" instance=ExtResource("5_xgcrx")]

View file

@ -0,0 +1,66 @@
// This shader is used with a cloned GPUParticles3D system that is rendered in an offscreen SubViewport
// (sized 8×2 pixels) on a dedicated layer (e.g. layer 20). Its purpose is to check each particles full 3D
// world-space position against up to eight static target areas. Each target area is defined by a center (vec3),
// extents (vec3, representing half-sizes), and a precomputed inverse basis (mat3) that converts world space into
// the targets local space. If a particle is within a target, the shader maps its geometry to a quad occupying the
// horizontal slice corresponding to that target (i.e. one pixel column in the 8×1 output). The fragment outputs red
// with a configurable alpha value. With additive blending, the red intensity in each slice roughly indicates the number
// of particles hitting that target.
//
// Targets with zero extents are considered disabled.
shader_type spatial;
render_mode unshaded, depth_draw_never, cull_disabled, blend_add;
const int MAX_TARGETS = 8;
uniform vec3 target_center[MAX_TARGETS]; // 3D centers for each target.
uniform vec3 target_extents[MAX_TARGETS]; // 3D half-sizes for each target.
uniform mat3 target_inv_basis[MAX_TARGETS]; // Precomputed inverse bases (inverts the target's rotation).
void vertex() {
// Compute the particle's 3D world-space center (assumes local origin is the center).
vec3 world_pos = (MODEL_MATRIX * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
int hit_target = -1;
// Loop through targets.
for (int i = 0; i < MAX_TARGETS; i++) {
// Skip disabled targets.
if (target_extents[i] == vec3(0.0))
continue;
// Transform the world position into the target's local space.
vec3 local_pos = target_inv_basis[i] * (world_pos - target_center[i]);
// Check if within the target's extents on all three axes.
if (abs(local_pos.x) <= target_extents[i].x &&
abs(local_pos.y) <= target_extents[i].y &&
abs(local_pos.z) <= target_extents[i].z) {
hit_target = i;
break;
}
}
if (hit_target == -1) {
// Particle is not inside any target: send its geometry offscreen.
POSITION = vec4(2.0, 2.0, 2.0, 1.0);
} else {
// Map the target index to a horizontal slice of clip space.
float slice_width = 2.0 / float(MAX_TARGETS);
float x_min = -1.0 + slice_width * float(hit_target);
float x_max = x_min + slice_width;
// Output a quad covering the full vertical range.
if (VERTEX_ID == 0) {
POSITION = vec4(x_min, -1.0, 0.0, 1.0);
} else if (VERTEX_ID == 1) {
POSITION = vec4(x_max, -1.0, 0.0, 1.0);
} else if (VERTEX_ID == 2) {
POSITION = vec4(x_min, 1.0, 0.0, 1.0);
} else {
POSITION = vec4(x_max, 1.0, 0.0, 1.0);
}
}
}
void fragment() {
ALBEDO = vec3(1.0, 0.0, 0.0);
ALPHA = 0.05f;
}

View file

@ -36,65 +36,65 @@
[ext_resource type="PackedScene" uid="uid://bmjemjgtnpkpo" path="res://assets/3dmodelscc0/models/scenes/sniper_rifle.tscn" id="25_xgu4l"] [ext_resource type="PackedScene" uid="uid://bmjemjgtnpkpo" path="res://assets/3dmodelscc0/models/scenes/sniper_rifle.tscn" id="25_xgu4l"]
[ext_resource type="PackedScene" uid="uid://deuxld12hxsq0" path="res://scenes/pickable_demo/objects/picatinny_scope.tscn" id="26_x40vw"] [ext_resource type="PackedScene" uid="uid://deuxld12hxsq0" path="res://scenes/pickable_demo/objects/picatinny_scope.tscn" id="26_x40vw"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ayae3"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_f236f"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_q1ybi"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_oh7qd"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_sf634"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_6tydi"]
filter_enabled = true 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"] 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_cw65d"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_wdn5b"]
animation = &"Grip 5" animation = &"Grip 5"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_y4myv"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_2h5nu"]
filter_enabled = true 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"] 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_ql04s"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_ptd85"]
graph_offset = Vector2(-536, 11) graph_offset = Vector2(-536, 11)
nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_ayae3") nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_f236f")
nodes/ClosedHand1/position = Vector2(-600, 300) nodes/ClosedHand1/position = Vector2(-600, 300)
nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_q1ybi") nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_oh7qd")
nodes/ClosedHand2/position = Vector2(-360, 300) nodes/ClosedHand2/position = Vector2(-360, 300)
nodes/Grip/node = SubResource("AnimationNodeBlend2_sf634") nodes/Grip/node = SubResource("AnimationNodeBlend2_6tydi")
nodes/Grip/position = Vector2(0, 20) nodes/Grip/position = Vector2(0, 20)
nodes/OpenHand/node = SubResource("AnimationNodeAnimation_cw65d") nodes/OpenHand/node = SubResource("AnimationNodeAnimation_wdn5b")
nodes/OpenHand/position = Vector2(-600, 100) nodes/OpenHand/position = Vector2(-600, 100)
nodes/Trigger/node = SubResource("AnimationNodeBlend2_y4myv") nodes/Trigger/node = SubResource("AnimationNodeBlend2_2h5nu")
nodes/Trigger/position = Vector2(-360, 20) nodes/Trigger/position = Vector2(-360, 20)
node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_lwvn0"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_wo3xt"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_23a7s"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_lxjyi"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_la71d"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_4pghn"]
filter_enabled = true 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"] 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_b3yxh"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_bfkh7"]
animation = &"Grip 5" animation = &"Grip 5"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_be0ca"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_k2f07"]
filter_enabled = true 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"] 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_0stb8"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_e87ne"]
graph_offset = Vector2(-552.664, 107.301) graph_offset = Vector2(-552.664, 107.301)
nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_lwvn0") nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_wo3xt")
nodes/ClosedHand1/position = Vector2(-600, 300) nodes/ClosedHand1/position = Vector2(-600, 300)
nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_23a7s") nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_lxjyi")
nodes/ClosedHand2/position = Vector2(-360, 300) nodes/ClosedHand2/position = Vector2(-360, 300)
nodes/Grip/node = SubResource("AnimationNodeBlend2_la71d") nodes/Grip/node = SubResource("AnimationNodeBlend2_4pghn")
nodes/Grip/position = Vector2(0, 40) nodes/Grip/position = Vector2(0, 40)
nodes/OpenHand/node = SubResource("AnimationNodeAnimation_b3yxh") nodes/OpenHand/node = SubResource("AnimationNodeAnimation_bfkh7")
nodes/OpenHand/position = Vector2(-600, 100) nodes/OpenHand/position = Vector2(-600, 100)
nodes/Trigger/node = SubResource("AnimationNodeBlend2_be0ca") nodes/Trigger/node = SubResource("AnimationNodeBlend2_k2f07")
nodes/Trigger/position = Vector2(-360, 40) nodes/Trigger/position = Vector2(-360, 40)
node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"]
@ -123,7 +123,7 @@ push_bodies = false
[node name="AnimationTree" parent="XROrigin3D/LeftHand/XRToolsCollisionHand/LeftHand" index="1"] [node name="AnimationTree" parent="XROrigin3D/LeftHand/XRToolsCollisionHand/LeftHand" index="1"]
root_node = NodePath("../Hand_Nails_low_L") root_node = NodePath("../Hand_Nails_low_L")
tree_root = SubResource("AnimationNodeBlendTree_ql04s") tree_root = SubResource("AnimationNodeBlendTree_ptd85")
[node name="MovementDirect" parent="XROrigin3D/LeftHand/XRToolsCollisionHand" index="1" instance=ExtResource("7")] [node name="MovementDirect" parent="XROrigin3D/LeftHand/XRToolsCollisionHand" index="1" instance=ExtResource("7")]
strafe = true strafe = true
@ -159,7 +159,7 @@ push_bodies = false
[node name="AnimationTree" parent="XROrigin3D/RightHand/XRToolsCollisionHand/RightHand" index="1"] [node name="AnimationTree" parent="XROrigin3D/RightHand/XRToolsCollisionHand/RightHand" index="1"]
root_node = NodePath("../Hand_Nails_R") root_node = NodePath("../Hand_Nails_R")
tree_root = SubResource("AnimationNodeBlendTree_0stb8") tree_root = SubResource("AnimationNodeBlendTree_e87ne")
[node name="MovementDirect" parent="XROrigin3D/RightHand/XRToolsCollisionHand" index="1" instance=ExtResource("7")] [node name="MovementDirect" parent="XROrigin3D/RightHand/XRToolsCollisionHand" index="1" instance=ExtResource("7")]

View file

@ -0,0 +1,105 @@
# This script is designed to drive gameplay logic based on the number of GPUParticles3D
# that “hit” various static target areas in 3D space. A cloned particle system (rendered
# in a dedicated SubViewport on layer 20) uses a special testing shader that, for each particle,
# checks its 3D world-space position against up to eight static target bounding boxes.
#
# The testing shader maps particles that hit a target into a designated horizontal slice of clip
# space so that the SubViewport (sized 8×1 pixels) accumulates red intensity in each column. Higher
# red intensity means more particles hit that target.
#
# In this version, the targets are static so their parameters (center, extents, and the inverse of
# their 3×3 rotation basis) are computed once and sent to the shader. The attractors are shared
# (set up in the main scene and used by the cloned particle system) rather than cloned.
#
# Other game scripts can connect to the "target_occupancy_changed" signal, which is emitted each frame
# for every target (07) with the measured red intensity (occupancy).
extends Node3D
# Signal emitted when the occupancy of a target changes. Sent every frame.
# occupancy is a float between 0 and 1 corresponding to how many particles are in the target.
signal target_occupancy_changed(target_index: int, occupancy: float)
# Optional debug mesh to visualize the viewport texture
@export var debug_mesh_path: NodePath
var debug_mesh: MeshInstance3D
# Exported node paths.
@export var source_particles_path: NodePath # The original GPUParticles3D to clone for collision detection.
@export var target_collision_shapes_paths: Array[NodePath] = [] # Array of CollisionShape3D nodes (each with a BoxShape3D).
# Path to the testing shader resource.
const shader = preload("res://scenes/particle_test.gdshader")
# Maximum number of target areas supported.
const MAX_TARGETS: int = 8
# References.
var clone_particles: GPUParticles3D
@onready var sub_viewport: SubViewport = $SubViewport
var target_collision_shapes: Array[CollisionShape3D] = []
func _ready():
# Get references from the scene.
var source_particles = get_node(source_particles_path) as GPUParticles3D
for path in target_collision_shapes_paths:
var shape = get_node(path) as CollisionShape3D
target_collision_shapes.append(shape)
# Pad to MAX_TARGETS if necessary.
while target_collision_shapes.size() < MAX_TARGETS:
target_collision_shapes.append(null)
# Set up debug mesh if path provided
if not debug_mesh_path.is_empty():
debug_mesh = get_node(debug_mesh_path)
if debug_mesh:
var debug_material = debug_mesh.get_surface_override_material(0)
debug_material.albedo_texture = sub_viewport.get_texture()
debug_mesh.set_surface_override_material(0, debug_material)
# Load the testing shader and assign it to the cloned particle systems draw pass.
var shader_material = ShaderMaterial.new()
shader_material.shader = shader
# Clone the source particles and set the shader material.
clone_particles = source_particles.duplicate()
# duplicate the draw pass so we don't affect the original.
clone_particles.draw_pass_1 = clone_particles.draw_pass_1.duplicate()
# replace with the special material
clone_particles.draw_pass_1.surface_set_material(0, shader_material)
# set visual layer to 20 so it doesn't draw on main camera
clone_particles.layers = 0
clone_particles.set_layer_mask_value(20, true)
# add clone as child of SubViewport
sub_viewport.add_child(clone_particles)
# Precompute static target parameters and set them in the shader.
var centers: Array = [] # Array of Vector3 centers.
var extents: Array = [] # Array of Vector3 half-sizes.
var inv_bases: Array = [] # Array of mat3 (precomputed inverse bases).
for i in range(MAX_TARGETS):
if i < target_collision_shapes.size() and target_collision_shapes[i] and (target_collision_shapes[i].shape is BoxShape3D):
var box: BoxShape3D = target_collision_shapes[i].shape as BoxShape3D
var gxf: Transform3D = target_collision_shapes[i].global_transform
centers.append(gxf.origin)
extents.append(box.extents)
inv_bases.append(gxf.basis.inverse()) # Precompute the inverse once.
else:
centers.append(Vector3.ZERO)
extents.append(Vector3.ZERO) # Zero extents means this target is disabled.
inv_bases.append(Basis.IDENTITY)
shader_material.set_shader_parameter("target_center", centers)
shader_material.set_shader_parameter("target_extents", extents)
shader_material.set_shader_parameter("target_inv_basis", inv_bases)
func _process(_delta):
# Each frame, read back the 8 pixel wide image from the SubViewport.
var viewport_tex = sub_viewport.get_texture()
if viewport_tex:
var img: Image = viewport_tex.get_image()
if img:
for x in range(target_collision_shapes.size()):
var col: Color = img.get_pixel(x, 0)
var occupancy: float = col.r # The red channel intensity.
target_occupancy_changed.emit(x, occupancy)

View file

@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://rsrnbs08nv1n"]
[ext_resource type="Script" path="res://scenes/proxy_collision_detector.gd" id="1_ijo8k"]
[sub_resource type="Environment" id="Environment_gp8a6"]
background_mode = 1
[node name="ProxyCollisionDetector" type="Node3D"]
script = ExtResource("1_ijo8k")
[node name="SubViewport" type="SubViewport" parent="."]
size = Vector2i(8, 8)
render_target_update_mode = 4
[node name="Camera3D" type="Camera3D" parent="SubViewport"]
cull_mask = 524288
environment = SubResource("Environment_gp8a6")

View file

@ -0,0 +1,20 @@
extends StaticBody3D
@export var index: int = 0
@onready var mesh: MeshInstance3D = $MeshInstance3D
func _ready() -> void:
pass
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta: float) -> void:
pass
func _on_proxy_collision_detector_target_occupancy_changed(target_index: int, occupancy: float) -> void:
if target_index == index:
var material = mesh.get_surface_override_material(0)
if material:
material.emission_energy_multiplier = occupancy * 10

Binary file not shown.

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=22 format=3 uid="uid://bd86thqpujh3p"] [gd_scene load_steps=31 format=3 uid="uid://bd86thqpujh3p"]
[ext_resource type="Script" path="res://addons/godot-xr-tools/staging/scene_base.gd" id="1_t86sx"] [ext_resource type="Script" path="res://addons/godot-xr-tools/staging/scene_base.gd" id="1_t86sx"]
[ext_resource type="PackedScene" uid="uid://7uc6tf2tvn1k" path="res://scenes/xr_origin_3d.tscn" id="2_xk21l"] [ext_resource type="PackedScene" uid="uid://7uc6tf2tvn1k" path="res://scenes/xr_origin_3d.tscn" id="2_xk21l"]
@ -6,6 +6,9 @@
[ext_resource type="PackedScene" uid="uid://57q7hhomocdh" path="res://addons/godot-xr-tools/objects/world_grab_area.tscn" id="4_nruf2"] [ext_resource type="PackedScene" uid="uid://57q7hhomocdh" path="res://addons/godot-xr-tools/objects/world_grab_area.tscn" id="4_nruf2"]
[ext_resource type="VoxelGIData" uid="uid://bxphdae7hohsh" path="res://scenes/title_scene.VoxelGI_data.res" id="5_ebg1r"] [ext_resource type="VoxelGIData" uid="uid://bxphdae7hohsh" path="res://scenes/title_scene.VoxelGI_data.res" id="5_ebg1r"]
[ext_resource type="CompressedTexture3D" uid="uid://c6uya54wegrle" path="res://scenes/title_scene.GPUParticlesCollisionSDF3D_data.exr" id="6_l378m"] [ext_resource type="CompressedTexture3D" uid="uid://c6uya54wegrle" path="res://scenes/title_scene.GPUParticlesCollisionSDF3D_data.exr" id="6_l378m"]
[ext_resource type="PackedScene" uid="uid://rsrnbs08nv1n" path="res://scenes/proxy_collision_detector.tscn" id="7_1kkxh"]
[ext_resource type="PackedScene" uid="uid://c20kawop2lrv" path="res://assets/Arcane Source 2.glb" id="8_h17hj"]
[ext_resource type="Script" path="res://scenes/target_highlight_test.gd" id="9_jig6v"]
[sub_resource type="Sky" id="Sky_c23dr"] [sub_resource type="Sky" id="Sky_c23dr"]
@ -47,7 +50,7 @@ size = Vector3(100, 100, 100)
[sub_resource type="Gradient" id="Gradient_0ygfi"] [sub_resource type="Gradient" id="Gradient_0ygfi"]
colors = PackedColorArray(0.764539, 0.208898, 0.642811, 1, 1, 1, 3, 1) colors = PackedColorArray(0.764539, 0.208898, 0.642811, 1, 1, 1, 3, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_g0abw"] [sub_resource type="GradientTexture1D" id="GradientTexture1D_e428v"]
gradient = SubResource("Gradient_0ygfi") gradient = SubResource("Gradient_0ygfi")
use_hdr = true use_hdr = true
@ -55,7 +58,7 @@ use_hdr = true
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.905229, 0.968574), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] _data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.905229, 0.968574), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 3 point_count = 3
[sub_resource type="CurveTexture" id="CurveTexture_bbn11"] [sub_resource type="CurveTexture" id="CurveTexture_qnerq"]
curve = SubResource("Curve_g0jsu") curve = SubResource("Curve_g0jsu")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_y126y"] [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_y126y"]
@ -63,18 +66,17 @@ resource_local_to_scene = true
emission_shape = 3 emission_shape = 3
emission_box_extents = Vector3(0.1, 0.1, 0.1) emission_box_extents = Vector3(0.1, 0.1, 0.1)
spread = 0.0 spread = 0.0
initial_velocity_min = 2.0 initial_velocity_min = 1.0
initial_velocity_max = 2.0 initial_velocity_max = 1.0
gravity = Vector3(0, 0, 0) gravity = Vector3(0, 0, 0)
damping_min = 0.03 damping_min = 0.05
damping_max = 0.03 damping_max = 0.05
scale_max = 1.3 scale_max = 1.3
scale_curve = SubResource("CurveTexture_bbn11") scale_curve = SubResource("CurveTexture_qnerq")
color = Color(0.407056, 0.407056, 0.407056, 1) color = Color(0.407056, 0.407056, 0.407056, 1)
color_ramp = SubResource("GradientTexture1D_g0abw") color_ramp = SubResource("GradientTexture1D_e428v")
hue_variation_min = -0.1 hue_variation_min = -0.1
hue_variation_max = 0.1 hue_variation_max = 0.1
turbulence_enabled = true
turbulence_noise_scale = 6.228 turbulence_noise_scale = 6.228
turbulence_influence_min = 0.01 turbulence_influence_min = 0.01
turbulence_influence_max = 0.01 turbulence_influence_max = 0.01
@ -82,11 +84,11 @@ collision_mode = 1
collision_friction = 0.06 collision_friction = 0.06
collision_bounce = 1.0 collision_bounce = 1.0
[sub_resource type="Curve" id="Curve_polom"] [sub_resource type="Curve" id="Curve_y0yng"]
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.149718, 0.977694), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] _data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.149718, 0.977694), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 3 point_count = 3
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_22hrm"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lbp2k"]
shading_mode = 2 shading_mode = 2
vertex_color_use_as_albedo = true vertex_color_use_as_albedo = true
vertex_color_is_srgb = true vertex_color_is_srgb = true
@ -97,12 +99,40 @@ disable_receive_shadows = true
use_particle_trails = true use_particle_trails = true
[sub_resource type="TubeTrailMesh" id="TubeTrailMesh_xiw4w"] [sub_resource type="TubeTrailMesh" id="TubeTrailMesh_xiw4w"]
material = SubResource("StandardMaterial3D_22hrm") material = SubResource("StandardMaterial3D_lbp2k")
radius = 0.002 radius = 0.002
radial_steps = 4 radial_steps = 4
cap_top = false cap_top = false
cap_bottom = false cap_bottom = false
curve = SubResource("Curve_polom") curve = SubResource("Curve_y0yng")
[sub_resource type="BoxShape3D" id="BoxShape3D_gofwq"]
[sub_resource type="BoxMesh" id="BoxMesh_0cc1r"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fof64"]
transparency = 1
albedo_color = Color(1, 1, 1, 0.3)
emission_enabled = true
emission = Color(1, 1, 1, 1)
emission_energy_multiplier = 7.57
rim = 0.38
refraction_scale = 0.88
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_n0pd7"]
transparency = 1
albedo_color = Color(1, 1, 1, 0.3)
emission_enabled = true
emission = Color(1, 1, 1, 1)
emission_energy_multiplier = 0.61
rim = 0.38
refraction_scale = 0.88
[sub_resource type="QuadMesh" id="QuadMesh_2imrf"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6ry38"]
resource_local_to_scene = true
shading_mode = 0
[node name="TitleScene" type="Node3D"] [node name="TitleScene" type="Node3D"]
script = ExtResource("1_t86sx") script = ExtResource("1_t86sx")
@ -123,6 +153,7 @@ mesh = SubResource("TextMesh_6owc4")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.38227, 3.47531, -13.7485) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.38227, 3.47531, -13.7485)
light_energy = 1.308 light_energy = 1.308
light_bake_mode = 1 light_bake_mode = 1
light_cull_mask = 4294443007
shadow_enabled = true shadow_enabled = true
omni_range = 14.8072 omni_range = 14.8072
metadata/_edit_lock_ = true metadata/_edit_lock_ = true
@ -142,12 +173,11 @@ size = Vector3(31, 6.57, 31)
data = ExtResource("5_ebg1r") data = ExtResource("5_ebg1r")
[node name="GPUParticles3D" type="GPUParticles3D" parent="."] [node name="GPUParticles3D" type="GPUParticles3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.26492, 1.52311, -9.46452) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.26492, 1.52311, -8.99933)
cast_shadow = 0 cast_shadow = 0
gi_mode = 2 gi_mode = 2
amount = 1000 amount = 1000
lifetime = 10.0 lifetime = 10.0
preprocess = 5.0
randomness = 0.18 randomness = 0.18
visibility_aabb = AABB(-100, -100, -100, 200, 200, 200) visibility_aabb = AABB(-100, -100, -100, 200, 200, 200)
transform_align = 2 transform_align = 2
@ -155,9 +185,56 @@ trail_enabled = true
trail_lifetime = 0.5 trail_lifetime = 0.5
process_material = SubResource("ParticleProcessMaterial_y126y") process_material = SubResource("ParticleProcessMaterial_y126y")
draw_pass_1 = SubResource("TubeTrailMesh_xiw4w") draw_pass_1 = SubResource("TubeTrailMesh_xiw4w")
metadata/_edit_lock_ = true
[node name="GPUParticlesCollisionSDF3D" type="GPUParticlesCollisionSDF3D" parent="."] [node name="GPUParticlesCollisionSDF3D" type="GPUParticlesCollisionSDF3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.171387, 1.63794, -9.15827) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.171387, 1.63794, -9.15827)
visible = false
size = Vector3(13.1045, 5.27588, 4.47766) size = Vector3(13.1045, 5.27588, 4.47766)
texture = ExtResource("6_l378m") texture = ExtResource("6_l378m")
[node name="GPUParticlesAttractorBox3D" type="GPUParticlesAttractorBox3D" parent="."]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 3.63926, -9.75923)
strength = 50.13
attenuation = 4.43828
size = Vector3(6, 6, 6)
[node name="ProxyCollisionDetector" parent="." instance=ExtResource("7_1kkxh")]
debug_mesh_path = NodePath("../DebugMesh")
source_particles_path = NodePath("../GPUParticles3D")
target_collision_shapes_paths = Array[NodePath]([NodePath("../Target/CollisionShape3D"), NodePath("../Target2/CollisionShape3D")])
[node name="Arcane Source 2" parent="." instance=ExtResource("8_h17hj")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.186696, -0.0137267, -6.72164)
[node name="Target" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.31548, 4.27292, -10.1667)
script = ExtResource("9_jig6v")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Target"]
shape = SubResource("BoxShape3D_gofwq")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Target"]
mesh = SubResource("BoxMesh_0cc1r")
skeleton = NodePath("../..")
surface_material_override/0 = SubResource("StandardMaterial3D_fof64")
[node name="Target2" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.21807, 4.27292, -10.0553)
script = ExtResource("9_jig6v")
index = 1
[node name="CollisionShape3D" type="CollisionShape3D" parent="Target2"]
shape = SubResource("BoxShape3D_gofwq")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Target2"]
mesh = SubResource("BoxMesh_0cc1r")
skeleton = NodePath("../..")
surface_material_override/0 = SubResource("StandardMaterial3D_n0pd7")
[node name="DebugMesh" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.74113, 5.01477, -10.7979)
mesh = SubResource("QuadMesh_2imrf")
surface_material_override/0 = SubResource("StandardMaterial3D_6ry38")
[connection signal="target_occupancy_changed" from="ProxyCollisionDetector" to="Target" method="_on_proxy_collision_detector_target_occupancy_changed"]
[connection signal="target_occupancy_changed" from="ProxyCollisionDetector" to="Target2" method="_on_proxy_collision_detector_target_occupancy_changed"]

View file

@ -1,40 +0,0 @@
shader_type spatial;
render_mode unshaded, depth_draw_never, cull_disabled;
// Uniforms that define the bounding box in world space.
uniform vec3 bbox_min;
uniform vec3 bbox_max;
void vertex() {
// Compute the particles center in world space.
// (This assumes that your particles mesh is centered at the local origin.)
vec3 particle_center = (MODEL_MATRIX * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
// Check if the particles center is within the provided bounding box.
bool inside = (particle_center.x >= bbox_min.x && particle_center.x <= bbox_max.x &&
particle_center.y >= bbox_min.y && particle_center.y <= bbox_max.y &&
particle_center.z >= bbox_min.z && particle_center.z <= bbox_max.z);
if (inside) {
// If the particle qualifies, we override its vertex positions so that
// regardless of its original quad, it covers the full clip space (i.e. the whole screen).
// This assumes exactly 4 vertices per instance.
if (VERTEX_ID == 0) {
POSITION = vec4(-1.0, -1.0, 0.0, 1.0);
} else if (VERTEX_ID == 1) {
POSITION = vec4( 1.0, -1.0, 0.0, 1.0);
} else if (VERTEX_ID == 2) {
POSITION = vec4(-1.0, 1.0, 0.0, 1.0);
} else {
POSITION = vec4( 1.0, 1.0, 0.0, 1.0);
}
} else {
// Otherwise, move the geometry far off clip space so it isnt rendered.
POSITION = vec4(2.0, 2.0, 2.0, 1.0);
}
}
void fragment() {
// Output pure red color.
ALBEDO = vec3(1.0, 0.0, 0.0);
}

View file

@ -1,90 +0,0 @@
extends Node3D
# Exported node paths for references in the editor.
@export var real_particles_path: NodePath # The real GPUParticles3D in the scene.
@export var real_attractor_path: NodePath # The real attractor node.
@export var target_collision_box_path: NodePath # a node for the particle target, assumed to be a 1x1x1 cube around its origin.
@export var debug_label_path: NodePath # A Label node to show "Target Hit: true/false".
# Variables to hold the real nodes.
var real_particles: GPUParticles3D
var real_attractor: Node3D
var target_collision_box: Node3D
var debug_label: Label3D
# Cloned proxy nodes that will live in the offscreen SubViewport.
var clone_particles: GPUParticles3D
var clone_attractor: Node3D
# The SubViewport (and its container) for offscreen rendering.
var sub_viewport_container: SubViewportContainer
var sub_viewport: SubViewport
# Path to your special testing shader resource.
var test_shader_path := "res://scenes/world_grab_demo/particle_test.gdshader"
var test_shader: Shader
var test_shader_material: ShaderMaterial
func _ready():
# Get the real nodes from the exported paths.
real_particles = get_node(real_particles_path) as GPUParticles3D
real_attractor = get_node(real_attractor_path) as Node3D
target_collision_box = get_node(target_collision_box_path) as Node3D
debug_label = get_node(debug_label_path) as Label3D
# Create a SubViewportContainer and a SubViewport.
sub_viewport_container = SubViewportContainer.new()
add_child(sub_viewport_container)
sub_viewport = SubViewport.new()
sub_viewport_container.add_child(sub_viewport)
# Set the SubViewport resolution to a very low value (2x2 pixels).
sub_viewport.size = Vector2i(2, 2)
sub_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
sub_viewport.own_world_3d = true
#sub_viewport.render_target_v_flip = false
# Add a Camera3D to the SubViewport
var camera = Camera3D.new()
sub_viewport.add_child(camera)
# Clone the particle system and attractor. Using duplicate() with default flags
# (which duplicates recursively) so that the clones have similar structure.
clone_particles = real_particles.duplicate() as GPUParticles3D
clone_attractor = real_attractor.duplicate() as Node3D
# Add the clones to the SubViewport so they render in its world.
sub_viewport.add_child(clone_particles)
sub_viewport.add_child(clone_attractor)
# Load the testing shader and assign it to the clone particle system.
test_shader = load(test_shader_path)
test_shader_material = ShaderMaterial.new()
test_shader_material.shader = test_shader
# Create a copy of the draw_pass_1 mesh
var mesh_copy = clone_particles.draw_pass_1.duplicate()
clone_particles.draw_pass_1 = mesh_copy
# Apply the shader material to the copied mesh
clone_particles.draw_pass_1.surface_set_material(0, test_shader_material)
func _process(_delta):
# Synchronize the global transforms of the clones with the real objects.
clone_particles.global_transform = real_particles.global_transform
clone_attractor.global_transform = real_attractor.global_transform
# update the shader parameter for the target bounds.
test_shader_material.set_shader_parameter("bbox_min", target_collision_box.global_position)
test_shader_material.set_shader_parameter("bbox_max", target_collision_box.global_position + Vector3(1, 1, 1))
# Get the rendered image from the SubViewport.
var viewport_tex := sub_viewport.get_texture()
if viewport_tex:
var img: Image = viewport_tex.get_image()
if img:
# Check only the first pixel in the 2x2 render output.
var col: Color = img.get_pixel(0, 0)
# Our testing shader outputs red (1,0,0) for particles inside the box.
var hit := col.r > 0.9 and col.g < 0.1 and col.b < 0.1
# Update the debug label to show whether the target is hit.
debug_label.text = "Target Hit: " + ("Yes" if hit else "No")

View file

@ -22,67 +22,67 @@
[ext_resource type="Script" path="res://addons/godot-xr-tools/objects/pickable.gd" id="20_bgctf"] [ext_resource type="Script" path="res://addons/godot-xr-tools/objects/pickable.gd" id="20_bgctf"]
[ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="21_v207o"] [ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="21_v207o"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="22_0w02o"] [ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="22_0w02o"]
[ext_resource type="Script" path="res://scenes/world_grab_demo/proxy_collision_detector.gd" id="25_6xc52"] [ext_resource type="Script" path="res://scenes/proxy_collision_detector.gd" id="25_6xc52"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_kmq2v"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_m32k1"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_6j6d0"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_qw7jk"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_skfkg"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ivmsq"]
filter_enabled = true 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"] 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_4ygh1"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_l5dfb"]
animation = &"Grip 5" animation = &"Grip 5"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_45bm0"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_rnq60"]
filter_enabled = true 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"] 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_35hir"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_5klmq"]
graph_offset = Vector2(-536, 11) graph_offset = Vector2(-536, 11)
nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_kmq2v") nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_m32k1")
nodes/ClosedHand1/position = Vector2(-600, 300) nodes/ClosedHand1/position = Vector2(-600, 300)
nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_6j6d0") nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_qw7jk")
nodes/ClosedHand2/position = Vector2(-360, 300) nodes/ClosedHand2/position = Vector2(-360, 300)
nodes/Grip/node = SubResource("AnimationNodeBlend2_skfkg") nodes/Grip/node = SubResource("AnimationNodeBlend2_ivmsq")
nodes/Grip/position = Vector2(0, 20) nodes/Grip/position = Vector2(0, 20)
nodes/OpenHand/node = SubResource("AnimationNodeAnimation_4ygh1") nodes/OpenHand/node = SubResource("AnimationNodeAnimation_l5dfb")
nodes/OpenHand/position = Vector2(-600, 100) nodes/OpenHand/position = Vector2(-600, 100)
nodes/Trigger/node = SubResource("AnimationNodeBlend2_45bm0") nodes/Trigger/node = SubResource("AnimationNodeBlend2_rnq60")
nodes/Trigger/position = Vector2(-360, 20) nodes/Trigger/position = Vector2(-360, 20)
node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_1wlut"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_erxjr"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ramxn"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_mt3yx"]
animation = &"Grip" animation = &"Grip"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_rdbw8"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_8gcep"]
filter_enabled = true 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"] 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_n0t0f"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_cwne3"]
animation = &"Grip 5" animation = &"Grip 5"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_p6jdr"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_syf4j"]
filter_enabled = true 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"] 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_3isc8"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_h0vtx"]
graph_offset = Vector2(-552.664, 107.301) graph_offset = Vector2(-552.664, 107.301)
nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_1wlut") nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_erxjr")
nodes/ClosedHand1/position = Vector2(-600, 300) nodes/ClosedHand1/position = Vector2(-600, 300)
nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_ramxn") nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_mt3yx")
nodes/ClosedHand2/position = Vector2(-360, 300) nodes/ClosedHand2/position = Vector2(-360, 300)
nodes/Grip/node = SubResource("AnimationNodeBlend2_rdbw8") nodes/Grip/node = SubResource("AnimationNodeBlend2_8gcep")
nodes/Grip/position = Vector2(0, 40) nodes/Grip/position = Vector2(0, 40)
nodes/OpenHand/node = SubResource("AnimationNodeAnimation_n0t0f") nodes/OpenHand/node = SubResource("AnimationNodeAnimation_cwne3")
nodes/OpenHand/position = Vector2(-600, 100) nodes/OpenHand/position = Vector2(-600, 100)
nodes/Trigger/node = SubResource("AnimationNodeBlend2_p6jdr") nodes/Trigger/node = SubResource("AnimationNodeBlend2_syf4j")
nodes/Trigger/position = Vector2(-360, 40) nodes/Trigger/position = Vector2(-360, 40)
node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"]
@ -177,24 +177,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 3)
[node name="Skeleton3D" parent="XROrigin3D/LeftHand/LeftHand/Hand_Nails_low_L/Armature" index="0"] [node name="Skeleton3D" parent="XROrigin3D/LeftHand/LeftHand/Hand_Nails_low_L/Armature" index="0"]
bones/1/rotation = Quaternion(0.323537, -2.56588e-05, -0.0272204, 0.945824) bones/1/rotation = Quaternion(0.323537, -2.56588e-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.00794416, 0.994608) bones/6/rotation = Quaternion(0.102925, -0.00993208, -0.00794416, 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.000225721, -0.115393, 0.991351) 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="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/LeftHand/LeftHand/Hand_Nails_low_L/Armature/Skeleton3D" index="1"] [node name="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/LeftHand/LeftHand/Hand_Nails_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.840813, -0.0231736, -0.0826267, 0.0805243, 0.993322, 0.837064, -0.535303, 0.113023, 0.039902, 0.0402828, -0.150096)
@ -205,7 +189,7 @@ bone_idx = 9
[node name="AnimationTree" parent="XROrigin3D/LeftHand/LeftHand" index="1"] [node name="AnimationTree" parent="XROrigin3D/LeftHand/LeftHand" index="1"]
root_node = NodePath("../Hand_Nails_low_L") root_node = NodePath("../Hand_Nails_low_L")
tree_root = SubResource("AnimationNodeBlendTree_35hir") tree_root = SubResource("AnimationNodeBlendTree_5klmq")
[node name="FunctionPickup" parent="XROrigin3D/LeftHand" index="1" instance=ExtResource("3_gbd4b")] [node name="FunctionPickup" parent="XROrigin3D/LeftHand" index="1" instance=ExtResource("3_gbd4b")]
@ -216,24 +200,7 @@ visible = false
[node name="Skeleton3D" parent="XROrigin3D/RightHand/RightHand/Hand_Nails_low_R/Armature" index="0"] [node name="Skeleton3D" parent="XROrigin3D/RightHand/RightHand/Hand_Nails_low_R/Armature" index="0"]
bones/1/rotation = Quaternion(0.323537, 2.56588e-05, 0.0272204, 0.945824) bones/1/rotation = Quaternion(0.323537, 2.56588e-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.000225722, 0.115393, 0.991351) bones/21/rotation = Quaternion(-0.0625182, 0.000225722, 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/RightHand/RightHand/Hand_Nails_low_R/Armature/Skeleton3D" index="1"] [node name="BoneAttachment3D" type="BoneAttachment3D" parent="XROrigin3D/RightHand/RightHand/Hand_Nails_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.540829, -0.840813, 0.0231736, 0.0826268, 0.0805242, 0.993322, -0.837064, -0.535303, 0.113024, -0.039902, 0.0402828, -0.150096)
@ -244,7 +211,7 @@ bone_idx = 9
[node name="AnimationTree" parent="XROrigin3D/RightHand/RightHand" index="1"] [node name="AnimationTree" parent="XROrigin3D/RightHand/RightHand" index="1"]
root_node = NodePath("../Hand_Nails_low_R") root_node = NodePath("../Hand_Nails_low_R")
tree_root = SubResource("AnimationNodeBlendTree_3isc8") tree_root = SubResource("AnimationNodeBlendTree_h0vtx")
[node name="FunctionPickup" parent="XROrigin3D/RightHand" index="1" instance=ExtResource("3_gbd4b")] [node name="FunctionPickup" parent="XROrigin3D/RightHand" index="1" instance=ExtResource("3_gbd4b")]
@ -406,10 +373,6 @@ shape = SubResource("BoxShape3D_bld3o")
[node name="ProxyCollisionDetector" type="Node3D" parent="." index="8"] [node name="ProxyCollisionDetector" type="Node3D" parent="." index="8"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.5, 0.5) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.5, 0.5)
script = ExtResource("25_6xc52") script = ExtResource("25_6xc52")
real_particles_path = NodePath("../GPUParticles3D")
real_attractor_path = NodePath("../XRToolsPickable/GPUParticlesAttractorSphere3D")
target_collision_box_path = NodePath("../Target/CollisionShape3D")
debug_label_path = NodePath("../Label3D")
[node name="Label3D" type="Label3D" parent="." index="9"] [node name="Label3D" type="Label3D" parent="." index="9"]
transform = Transform3D(-3.15013, 0, 2.75393e-07, 0, 3.15013, 0, -2.75393e-07, 0, -3.15013, -0.167185, 1.34727, 3.65275) transform = Transform3D(-3.15013, 0, 2.75393e-07, 0, 3.15013, 0, -2.75393e-07, 0, -3.15013, -0.167185, 1.34727, 3.65275)

View file

@ -24,6 +24,7 @@ bounce_threshold = 1.0
[node name="XRCamera3D" type="XRCamera3D" parent="."] [node name="XRCamera3D" type="XRCamera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.72, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.72, 0)
cull_mask = 524287
[node name="LeftHand" type="XRController3D" parent="."] [node name="LeftHand" type="XRController3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 1, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 1, 0)