add basic room creation
This commit is contained in:
parent
24a218be06
commit
836380f6a4
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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")]
|
||||
|
|
3
content/ui/menu/room/edge.tres
Normal file
3
content/ui/menu/room/edge.tres
Normal file
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:77753eec248c2d0593cfa5e5a86aa8be8ee13c5f96680226d8428f732f5f2098
|
||||
size 150
|
88
content/ui/menu/room/room_menu.gd
Normal file
88
content/ui/menu/room/room_menu.gd
Normal file
|
@ -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
|
23
content/ui/menu/room/room_menu.tscn
Normal file
23
content/ui/menu/room/room_menu.tscn
Normal file
|
@ -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"]
|
26
content/ui/menu/room/wall_corner.tscn
Normal file
26
content/ui/menu/room/wall_corner.tscn
Normal file
|
@ -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")
|
11
content/ui/menu/room/wall_edge.tscn
Normal file
11
content/ui/menu/room/wall_edge.tscn
Normal file
|
@ -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")
|
Loading…
Reference in New Issue
Block a user