diff --git a/content/main.tscn b/content/main.tscn index e732963..68a9d1e 100644 --- a/content/main.tscn +++ b/content/main.tscn @@ -33,7 +33,7 @@ script = ExtResource("1_uvrd4") [node name="XROrigin3D" type="XROrigin3D" parent="."] [node name="XRCamera3D" type="XRCamera3D" parent="XROrigin3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.798091, 0.311748) +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) [node name="XRControllerLeft" type="XRController3D" parent="XROrigin3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.469893, 0.597213, -0.251112) @@ -59,12 +59,12 @@ script = ExtResource("1_tsqxc") ray = NodePath("RayCast3D") [node name="RayCast3D" type="RayCast3D" parent="XROrigin3D/XRControllerRight/Raycast"] -transform = Transform3D(-2.58078e-11, 4.3714e-08, 1, 1, -4.37117e-08, 9.27469e-12, 4.37112e-08, 1, -4.3714e-08, 0, 0, 0) +transform = Transform3D(-4.62364e-10, 4.3714e-08, 0.999998, 0.999999, -4.37194e-08, 9.2768e-12, 4.37103e-08, 0.999999, -4.3714e-08, -0.000467122, 0.00228411, -0.0016689) target_position = Vector3(0, -5, 0) [node name="Decal" type="Decal" parent="XROrigin3D/XRControllerRight/Raycast"] transform = Transform3D(0.999999, -0.000567105, -2.5179e-05, -2.51789e-05, 4.39886e-08, -0.999999, 0.000567105, 1, 2.97064e-08, -0.000775784, -1.09076e-05, -2.46767) -size = Vector3(0.02, 5, 0.02) +size = Vector3(0.02, 4.91995, 0.02) texture_albedo = ExtResource("4_wcfej") upper_fade = 0.000985425 lower_fade = 0.000919435 @@ -84,3 +84,4 @@ xr_origin = NodePath("../XROrigin3D") [node name="House" parent="." instance=ExtResource("8_qkrg7")] transform = Transform3D(0.404247, 0.000180645, 0.914648, 0.00017221, 0.999999, -0.000273614, -0.914648, 0.00026812, 0.404247, -0.343479, 0.000110551, 1.91547) +visible = false diff --git a/content/scenes/house.tscn b/content/scenes/house.tscn index b3b3fd9..3d7d425 100644 --- a/content/scenes/house.tscn +++ b/content/scenes/house.tscn @@ -10,7 +10,9 @@ transform = Transform3D(1, -1.39637e-11, 0, 9.47975e-12, 1, 0, 0, 0, 1, 0, 0, 0) [node name="scene" parent="." instance=ExtResource("1_mu2l0")] transform = Transform3D(0.01, 7.86411e-14, 0, -2.05335e-13, 0.01, 7.10543e-15, 0, 0, 0.01, 0, 0, 0) +visible = false [node name="MeshInstance3D" type="MeshInstance3D" parent="."] transform = Transform3D(0.999999, -0.000592284, 0.000541925, -0.000592284, -1, -7.3062e-08, 0.000541926, -2.47913e-07, -0.999999, 2.38683, 1.18178, -1.05161) +visible = false mesh = SubResource("PlaneMesh_b3o5e") diff --git a/content/ui/components/button/button.gd b/content/ui/components/button/button.gd index b28bf8e..8be1f4a 100644 --- a/content/ui/components/button/button.gd +++ b/content/ui/components/button/button.gd @@ -3,6 +3,7 @@ class_name Button3D @export var toggleable: bool = false @export var disabled: bool = false +@export var initial_active: bool = false var active: bool = false : set(value): print("set active", value) @@ -16,16 +17,15 @@ var active: bool = false : animation_player.play("down") else: animation_player.play_backwards("down") - - - get: - return active - - + return active @onready var animation_player: AnimationPlayer = $AnimationPlayer +func _ready(): + if initial_active: + active = true + func _on_click(_event): if disabled: return false diff --git a/content/ui/components/button/button.tscn b/content/ui/components/button/button.tscn index a0d99ff..11dae36 100644 --- a/content/ui/components/button/button.tscn +++ b/content/ui/components/button/button.tscn @@ -13,6 +13,31 @@ size = Vector3(0.05, 0.02, 0.05) [sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_o4j7g"] points = PackedVector3Array(-0.025, -0.01, -0.025, -0.025, 0.01, -0.025, 0.025, -0.01, -0.025, -0.025, -0.01, 0.025, -0.025, 0.01, 0.025, 0.025, 0.01, -0.025, 0.025, -0.01, 0.025, 0.025, 0.01, 0.025) +[sub_resource type="Animation" id="Animation_gvfrg"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -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("MeshInstance3D:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + [sub_resource type="Animation" id="Animation_iu2ed"] resource_name = "down" length = 0.2 @@ -50,31 +75,6 @@ tracks/2/keys = { "times": PackedFloat32Array(0, 0.2) } -[sub_resource type="Animation" id="Animation_gvfrg"] -length = 0.001 -tracks/0/type = "bezier" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:position:y") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"handle_modes": PackedInt32Array(0), -"points": PackedFloat32Array(0, -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("MeshInstance3D:position:y") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"handle_modes": PackedInt32Array(0), -"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0) -} - [sub_resource type="AnimationLibrary" id="AnimationLibrary_sbgno"] _data = { "RESET": SubResource("Animation_gvfrg"), diff --git a/content/ui/menu/menu.gd b/content/ui/menu/menu.gd index 95edab0..3ab0e63 100644 --- a/content/ui/menu/menu.gd +++ b/content/ui/menu/menu.gd @@ -18,7 +18,7 @@ enum Menu { var selected_menu := Menu.EDIT func _ready(): - select_menu(selected_menu) + pass func _on_click(event): if event.target == nav_view: @@ -41,6 +41,9 @@ func select_menu(menu: Menu): var menu_node = enum_to_menu(menu) var nav_node = enum_to_nav(menu) + if nav_node != null: + nav_node.disabled = true + if menu_node != null: menu_node.show() diff --git a/content/ui/menu/menu.tscn b/content/ui/menu/menu.tscn index ad3f75c..116ecc8 100644 --- a/content/ui/menu/menu.tscn +++ b/content/ui/menu/menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://c3kdssrmv84kv"] +[gd_scene load_steps=12 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"] @@ -9,6 +9,7 @@ [ext_resource type="Texture2D" uid="uid://jodf3dm654j3" path="res://assets/icons/view_in_ar_white_24dp.svg" id="7_wvovx"] [ext_resource type="Texture2D" uid="uid://dch6rwihrl3i2" path="res://assets/icons/schema_white_24dp.svg" id="8_3d082"] [ext_resource type="Texture2D" uid="uid://dyh0ax51xqp8n" path="res://assets/icons/settings_white_24dp.svg" id="9_mel13"] +[ext_resource type="PackedScene" uid="uid://c01gkeldvjwtr" path="res://content/ui/menu/room/room_menu.tscn" id="10_u4i1x"] [sub_resource type="BoxMesh" id="BoxMesh_08du6"] size = Vector3(0.3, 0.01, 0.3) @@ -79,3 +80,5 @@ 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")] diff --git a/content/ui/menu/room/edge.tres b/content/ui/menu/room/edge.tres new file mode 100644 index 0000000..02dd679 --- /dev/null +++ b/content/ui/menu/room/edge.tres @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77753eec248c2d0593cfa5e5a86aa8be8ee13c5f96680226d8428f732f5f2098 +size 150 diff --git a/content/ui/menu/room/room_menu.gd b/content/ui/menu/room/room_menu.gd new file mode 100644 index 0000000..eacdd7c --- /dev/null +++ b/content/ui/menu/room/room_menu.gd @@ -0,0 +1,88 @@ +extends Node3D + +const wall_corner_scene = preload("res://content/ui/menu/room/wall_corner.tscn") +const wall_edge_scene = preload("res://content/ui/menu/room/wall_edge.tscn") + +@onready var teleport_root = $TeleportRoot +@onready var wall_corners = $TeleportRoot/WallCorners +@onready var wall_edges = $TeleportRoot/WallEdges + +var moving = null +var ground_plane = Plane(Vector3.UP, Vector3.ZERO) + +func _ready(): + remove_child(teleport_root) + get_tree().get_root().get_node("Main").add_child.call_deferred(teleport_root) + + teleport_root.get_node("Ground/Clickable").on_click.connect(func(event): + add_corner(event.ray.get_collision_point()) + ) + + +func add_corner(position: Vector3): + var corner = wall_corner_scene.instantiate() + corner.position = position + + corner.get_node("Clickable").on_grab_down.connect(func(event): + moving = event.target + ) + + corner.get_node("Clickable").on_grab_move.connect(func(event): + if moving == null: + return + + var direction = (event.ray.to_global(event.ray.target_position) - event.ray.global_position).normalized() + var new_position = ground_plane.intersects_ray(event.ray.global_position, direction) + + if new_position == null: + return + + moving.position = new_position + var moving_index = moving.get_index() + + get_edge(moving_index).transform = corners_to_edge_transform(new_position, get_corner(moving_index + 1).position) + get_edge(moving_index - 1).transform = corners_to_edge_transform(get_corner(moving_index - 1).position, new_position) + ) + + corner.get_node("Clickable").on_grab_up.connect(func(_event): + moving = null + ) + + wall_corners.add_child(corner) + + + var num_corners = wall_corners.get_child_count() + var edge + + if num_corners > 1: + edge = add_edge(wall_corners.get_child(num_corners - 2).position, position) + + if num_corners > 2: + if num_corners != wall_edges.get_child_count(): + add_edge(position, wall_corners.get_child(0).position) + else: + wall_edges.move_child(edge, num_corners - 2) + get_edge(-1).transform = corners_to_edge_transform(position, get_corner(0).position) + +func get_corner(index: int) -> MeshInstance3D: + return wall_corners.get_child(index % wall_corners.get_child_count()) + +func get_edge(index: int) -> MeshInstance3D: + return wall_edges.get_child(index % wall_edges.get_child_count()) + + +func add_edge(from_pos: Vector3, to_pos: Vector3): + var edge: MeshInstance3D = wall_edge_scene.instantiate() + edge.transform = corners_to_edge_transform(from_pos, to_pos) + wall_edges.add_child(edge) + return edge + +func corners_to_edge_transform(from_pos: Vector3, to_pos: Vector3) -> Transform3D: + var diff = to_pos - from_pos + var direction = diff.normalized() + + var edge_position = from_pos + diff / 2 + var edge_basis = Basis(Vector3.UP, diff, direction.cross(Vector3.UP)) + + var edge_transform = Transform3D(edge_basis, edge_position) + return edge_transform diff --git a/content/ui/menu/room/room_menu.tscn b/content/ui/menu/room/room_menu.tscn new file mode 100644 index 0000000..880a387 --- /dev/null +++ b/content/ui/menu/room/room_menu.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=4 format=3 uid="uid://c01gkeldvjwtr"] + +[ext_resource type="Script" path="res://content/ui/menu/room/room_menu.gd" id="1_ch4jb"] +[ext_resource type="Script" path="res://content/functions/clickable.gd" id="2_elugy"] + +[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_08sv0"] + +[node name="RoomMenu" type="Node3D"] +script = ExtResource("1_ch4jb") + +[node name="TeleportRoot" type="Node3D" parent="."] + +[node name="Ground" type="StaticBody3D" parent="TeleportRoot"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="TeleportRoot/Ground"] +shape = SubResource("WorldBoundaryShape3D_08sv0") + +[node name="Clickable" type="Node" parent="TeleportRoot/Ground"] +script = ExtResource("2_elugy") + +[node name="WallCorners" type="Node3D" parent="TeleportRoot"] + +[node name="WallEdges" type="Node3D" parent="TeleportRoot"] diff --git a/content/ui/menu/room/wall_corner.tscn b/content/ui/menu/room/wall_corner.tscn new file mode 100644 index 0000000..1e781b5 --- /dev/null +++ b/content/ui/menu/room/wall_corner.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=5 format=3 uid="uid://eht83kc5wtiw"] + +[ext_resource type="Script" path="res://content/functions/clickable.gd" id="1_e5awq"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_86rci"] +radius = 0.05 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_i1w3w"] +transparency = 1 +albedo_color = Color(1, 1, 1, 0.270588) + +[sub_resource type="SphereMesh" id="SphereMesh_7586u"] +material = SubResource("StandardMaterial3D_i1w3w") +radius = 0.05 +height = 0.1 + +[node name="WallCorner" type="StaticBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_86rci") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("SphereMesh_7586u") + +[node name="Clickable" type="Node" parent="."] +script = ExtResource("1_e5awq") diff --git a/content/ui/menu/room/wall_edge.tscn b/content/ui/menu/room/wall_edge.tscn new file mode 100644 index 0000000..859e691 --- /dev/null +++ b/content/ui/menu/room/wall_edge.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=3 format=3 uid="uid://cfcabpcbp577o"] + +[ext_resource type="Material" uid="uid://j12e5wwthtaa" path="res://content/ui/menu/room/edge.tres" id="1_b21dw"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_a2dct"] +material = ExtResource("1_b21dw") +radius = 0.01 +height = 1.0 + +[node name="MeshInstance3D" type="MeshInstance3D"] +mesh = SubResource("CapsuleMesh_a2dct")