multiple collisions working, add gizmo asset
This commit is contained in:
parent
d981a41dee
commit
305dfcf3e3
23 changed files with 529 additions and 275 deletions
BIN
assets/Arcane Source 2.glb
Normal file
BIN
assets/Arcane Source 2.glb
Normal file
Binary file not shown.
36
assets/Arcane Source 2.glb.import
Normal file
36
assets/Arcane Source 2.glb.import
Normal 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
|
BIN
assets/Arcane Source 2.glb.unwrap_cache
Normal file
BIN
assets/Arcane Source 2.glb.unwrap_cache
Normal file
Binary file not shown.
BIN
assets/Arcane Source 2_CAUTION POSTER.png
Normal file
BIN
assets/Arcane Source 2_CAUTION POSTER.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 57 KiB |
39
assets/Arcane Source 2_CAUTION POSTER.png.import
Normal file
39
assets/Arcane Source 2_CAUTION POSTER.png.import
Normal 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
|
BIN
assets/Arcane Source 2_Crystal.png
Normal file
BIN
assets/Arcane Source 2_Crystal.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 MiB |
39
assets/Arcane Source 2_Crystal.png.import
Normal file
39
assets/Arcane Source 2_Crystal.png.import
Normal 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
|
BIN
assets/Arcane Source 2_Image.png
Normal file
BIN
assets/Arcane Source 2_Image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
37
assets/Arcane Source 2_Image.png.import
Normal file
37
assets/Arcane Source 2_Image.png.import
Normal 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
|
|
@ -1,3 +1,3 @@
|
||||||
[xr]
|
[xr]
|
||||||
|
|
||||||
openxr/enabled=true
|
openxr/enabled=false
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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")]
|
||||||
|
|
||||||
|
|
66
scenes/particle_test.gdshader
Normal file
66
scenes/particle_test.gdshader
Normal 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 particle’s 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 target’s 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;
|
||||||
|
}
|
|
@ -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")]
|
||||||
|
|
||||||
|
|
105
scenes/proxy_collision_detector.gd
Normal file
105
scenes/proxy_collision_detector.gd
Normal 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 (0–7) 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 system’s 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)
|
17
scenes/proxy_collision_detector.tscn
Normal file
17
scenes/proxy_collision_detector.tscn
Normal 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")
|
20
scenes/target_highlight_test.gd
Normal file
20
scenes/target_highlight_test.gd
Normal 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.
|
@ -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"]
|
||||||
|
|
|
@ -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 particle’s center in world space.
|
|
||||||
// (This assumes that your particle’s 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 particle’s 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 isn’t 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);
|
|
||||||
}
|
|
|
@ -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")
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue