From 586f287525142a368e7927c7e3abbb04549d6236 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Sun, 19 Nov 2023 23:58:26 +0100 Subject: [PATCH] add trash bin and improve sound effects --- assets/design.afdesign | 4 +- assets/models/trash_bin/cross.png | 3 + assets/models/trash_bin/cross.png.import | 34 +++ assets/models/trash_bin/trash_bin.gltf | 3 + assets/models/trash_bin/trash_bin.gltf.import | 32 ++ assets/models/trash_bin/trash_bin.png | 3 + assets/models/trash_bin/trash_bin.png.import | 34 +++ .../models/trash_bin/trash_bin_trash_bin.png | 3 + .../trash_bin/trash_bin_trash_bin.png.import | 37 +++ assets/sound/close_menu.wav | 3 + assets/sound/close_menu.wav.import | 24 ++ assets/sound/open_menu.wav | 3 + assets/sound/open_menu.wav.import | 24 ++ assets/trash_bin.blend | 3 + content/controller_left.gd | 65 +++++ content/controller_left.tscn | 121 ++++++++ content/entities/light/light.tscn | 2 +- content/entities/sensor/sensor.tscn | 2 +- content/entities/switch/switch.tscn | 2 +- content/main.tscn | 16 +- content/raycast.gd | 10 +- content/ui/menu/edit/edit_menu.gd | 9 +- content/ui/menu/menu.gd | 52 +++- content/ui/menu/menu.tscn | 276 ++++++++++++++---- content/ui/menu/settings/settings_menu.gd | 14 +- content/ui/menu/settings/settings_menu.tscn | 27 +- lib/globals/audio_player.gd | 10 + lib/globals/events.gd | 13 + project.godot | 1 + 29 files changed, 723 insertions(+), 107 deletions(-) create mode 100644 assets/models/trash_bin/cross.png create mode 100644 assets/models/trash_bin/cross.png.import create mode 100644 assets/models/trash_bin/trash_bin.gltf create mode 100644 assets/models/trash_bin/trash_bin.gltf.import create mode 100644 assets/models/trash_bin/trash_bin.png create mode 100644 assets/models/trash_bin/trash_bin.png.import create mode 100644 assets/models/trash_bin/trash_bin_trash_bin.png create mode 100644 assets/models/trash_bin/trash_bin_trash_bin.png.import create mode 100644 assets/sound/close_menu.wav create mode 100644 assets/sound/close_menu.wav.import create mode 100644 assets/sound/open_menu.wav create mode 100644 assets/sound/open_menu.wav.import create mode 100644 assets/trash_bin.blend create mode 100644 content/controller_left.gd create mode 100644 content/controller_left.tscn create mode 100644 lib/globals/events.gd diff --git a/assets/design.afdesign b/assets/design.afdesign index 289aefd..bdbd7e4 100644 --- a/assets/design.afdesign +++ b/assets/design.afdesign @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8a8155035309697c511a28e0e7ca8912f19cb4ddb705be118ec5a0740336d29 -size 4088828 +oid sha256:d7d0bc9d14c5e8b172f5e3d5671f93ee7b67f62d82ec231f9f91792f30fc3bd9 +size 4015387 diff --git a/assets/models/trash_bin/cross.png b/assets/models/trash_bin/cross.png new file mode 100644 index 0000000..2b842d6 --- /dev/null +++ b/assets/models/trash_bin/cross.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7edf1d21866d37549789aa3baef58b5e956ece16c0327c26e92649f389cd9056 +size 991 diff --git a/assets/models/trash_bin/cross.png.import b/assets/models/trash_bin/cross.png.import new file mode 100644 index 0000000..f54729f --- /dev/null +++ b/assets/models/trash_bin/cross.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://s6fp7mqjrni0" +path="res://.godot/imported/cross.png-cdc4200b4741b1c53e6547059c1eeb4d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/models/trash_bin/cross.png" +dest_files=["res://.godot/imported/cross.png-cdc4200b4741b1c53e6547059c1eeb4d.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=false +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/assets/models/trash_bin/trash_bin.gltf b/assets/models/trash_bin/trash_bin.gltf new file mode 100644 index 0000000..032e1f7 --- /dev/null +++ b/assets/models/trash_bin/trash_bin.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:430fe8b8428bf05b8d72e62ecccd0f167aff255de034b007f259b87d6e975f94 +size 1299456 diff --git a/assets/models/trash_bin/trash_bin.gltf.import b/assets/models/trash_bin/trash_bin.gltf.import new file mode 100644 index 0000000..459159d --- /dev/null +++ b/assets/models/trash_bin/trash_bin.gltf.import @@ -0,0 +1,32 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cj42our8uhfq6" +path="res://.godot/imported/trash_bin.gltf-00f08fd370f3ef175290a8724bc98fbe.scn" + +[deps] + +source_file="res://assets/models/trash_bin/trash_bin.gltf" +dest_files=["res://.godot/imported/trash_bin.gltf-00f08fd370f3ef175290a8724bc98fbe.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={} +gltf/embedded_image_handling=1 diff --git a/assets/models/trash_bin/trash_bin.png b/assets/models/trash_bin/trash_bin.png new file mode 100644 index 0000000..a102408 --- /dev/null +++ b/assets/models/trash_bin/trash_bin.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82509704bbbe2c578f8fb7d974a3179e1ac27d1ef248d606788aa1fc7bfd496a +size 945321 diff --git a/assets/models/trash_bin/trash_bin.png.import b/assets/models/trash_bin/trash_bin.png.import new file mode 100644 index 0000000..21c8b9f --- /dev/null +++ b/assets/models/trash_bin/trash_bin.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://di7g13y7krle0" +path="res://.godot/imported/trash_bin.png-e418852ac63604cea63dd00ccf8fd222.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/models/trash_bin/trash_bin.png" +dest_files=["res://.godot/imported/trash_bin.png-e418852ac63604cea63dd00ccf8fd222.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=false +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/assets/models/trash_bin/trash_bin_trash_bin.png b/assets/models/trash_bin/trash_bin_trash_bin.png new file mode 100644 index 0000000..11d3d6d --- /dev/null +++ b/assets/models/trash_bin/trash_bin_trash_bin.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82b66bd89513d6bb26219be53c57b19a9ac67fef461a9ac4ee80b421a3e14e0f +size 844591 diff --git a/assets/models/trash_bin/trash_bin_trash_bin.png.import b/assets/models/trash_bin/trash_bin_trash_bin.png.import new file mode 100644 index 0000000..8c6a567 --- /dev/null +++ b/assets/models/trash_bin/trash_bin_trash_bin.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wrc2wki2dc2f" +path.s3tc="res://.godot/imported/trash_bin_trash_bin.png-25f979e82f0cb781d5118607430651f5.s3tc.ctex" +path.etc2="res://.godot/imported/trash_bin_trash_bin.png-25f979e82f0cb781d5118607430651f5.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://assets/models/trash_bin/trash_bin_trash_bin.png" +dest_files=["res://.godot/imported/trash_bin_trash_bin.png-25f979e82f0cb781d5118607430651f5.s3tc.ctex", "res://.godot/imported/trash_bin_trash_bin.png-25f979e82f0cb781d5118607430651f5.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/sound/close_menu.wav b/assets/sound/close_menu.wav new file mode 100644 index 0000000..114a81f --- /dev/null +++ b/assets/sound/close_menu.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33fe15d932e837c510f71d906a4a56ff7b5f6f329f4c67fa084dee883da9f475 +size 100396 diff --git a/assets/sound/close_menu.wav.import b/assets/sound/close_menu.wav.import new file mode 100644 index 0000000..6ddcb61 --- /dev/null +++ b/assets/sound/close_menu.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dfqnvsyxyifxa" +path="res://.godot/imported/close_menu.wav-c3ab6be18de30d0a6f79d056b38c22d1.sample" + +[deps] + +source_file="res://assets/sound/close_menu.wav" +dest_files=["res://.godot/imported/close_menu.wav-c3ab6be18de30d0a6f79d056b38c22d1.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/sound/open_menu.wav b/assets/sound/open_menu.wav new file mode 100644 index 0000000..d8eeccf --- /dev/null +++ b/assets/sound/open_menu.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b475413c4d2e2558b6d1e78d442e7c4bc97452e9c4f3d59b6bd48a87f4898a9e +size 100396 diff --git a/assets/sound/open_menu.wav.import b/assets/sound/open_menu.wav.import new file mode 100644 index 0000000..d092e99 --- /dev/null +++ b/assets/sound/open_menu.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c83d1f5u1ivma" +path="res://.godot/imported/open_menu.wav-1958af615b69d23f180305ab9fd30ba3.sample" + +[deps] + +source_file="res://assets/sound/open_menu.wav" +dest_files=["res://.godot/imported/open_menu.wav-1958af615b69d23f180305ab9fd30ba3.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/trash_bin.blend b/assets/trash_bin.blend new file mode 100644 index 0000000..80413c7 --- /dev/null +++ b/assets/trash_bin.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f48cf7795dee0577c5183968eb16d742dc06248965e8871c7e5d2126bf439f4f +size 957708 diff --git a/content/controller_left.gd b/content/controller_left.gd new file mode 100644 index 0000000..355bc3b --- /dev/null +++ b/content/controller_left.gd @@ -0,0 +1,65 @@ +extends XRController3D + +@onready var area = $trash_bin/Area3D +@onready var trash_bin = $trash_bin +@onready var animation = $AnimationPlayer + +var to_delete = [] +var trash_bin_visible: bool = true: + set(value): + if trash_bin_visible == value: + return + + if value: + add_child(trash_bin) + else: + if animation.is_playing(): + await animation.animation_finished + remove_child(trash_bin) + + trash_bin_visible = value + +var trash_bin_large: bool = false: + set(value): + if trash_bin_large == value: + return + + if value: + animation.play("add_trashbin") + else: + animation.play_backwards("add_trashbin") + + trash_bin_large = value + +func _ready(): + trash_bin_visible = false + + Events.on_grab_down.connect(func(event): + trash_bin_visible = event.target.is_in_group("entity") + ) + + Events.on_grab_move.connect(func(event): + if !trash_bin_visible: + return + + if event.target.is_in_group("entity") && area.overlaps_body(event.target): + if !to_delete.has(event.target): + to_delete.append(event.target) + trash_bin_large = true + + else: + to_delete.erase(event.target) + trash_bin_large = false + + ) + + Events.on_grab_up.connect(func(event): + if !trash_bin_visible: + return + + for entity in to_delete: + entity.queue_free() + to_delete.clear() + trash_bin_large = false + trash_bin_visible = false + ) diff --git a/content/controller_left.tscn b/content/controller_left.tscn new file mode 100644 index 0000000..de6a854 --- /dev/null +++ b/content/controller_left.tscn @@ -0,0 +1,121 @@ +[gd_scene load_steps=10 format=3 uid="uid://b30w6tywfj4fp"] + +[ext_resource type="Script" path="res://content/controller_left.gd" id="1_2j3qs"] +[ext_resource type="PackedScene" uid="uid://c3kdssrmv84kv" path="res://content/ui/menu/menu.tscn" id="1_ccbr3"] +[ext_resource type="PackedScene" uid="uid://cj42our8uhfq6" path="res://assets/models/trash_bin/trash_bin.gltf" id="3_m33ce"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_m58yb"] +ao_enabled = true + +[sub_resource type="BoxMesh" id="BoxMesh_ir3co"] +material = SubResource("StandardMaterial3D_m58yb") +size = Vector3(0.01, 0.01, 0.01) + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_x2eyr"] +height = 0.105954 +radius = 0.0447927 + +[sub_resource type="Animation" id="Animation_7owc4"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("trash_bin:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.03, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("trash_bin:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.03, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("trash_bin:scale:z") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.03, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_hax52"] +resource_name = "add_trashbin" +length = 0.3 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("trash_bin:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.03, -0.25, 0, 0.25, 0, 0.04, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.3) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("trash_bin:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.03, -0.25, 0, 0.25, 0, 0.04, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.3) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("trash_bin:scale:z") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0.03, -0.25, 0, 0.25, 0, 0.04, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.3) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_hkli8"] +_data = { +"RESET": SubResource("Animation_7owc4"), +"add_trashbin": SubResource("Animation_hax52") +} + +[node name="XRControllerLeft" type="XRController3D"] +tracker = &"left_hand" +pose = &"aim" +script = ExtResource("1_2j3qs") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_ir3co") + +[node name="Menu" parent="." instance=ExtResource("1_ccbr3")] +transform = Transform3D(1, -0.000382732, -0.000120985, 8.65898e-05, 0.5, -0.866025, 0.000391948, 0.866025, 0.5, 0.0669508, 0.0876772, -0.101157) + +[node name="trash_bin" parent="." instance=ExtResource("3_m33ce")] +transform = Transform3D(0.03, 0, 0, 0, 0.03, 0, 0, 0, 0.03, 0.106903, -0.228617, 0.132214) + +[node name="Area3D" type="Area3D" parent="trash_bin"] +transform = Transform3D(25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="trash_bin/Area3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0542412, 0) +shape = SubResource("CylinderShape3D_x2eyr") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_hkli8") +} diff --git a/content/entities/light/light.tscn b/content/entities/light/light.tscn index a444e4a..fc62b80 100644 --- a/content/entities/light/light.tscn +++ b/content/entities/light/light.tscn @@ -90,7 +90,7 @@ top_radius = 0.006 bottom_radius = 0.006 height = 0.004 -[node name="Light" type="StaticBody3D"] +[node name="Light" type="StaticBody3D" groups=["entity"]] script = ExtResource("1_ykxy3") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] diff --git a/content/entities/sensor/sensor.tscn b/content/entities/sensor/sensor.tscn index c7b6b96..19818c2 100644 --- a/content/entities/sensor/sensor.tscn +++ b/content/entities/sensor/sensor.tscn @@ -6,7 +6,7 @@ [sub_resource type="SphereShape3D" id="SphereShape3D_r20gc"] radius = 0.1 -[node name="Sensor" type="StaticBody3D"] +[node name="Sensor" type="StaticBody3D" groups=["entity"]] script = ExtResource("1_57ac8") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] diff --git a/content/entities/switch/switch.tscn b/content/entities/switch/switch.tscn index a6cedf4..b37a547 100644 --- a/content/entities/switch/switch.tscn +++ b/content/entities/switch/switch.tscn @@ -22,7 +22,7 @@ animations = [{ "speed": 5.0 }] -[node name="Switch" type="StaticBody3D"] +[node name="Switch" type="StaticBody3D" groups=["entity"]] script = ExtResource("1_8ffhi") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] diff --git a/content/main.tscn b/content/main.tscn index 68a9d1e..7609b70 100644 --- a/content/main.tscn +++ b/content/main.tscn @@ -3,7 +3,7 @@ [ext_resource type="PackedScene" uid="uid://clc5dre31iskm" path="res://addons/godot-xr-tools/xr/start_xr.tscn" id="1_i4c04"] [ext_resource type="Script" path="res://content/raycast.gd" id="1_tsqxc"] [ext_resource type="Script" path="res://content/main.gd" id="1_uvrd4"] -[ext_resource type="PackedScene" uid="uid://c3kdssrmv84kv" path="res://content/ui/menu/menu.tscn" id="3_1tbp3"] +[ext_resource type="PackedScene" uid="uid://b30w6tywfj4fp" path="res://content/controller_left.tscn" id="2_2lraw"] [ext_resource type="Texture2D" uid="uid://bo55nohs0wsgf" path="res://assets/materials/pointer.png" id="4_wcfej"] [ext_resource type="PackedScene" uid="uid://ctltchlf2j2r4" path="res://addons/xr-simulator/XRSimulator.tscn" id="5_3qc8g"] [ext_resource type="Material" uid="uid://bf5ina366dwm6" path="res://assets/materials/sky.material" id="5_wgwf8"] @@ -33,18 +33,10 @@ script = ExtResource("1_uvrd4") [node name="XROrigin3D" type="XROrigin3D" parent="."] [node name="XRCamera3D" type="XRCamera3D" parent="XROrigin3D"] -transform = Transform3D(1, 2.47971e-10, 3.49246e-10, 9.47986e-12, 1, 2.08834e-08, 0, 4.54747e-13, 1, -7.27596e-12, 0.798091, 0.311748) +transform = Transform3D(1, 2.18865e-10, 3.7835e-10, 3.85836e-11, 1, 2.08752e-08, -2.91038e-11, 8.6402e-12, 1, 0.0356344, 0.79808, 0.202806) -[node name="XRControllerLeft" type="XRController3D" parent="XROrigin3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.469893, 0.597213, -0.251112) -tracker = &"left_hand" -pose = &"aim" - -[node name="MeshInstance3D" type="MeshInstance3D" parent="XROrigin3D/XRControllerLeft"] -mesh = SubResource("BoxMesh_ir3co") - -[node name="Menu" parent="XROrigin3D/XRControllerLeft" instance=ExtResource("3_1tbp3")] -transform = Transform3D(1, -0.000382732, -0.000120985, 8.65898e-05, 0.5, -0.866025, 0.000391948, 0.866025, 0.5, 0.0669508, 0.0876772, -0.101157) +[node name="XRControllerLeft" parent="XROrigin3D" instance=ExtResource("2_2lraw")] +transform = Transform3D(0.999999, -1.39633e-11, 0, 9.48075e-12, 1, 0, 0, 0, 1, -0.355145, 0.550439, -0.477945) [node name="XRControllerRight" type="XRController3D" parent="XROrigin3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.488349, 0.559219, -0.2988) diff --git a/content/raycast.gd b/content/raycast.gd index 7cf25d2..530e703 100644 --- a/content/raycast.gd +++ b/content/raycast.gd @@ -72,14 +72,16 @@ func _on_button_released(button): _call_fn(_last_collided, "_on_click") _call_fn(_last_collided, "_on_press_up") _is_pressed = false + _last_collided = null _moved = false "grip_click": if _is_grabbed: _call_fn(_last_collided, "_on_grab_up") _is_grabbed = false + _last_collided = null _moved = false -func _call_fn(collider: Object, fn_name: String, node: Node3D = null, event = null): +func _call_fn(collider: Variant, fn_name: String, node: Node3D = null, event = null): if collider == null: return @@ -111,3 +113,9 @@ func _call_fn(collider: Object, fn_name: String, node: Node3D = null, event = nu if parent != null && parent is Node3D: _call_fn(collider, fn_name, parent, event) + else: + # in case the top has been reached + _call_global_fn(fn_name, event) + +func _call_global_fn(fn_name: String, event = null): + Events.get(fn_name.substr(1)).emit(event) diff --git a/content/ui/menu/edit/edit_menu.gd b/content/ui/menu/edit/edit_menu.gd index 89adbfe..164589e 100644 --- a/content/ui/menu/edit/edit_menu.gd +++ b/content/ui/menu/edit/edit_menu.gd @@ -65,8 +65,13 @@ func render(): update_pages() page_number_label.set_text(str(page + 1) + " / " + str(pages)) - previous_page_button.visible = page > 0 - next_page_button.visible = page < pages - 1 + var has_prev_page = page > 0 + var has_next_page = page < pages - 1 + + previous_page_button.visible = has_prev_page + previous_page_button.disabled = !has_prev_page + next_page_button.visible = has_next_page + next_page_button.disabled = !has_next_page clear_menu() if selected_device == null: diff --git a/content/ui/menu/menu.gd b/content/ui/menu/menu.gd index 87567b0..ffabd62 100644 --- a/content/ui/menu/menu.gd +++ b/content/ui/menu/menu.gd @@ -1,13 +1,20 @@ extends Node3D -@onready var nav_view = $Navigation/View -@onready var nav_edit: Button3D = $Navigation/Edit -@onready var menu_edit: Node3D = $Content/EditMenu -@onready var nav_room = $Navigation/Room -@onready var menu_room: Node3D = $Content/RoomMenu -@onready var nav_automate = $Navigation/Automate -@onready var nav_settings = $Navigation/Settings -@onready var menu_settings: Node3D = $Content/SettingsMenu +@onready var _controller := XRHelpers.get_xr_controller(self) + +@onready var nav_view = $AnimationContainer/Navigation/View +@onready var nav_edit: Button3D = $AnimationContainer/Navigation/Edit +@onready var menu_edit: Node3D = $AnimationContainer/Content/EditMenu +@onready var nav_room = $AnimationContainer/Navigation/Room +@onready var menu_room: Node3D = $AnimationContainer/Content/RoomMenu +@onready var nav_automate = $AnimationContainer/Navigation/Automate +@onready var nav_settings = $AnimationContainer/Navigation/Settings +@onready var menu_settings: Node3D = $AnimationContainer/Content/SettingsMenu + +@onready var menu_root = $AnimationContainer +@onready var content = $AnimationContainer/Content +@onready var nav = $AnimationContainer/Navigation +@onready var animation_player = $AnimationPlayer enum Menu { VIEW, @@ -18,8 +25,25 @@ enum Menu { } var selected_menu := Menu.EDIT +var show_menu := true: + get: + return show_menu + set(value): + show_menu = value + if value: + animation_player.play_backwards("hide_menu") + AudioPlayer.play_effect("open_menu") + else: + animation_player.play("hide_menu") + AudioPlayer.play_effect("close_menu") func _ready(): + _controller.button_pressed.connect(func(button): + print(button) + if button == "by_button": + show_menu = !show_menu + ) + select_menu(selected_menu) func _on_click(event): @@ -36,9 +60,8 @@ func _on_click(event): func select_menu(menu: Menu): selected_menu = menu - for child in $Content.get_children(): - if child.is_visible(): - $Content.remove_child(child) + for child in content.get_children(): + content.remove_child(child) var menu_node = enum_to_menu(menu) var nav_node = enum_to_nav(menu) @@ -47,9 +70,10 @@ func select_menu(menu: Menu): nav_node.disabled = true if menu_node != null: - $Content.add_child(menu_node) + menu_node.visible = true + content.add_child(menu_node) - for child in $Navigation.get_children(): + for child in nav.get_children(): if child.active && child != nav_node: child.active = false child.disabled = false @@ -78,4 +102,4 @@ func enum_to_menu(menu: Menu): Menu.AUTOMATE: return null Menu.SETTINGS: - return menu_settings \ No newline at end of file + return menu_settings diff --git a/content/ui/menu/menu.tscn b/content/ui/menu/menu.tscn index 02f3a56..e19416a 100644 --- a/content/ui/menu/menu.tscn +++ b/content/ui/menu/menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://c3kdssrmv84kv"] +[gd_scene load_steps=16 format=3 uid="uid://c3kdssrmv84kv"] [ext_resource type="Script" path="res://content/ui/menu/menu.gd" id="1_ng4u3"] [ext_resource type="PackedScene" uid="uid://crrb0l3ekuotj" path="res://content/ui/menu/edit/edit_menu.tscn" id="4_r2raj"] @@ -15,76 +15,224 @@ [sub_resource type="BoxMesh" id="BoxMesh_08du6"] size = Vector3(0.3, 0.01, 0.3) +[sub_resource type="Animation" id="Animation_lkh72"] +resource_name = "hide_menu" +length = 0.4 +step = 0.01 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("AnimationContainer:rotation:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.4) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimationContainer:rotation:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.4) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationContainer:rotation:z") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.18, -0.0484788, -1.5708, -0.24, 0.0818026, 0.25, 0), +"times": PackedFloat32Array(0, 0.4) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AnimationContainer:scale:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 0.01, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.4) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("AnimationContainer:scale:y") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 0.01, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.4) +} +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("AnimationContainer:scale:z") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 0.01, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.4) +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("AnimationContainer:visible") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0.39, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} + +[sub_resource type="Animation" id="Animation_61md4"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("AnimationContainer:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimationContainer:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimationContainer:scale:z") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AnimationContainer:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_s30cd"] +_data = { +"RESET": SubResource("Animation_61md4"), +"hide_menu": SubResource("Animation_lkh72") +} + [node name="Menu" type="Node3D"] script = ExtResource("1_ng4u3") -[node name="Background" type="MeshInstance3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0, 0.15) +[node name="AnimationContainer" type="Node3D" parent="."] + +[node name="Background" type="MeshInstance3D" parent="AnimationContainer"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.21, 0, 0.15) mesh = SubResource("BoxMesh_08du6") +skeleton = NodePath("../..") + +[node name="Navigation" type="Node3D" parent="AnimationContainer"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0, 0) + +[node name="View" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.03) +toggleable = true + +[node name="Sprite3D" type="Sprite3D" parent="AnimationContainer/Navigation/View"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) +pixel_size = 0.0002 +axis = 1 +texture = ExtResource("5_8o1rb") + +[node name="Edit" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.09) +toggleable = true +initial_active = true + +[node name="Sprite3D" type="Sprite3D" parent="AnimationContainer/Navigation/Edit"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) +pixel_size = 0.0002 +axis = 1 +texture = ExtResource("6_344ot") + +[node name="Room" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.15) +toggleable = true + +[node name="Sprite3D" type="Sprite3D" parent="AnimationContainer/Navigation/Room"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) +pixel_size = 0.0002 +axis = 1 +texture = ExtResource("7_wvovx") + +[node name="Automate" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.21) +toggleable = true + +[node name="Sprite3D" type="Sprite3D" parent="AnimationContainer/Navigation/Automate"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) +pixel_size = 0.0002 +axis = 1 +texture = ExtResource("8_3d082") + +[node name="Settings" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.27) +toggleable = true + +[node name="Sprite3D" type="Sprite3D" parent="AnimationContainer/Navigation/Settings"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) +pixel_size = 0.0002 +axis = 1 +texture = ExtResource("9_mel13") + +[node name="Content" type="Node3D" parent="AnimationContainer"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0, 0) + +[node name="EditMenu" parent="AnimationContainer/Content" instance=ExtResource("4_r2raj")] + +[node name="RoomMenu" parent="AnimationContainer/Content" instance=ExtResource("10_u4i1x")] +visible = false + +[node name="SettingsMenu" parent="AnimationContainer/Content" instance=ExtResource("11_7wm6b")] +visible = false [node name="ImmersiveHomePanels" type="MeshInstance3D" parent="."] transform = Transform3D(-4.37114e-10, 0, 0.01, 0, 0.01, 0, -0.01, 0, -4.37114e-10, 0.32, 0, -0.0500001) visible = false mesh = ExtResource("7_f4u4o") -[node name="Navigation" type="Node3D" parent="."] - -[node name="View" parent="Navigation" instance=ExtResource("5_w4i01")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.03) -toggleable = true - -[node name="Sprite3D" type="Sprite3D" parent="Navigation/View"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) -pixel_size = 0.0002 -axis = 1 -texture = ExtResource("5_8o1rb") - -[node name="Edit" parent="Navigation" instance=ExtResource("5_w4i01")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.09) -toggleable = true -initial_active = true - -[node name="Sprite3D" type="Sprite3D" parent="Navigation/Edit"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) -pixel_size = 0.0002 -axis = 1 -texture = ExtResource("6_344ot") - -[node name="Room" parent="Navigation" instance=ExtResource("5_w4i01")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.15) -toggleable = true - -[node name="Sprite3D" type="Sprite3D" parent="Navigation/Room"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) -pixel_size = 0.0002 -axis = 1 -texture = ExtResource("7_wvovx") - -[node name="Automate" parent="Navigation" instance=ExtResource("5_w4i01")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.21) -toggleable = true - -[node name="Sprite3D" type="Sprite3D" parent="Navigation/Automate"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) -pixel_size = 0.0002 -axis = 1 -texture = ExtResource("8_3d082") - -[node name="Settings" parent="Navigation" instance=ExtResource("5_w4i01")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.27) -toggleable = true - -[node name="Sprite3D" type="Sprite3D" parent="Navigation/Settings"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.012, 0) -pixel_size = 0.0002 -axis = 1 -texture = ExtResource("9_mel13") - -[node name="Content" type="Node3D" parent="."] - -[node name="EditMenu" parent="Content" instance=ExtResource("4_r2raj")] - -[node name="RoomMenu" parent="Content" instance=ExtResource("10_u4i1x")] - -[node name="SettingsMenu" parent="Content" instance=ExtResource("11_7wm6b")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.01, 0) +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_s30cd") +} diff --git a/content/ui/menu/settings/settings_menu.gd b/content/ui/menu/settings/settings_menu.gd index b53dd50..ff0fad1 100644 --- a/content/ui/menu/settings/settings_menu.gd +++ b/content/ui/menu/settings/settings_menu.gd @@ -2,8 +2,8 @@ extends Node3D const ball_scene = preload("res://content/ui/menu/settings/ball.tscn") -@onready var clickable = $Button/Clickable -@onready var balls = $Balls +@onready var clickable = $Content/Button/Clickable +@onready var connection_status = $Content/ConnectionStatus func _ready(): clickable.on_click.connect(func(event): @@ -12,4 +12,12 @@ func _ready(): ball.linear_velocity = -event.controller.transform.basis.z * 5 + Vector3(0, 5, 0) get_tree().root.add_child(ball) ) - \ No newline at end of file + + HomeAdapters.adapter.adapter.on_connect.connect(func(): + connection_status.text = "Connected" + ) + + HomeAdapters.adapter.adapter.on_disconnect.connect(func(): + connection_status.text = "Disconnected" + ) + diff --git a/content/ui/menu/settings/settings_menu.tscn b/content/ui/menu/settings/settings_menu.tscn index d892d10..07e790c 100644 --- a/content/ui/menu/settings/settings_menu.tscn +++ b/content/ui/menu/settings/settings_menu.tscn @@ -1,19 +1,34 @@ -[gd_scene load_steps=4 format=3 uid="uid://c6r4higceibif"] +[gd_scene load_steps=5 format=3 uid="uid://c6r4higceibif"] [ext_resource type="Script" path="res://content/ui/menu/settings/settings_menu.gd" id="1_0lte6"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_faxng"] [ext_resource type="Script" path="res://content/functions/clickable.gd" id="3_qmg6q"] +[sub_resource type="BoxMesh" id="BoxMesh_e51x8"] +size = Vector3(0.3, 0.01, 0.3) + [node name="SettingsMenu" type="Node3D"] script = ExtResource("1_0lte6") -[node name="Button" parent="." instance=ExtResource("1_faxng")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0458097, 0, 0.0435752) +[node name="Background" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0, 0.15) +mesh = SubResource("BoxMesh_e51x8") -[node name="Label3D" type="Label3D" parent="Button"] -transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.138567, 0, 0) +[node name="Content" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0102286, 0) + +[node name="Label3D" type="Label3D" parent="Content"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.184377, 0, 0.0435752) pixel_size = 0.001 text = "Spawn Ball" -[node name="Clickable" type="Node" parent="Button"] +[node name="Button" parent="Content" instance=ExtResource("1_faxng")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0458097, 0, 0.0435752) + +[node name="Clickable" type="Node" parent="Content/Button"] script = ExtResource("3_qmg6q") + +[node name="ConnectionStatus" type="Label3D" parent="Content"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.26, 0, 0.29) +pixel_size = 0.0003 +text = "Disconnected" diff --git a/lib/globals/audio_player.gd b/lib/globals/audio_player.gd index 83cb8a5..2920612 100644 --- a/lib/globals/audio_player.gd +++ b/lib/globals/audio_player.gd @@ -2,6 +2,8 @@ extends AudioStreamPlayer var click_sound = preload("res://assets/sound/click.wav") var spawn_sound = preload("res://assets/sound/spawn.wav") +var open_menu = preload("res://assets/sound/open_menu.wav") +var close_menu = preload("res://assets/sound/close_menu.wav") func _ready(): volume_db = -18 @@ -9,7 +11,15 @@ func _ready(): func play_effect(sound): if sound == "click": stream = click_sound + volume_db = -18 elif sound == "spawn": stream = spawn_sound + volume_db = -10 + elif sound == "open_menu": + stream = open_menu + volume_db = -6 + elif sound == "close_menu": + stream = close_menu + volume_db = -6 play() diff --git a/lib/globals/events.gd b/lib/globals/events.gd new file mode 100644 index 0000000..5abf48a --- /dev/null +++ b/lib/globals/events.gd @@ -0,0 +1,13 @@ +# Global event bus +extends Node + +# Interaction Events +signal on_click(event: Dictionary) +signal on_press_down(event: Dictionary) +signal on_press_move(event: Dictionary) +signal on_press_up(event: Dictionary) +signal on_grab_down(event: Dictionary) +signal on_grab_move(event: Dictionary) +signal on_grab_up(event: Dictionary) +signal on_ray_enter(event: Dictionary) +signal on_ray_leave(event: Dictionary) \ No newline at end of file diff --git a/project.godot b/project.godot index 26e7232..73ec25b 100644 --- a/project.godot +++ b/project.godot @@ -21,6 +21,7 @@ XRToolsUserSettings="*res://addons/godot-xr-tools/user_settings/user_settings.gd Request="*res://lib/globals/request.gd" HomeAdapters="*res://lib/globals/home_adapters.gd" AudioPlayer="*res://lib/globals/audio_player.gd" +Events="*res://lib/globals/events.gd" [editor_plugins]