diff --git a/assets/Arcane Source 2.glb b/assets/Arcane Source 2.glb new file mode 100644 index 0000000..3e90143 Binary files /dev/null and b/assets/Arcane Source 2.glb differ diff --git a/assets/Arcane Source 2.glb.import b/assets/Arcane Source 2.glb.import new file mode 100644 index 0000000..fad9ced --- /dev/null +++ b/assets/Arcane Source 2.glb.import @@ -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 diff --git a/assets/Arcane Source 2.glb.unwrap_cache b/assets/Arcane Source 2.glb.unwrap_cache new file mode 100644 index 0000000..3969337 Binary files /dev/null and b/assets/Arcane Source 2.glb.unwrap_cache differ diff --git a/assets/Arcane Source 2_CAUTION POSTER.png b/assets/Arcane Source 2_CAUTION POSTER.png new file mode 100644 index 0000000..a20019f Binary files /dev/null and b/assets/Arcane Source 2_CAUTION POSTER.png differ diff --git a/assets/Arcane Source 2_CAUTION POSTER.png.import b/assets/Arcane Source 2_CAUTION POSTER.png.import new file mode 100644 index 0000000..e84de4c --- /dev/null +++ b/assets/Arcane Source 2_CAUTION POSTER.png.import @@ -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 diff --git a/assets/Arcane Source 2_Crystal.png b/assets/Arcane Source 2_Crystal.png new file mode 100644 index 0000000..3a3b961 Binary files /dev/null and b/assets/Arcane Source 2_Crystal.png differ diff --git a/assets/Arcane Source 2_Crystal.png.import b/assets/Arcane Source 2_Crystal.png.import new file mode 100644 index 0000000..3a2c8c6 --- /dev/null +++ b/assets/Arcane Source 2_Crystal.png.import @@ -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 diff --git a/assets/Arcane Source 2_Image.png b/assets/Arcane Source 2_Image.png new file mode 100644 index 0000000..831e837 Binary files /dev/null and b/assets/Arcane Source 2_Image.png differ diff --git a/assets/Arcane Source 2_Image.png.import b/assets/Arcane Source 2_Image.png.import new file mode 100644 index 0000000..6e058be --- /dev/null +++ b/assets/Arcane Source 2_Image.png.import @@ -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 diff --git a/override.cfg b/override.cfg index 4cd32b3..0d1998e 100644 --- a/override.cfg +++ b/override.cfg @@ -1,3 +1,3 @@ [xr] -openxr/enabled=true +openxr/enabled=false diff --git a/project.godot b/project.godot index 9b440dc..577da29 100644 --- a/project.godot +++ b/project.godot @@ -58,6 +58,7 @@ trigger_left={ [layer_names] +3d_render/layer_20="particle_collision_proxy" 3d_physics/layer_1="Static World" 3d_physics/layer_2="Dynamic World" 3d_physics/layer_3="Pickable Objects" diff --git a/scenes/main_menu/main_menu_level.tscn b/scenes/main_menu/main_menu_level.tscn index 67c5504..9e6a8ce 100644 --- a/scenes/main_menu/main_menu_level.tscn +++ b/scenes/main_menu/main_menu_level.tscn @@ -42,65 +42,65 @@ [ext_resource type="Texture2D" uid="uid://cr1l4g7btdyht" path="res://scenes/origin_gravity_demo/origin_gravity_demo.png" id="32_c4n1q"] [ext_resource type="Texture2D" uid="uid://dhd30j0xpcxoi" path="res://scenes/sphere_world_demo/sphere_world_demo.png" id="34_xw8ig"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_uemdn"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_al5fx"] animation = &"Grip" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_cetcl"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_eutcj"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_7ad3m"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_p2ig7"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_L", "Armature/Skeleton3D:Little_Intermediate_L", "Armature/Skeleton3D:Little_Metacarpal_L", "Armature/Skeleton3D:Little_Proximal_L", "Armature/Skeleton3D:Middle_Distal_L", "Armature/Skeleton3D:Middle_Intermediate_L", "Armature/Skeleton3D:Middle_Metacarpal_L", "Armature/Skeleton3D:Middle_Proximal_L", "Armature/Skeleton3D:Ring_Distal_L", "Armature/Skeleton3D:Ring_Intermediate_L", "Armature/Skeleton3D:Ring_Metacarpal_L", "Armature/Skeleton3D:Ring_Proximal_L", "Armature/Skeleton3D:Thumb_Distal_L", "Armature/Skeleton3D:Thumb_Metacarpal_L", "Armature/Skeleton3D:Thumb_Proximal_L", "Armature/Skeleton:Little_Distal_L", "Armature/Skeleton:Little_Intermediate_L", "Armature/Skeleton:Little_Proximal_L", "Armature/Skeleton:Middle_Distal_L", "Armature/Skeleton:Middle_Intermediate_L", "Armature/Skeleton:Middle_Proximal_L", "Armature/Skeleton:Ring_Distal_L", "Armature/Skeleton:Ring_Intermediate_L", "Armature/Skeleton:Ring_Proximal_L", "Armature/Skeleton:Thumb_Distal_L", "Armature/Skeleton:Thumb_Proximal_L"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_nedco"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_bdkoa"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_dxfrv"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_aw2tq"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_L", "Armature/Skeleton3D:Index_Intermediate_L", "Armature/Skeleton3D:Index_Metacarpal_L", "Armature/Skeleton3D:Index_Proximal_L", "Armature/Skeleton:Index_Distal_L", "Armature/Skeleton:Index_Intermediate_L", "Armature/Skeleton:Index_Proximal_L"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_wvkh4"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_x3j1i"] graph_offset = Vector2(-536, 11) -nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_uemdn") +nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_al5fx") 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/Grip/node = SubResource("AnimationNodeBlend2_7ad3m") +nodes/Grip/node = SubResource("AnimationNodeBlend2_p2ig7") 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/Trigger/node = SubResource("AnimationNodeBlend2_dxfrv") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_aw2tq") nodes/Trigger/position = Vector2(-360, 20) node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_66tgm"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_yt7kt"] animation = &"Grip" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_2dxub"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_afuug"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_b2nhh"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_qraqy"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_R", "Armature/Skeleton3D:Little_Intermediate_R", "Armature/Skeleton3D:Little_Metacarpal_R", "Armature/Skeleton3D:Little_Proximal_R", "Armature/Skeleton3D:Middle_Distal_R", "Armature/Skeleton3D:Middle_Intermediate_R", "Armature/Skeleton3D:Middle_Metacarpal_R", "Armature/Skeleton3D:Middle_Proximal_R", "Armature/Skeleton3D:Ring_Distal_R", "Armature/Skeleton3D:Ring_Intermediate_R", "Armature/Skeleton3D:Ring_Metacarpal_R", "Armature/Skeleton3D:Ring_Proximal_R", "Armature/Skeleton3D:Thumb_Distal_R", "Armature/Skeleton3D:Thumb_Metacarpal_R", "Armature/Skeleton3D:Thumb_Proximal_R", "Armature/Skeleton:Little_Distal_R", "Armature/Skeleton:Little_Intermediate_R", "Armature/Skeleton:Little_Proximal_R", "Armature/Skeleton:Middle_Distal_R", "Armature/Skeleton:Middle_Intermediate_R", "Armature/Skeleton:Middle_Proximal_R", "Armature/Skeleton:Ring_Distal_R", "Armature/Skeleton:Ring_Intermediate_R", "Armature/Skeleton:Ring_Proximal_R", "Armature/Skeleton:Thumb_Distal_R", "Armature/Skeleton:Thumb_Proximal_R"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_xs4y0"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_30nip"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_7l3h6"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ybln8"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_R", "Armature/Skeleton3D:Index_Intermediate_R", "Armature/Skeleton3D:Index_Metacarpal_R", "Armature/Skeleton3D:Index_Proximal_R", "Armature/Skeleton:Index_Distal_R", "Armature/Skeleton:Index_Intermediate_R", "Armature/Skeleton:Index_Proximal_R"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_jr1q8"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_tgska"] 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/ClosedHand2/node = SubResource("AnimationNodeAnimation_2dxub") +nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_afuug") 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/OpenHand/node = SubResource("AnimationNodeAnimation_xs4y0") +nodes/OpenHand/node = SubResource("AnimationNodeAnimation_30nip") nodes/OpenHand/position = Vector2(-600, 100) -nodes/Trigger/node = SubResource("AnimationNodeBlend2_7l3h6") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_ybln8") nodes/Trigger/position = Vector2(-360, 40) 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) [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")] @@ -144,24 +144,7 @@ strafe = true [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/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/22/rotation = Quaternion(0.0585786, -0.0216483, 0.269905, 0.96086) -bones/23/rotation = Quaternion(0.00687177, 0.00357275, 0.211953, 0.977249) [node name="mesh_Hand_low_R" parent="XROrigin3D/RightHand/RightHand/Hand_low_R/Armature/Skeleton3D" index="0"] surface_material_override/0 = ExtResource("26_id1x7") @@ -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"] 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")] diff --git a/scenes/particle_test.gdshader b/scenes/particle_test.gdshader new file mode 100644 index 0000000..0d7f114 --- /dev/null +++ b/scenes/particle_test.gdshader @@ -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; +} diff --git a/scenes/pickable_demo/pickable_demo.tscn b/scenes/pickable_demo/pickable_demo.tscn index fce952d..d02ba01 100644 --- a/scenes/pickable_demo/pickable_demo.tscn +++ b/scenes/pickable_demo/pickable_demo.tscn @@ -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://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" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_q1ybi"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_oh7qd"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_sf634"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_6tydi"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_L", "Armature/Skeleton3D:Little_Intermediate_L", "Armature/Skeleton3D:Little_Metacarpal_L", "Armature/Skeleton3D:Little_Proximal_L", "Armature/Skeleton3D:Middle_Distal_L", "Armature/Skeleton3D:Middle_Intermediate_L", "Armature/Skeleton3D:Middle_Metacarpal_L", "Armature/Skeleton3D:Middle_Proximal_L", "Armature/Skeleton3D:Ring_Distal_L", "Armature/Skeleton3D:Ring_Intermediate_L", "Armature/Skeleton3D:Ring_Metacarpal_L", "Armature/Skeleton3D:Ring_Proximal_L", "Armature/Skeleton3D:Thumb_Distal_L", "Armature/Skeleton3D:Thumb_Metacarpal_L", "Armature/Skeleton3D:Thumb_Proximal_L", "Armature/Skeleton:Little_Distal_L", "Armature/Skeleton:Little_Intermediate_L", "Armature/Skeleton:Little_Proximal_L", "Armature/Skeleton:Middle_Distal_L", "Armature/Skeleton:Middle_Intermediate_L", "Armature/Skeleton:Middle_Proximal_L", "Armature/Skeleton:Ring_Distal_L", "Armature/Skeleton:Ring_Intermediate_L", "Armature/Skeleton:Ring_Proximal_L", "Armature/Skeleton:Thumb_Distal_L", "Armature/Skeleton:Thumb_Proximal_L"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_cw65d"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_wdn5b"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_y4myv"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_2h5nu"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_L", "Armature/Skeleton3D:Index_Intermediate_L", "Armature/Skeleton3D:Index_Metacarpal_L", "Armature/Skeleton3D:Index_Proximal_L", "Armature/Skeleton:Index_Distal_L", "Armature/Skeleton:Index_Intermediate_L", "Armature/Skeleton:Index_Proximal_L"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_ql04s"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_ptd85"] graph_offset = Vector2(-536, 11) -nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_ayae3") +nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_f236f") 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/Grip/node = SubResource("AnimationNodeBlend2_sf634") +nodes/Grip/node = SubResource("AnimationNodeBlend2_6tydi") 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/Trigger/node = SubResource("AnimationNodeBlend2_y4myv") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_2h5nu") nodes/Trigger/position = Vector2(-360, 20) node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_lwvn0"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_wo3xt"] animation = &"Grip" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_23a7s"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_lxjyi"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_la71d"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_4pghn"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_R", "Armature/Skeleton3D:Little_Intermediate_R", "Armature/Skeleton3D:Little_Metacarpal_R", "Armature/Skeleton3D:Little_Proximal_R", "Armature/Skeleton3D:Middle_Distal_R", "Armature/Skeleton3D:Middle_Intermediate_R", "Armature/Skeleton3D:Middle_Metacarpal_R", "Armature/Skeleton3D:Middle_Proximal_R", "Armature/Skeleton3D:Ring_Distal_R", "Armature/Skeleton3D:Ring_Intermediate_R", "Armature/Skeleton3D:Ring_Metacarpal_R", "Armature/Skeleton3D:Ring_Proximal_R", "Armature/Skeleton3D:Thumb_Distal_R", "Armature/Skeleton3D:Thumb_Metacarpal_R", "Armature/Skeleton3D:Thumb_Proximal_R", "Armature/Skeleton:Little_Distal_R", "Armature/Skeleton:Little_Intermediate_R", "Armature/Skeleton:Little_Proximal_R", "Armature/Skeleton:Middle_Distal_R", "Armature/Skeleton:Middle_Intermediate_R", "Armature/Skeleton:Middle_Proximal_R", "Armature/Skeleton:Ring_Distal_R", "Armature/Skeleton:Ring_Intermediate_R", "Armature/Skeleton:Ring_Proximal_R", "Armature/Skeleton:Thumb_Distal_R", "Armature/Skeleton:Thumb_Proximal_R"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_b3yxh"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_bfkh7"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_be0ca"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_k2f07"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_R", "Armature/Skeleton3D:Index_Intermediate_R", "Armature/Skeleton3D:Index_Metacarpal_R", "Armature/Skeleton3D:Index_Proximal_R", "Armature/Skeleton:Index_Distal_R", "Armature/Skeleton:Index_Intermediate_R", "Armature/Skeleton:Index_Proximal_R"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_0stb8"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_e87ne"] 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/ClosedHand2/node = SubResource("AnimationNodeAnimation_23a7s") +nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_lxjyi") 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/OpenHand/node = SubResource("AnimationNodeAnimation_b3yxh") +nodes/OpenHand/node = SubResource("AnimationNodeAnimation_bfkh7") nodes/OpenHand/position = Vector2(-600, 100) -nodes/Trigger/node = SubResource("AnimationNodeBlend2_be0ca") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_k2f07") nodes/Trigger/position = Vector2(-360, 40) 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"] 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")] strafe = true @@ -159,7 +159,7 @@ push_bodies = false [node name="AnimationTree" parent="XROrigin3D/RightHand/XRToolsCollisionHand/RightHand" index="1"] 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")] diff --git a/scenes/proxy_collision_detector.gd b/scenes/proxy_collision_detector.gd new file mode 100644 index 0000000..4ca54e7 --- /dev/null +++ b/scenes/proxy_collision_detector.gd @@ -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) diff --git a/scenes/proxy_collision_detector.tscn b/scenes/proxy_collision_detector.tscn new file mode 100644 index 0000000..1959b09 --- /dev/null +++ b/scenes/proxy_collision_detector.tscn @@ -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") diff --git a/scenes/target_highlight_test.gd b/scenes/target_highlight_test.gd new file mode 100644 index 0000000..d9f84ff --- /dev/null +++ b/scenes/target_highlight_test.gd @@ -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 diff --git a/scenes/title_scene.VoxelGI_data.res b/scenes/title_scene.VoxelGI_data.res index 534622b..4ad26c8 100644 Binary files a/scenes/title_scene.VoxelGI_data.res and b/scenes/title_scene.VoxelGI_data.res differ diff --git a/scenes/title_scene.tscn b/scenes/title_scene.tscn index 6a19397..1e3eafb 100644 --- a/scenes/title_scene.tscn +++ b/scenes/title_scene.tscn @@ -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="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="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="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"] @@ -47,7 +50,7 @@ size = Vector3(100, 100, 100) [sub_resource type="Gradient" id="Gradient_0ygfi"] 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") 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] point_count = 3 -[sub_resource type="CurveTexture" id="CurveTexture_bbn11"] +[sub_resource type="CurveTexture" id="CurveTexture_qnerq"] curve = SubResource("Curve_g0jsu") [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_y126y"] @@ -63,18 +66,17 @@ resource_local_to_scene = true emission_shape = 3 emission_box_extents = Vector3(0.1, 0.1, 0.1) spread = 0.0 -initial_velocity_min = 2.0 -initial_velocity_max = 2.0 +initial_velocity_min = 1.0 +initial_velocity_max = 1.0 gravity = Vector3(0, 0, 0) -damping_min = 0.03 -damping_max = 0.03 +damping_min = 0.05 +damping_max = 0.05 scale_max = 1.3 -scale_curve = SubResource("CurveTexture_bbn11") +scale_curve = SubResource("CurveTexture_qnerq") 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_max = 0.1 -turbulence_enabled = true turbulence_noise_scale = 6.228 turbulence_influence_min = 0.01 turbulence_influence_max = 0.01 @@ -82,11 +84,11 @@ collision_mode = 1 collision_friction = 0.06 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] point_count = 3 -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_22hrm"] +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lbp2k"] shading_mode = 2 vertex_color_use_as_albedo = true vertex_color_is_srgb = true @@ -97,12 +99,40 @@ disable_receive_shadows = true use_particle_trails = true [sub_resource type="TubeTrailMesh" id="TubeTrailMesh_xiw4w"] -material = SubResource("StandardMaterial3D_22hrm") +material = SubResource("StandardMaterial3D_lbp2k") radius = 0.002 radial_steps = 4 cap_top = 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"] 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) light_energy = 1.308 light_bake_mode = 1 +light_cull_mask = 4294443007 shadow_enabled = true omni_range = 14.8072 metadata/_edit_lock_ = true @@ -142,12 +173,11 @@ size = Vector3(31, 6.57, 31) data = ExtResource("5_ebg1r") [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 gi_mode = 2 amount = 1000 lifetime = 10.0 -preprocess = 5.0 randomness = 0.18 visibility_aabb = AABB(-100, -100, -100, 200, 200, 200) transform_align = 2 @@ -155,9 +185,56 @@ trail_enabled = true trail_lifetime = 0.5 process_material = SubResource("ParticleProcessMaterial_y126y") draw_pass_1 = SubResource("TubeTrailMesh_xiw4w") -metadata/_edit_lock_ = true [node name="GPUParticlesCollisionSDF3D" type="GPUParticlesCollisionSDF3D" parent="."] 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) 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"] diff --git a/scenes/world_grab_demo/particle_test.gdshader b/scenes/world_grab_demo/particle_test.gdshader deleted file mode 100644 index 4dfd75c..0000000 --- a/scenes/world_grab_demo/particle_test.gdshader +++ /dev/null @@ -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); -} diff --git a/scenes/world_grab_demo/proxy_collision_detector.gd b/scenes/world_grab_demo/proxy_collision_detector.gd deleted file mode 100644 index f1a954b..0000000 --- a/scenes/world_grab_demo/proxy_collision_detector.gd +++ /dev/null @@ -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") diff --git a/scenes/world_grab_demo/world_grab_demo.tscn b/scenes/world_grab_demo/world_grab_demo.tscn index 6f98c2d..259cd30 100644 --- a/scenes/world_grab_demo/world_grab_demo.tscn +++ b/scenes/world_grab_demo/world_grab_demo.tscn @@ -22,67 +22,67 @@ [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://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" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_6j6d0"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_qw7jk"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_skfkg"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ivmsq"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_L", "Armature/Skeleton3D:Little_Intermediate_L", "Armature/Skeleton3D:Little_Metacarpal_L", "Armature/Skeleton3D:Little_Proximal_L", "Armature/Skeleton3D:Middle_Distal_L", "Armature/Skeleton3D:Middle_Intermediate_L", "Armature/Skeleton3D:Middle_Metacarpal_L", "Armature/Skeleton3D:Middle_Proximal_L", "Armature/Skeleton3D:Ring_Distal_L", "Armature/Skeleton3D:Ring_Intermediate_L", "Armature/Skeleton3D:Ring_Metacarpal_L", "Armature/Skeleton3D:Ring_Proximal_L", "Armature/Skeleton3D:Thumb_Distal_L", "Armature/Skeleton3D:Thumb_Metacarpal_L", "Armature/Skeleton3D:Thumb_Proximal_L", "Armature/Skeleton:Little_Distal_L", "Armature/Skeleton:Little_Intermediate_L", "Armature/Skeleton:Little_Proximal_L", "Armature/Skeleton:Middle_Distal_L", "Armature/Skeleton:Middle_Intermediate_L", "Armature/Skeleton:Middle_Proximal_L", "Armature/Skeleton:Ring_Distal_L", "Armature/Skeleton:Ring_Intermediate_L", "Armature/Skeleton:Ring_Proximal_L", "Armature/Skeleton:Thumb_Distal_L", "Armature/Skeleton:Thumb_Proximal_L"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_4ygh1"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_l5dfb"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_45bm0"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_rnq60"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_L", "Armature/Skeleton3D:Index_Intermediate_L", "Armature/Skeleton3D:Index_Metacarpal_L", "Armature/Skeleton3D:Index_Proximal_L", "Armature/Skeleton:Index_Distal_L", "Armature/Skeleton:Index_Intermediate_L", "Armature/Skeleton:Index_Proximal_L"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_35hir"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_5klmq"] graph_offset = Vector2(-536, 11) -nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_kmq2v") +nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_m32k1") 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/Grip/node = SubResource("AnimationNodeBlend2_skfkg") +nodes/Grip/node = SubResource("AnimationNodeBlend2_ivmsq") 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/Trigger/node = SubResource("AnimationNodeBlend2_45bm0") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_rnq60") nodes/Trigger/position = Vector2(-360, 20) node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_1wlut"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_erxjr"] animation = &"Grip" -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ramxn"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_mt3yx"] animation = &"Grip" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_rdbw8"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_8gcep"] filter_enabled = true filters = ["Armature/Skeleton3D:Little_Distal_R", "Armature/Skeleton3D:Little_Intermediate_R", "Armature/Skeleton3D:Little_Metacarpal_R", "Armature/Skeleton3D:Little_Proximal_R", "Armature/Skeleton3D:Middle_Distal_R", "Armature/Skeleton3D:Middle_Intermediate_R", "Armature/Skeleton3D:Middle_Metacarpal_R", "Armature/Skeleton3D:Middle_Proximal_R", "Armature/Skeleton3D:Ring_Distal_R", "Armature/Skeleton3D:Ring_Intermediate_R", "Armature/Skeleton3D:Ring_Metacarpal_R", "Armature/Skeleton3D:Ring_Proximal_R", "Armature/Skeleton3D:Thumb_Distal_R", "Armature/Skeleton3D:Thumb_Metacarpal_R", "Armature/Skeleton3D:Thumb_Proximal_R", "Armature/Skeleton:Little_Distal_R", "Armature/Skeleton:Little_Intermediate_R", "Armature/Skeleton:Little_Proximal_R", "Armature/Skeleton:Middle_Distal_R", "Armature/Skeleton:Middle_Intermediate_R", "Armature/Skeleton:Middle_Proximal_R", "Armature/Skeleton:Ring_Distal_R", "Armature/Skeleton:Ring_Intermediate_R", "Armature/Skeleton:Ring_Proximal_R", "Armature/Skeleton:Thumb_Distal_R", "Armature/Skeleton:Thumb_Proximal_R"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_n0t0f"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_cwne3"] animation = &"Grip 5" -[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_p6jdr"] +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_syf4j"] filter_enabled = true filters = ["Armature/Skeleton3D:Index_Distal_R", "Armature/Skeleton3D:Index_Intermediate_R", "Armature/Skeleton3D:Index_Metacarpal_R", "Armature/Skeleton3D:Index_Proximal_R", "Armature/Skeleton:Index_Distal_R", "Armature/Skeleton:Index_Intermediate_R", "Armature/Skeleton:Index_Proximal_R"] -[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_3isc8"] +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_h0vtx"] 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/ClosedHand2/node = SubResource("AnimationNodeAnimation_ramxn") +nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_mt3yx") 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/OpenHand/node = SubResource("AnimationNodeAnimation_n0t0f") +nodes/OpenHand/node = SubResource("AnimationNodeAnimation_cwne3") nodes/OpenHand/position = Vector2(-600, 100) -nodes/Trigger/node = SubResource("AnimationNodeBlend2_p6jdr") +nodes/Trigger/node = SubResource("AnimationNodeBlend2_syf4j") nodes/Trigger/position = Vector2(-360, 40) 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"] 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/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/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"] 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"] 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")] @@ -216,24 +200,7 @@ visible = false [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/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/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"] 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"] 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")] @@ -406,10 +373,6 @@ shape = SubResource("BoxShape3D_bld3o") [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) 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"] transform = Transform3D(-3.15013, 0, 2.75393e-07, 0, 3.15013, 0, -2.75393e-07, 0, -3.15013, -0.167185, 1.34727, 3.65275) diff --git a/scenes/xr_origin_3d.tscn b/scenes/xr_origin_3d.tscn index 348c4bf..8276a83 100644 --- a/scenes/xr_origin_3d.tscn +++ b/scenes/xr_origin_3d.tscn @@ -24,6 +24,7 @@ bounce_threshold = 1.0 [node name="XRCamera3D" type="XRCamera3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.72, 0) +cull_mask = 524287 [node name="LeftHand" type="XRController3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 1, 0)