From 5ffbc6d3f2a118d6277a6426117f14dc9cd00b77 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Thu, 9 May 2024 12:40:41 +0200 Subject: [PATCH] add sound effects, clean up code --- app/assets/sound/analog-appliance-button.mp3 | Bin 0 -> 9984 bytes .../sound/analog-appliance-button.mp3.import | 19 +++ app/assets/sound/camera-shutter.mp3 | Bin 0 -> 10867 bytes app/assets/sound/camera-shutter.mp3.import | 19 +++ app/assets/sound/crumple.mp3 | Bin 0 -> 18240 bytes app/assets/sound/crumple.mp3.import | 19 +++ app/assets/sound/finger-snap.mp3 | Bin 0 -> 16128 bytes app/assets/sound/finger-snap.mp3.import | 19 +++ app/assets/sound/message-incoming.mp3 | Bin 0 -> 50991 bytes app/assets/sound/message-incoming.mp3.import | 19 +++ app/content/entities/light/light.gd | 4 + app/content/entities/light/light.tscn | 7 +- app/content/entities/switch/switch.gd | 2 + app/content/entities/switch/switch.tscn | 7 +- app/content/entities/timer/timer.tscn | 8 +- app/content/main.gd | 31 +--- app/content/main.tscn | 22 ++- .../system/controller_left/controller_left.gd | 85 +--------- .../controller_left/controller_left.tscn | 108 +----------- .../controller_right/controller_right.gd | 8 +- .../controller_right/controller_right.tscn | 2 +- app/content/system/dot/dot.gd | 3 + app/content/system/dot/dot.tscn | 7 +- app/content/system/hands/hands.gd | 150 ----------------- app/content/system/hands/hands.tscn | 158 +++++++++++++++++- app/content/system/raycast/raycast.gd | 4 +- app/content/system/trash_bin/trash_bin.gd | 85 ++++++++++ app/content/system/trash_bin/trash_bin.tscn | 93 +++++++++++ app/content/ui/components/button/button.gd | 5 +- app/content/ui/components/button/button.tscn | 15 +- app/content/ui/components/input/input.gd | 2 + app/content/ui/components/input/input.tscn | 10 +- app/content/ui/menu/edit/edit_menu.gd | 3 +- app/content/ui/menu/edit/edit_menu.tscn | 7 +- app/content/ui/menu/menu.gd | 8 +- app/content/ui/menu/menu.tscn | 20 ++- app/lib/globals/audio_player.gd | 26 --- app/lib/utils/pointer/initiator.gd | 3 - app/lib/utils/pointer/pointer.gd | 8 +- app/lib/utils/screenshot.gd | 65 +++++++ app/project.godot | 1 - 41 files changed, 608 insertions(+), 444 deletions(-) create mode 100644 app/assets/sound/analog-appliance-button.mp3 create mode 100644 app/assets/sound/analog-appliance-button.mp3.import create mode 100644 app/assets/sound/camera-shutter.mp3 create mode 100644 app/assets/sound/camera-shutter.mp3.import create mode 100644 app/assets/sound/crumple.mp3 create mode 100644 app/assets/sound/crumple.mp3.import create mode 100644 app/assets/sound/finger-snap.mp3 create mode 100644 app/assets/sound/finger-snap.mp3.import create mode 100644 app/assets/sound/message-incoming.mp3 create mode 100644 app/assets/sound/message-incoming.mp3.import delete mode 100644 app/content/system/hands/hands.gd create mode 100644 app/content/system/trash_bin/trash_bin.gd create mode 100644 app/content/system/trash_bin/trash_bin.tscn delete mode 100644 app/lib/globals/audio_player.gd create mode 100644 app/lib/utils/screenshot.gd diff --git a/app/assets/sound/analog-appliance-button.mp3 b/app/assets/sound/analog-appliance-button.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bb82688e567f46744ae7292e44ad3b0569f9d335 GIT binary patch literal 9984 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 literal 0 HcmV?d00001 diff --git a/app/assets/sound/analog-appliance-button.mp3.import b/app/assets/sound/analog-appliance-button.mp3.import new file mode 100644 index 0000000..0fbd522 --- /dev/null +++ b/app/assets/sound/analog-appliance-button.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://cxhsv4h1q8pm7" +path="res://.godot/imported/analog-appliance-button.mp3-3400d402b6dbe616a93c6ce4dfd33aab.mp3str" + +[deps] + +source_file="res://assets/sound/analog-appliance-button.mp3" +dest_files=["res://.godot/imported/analog-appliance-button.mp3-3400d402b6dbe616a93c6ce4dfd33aab.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/app/assets/sound/camera-shutter.mp3 b/app/assets/sound/camera-shutter.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0cda4c069c80b995ff22cebe84eab8218b21417e GIT binary patch literal 10867 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

FsYz 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%0AhuvX}>nB+F3B{nZBEyK}wsFd-yPA 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 literal 0 HcmV?d00001 diff --git a/app/assets/sound/message-incoming.mp3.import b/app/assets/sound/message-incoming.mp3.import new file mode 100644 index 0000000..a82d9eb --- /dev/null +++ b/app/assets/sound/message-incoming.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://c0fj5p6544ab7" +path="res://.godot/imported/message-incoming.mp3-f3b0b0d850f78a95341ef72186559e01.mp3str" + +[deps] + +source_file="res://assets/sound/message-incoming.mp3" +dest_files=["res://.godot/imported/message-incoming.mp3-f3b0b0d850f78a95341ef72186559e01.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/app/content/entities/light/light.gd b/app/content/entities/light/light.gd index b0f876c..1a5b371 100644 --- a/app/content/entities/light/light.gd +++ b/app/content/entities/light/light.gd @@ -14,6 +14,7 @@ const color_wheel_img := preload ("res://assets/canvas.png") @onready var mode_next = $Modes/Next @onready var mode_before = $Modes/Previous @onready var mode_label = $Modes/Label +@onready var snap_sound = $SnapSound var active = R.state(false) var brightness = R.state(0) # 0-255 @@ -78,6 +79,8 @@ func _ready(): "rgb_color": [int(picked_color.r * 255), int(picked_color.g * 255), int(picked_color.b * 255)], } + snap_sound.play() + HomeApi.set_state(entity_id, "on", attributes) ) color_supported = true @@ -123,6 +126,7 @@ func set_state(stateInfo): func _on_click(event): if event.target == self: + snap_sound.play() _toggle() func quick_action(): diff --git a/app/content/entities/light/light.tscn b/app/content/entities/light/light.tscn index 1bcc455..6819ead 100644 --- a/app/content/entities/light/light.tscn +++ b/app/content/entities/light/light.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://cw86rc42dv2d8"] +[gd_scene load_steps=15 format=3 uid="uid://cw86rc42dv2d8"] [ext_resource type="Script" path="res://content/entities/light/light.gd" id="1_ykxy3"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="4_4sfxb"] @@ -6,6 +6,7 @@ [ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="6_mhjlm"] [ext_resource type="Texture2D" uid="uid://hy2f6is7qjyv" path="res://assets/canvas.png" id="7_ximu1"] [ext_resource type="Script" path="res://content/functions/clickable.gd" id="8_1sfll"] +[ext_resource type="AudioStream" uid="uid://du7ur0lu28cvn" path="res://assets/sound/finger-snap.mp3" id="8_3togy"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="8_nhcff"] [sub_resource type="SphereShape3D" id="SphereShape3D_ukj14"] @@ -105,3 +106,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.01, 0, 0) pixel_size = 0.001 text = "Default" horizontal_alignment = 0 + +[node name="SnapSound" type="AudioStreamPlayer" parent="."] +stream = ExtResource("8_3togy") +volume_db = -20.0 diff --git a/app/content/entities/switch/switch.gd b/app/content/entities/switch/switch.gd index 17ef18c..e304a9d 100644 --- a/app/content/entities/switch/switch.gd +++ b/app/content/entities/switch/switch.gd @@ -3,6 +3,7 @@ extends Entity const Entity = preload ("../entity.gd") @onready var sprite: AnimatedSprite3D = $Icon +@onready var snap_sound = $SnapSound var active = R.state(false) @@ -29,6 +30,7 @@ func set_state(stateInfo): icon.value = "toggle_" + stateInfo["state"] func _on_click(_event): + snap_sound.play() _toggle() func quick_action(): diff --git a/app/content/entities/switch/switch.tscn b/app/content/entities/switch/switch.tscn index 7c89bd6..c212cdc 100644 --- a/app/content/entities/switch/switch.tscn +++ b/app/content/entities/switch/switch.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=7 format=3 uid="uid://cscl5k7lhopj5"] +[gd_scene load_steps=8 format=3 uid="uid://cscl5k7lhopj5"] [ext_resource type="Script" path="res://content/entities/switch/switch.gd" id="1_8ffhi"] [ext_resource type="Texture2D" uid="uid://br3p0c2foputg" path="res://assets/materials/swich_on.png" id="1_w68gw"] [ext_resource type="Texture2D" uid="uid://co2ishj2hx57p" path="res://assets/materials/switch_off.png" id="2_86ba1"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="4_6xr03"] +[ext_resource type="AudioStream" uid="uid://du7ur0lu28cvn" path="res://assets/sound/finger-snap.mp3" id="5_qvw3h"] [sub_resource type="SphereShape3D" id="SphereShape3D_ukj14"] radius = 0.0482081 @@ -37,3 +38,7 @@ sprite_frames = SubResource("SpriteFrames_ldpuo") [node name="Movable" type="Node" parent="."] script = ExtResource("4_6xr03") resizable = true + +[node name="SnapSound" type="AudioStreamPlayer" parent="."] +stream = ExtResource("5_qvw3h") +volume_db = -20.0 diff --git a/app/content/entities/timer/timer.tscn b/app/content/entities/timer/timer.tscn index b7cf37d..521c4af 100644 --- a/app/content/entities/timer/timer.tscn +++ b/app/content/entities/timer/timer.tscn @@ -10,7 +10,7 @@ [sub_resource type="BoxShape3D" id="BoxShape3D_3qyo4"] size = Vector3(0.32, 0.16, 0.02) -[sub_resource type="ShaderMaterial" id="ShaderMaterial_nktla"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_mb0u1"] resource_local_to_scene = true render_priority = 10 shader = ExtResource("6_40cd1") @@ -25,7 +25,7 @@ shader_parameter/corner_radius = 0.8 shader_parameter/roughness = 0.3 shader_parameter/grain_amount = 0.02 -[sub_resource type="QuadMesh" id="QuadMesh_mqjqg"] +[sub_resource type="QuadMesh" id="QuadMesh_ysurb"] size = Vector2(0.32, 0.16) [node name="Timer" type="StaticBody3D" groups=["entity"]] @@ -78,7 +78,7 @@ label = "stop" icon = true [node name="Panel" parent="." instance=ExtResource("5_j3gsb")] -material_override = SubResource("ShaderMaterial_nktla") -mesh = SubResource("QuadMesh_mqjqg") +material_override = SubResource("ShaderMaterial_mb0u1") +mesh = SubResource("QuadMesh_ysurb") size = Vector2(0.32, 0.16) corner_radius = 0.8 diff --git a/app/content/main.gd b/app/content/main.gd index 54ff0b2..b22c126 100644 --- a/app/content/main.gd +++ b/app/content/main.gd @@ -48,9 +48,6 @@ func _ready(): toggle_menu() elif action.name == "by_button": House.body.mini_view.small.value=!House.body.mini_view.small.value - elif action.name == "ax_button": - if take_screenshot(): - EventSystem.notify("Screenshot taken", EventNotify.Type.INFO) ) EventSystem.on_focus_in.connect(func(event): @@ -124,9 +121,6 @@ func _input(event): if event is InputEventKey and Input.is_key_pressed(KEY_F10): var vp = get_viewport() vp.debug_draw = (vp.debug_draw + 1) % 5 - - if event is InputEventKey and Input.is_key_pressed(KEY_F2): - take_screenshot() if event is InputEventKey and Input.is_key_pressed(KEY_M): toggle_menu() @@ -149,27 +143,4 @@ func vector_key_mapping(key_positive_x: int, key_negative_x: int, key_positive_y if vec: vec = vec.normalized() - return vec - -func take_screenshot(): - var vp = get_viewport() - var texture = vp.get_texture() - var image = texture.get_image() - - var file_name = "%s.png" % Time.get_datetime_string_from_system().replace(":", "-") - - if image == null: - return false - - if OS.get_name() == "Android": - var path = OS.get_system_dir(OS.SYSTEM_DIR_PICTURES, false) + "/immersive-home/" + file_name - - if not FileAccess.file_exists(path): - var dir = path.get_base_dir() - DirAccess.open("user://").make_dir_recursive(dir) - - image.save_png(path) - else: - image.save_png("user://screenshots/%s.png" % Time.get_datetime_string_from_system().replace(":", "-")) - - return true \ No newline at end of file + return vec \ No newline at end of file diff --git a/app/content/main.tscn b/app/content/main.tscn index 1b8d27e..88ebabf 100644 --- a/app/content/main.tscn +++ b/app/content/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=3 uid="uid://eecv28y6jxk4"] +[gd_scene load_steps=13 format=3 uid="uid://eecv28y6jxk4"] [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/main.gd" id="1_uvrd4"] @@ -10,6 +10,7 @@ [ext_resource type="PackedScene" uid="uid://c3kdssrmv84kv" path="res://content/ui/menu/menu.tscn" id="8_du83w"] [ext_resource type="PackedScene" uid="uid://lrehk38exd5n" path="res://content/system/keyboard/keyboard.tscn" id="9_e5n3p"] [ext_resource type="PackedScene" uid="uid://cbemihbxkd4ll" path="res://content/system/house/house.tscn" id="9_np6mw"] +[ext_resource type="Script" path="res://lib/utils/screenshot.gd" id="12_e13ym"] [ext_resource type="PackedScene" uid="uid://bhyddd1f0ry1x" path="res://content/ui/onboarding/onboarding.tscn" id="12_uq2nj"] [node name="Main" type="Node3D"] @@ -33,17 +34,17 @@ enable_passthrough = true [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="IndexTip" parent="XROrigin3D/XRControllerLeft" index="6"] -transform = Transform3D(0.967526, 0.252326, -0.0150302, -0.0150302, 0.116784, 0.993043, 0.252326, -0.960569, 0.116784, -0.00665802, 0.0427913, -0.169868) +[node name="IndexTip" parent="XROrigin3D/XRControllerLeft" index="4"] +transform = Transform3D(0.967526, 0.252326, -0.0150302, -0.0150302, 0.116784, 0.993043, 0.252326, -0.960569, 0.116784, -0.00665808, 0.0427912, -0.169868) -[node name="ThumbTip" parent="XROrigin3D/XRControllerLeft" index="7"] -transform = Transform3D(0.967042, 0.24582, -0.0663439, -0.0663439, 0.494837, 0.866449, 0.24582, -0.833492, 0.494837, 0.0261569, 0.0891964, -0.0934418) +[node name="ThumbTip" parent="XROrigin3D/XRControllerLeft" index="5"] +transform = Transform3D(0.967043, 0.24582, -0.0663439, -0.0663439, 0.494837, 0.86645, 0.24582, -0.833492, 0.494837, 0.0261569, 0.0891963, -0.0934418) -[node name="MiddleTip" parent="XROrigin3D/XRControllerLeft" index="8"] -transform = Transform3D(0.98042, 0.196912, 0.00149799, 0.001498, -0.015065, 0.999885, 0.196912, -0.980305, -0.0150651, -0.00327212, -0.00771424, -0.176318) +[node name="MiddleTip" parent="XROrigin3D/XRControllerLeft" index="6"] +transform = Transform3D(0.98042, 0.196912, 0.00149799, 0.001498, -0.015065, 0.999885, 0.196912, -0.980305, -0.0150651, -0.00327212, -0.00771427, -0.176318) -[node name="Palm" parent="XROrigin3D/XRControllerLeft" index="9"] -transform = Transform3D(1, 3.12364e-06, -3.13861e-06, -3.12371e-06, 1, -1.97886e-05, 3.13854e-06, 1.97889e-05, 1, 0.0307807, -0.0419721, -0.0399505) +[node name="Palm" parent="XROrigin3D/XRControllerLeft" index="7"] +transform = Transform3D(1, 3.12361e-06, -3.13859e-06, -3.12371e-06, 1, -1.97886e-05, 3.13859e-06, 1.97889e-05, 1, 0.0307807, -0.0419722, -0.0399505) [node name="XRControllerRight" parent="XROrigin3D" instance=ExtResource("7_0b3tc")] transform = Transform3D(0.999999, -1.39635e-11, 0, 1.31553e-10, 1, 0, 0, 0, 1, 0.336726, 0.575093, -0.437942) @@ -65,5 +66,8 @@ transform = Transform3D(0.5, 5.24309e-05, 0.000144384, -0.000139169, 0.353553, 0 [node name="Onboarding" parent="." instance=ExtResource("12_uq2nj")] transform = Transform3D(1, -1.39636e-11, 0, 4.42413e-11, 1, 0, 0, 0, 1, -0.576793, 0.820168, -0.60016) +[node name="Node" type="Node" parent="."] +script = ExtResource("12_e13ym") + [editable path="XROrigin3D/XRControllerLeft"] [editable path="XROrigin3D/XRControllerLeft/hand_l"] diff --git a/app/content/system/controller_left/controller_left.gd b/app/content/system/controller_left/controller_left.gd index f7aea0b..25428b0 100644 --- a/app/content/system/controller_left/controller_left.gd +++ b/app/content/system/controller_left/controller_left.gd @@ -1,6 +1,5 @@ extends XRController3D -const Entity = preload ("res://content/entities/entity.gd") const Pointer = preload ("res://lib/utils/pointer/pointer.gd") const Initiator = preload ("res://lib/utils/pointer/initiator.gd") const Finger = preload ("res://lib/utils/touch/finger.gd") @@ -23,9 +22,6 @@ const Miniature = preload ("res://content/system/house/mini/miniature.gd") @onready var palm = $Palm @onready var ray: RayCast3D = $Raycast -@onready var area = $trash_bin/Area3D -@onready var trash_bin = $trash_bin -@onready var animation = $AnimationPlayer @onready var quick_actions = $Palm/QuickActions var hand_active = false @@ -38,72 +34,10 @@ var grip_distance = 0.02 var pressed = false var grabbed = false -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 _setup_hand() - EventSystem.on_grab_down.connect(func(event: EventPointer): - trash_bin_visible=_get_entity(event.target) != null - ) - - EventSystem.on_grab_move.connect(func(event): - if !trash_bin_visible: - return - - var entity=_get_entity(event.target) - - if entity is Entity&&area.overlaps_body(entity): - if !to_delete.has(entity): - to_delete.append(entity) - trash_bin_large=true - - else: - to_delete.erase(entity) - trash_bin_large=false - - ) - - EventSystem.on_grab_up.connect(func(_event: EventPointer): - if !trash_bin_visible: - return - - for entity in to_delete: - entity.queue_free() - to_delete.clear() - trash_bin_large=false - trash_bin_visible=false - - House.body.save_all_entities() - ) - func _process(_delta): if !hand_active: if quick_actions.is_inside_tree(): palm.remove_child(quick_actions) @@ -124,28 +58,19 @@ func _physics_process(_delta): var grab_close = distance_grab <= grip_distance if trigger_close&&!pressed: - initiator.on_press.emit(Initiator.EventType.TRIGGER) + pointer.pressed(Initiator.EventType.TRIGGER) pressed = true elif !trigger_close&&pressed: - initiator.on_release.emit(Initiator.EventType.TRIGGER) + pointer.released(Initiator.EventType.TRIGGER) pressed = false if grab_close&&!grabbed: - initiator.on_press.emit(Initiator.EventType.GRIP) + pointer.pressed(Initiator.EventType.GRIP) grabbed = true elif !grab_close&&grabbed: - initiator.on_release.emit(Initiator.EventType.GRIP) + pointer.released(Initiator.EventType.GRIP) grabbed = false -func _get_entity(node: Node): - if node is Entity: - return node - - if node.get_parent() == null: - return null - - return _get_entity(node.get_parent()) - func _setup_hand(): TouchManager.add_finger(Finger.Type.INDEX_LEFT, $IndexTip/TouchArea) @@ -183,4 +108,4 @@ func _setup_hand(): initiator.node = self pointer = Pointer.new(initiator, ray) - add_child(pointer) \ No newline at end of file + add_child(pointer) diff --git a/app/content/system/controller_left/controller_left.tscn b/app/content/system/controller_left/controller_left.tscn index 2074e32..f6b167b 100644 --- a/app/content/system/controller_left/controller_left.tscn +++ b/app/content/system/controller_left/controller_left.tscn @@ -1,12 +1,12 @@ -[gd_scene load_steps=16 format=3 uid="uid://b30w6tywfj4fp"] +[gd_scene load_steps=12 format=3 uid="uid://b30w6tywfj4fp"] [ext_resource type="Script" path="res://content/system/controller_left/controller_left.gd" id="1_2j3qs"] -[ext_resource type="PackedScene" uid="uid://dqjcqdhe3rbtn" path="res://assets/models/trash_bin/trash_bin.gltf" id="3_m33ce"] [ext_resource type="PackedScene" uid="uid://dscp8x0ari57n" path="res://content/system/raycast/raycast.tscn" id="4_n7lao"] [ext_resource type="PackedScene" uid="uid://bufelcry36rw1" path="res://addons/xr-autohandtracker/auto_handtracker.tscn" id="4_oe7fv"] [ext_resource type="PackedScene" uid="uid://dhaqth6q5yw4n" path="res://addons/godot-xr-tools/hands/model/hand_l.gltf" id="5_w1pvs"] [ext_resource type="Shader" path="res://assets/materials/hands.gdshader" id="6_wk733"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="6_x5vuc"] +[ext_resource type="PackedScene" uid="uid://cfsnkoxb7mtok" path="res://content/system/trash_bin/trash_bin.tscn" id="7_vigb6"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_m58yb"] ao_enabled = true @@ -15,89 +15,6 @@ ao_enabled = true 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") -} - [sub_resource type="ShaderMaterial" id="ShaderMaterial_ca85m"] render_priority = 0 shader = ExtResource("6_wk733") @@ -117,22 +34,6 @@ script = ExtResource("1_2j3qs") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] mesh = SubResource("BoxMesh_ir3co") -[node name="trash_bin" parent="." instance=ExtResource("3_m33ce")] -transform = Transform3D(0.03, 0, 0, 0, 0.03, 0, 0, 0, 0.03, 0.0864577, -0.119983, 0.0462675) - -[node name="Area3D" type="Area3D" parent="trash_bin"] -transform = Transform3D(25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0) -collision_layer = 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") -} - [node name="Raycast" parent="." instance=ExtResource("4_n7lao")] is_right = false @@ -163,7 +64,7 @@ collision_mask = 4 monitorable = false [node name="CollisionShape3D" type="CollisionShape3D" parent="IndexTip/TouchArea"] -transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0) +transform = Transform3D(1, 0, 0, 1.49012e-08, 1, 0, 1.86265e-09, -7.45058e-09, 1, 0, -0.01, 0) shape = SubResource("CapsuleShape3D_65k2y") [node name="ThumbTip" type="BoneAttachment3D" parent="."] @@ -210,4 +111,7 @@ transform = Transform3D(1, 1.73472e-18, 0, 0, 1, 0, 0, 0, 1, 0.0600001, -5.68873 label = "humidity_mid" icon = true +[node name="TrashBin" parent="." instance=ExtResource("7_vigb6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.109418, -0.126353, 0.0278937) + [editable path="hand_l"] diff --git a/app/content/system/controller_right/controller_right.gd b/app/content/system/controller_right/controller_right.gd index f63b690..36cff06 100644 --- a/app/content/system/controller_right/controller_right.gd +++ b/app/content/system/controller_right/controller_right.gd @@ -58,15 +58,15 @@ func _physics_process(_delta): var grab_close = distance_grab <= grip_distance if trigger_close&&!pressed: - initiator.on_press.emit(Initiator.EventType.TRIGGER) + pointer.pressed(Initiator.EventType.TRIGGER) pressed = true elif !trigger_close&&pressed: - initiator.on_release.emit(Initiator.EventType.TRIGGER) + pointer.released(Initiator.EventType.TRIGGER) pressed = false if grab_close&&!grabbed: - initiator.on_press.emit(Initiator.EventType.GRIP) + pointer.pressed(Initiator.EventType.GRIP) grabbed = true elif !grab_close&&grabbed: - initiator.on_release.emit(Initiator.EventType.GRIP) + pointer.released(Initiator.EventType.GRIP) grabbed = false \ No newline at end of file diff --git a/app/content/system/controller_right/controller_right.tscn b/app/content/system/controller_right/controller_right.tscn index 0c3d427..e618885 100644 --- a/app/content/system/controller_right/controller_right.tscn +++ b/app/content/system/controller_right/controller_right.tscn @@ -54,7 +54,7 @@ collision_mask = 4 monitorable = false [node name="CollisionShape3D" type="CollisionShape3D" parent="IndexTip/TouchArea"] -transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0) +transform = Transform3D(1, 0, 0, -1.49012e-08, 1, 0, 0, -7.45058e-09, 1, 0, -0.01, 0) shape = SubResource("CapsuleShape3D_66uu0") [node name="ThumbTip" type="BoneAttachment3D" parent="."] diff --git a/app/content/system/dot/dot.gd b/app/content/system/dot/dot.gd index 548fd14..a111a75 100644 --- a/app/content/system/dot/dot.gd +++ b/app/content/system/dot/dot.gd @@ -7,6 +7,7 @@ const TOUCH_LONG = 400.0 @export var entity: Entity @onready var collision = $CollisionShape3D +@onready var snap_sound = $SnapSound @onready var label = $Label3D var active = R.state(false) var disabled = R.state(true) @@ -36,6 +37,7 @@ func _ready(): func _on_click(_event: EventPointer): if entity.has_method("quick_action")&&miniature.entity_select.selection_active() == false: entity.quick_action() + snap_sound.play() else: miniature.entity_select.toggle(entity) @@ -62,6 +64,7 @@ func _on_touch_leave(_event: EventTouch): if touch_ran: return if entity.has_method("quick_action")&&miniature.entity_select.selection_active() == false: + snap_sound.play() entity.quick_action() else: miniature.entity_select.toggle(entity) \ No newline at end of file diff --git a/app/content/system/dot/dot.tscn b/app/content/system/dot/dot.tscn index 58ceac5..147f700 100644 --- a/app/content/system/dot/dot.tscn +++ b/app/content/system/dot/dot.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=5 format=3 uid="uid://b5buw1sas18n4"] +[gd_scene load_steps=6 format=3 uid="uid://b5buw1sas18n4"] [ext_resource type="Script" path="res://content/system/dot/dot.gd" id="1_vdpux"] +[ext_resource type="AudioStream" uid="uid://du7ur0lu28cvn" path="res://assets/sound/finger-snap.mp3" id="3_04fcm"] [ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="4_504vw"] [sub_resource type="SphereShape3D" id="SphereShape3D_3wgjq"] @@ -34,3 +35,7 @@ monitoring = false [node name="CollisionShape3D2" type="CollisionShape3D" parent="Area3D"] shape = SubResource("SphereShape3D_y1ne8") + +[node name="SnapSound" type="AudioStreamPlayer" parent="."] +stream = ExtResource("3_04fcm") +volume_db = -20.0 diff --git a/app/content/system/hands/hands.gd b/app/content/system/hands/hands.gd deleted file mode 100644 index c9a0218..0000000 --- a/app/content/system/hands/hands.gd +++ /dev/null @@ -1,150 +0,0 @@ -extends Node3D - -const Pointer = preload ("res://lib/utils/pointer/pointer.gd") -const Initiator = preload ("res://lib/utils/pointer/initiator.gd") -const Finger = preload ("res://lib/utils/touch/finger.gd") -const Touch = preload ("res://lib/utils/touch/touch.gd") -const Collide = preload ("res://lib/utils/touch/collide.gd") -const Miniature = preload ("res://content/system/house/mini/miniature.gd") - -@onready var main = $"/root/Main" -@onready var palm = $XRHandLeft/Palm -@onready var quick_actions = $XRHandLeft/Palm/QuickActions -@onready var mini_view_button = $XRHandLeft/Palm/QuickActions/MiniView -@onready var temperature_button = $XRHandLeft/Palm/QuickActions/Temperature -@onready var humidity_button = $XRHandLeft/Palm/QuickActions/Humidity -@export var ray_left: RayCast3D -@export var ray_right: RayCast3D -@export var hand_left: Node3D -@export var hand_right: Node3D - -@onready var bone_attachments_right = [$XRHandRight/IndexTip, $XRHandRight/ThumbTip, $XRHandRight/MiddleTip] -@onready var bone_attachments_left = [$XRHandLeft/IndexTip, $XRHandLeft/ThumbTip, $XRHandLeft/MiddleTip] - -enum Fingers {INDEX, THUMB, MIDDLE} - -var left_initiator: Initiator = Initiator.new() -var right_initiator: Initiator = Initiator.new() -var touch: Touch -var collide: Collide -var left_pointer: Pointer -var right_pointer: Pointer -var press_distance = 0.03 -var grip_distance = 0.03 - -var pressed_left = false -var pressed_right = false -var grabbed_left = false -var grabbed_right = false - -func _ready(): - var fingers = { - Finger.Type.INDEX_RIGHT: $XRHandRight/IndexTip/TouchArea, - Finger.Type.INDEX_LEFT: $XRHandLeft/IndexTip/TouchArea, - Finger.Type.MIDDLE_RIGHT: $XRHandRight/MiddleTip/TouchArea, - Finger.Type.MIDDLE_LEFT: $XRHandLeft/MiddleTip/TouchArea - } - - touch = Touch.new(fingers) - collide = Collide.new(hand_left, hand_right, $XRHandLeft/IndexTip/TouchArea, $XRHandRight/IndexTip/TouchArea) - add_child(touch) - add_child(collide) - - _ready_hand() - - mini_view_button.on_button_up.connect(func(): - House.body.mini_view.small.value=!House.body.mini_view.small.value - ) - - temperature_button.on_button_up.connect(func(): - if House.body.mini_view.heatmap_type.value == Miniature.HeatmapType.TEMPERATURE: - House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.NONE - else: - House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.TEMPERATURE - ) - - humidity_button.on_button_up.connect(func(): - if House.body.mini_view.heatmap_type.value == Miniature.HeatmapType.HUMIDITY: - House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.NONE - else: - House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.HUMIDITY - ) - -func _ready_hand(): - left_initiator.type = Initiator.Type.HAND_LEFT - left_initiator.node = ray_left.get_parent() - - left_pointer = Pointer.new(left_initiator, ray_left) - add_child(left_pointer) - - right_initiator.type = Initiator.Type.HAND_RIGHT - right_initiator.node = ray_right.get_parent() - - right_pointer = Pointer.new(right_initiator, ray_right) - add_child(right_pointer) - -func _process(_delta): - if main.camera.global_transform.basis.z.dot(palm.global_transform.basis.y) > 0.85: - if quick_actions.is_inside_tree() == false: palm.add_child(quick_actions) - else: - if quick_actions.is_inside_tree(): palm.remove_child(quick_actions) - -func _physics_process(_delta): - _process_hand_left(hand_left) - _process_hand_right(hand_right) - -func _process_hand_left(hand: Node3D): - var index_tip = bone_attachments_left[Fingers.INDEX].get_node("Marker3D") - var thumb_tip = bone_attachments_left[Fingers.THUMB].get_node("Marker3D") - var middle_tip = bone_attachments_left[Fingers.MIDDLE].get_node("Marker3D") - - var _ray = ray_left if hand == hand_left else ray_right - var initiator = left_initiator if hand == hand_left else right_initiator - - var distance_trigger = index_tip.global_position.distance_to(thumb_tip.global_position) - var distance_grab = middle_tip.global_position.distance_to(thumb_tip.global_position) - - var trigger_close = distance_trigger <= press_distance - var grab_close = distance_grab <= grip_distance - - if trigger_close&&!pressed_left: - initiator.on_press.emit(Initiator.EventType.TRIGGER) - pressed_left = true - elif !trigger_close&&pressed_left: - initiator.on_release.emit(Initiator.EventType.TRIGGER) - pressed_left = false - - if grab_close&&!grabbed_left: - initiator.on_press.emit(Initiator.EventType.GRIP) - grabbed_left = true - elif !grab_close&&grabbed_left: - initiator.on_release.emit(Initiator.EventType.GRIP) - grabbed_left = false - -func _process_hand_right(hand: Node3D): - var index_tip = bone_attachments_right[Fingers.INDEX].get_node("Marker3D") - var thumb_tip = bone_attachments_right[Fingers.THUMB].get_node("Marker3D") - var middle_tip = bone_attachments_right[Fingers.MIDDLE].get_node("Marker3D") - - var _ray = ray_left if hand == hand_left else ray_right - var initiator = left_initiator if hand == hand_left else right_initiator - - var distance_trigger = index_tip.global_position.distance_to(thumb_tip.global_position) - var distance_grab = middle_tip.global_position.distance_to(thumb_tip.global_position) - - var trigger_close = distance_trigger <= press_distance - var grab_close = distance_grab <= grip_distance - - if trigger_close&&!pressed_right: - initiator.on_press.emit(Initiator.EventType.TRIGGER) - pressed_right = true - elif !trigger_close&&pressed_right: - initiator.on_release.emit(Initiator.EventType.TRIGGER) - pressed_right = false - - if grab_close&&!grabbed_right: - initiator.on_press.emit(Initiator.EventType.GRIP) - grabbed_right = true - elif !grab_close&&grabbed_right: - initiator.on_release.emit(Initiator.EventType.GRIP) - grabbed_right = false \ No newline at end of file diff --git a/app/content/system/hands/hands.tscn b/app/content/system/hands/hands.tscn index ce0eb3f..285129a 100644 --- a/app/content/system/hands/hands.tscn +++ b/app/content/system/hands/hands.tscn @@ -1,14 +1,166 @@ -[gd_scene load_steps=4 format=3 uid="uid://bsx12q23v8apy"] +[gd_scene load_steps=4 format=3 uid="uid://byj36o0boo1v2"] -[ext_resource type="Script" path="res://content/system/hands/hands.gd" id="1_c4f76"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="3_te2p8"] +[sub_resource type="GDScript" id="GDScript_4kea7"] +script/source = "extends Node3D + +const Pointer = preload (\"res://lib/utils/pointer/pointer.gd\") +const Initiator = preload (\"res://lib/utils/pointer/initiator.gd\") +const Finger = preload (\"res://lib/utils/touch/finger.gd\") +const Touch = preload (\"res://lib/utils/touch/touch.gd\") +const Collide = preload (\"res://lib/utils/touch/collide.gd\") +const Miniature = preload (\"res://content/system/house/mini/miniature.gd\") + +@onready var main = $\"/root/Main\" +@onready var palm = $XRHandLeft/Palm +@onready var quick_actions = $XRHandLeft/Palm/QuickActions +@onready var mini_view_button = $XRHandLeft/Palm/QuickActions/MiniView +@onready var temperature_button = $XRHandLeft/Palm/QuickActions/Temperature +@onready var humidity_button = $XRHandLeft/Palm/QuickActions/Humidity +@export var ray_left: RayCast3D +@export var ray_right: RayCast3D +@export var hand_left: Node3D +@export var hand_right: Node3D + +@onready var bone_attachments_right = [$XRHandRight/IndexTip, $XRHandRight/ThumbTip, $XRHandRight/MiddleTip] +@onready var bone_attachments_left = [$XRHandLeft/IndexTip, $XRHandLeft/ThumbTip, $XRHandLeft/MiddleTip] + +enum Fingers {INDEX, THUMB, MIDDLE} + +var left_initiator: Initiator = Initiator.new() +var right_initiator: Initiator = Initiator.new() +var touch: Touch +var collide: Collide +var left_pointer: Pointer +var right_pointer: Pointer +var press_distance = 0.03 +var grip_distance = 0.03 + +var pressed_left = false +var pressed_right = false +var grabbed_left = false +var grabbed_right = false + +func _ready(): + var fingers = { + Finger.Type.INDEX_RIGHT: $XRHandRight/IndexTip/TouchArea, + Finger.Type.INDEX_LEFT: $XRHandLeft/IndexTip/TouchArea, + Finger.Type.MIDDLE_RIGHT: $XRHandRight/MiddleTip/TouchArea, + Finger.Type.MIDDLE_LEFT: $XRHandLeft/MiddleTip/TouchArea + } + + touch = Touch.new(fingers) + collide = Collide.new(hand_left, hand_right, $XRHandLeft/IndexTip/TouchArea, $XRHandRight/IndexTip/TouchArea) + add_child(touch) + add_child(collide) + + _ready_hand() + + mini_view_button.on_button_up.connect(func(): + House.body.mini_view.small.value=!House.body.mini_view.small.value + ) + + temperature_button.on_button_up.connect(func(): + if House.body.mini_view.heatmap_type.value == Miniature.HeatmapType.TEMPERATURE: + House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.NONE + else: + House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.TEMPERATURE + ) + + humidity_button.on_button_up.connect(func(): + if House.body.mini_view.heatmap_type.value == Miniature.HeatmapType.HUMIDITY: + House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.NONE + else: + House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.HUMIDITY + ) + +func _ready_hand(): + left_initiator.type = Initiator.Type.HAND_LEFT + left_initiator.node = ray_left.get_parent() + + left_pointer = Pointer.new(left_initiator, ray_left) + add_child(left_pointer) + + right_initiator.type = Initiator.Type.HAND_RIGHT + right_initiator.node = ray_right.get_parent() + + right_pointer = Pointer.new(right_initiator, ray_right) + add_child(right_pointer) + +func _process(_delta): + if main.camera.global_transform.basis.z.dot(palm.global_transform.basis.y) > 0.85: + if quick_actions.is_inside_tree() == false: palm.add_child(quick_actions) + else: + if quick_actions.is_inside_tree(): palm.remove_child(quick_actions) + +func _physics_process(_delta): + _process_hand_left(hand_left) + _process_hand_right(hand_right) + +func _process_hand_left(hand: Node3D): + var index_tip = bone_attachments_left[Fingers.INDEX].get_node(\"Marker3D\") + var thumb_tip = bone_attachments_left[Fingers.THUMB].get_node(\"Marker3D\") + var middle_tip = bone_attachments_left[Fingers.MIDDLE].get_node(\"Marker3D\") + + var _ray = ray_left if hand == hand_left else ray_right + var initiator = left_initiator if hand == hand_left else right_initiator + + var distance_trigger = index_tip.global_position.distance_to(thumb_tip.global_position) + var distance_grab = middle_tip.global_position.distance_to(thumb_tip.global_position) + + var trigger_close = distance_trigger <= press_distance + var grab_close = distance_grab <= grip_distance + + if trigger_close&&!pressed_left: + initiator.on_press.emit(Initiator.EventType.TRIGGER) + pressed_left = true + elif !trigger_close&&pressed_left: + initiator.on_release.emit(Initiator.EventType.TRIGGER) + pressed_left = false + + if grab_close&&!grabbed_left: + initiator.on_press.emit(Initiator.EventType.GRIP) + grabbed_left = true + elif !grab_close&&grabbed_left: + initiator.on_release.emit(Initiator.EventType.GRIP) + grabbed_left = false + +func _process_hand_right(hand: Node3D): + var index_tip = bone_attachments_right[Fingers.INDEX].get_node(\"Marker3D\") + var thumb_tip = bone_attachments_right[Fingers.THUMB].get_node(\"Marker3D\") + var middle_tip = bone_attachments_right[Fingers.MIDDLE].get_node(\"Marker3D\") + + var _ray = ray_left if hand == hand_left else ray_right + var initiator = left_initiator if hand == hand_left else right_initiator + + var distance_trigger = index_tip.global_position.distance_to(thumb_tip.global_position) + var distance_grab = middle_tip.global_position.distance_to(thumb_tip.global_position) + + var trigger_close = distance_trigger <= press_distance + var grab_close = distance_grab <= grip_distance + + if trigger_close&&!pressed_right: + initiator.on_press.emit(Initiator.EventType.TRIGGER) + pressed_right = true + elif !trigger_close&&pressed_right: + initiator.on_release.emit(Initiator.EventType.TRIGGER) + pressed_right = false + + if grab_close&&!grabbed_right: + initiator.on_press.emit(Initiator.EventType.GRIP) + grabbed_right = true + elif !grab_close&&grabbed_right: + initiator.on_release.emit(Initiator.EventType.GRIP) + grabbed_right = false +" + [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_dopke"] radius = 0.001 height = 0.02 [node name="Hands" type="Node3D"] -script = ExtResource("1_c4f76") +script = SubResource("GDScript_4kea7") [node name="XRHandLeft" type="Node3D" parent="."] transform = Transform3D(0.999999, -1.39628e-11, 0, 9.48119e-12, 0.999999, -4.54747e-13, 0, 0, 0.999999, -0.25, 0, 0) diff --git a/app/content/system/raycast/raycast.gd b/app/content/system/raycast/raycast.gd index 4f9b2f2..b2de215 100644 --- a/app/content/system/raycast/raycast.gd +++ b/app/content/system/raycast/raycast.gd @@ -28,11 +28,11 @@ func _ready(): get_parent().button_pressed.connect(func(button: String): if _event_type_map.has(button): - initiator.on_press.emit(_event_type_map[button]) + pointer.pressed(_event_type_map[button]) ) get_parent().button_released.connect(func(button: String): if _event_type_map.has(button): - initiator.on_release.emit(_event_type_map[button]) + pointer.released(_event_type_map[button]) ) func _physics_process(_delta): diff --git a/app/content/system/trash_bin/trash_bin.gd b/app/content/system/trash_bin/trash_bin.gd new file mode 100644 index 0000000..ee9c618 --- /dev/null +++ b/app/content/system/trash_bin/trash_bin.gd @@ -0,0 +1,85 @@ +extends Node3D + +const Entity = preload ("res://content/entities/entity.gd") + +@onready var trash_bin = $trash_bin +@onready var bin_area = $trash_bin/Area3D + +@onready var delete_sound = $DeleteSound +@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 + + EventSystem.on_grab_down.connect(func(event: EventPointer): + trash_bin_visible=_get_entity(event.target) != null + ) + + EventSystem.on_grab_move.connect(func(event): + if !trash_bin_visible: + return + + var entity=_get_entity(event.target) + + if entity is Entity&&bin_area.overlaps_body(entity): + if !to_delete.has(entity): + to_delete.append(entity) + trash_bin_large=true + + else: + to_delete.erase(entity) + trash_bin_large=false + + ) + + EventSystem.on_grab_up.connect(func(_event: EventPointer): + if !trash_bin_visible: + return + + if to_delete.size() > 0: + delete_sound.play() + + for entity in to_delete: + entity.queue_free() + to_delete.clear() + trash_bin_large=false + trash_bin_visible=false + + House.body.save_all_entities() + ) + +func _get_entity(node: Node): + if node is Entity: + return node + + if node.get_parent() == null: + return null + + return _get_entity(node.get_parent()) \ No newline at end of file diff --git a/app/content/system/trash_bin/trash_bin.tscn b/app/content/system/trash_bin/trash_bin.tscn new file mode 100644 index 0000000..f74d7e0 --- /dev/null +++ b/app/content/system/trash_bin/trash_bin.tscn @@ -0,0 +1,93 @@ +[gd_scene load_steps=8 format=3 uid="uid://cfsnkoxb7mtok"] + +[ext_resource type="PackedScene" uid="uid://dqjcqdhe3rbtn" path="res://assets/models/trash_bin/trash_bin.gltf" id="1_g2oxl"] +[ext_resource type="Script" path="res://content/system/trash_bin/trash_bin.gd" id="1_krk5w"] +[ext_resource type="AudioStream" uid="uid://bm2uxwqfmnvs6" path="res://assets/sound/crumple.mp3" id="3_p7u0v"] + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_fmaps"] +height = 0.105954 +radius = 0.0447927 + +[sub_resource type="Animation" id="Animation_wg64y"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("trash_bin:scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0.03, 0.03, 0.03)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("trash_bin:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, -0.02, 0)] +} + +[sub_resource type="Animation" id="Animation_cxelh"] +resource_name = "add_trashbin" +length = 0.4 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("trash_bin:scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0.03, 0.03, 0.03), Vector3(0.04, 0.04, 0.04)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("trash_bin:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 0, 0), Vector3(0, -0.02, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_hrejr"] +_data = { +"RESET": SubResource("Animation_wg64y"), +"add_trashbin": SubResource("Animation_cxelh") +} + +[node name="TrashBin" type="Node3D"] +script = ExtResource("1_krk5w") + +[node name="trash_bin" parent="." instance=ExtResource("1_g2oxl")] +transform = Transform3D(0.03, 0, 0, 0, 0.03, 0, 0, 0, 0.03, 0, -0.02, 0) + +[node name="Area3D" type="Area3D" parent="trash_bin"] +transform = Transform3D(25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0) +collision_layer = 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_fmaps") + +[node name="DeleteSound" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("3_p7u0v") +volume_db = -10.0 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_hrejr") +} diff --git a/app/content/ui/components/button/button.gd b/app/content/ui/components/button/button.gd index 8e2f592..845c6fe 100644 --- a/app/content/ui/components/button/button.gd +++ b/app/content/ui/components/button/button.gd @@ -19,6 +19,7 @@ const ECHO_WAIT_REPEAT = 0.1 @onready var finger_area_collision: CollisionShape3D = $FingerArea/CollisionShape3D @onready var touch_collision: CollisionShape3D = $TouchBody/CollisionShape3D @onready var touch: StaticBody3D = $TouchBody +@onready var click_sound = $ClickSound @export var focusable: bool = true: set(value): @@ -115,7 +116,7 @@ func _on_press_down(event): event.bubbling = false return - AudioPlayer.play_effect("click") + click_sound.play() if toggleable: return @@ -163,7 +164,7 @@ func _on_touch_enter(event: EventTouch): event.bubbling = false return - AudioPlayer.play_effect("click") + click_sound.play() if toggleable: active = !active diff --git a/app/content/ui/components/button/button.tscn b/app/content/ui/components/button/button.tscn index f18baf5..f23899c 100644 --- a/app/content/ui/components/button/button.tscn +++ b/app/content/ui/components/button/button.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=8 format=3 uid="uid://bsjqdvkt0u87c"] +[gd_scene load_steps=9 format=3 uid="uid://bsjqdvkt0u87c"] [ext_resource type="Script" path="res://content/ui/components/button/button.gd" id="1_74x7g"] [ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="2_db5by"] [ext_resource type="Script" path="res://content/ui/components/panel/panel.gd" id="3_skm86"] +[ext_resource type="AudioStream" uid="uid://c1yu80uj3fsn7" path="res://assets/sound/click.wav" id="4_51sb0"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_n8om1"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_826v7"] resource_local_to_scene = true render_priority = 10 shader = ExtResource("2_db5by") @@ -19,7 +20,7 @@ shader_parameter/corner_radius = 0.2 shader_parameter/roughness = 0.3 shader_parameter/grain_amount = 0.02 -[sub_resource type="QuadMesh" id="QuadMesh_dxm1i"] +[sub_resource type="QuadMesh" id="QuadMesh_02501"] size = Vector2(0.04, 0.04) [sub_resource type="BoxShape3D" id="BoxShape3D_xwopm"] @@ -42,8 +43,8 @@ collision_mask = 0 [node name="Panel3D" type="MeshInstance3D" parent="Body"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.005) -material_override = SubResource("ShaderMaterial_n8om1") -mesh = SubResource("QuadMesh_dxm1i") +material_override = SubResource("ShaderMaterial_826v7") +mesh = SubResource("QuadMesh_02501") skeleton = NodePath("../..") script = ExtResource("3_skm86") size = Vector2(0.04, 0.04) @@ -78,3 +79,7 @@ collision_mask = 0 [node name="CollisionShape3D" type="CollisionShape3D" parent="TouchBody"] shape = SubResource("BoxShape3D_xwopm") + +[node name="ClickSound" type="AudioStreamPlayer" parent="."] +stream = ExtResource("4_51sb0") +volume_db = -18.0 diff --git a/app/content/ui/components/input/input.gd b/app/content/ui/components/input/input.gd index e358066..27f0d3c 100644 --- a/app/content/ui/components/input/input.gd +++ b/app/content/ui/components/input/input.gd @@ -13,6 +13,7 @@ signal on_text_changed(text: String) @onready var animation: AnimationPlayer = $AnimationPlayer @onready var label: Label3D = $Body/Label @onready var placeholder_label: Label3D = $Body/Placeholder +@onready var snap_sound = $SnapSound @export var placeholder: String = "": set(value): @@ -135,6 +136,7 @@ func _on_focus_in(_event): caret.visible = true panel.active = true animation.play("blink") + snap_sound.play() _update_placeholder() func update_caret_position(event): diff --git a/app/content/ui/components/input/input.tscn b/app/content/ui/components/input/input.tscn index 8ecf22b..62ced2a 100644 --- a/app/content/ui/components/input/input.tscn +++ b/app/content/ui/components/input/input.tscn @@ -5,7 +5,7 @@ [ext_resource type="FontVariation" uid="uid://d2ofyimg5s65q" path="res://assets/fonts/ui_font_500.tres" id="3_ij5fh"] [ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="3_nl02b"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_a00dk"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_w3y4s"] resource_local_to_scene = true render_priority = 10 shader = ExtResource("3_nl02b") @@ -20,7 +20,7 @@ shader_parameter/corner_radius = 0.2 shader_parameter/roughness = 0.3 shader_parameter/grain_amount = 0.02 -[sub_resource type="QuadMesh" id="QuadMesh_har6y"] +[sub_resource type="QuadMesh" id="QuadMesh_rsne0"] size = Vector2(0.15, 0.03) [sub_resource type="BoxShape3D" id="BoxShape3D_x4yp8"] @@ -83,8 +83,8 @@ collision_mask = 6 [node name="Panel3D" type="MeshInstance3D" parent="Body"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.005) -material_override = SubResource("ShaderMaterial_a00dk") -mesh = SubResource("QuadMesh_har6y") +material_override = SubResource("ShaderMaterial_w3y4s") +mesh = SubResource("QuadMesh_rsne0") script = ExtResource("3_3bvrj") size = Vector2(0.15, 0.03) @@ -128,3 +128,5 @@ root_node = NodePath("../Body") libraries = { "": SubResource("AnimationLibrary_1sy4t") } + +[node name="SnapSound" type="AudioStreamPlayer" parent="."] diff --git a/app/content/ui/menu/edit/edit_menu.gd b/app/content/ui/menu/edit/edit_menu.gd index a4db3d2..b541c94 100644 --- a/app/content/ui/menu/edit/edit_menu.gd +++ b/app/content/ui/menu/edit/edit_menu.gd @@ -4,6 +4,7 @@ const ButtonScene = preload ("res://content/ui/components/button/button.tscn") @onready var devices_page = $Devices @onready var entities_page = $Entities +@onready var spawn_sound = $SpawnSound var selected_device = R.state(null) @@ -17,7 +18,7 @@ func _ready(): ) entities_page.on_select_entity.connect(func(entity_name): - AudioPlayer.play_effect("spawn") + spawn_sound.play() var entity=House.body.create_entity(entity_name, global_position) diff --git a/app/content/ui/menu/edit/edit_menu.tscn b/app/content/ui/menu/edit/edit_menu.tscn index 5a21003..34d4f6b 100644 --- a/app/content/ui/menu/edit/edit_menu.tscn +++ b/app/content/ui/menu/edit/edit_menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://crrb0l3ekuotj"] +[gd_scene load_steps=14 format=3 uid="uid://crrb0l3ekuotj"] [ext_resource type="Script" path="res://content/ui/menu/edit/edit_menu.gd" id="1_34cbn"] [ext_resource type="Script" path="res://content/ui/menu/edit/devices.gd" id="2_rkvf4"] @@ -10,6 +10,7 @@ [ext_resource type="Script" path="res://content/ui/menu/edit/entities.gd" id="5_t34xe"] [ext_resource type="Script" path="res://content/ui/components/flex_container/flex_container.gd" id="6_cr6p6"] [ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="6_evh58"] +[ext_resource type="AudioStream" uid="uid://cn2qohl6abgeu" path="res://assets/sound/spawn.wav" id="11_7qxwt"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_hstwo"] render_priority = -3 @@ -131,3 +132,7 @@ visible = false material_override = SubResource("ShaderMaterial_hstwo") mesh = SubResource("QuadMesh_4pj6f") skeleton = NodePath("../..") + +[node name="SpawnSound" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("11_7qxwt") +volume_db = -10.0 diff --git a/app/content/ui/menu/menu.gd b/app/content/ui/menu/menu.gd index bb0c8b6..ca458f5 100644 --- a/app/content/ui/menu/menu.gd +++ b/app/content/ui/menu/menu.gd @@ -3,6 +3,8 @@ extends Node3D const Notification = preload ("res://content/ui/components/notification/notification.tscn") @onready var animation_player = $AnimationPlayer +@onready var open_sound = $OpenSound +@onready var close_sound = $CloseSound @onready var notify_place = $AnimationContainer/NotifyPlace @onready var main = $"/root/Main" @@ -18,10 +20,12 @@ func _ready(): main.add_child(self) move_into_view() animation_player.play_backwards("hide_menu") - AudioPlayer.play_effect("open_menu") + open_sound.play() + close_sound.stop() else: animation_player.play("hide_menu") - AudioPlayer.play_effect("close_menu") + close_sound.play() + open_sound.stop() ) animation_player.animation_finished.connect(func(_animation): diff --git a/app/content/ui/menu/menu.tscn b/app/content/ui/menu/menu.tscn index 38ecc2d..0ceb679 100644 --- a/app/content/ui/menu/menu.tscn +++ b/app/content/ui/menu/menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=21 format=3 uid="uid://c3kdssrmv84kv"] +[gd_scene load_steps=23 format=3 uid="uid://c3kdssrmv84kv"] [ext_resource type="Script" path="res://content/ui/menu/menu.gd" id="1_ng4u3"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="2_8coxu"] @@ -11,9 +11,11 @@ [ext_resource type="PackedScene" uid="uid://ddpxthb414unp" path="res://content/ui/menu/view/view_menu.tscn" id="8_71pkg"] [ext_resource type="PackedScene" uid="uid://c01gkeldvjwtr" path="res://content/ui/menu/room/room_menu.tscn" id="10_u4i1x"] [ext_resource type="PackedScene" uid="uid://c6r4higceibif" path="res://content/ui/menu/settings/settings_menu.tscn" id="11_7wm6b"] +[ext_resource type="AudioStream" uid="uid://nmm8y0xt5wyj" path="res://assets/sound/open_menu.wav" id="12_dsnuc"] +[ext_resource type="AudioStream" uid="uid://bnx2uv4nmra8f" path="res://assets/sound/close_menu.wav" id="13_nnnln"] [sub_resource type="BoxShape3D" id="BoxShape3D_e1esh"] -size = Vector3(0.51, 0.32, 0.013) +size = Vector3(0.51, 0.32, 0.034332) [sub_resource type="ShaderMaterial" id="ShaderMaterial_du6qr"] render_priority = 0 @@ -188,7 +190,7 @@ _data = { } [sub_resource type="BoxShape3D" id="BoxShape3D_emmtq"] -size = Vector3(0.542114, 0.355225, 0.0774612) +size = Vector3(0.542114, 0.355225, 0.091465) [node name="Menu" type="StaticBody3D"] collision_layer = 6 @@ -196,7 +198,7 @@ collision_mask = 6 script = ExtResource("1_ng4u3") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, -0.005) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, -0.015666) shape = SubResource("BoxShape3D_e1esh") [node name="Movable" type="Node" parent="."] @@ -303,5 +305,13 @@ collision_mask = 0 monitoring = false [node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0299683, 0, 0.00889969) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0299683, 0, 0.0018978) shape = SubResource("BoxShape3D_emmtq") + +[node name="OpenSound" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("12_dsnuc") +volume_db = -6.0 + +[node name="CloseSound" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("13_nnnln") +volume_db = -6.0 diff --git a/app/lib/globals/audio_player.gd b/app/lib/globals/audio_player.gd deleted file mode 100644 index 4165940..0000000 --- a/app/lib/globals/audio_player.gd +++ /dev/null @@ -1,26 +0,0 @@ -extends AudioStreamPlayer - -const click_sound = preload ("res://assets/sound/click.wav") -const spawn_sound = preload ("res://assets/sound/spawn.wav") -const open_menu = preload ("res://assets/sound/open_menu.wav") -const close_menu = preload ("res://assets/sound/close_menu.wav") - -func _ready(): - volume_db = -18 - -## Plays a given sound effect -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/app/lib/utils/pointer/initiator.gd b/app/lib/utils/pointer/initiator.gd index 12e13d0..8c8481f 100644 --- a/app/lib/utils/pointer/initiator.gd +++ b/app/lib/utils/pointer/initiator.gd @@ -13,9 +13,6 @@ enum EventType { TRIGGER, } -signal on_press(type: EventType) -signal on_release(type: EventType) - var node: Node3D var type: Type diff --git a/app/lib/utils/pointer/pointer.gd b/app/lib/utils/pointer/pointer.gd index e299a4a..8cd44a6 100644 --- a/app/lib/utils/pointer/pointer.gd +++ b/app/lib/utils/pointer/pointer.gd @@ -19,10 +19,6 @@ func _init(initiator: Initiator, ray: RayCast3D): self.initiator = initiator self.ray = ray -func _ready(): - initiator.on_press.connect(_on_pressed) - initiator.on_release.connect(_on_released) - func _physics_process(_delta): _handle_enter_leave() _handle_move() @@ -56,7 +52,7 @@ func _handle_enter_leave(): last_collided = collider -func _on_pressed(type: Initiator.EventType): +func pressed(type: Initiator.EventType): var collider = ray.get_collider() if collider == null: @@ -73,7 +69,7 @@ func _on_pressed(type: Initiator.EventType): click_point = ray.get_collision_point() _emit_event("grab_down", collider) -func _on_released(type: Initiator.EventType): +func released(type: Initiator.EventType): match type: Initiator.EventType.TRIGGER: if is_pressed: diff --git a/app/lib/utils/screenshot.gd b/app/lib/utils/screenshot.gd new file mode 100644 index 0000000..a1b15a8 --- /dev/null +++ b/app/lib/utils/screenshot.gd @@ -0,0 +1,65 @@ +extends Node + +const photo_sound_stream = preload ("res://assets/sound/camera-shutter.mp3") + +var timer = Timer.new() +var photo_sound = AudioStreamPlayer.new() + +func _ready(): + timer.wait_time = 2 + timer.one_shot = true + + photo_sound.stream = photo_sound_stream + photo_sound.volume_db = -10 + + EventSystem.on_action_down.connect(func(action): + if action.name == "ax_button": + timer.start() + ) + + timer.timeout.connect(func(): + EventSystem.notify("Screenshot taken", EventNotify.Type.INFO) + take_screenshot() + ) + + add_child(timer) + add_child(photo_sound) + +func _input(event): + if event is InputEventKey and Input.is_key_pressed(KEY_F2): + timer.start() + +func take_screenshot(): + var file_name = "%s.png" % Time.get_datetime_string_from_system().replace(":", "-") + + var path = OS.get_system_dir(OS.SYSTEM_DIR_PICTURES) + "/immersive-home/" + file_name + + print("Saving screenshot to: %s" % path) + + if not FileAccess.file_exists(path): + var dir = path.get_base_dir() + DirAccess.open("user://").make_dir_recursive(dir) + + var image + + if OS.get_name() == "Android": + var viewport_rid = get_viewport().get_viewport_rid() + var texture_rid = RenderingServer.viewport_get_texture(viewport_rid) + image = RenderingServer.texture_2d_layer_get(texture_rid, 0) + print(image) + + if image == null: + return false + + else: + var vp = get_viewport() + var texture = vp.get_texture() + image = texture.get_image() + + if image == null: + return false + + image.save_png(path) + photo_sound.play() + + return true \ No newline at end of file diff --git a/app/project.godot b/app/project.godot index 9e33be5..44e6ffc 100644 --- a/app/project.godot +++ b/app/project.godot @@ -22,7 +22,6 @@ driver/enable_input=true [autoload] XRToolsUserSettings="*res://addons/godot-xr-tools/user_settings/user_settings.gd" -AudioPlayer="*res://lib/globals/audio_player.gd" HomeApi="*res://lib/globals/home_api.gd" Store="*res://lib/globals/main_store.gd" EventSystem="*res://lib/globals/event_system.gd"