implement foundation for a room system

This commit is contained in:
Nitwel 2023-12-20 01:54:22 +01:00
parent eab54b5850
commit 9b116a97ab
18 changed files with 123 additions and 81 deletions

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=14 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="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"] [ext_resource type="Script" path="res://content/main.gd" id="1_uvrd4"]
@ -7,7 +7,6 @@
[ext_resource type="PackedScene" uid="uid://bsx12q23v8apy" path="res://content/system/hands/hands.tscn" id="4_v8xu6"] [ext_resource type="PackedScene" uid="uid://bsx12q23v8apy" path="res://content/system/hands/hands.tscn" id="4_v8xu6"]
[ext_resource type="PackedScene" uid="uid://ctltchlf2j2r4" path="res://addons/xr-simulator/XRSimulator.tscn" id="5_3qc8g"] [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"] [ext_resource type="Material" uid="uid://bf5ina366dwm6" path="res://assets/materials/sky.material" id="5_wgwf8"]
[ext_resource type="PackedScene" uid="uid://83lb5p4e0qk0" path="res://content/scenes/house.tscn" id="8_qkrg7"]
[ext_resource type="PackedScene" uid="uid://lrehk38exd5n" path="res://content/system/keyboard/keyboard.tscn" id="9_e5n3p"] [ext_resource type="PackedScene" uid="uid://lrehk38exd5n" path="res://content/system/keyboard/keyboard.tscn" id="9_e5n3p"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_m58yb"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_m58yb"]
@ -71,10 +70,6 @@ shadow_enabled = true
[node name="XRSimulator" parent="." instance=ExtResource("5_3qc8g")] [node name="XRSimulator" parent="." instance=ExtResource("5_3qc8g")]
xr_origin = NodePath("../XROrigin3D") 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
[node name="Keyboard" parent="." instance=ExtResource("9_e5n3p")] [node name="Keyboard" parent="." instance=ExtResource("9_e5n3p")]
transform = Transform3D(0.499999, -6.98142e-12, 0, 4.74065e-12, 0.5, -2.27374e-13, 0, 2.27374e-13, 0.5, -0.125313, 0.424282, -0.263966) transform = Transform3D(0.499999, -6.98142e-12, 0, 4.74065e-12, 0.5, -2.27374e-13, 0, 2.27374e-13, 0.5, -0.125313, 0.424282, -0.263966)

View File

@ -0,0 +1,67 @@
extends Node3D
const Room = preload("./room/room.tscn")
const RoomType = preload("./room/room.gd")
@onready var levels = $Levels
var editing_room: RoomType = null
func create_room(room_name: String, level: int) -> RoomType:
if editing_room != null:
editing_room.editable = false
editing_room = null
var room = Room.instantiate()
room.name = room_name
room.editable = true
editing_room = room
get_level(level).add_child(room)
return room
func edit_room(room_name: String):
if editing_room != null:
editing_room.editable = false
editing_room = null
var room = find_room(room_name)
room.editable = true
editing_room = room
func find_room(room_name: String):
for level in levels.get_children():
for room in level.get_children():
if room.name == room_name:
return room
return null
func find_room_at(entity_position: Vector3):
for level in levels.get_children():
for room in level.get_children():
if room.has_point(entity_position):
return room
return null
func get_level(level: int):
return levels.get_index(level)
func get_rooms(level: int):
return get_level(level).get_children()
func create_entity(entity_id: String, entity_position: Vector3):
var room = find_room_at(entity_position)
if room == null:
return
var entity = EntityFactory.create_entity(entity_id)
if entity == null:
return
room.add_child(entity)
entity.global_position = entity_position

View File

@ -0,0 +1,10 @@
[gd_scene load_steps=2 format=3 uid="uid://cbemihbxkd4ll"]
[ext_resource type="Script" path="res://content/system/house/house.gd" id="1_p8amj"]
[node name="House" type="Node3D"]
script = ExtResource("1_p8amj")
[node name="Levels" type="Node3D" parent="."]
[node name="Level0" type="Node3D" parent="Levels"]

View File

@ -2,7 +2,7 @@ extends Node3D
@onready var wall_corners = $Ceiling/WallCorners @onready var wall_corners = $Ceiling/WallCorners
@onready var wall_edges = $Ceiling/WallEdges @onready var wall_edges = $Ceiling/WallEdges
@onready var wall_mesh = $WallMesh @onready var wall_mesh: MeshInstance3D = $WallMesh
@onready var wall_collisions = $WallCollisions @onready var wall_collisions = $WallCollisions
@onready var room_floor = $Floor @onready var room_floor = $Floor
@ -23,6 +23,8 @@ func get_corner(index: int) -> MeshInstance3D:
func get_edge(index: int) -> MeshInstance3D: func get_edge(index: int) -> MeshInstance3D:
return wall_edges.get_child(index % wall_edges.get_child_count()) return wall_edges.get_child(index % wall_edges.get_child_count())
func has_point(point: Vector3) -> bool:
return wall_mesh.get_aabb().has_point(point)
func _save(): func _save():
return { return {

View File

@ -1,11 +1,11 @@
[gd_scene load_steps=10 format=3 uid="uid://bswgmclohuqui"] [gd_scene load_steps=10 format=3 uid="uid://bswgmclohuqui"]
[ext_resource type="Script" path="res://content/system/room/room.gd" id="1_fccq0"] [ext_resource type="Script" path="res://content/system/house/room/room.gd" id="1_fccq0"]
[ext_resource type="Script" path="res://content/functions/clickable.gd" id="1_ugebq"] [ext_resource type="Script" path="res://content/functions/clickable.gd" id="1_ugebq"]
[ext_resource type="Material" uid="uid://bbx6fv7jq50tr" path="res://content/system/room/walls.tres" id="3_al1ev"] [ext_resource type="Material" uid="uid://bbx6fv7jq50tr" path="res://content/system/house/room/walls.tres" id="3_al1ev"]
[ext_resource type="Script" path="res://lib/utils/state_machine/state_machine.gd" id="4_nbbo6"] [ext_resource type="Script" path="res://lib/utils/state_machine/state_machine.gd" id="4_nbbo6"]
[ext_resource type="Script" path="res://content/system/room/states/view.gd" id="6_g066t"] [ext_resource type="Script" path="res://content/system/house/room/states/view.gd" id="6_g066t"]
[ext_resource type="Script" path="res://content/system/room/states/edit.gd" id="7_ap14h"] [ext_resource type="Script" path="res://content/system/house/room/states/edit.gd" id="7_ap14h"]
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_08sv0"] [sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_08sv0"]

View File

@ -1,5 +1,5 @@
extends State extends State
const Room = preload("res://content/system/room/room.gd") const Room = preload("res://content/system/house/room/room.gd")
var room: Room var room: Room

View File

@ -53,6 +53,8 @@ func generate_mesh():
st.add_vertex(first_corner.position) st.add_vertex(first_corner.position)
st.add_vertex(first_corner.position + wall_up) st.add_vertex(first_corner.position + wall_up)
# TODO: Implement Rust Binding for cdt algorithm to fill floor and ceiling
st.index() st.index()
st.generate_normals() st.generate_normals()
st.generate_tangents() st.generate_tangents()

View File

@ -1,7 +1,6 @@
extends Node3D extends Node3D
const ButtonScene = preload("res://content/ui/components/button/button.tscn") const ButtonScene = preload("res://content/ui/components/button/button.tscn")
const EntityCreator = preload("./entity_creator.gd")
@onready var devices_node: GridContainer3D = $Devices @onready var devices_node: GridContainer3D = $Devices
@onready var next_page_button = $Buttons/NextPageButton @onready var next_page_button = $Buttons/NextPageButton
@ -145,22 +144,11 @@ func _on_entity_click(entity_name):
render() render()
return return
var type = entity_name.split(".")[0]
AudioPlayer.play_effect("spawn") AudioPlayer.play_effect("spawn")
var entity = EntityCreator.create_entity(type, entity_name) House.body.create_entity(entity_name, global_position)
if entity == null:
return
entity.set_position(global_position)
get_node("/root/Main").add_child(entity)
func clear_menu(): func clear_menu():
for child in devices_node.get_children(): for child in devices_node.get_children():
devices_node.remove_child(child) devices_node.remove_child(child)
child.queue_free() child.queue_free()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

View File

@ -1,40 +1,22 @@
extends Node3D extends Node3D
const Room = preload("res://content/system/room/room.tscn") const Room = preload("res://content/system/house/room/room.tscn")
const RoomType = preload("res://content/system/house/room/room.gd")
const window_scene = preload("./window.tscn") const window_scene = preload("./window.tscn")
@onready var background = $Background @onready var background = $Background
@onready var toggle_edit_button = $Interface/ToggleEdit
@onready var spawn_windows = $SpawnWindows
@onready var rooms = get_tree().root.get_node("Main/Rooms")
var room: Node3D
func _ready(): func _ready():
background.visible = false background.visible = false
HomeApi.on_connect.connect(func(): HomeApi.on_connect.connect(func():
if rooms.get_child_count() == 0: var rooms = House.body.get_rooms(0)
room = Room.instantiate()
rooms.add_child(room) for room in rooms:
else: var mesh = room.wall_mesh
room = rooms.get_child(0)
if rooms.get_child_count() > 1:
for child in rooms.get_children():
if child != room:
child.queue_free()
)
spawn_windows.on_button_down.connect(func():
get_tree().root.get_node("Main").add_child.call_deferred(window_scene.instantiate())
)
toggle_edit_button.on_button_down.connect(func():
if room != null:
room.editable = true
)
toggle_edit_button.on_button_up.connect(func():
if room != null:
room.editable = false
) )

View File

@ -1,8 +1,8 @@
[gd_scene load_steps=5 format=3 uid="uid://c01gkeldvjwtr"] [gd_scene load_steps=5 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/ui/menu/room/room_menu.gd" id="1_ch4jb"]
[ext_resource type="Script" path="res://content/functions/clickable.gd" id="2_elugy"] [ext_resource type="Material" uid="uid://bujy3egn1oqac" path="res://assets/materials/pri-500.material" id="2_7m4yn"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="3_whl7a"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="4_cghmp"]
[sub_resource type="BoxMesh" id="BoxMesh_e37nn"] [sub_resource type="BoxMesh" id="BoxMesh_e37nn"]
size = Vector3(0.3, 0.01, 0.3) size = Vector3(0.3, 0.01, 0.3)
@ -12,35 +12,15 @@ script = ExtResource("1_ch4jb")
[node name="Background" type="MeshInstance3D" parent="."] [node name="Background" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0, 0.15) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0, 0.15)
material_override = ExtResource("2_7m4yn")
mesh = SubResource("BoxMesh_e37nn") mesh = SubResource("BoxMesh_e37nn")
[node name="Interface" type="Node3D" parent="."] [node name="Interface" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.01, 0)
[node name="ToggleEdit" parent="Interface" instance=ExtResource("3_whl7a")] [node name="Rooms" type="Node3D" parent="Interface"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.05, 0, 0.05) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0, 0.12)
label = "room_preferences"
icon = true [node name="Button" parent="Interface" instance=ExtResource("4_cghmp")]
toggleable = true transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.27, 0, 0.27)
label = "add"
[node name="Clickable" type="Node" parent="Interface/ToggleEdit"]
script = ExtResource("2_elugy")
[node name="Label3D" type="Label3D" parent="Interface"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.13, -1.86265e-09, 0.05)
pixel_size = 0.001
text = "Edit Room"
font_size = 18
outline_size = 0
[node name="CreateBlur" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.15, 0.01, 0.261858)
pixel_size = 0.001
text = "Fake Windows"
font_size = 18
outline_size = 0
[node name="SpawnWindows" parent="." instance=ExtResource("3_whl7a")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.05, 0, 0.26)
label = "lens_blur"
icon = true icon = true

View File

@ -0,0 +1,3 @@
extends Node
@onready var body = get_node("/root/Main/House")

View File

@ -2,8 +2,15 @@ extends Node
const VariantSerializer = preload("res://lib/utils/variant_serializer.gd") const VariantSerializer = preload("res://lib/utils/variant_serializer.gd")
signal loaded()
signal unloaded()
var is_loaded := false
func clear(): func clear():
await _clear_save_tree(get_tree().root.get_node("Main")) await _clear_save_tree(get_tree().root.get_node("Main"))
unloaded.emit()
is_loaded = false
func save(): func save():
if HomeApi.has_connected() == false: if HomeApi.has_connected() == false:
@ -43,6 +50,9 @@ func load():
else: else:
_build_save_tree(save_tree) _build_save_tree(save_tree)
loaded.emit()
is_loaded = true
func _clear_save_tree(node: Node): func _clear_save_tree(node: Node):
for child in node.get_children(): for child in node.get_children():
await _clear_save_tree(child) await _clear_save_tree(child)

View File

@ -1,4 +1,5 @@
extends RefCounted extends RefCounted
class_name EntityFactory
const Switch = preload("res://content/entities/switch/switch.tscn") const Switch = preload("res://content/entities/switch/switch.tscn")
const Light = preload("res://content/entities/light/light.tscn") const Light = preload("res://content/entities/light/light.tscn")
@ -7,8 +8,9 @@ const MediaPlayer = preload("res://content/entities/media_player/media_player.ts
const Camera = preload("res://content/entities/camera/camera.tscn") const Camera = preload("res://content/entities/camera/camera.tscn")
const ButtonEntity = preload("res://content/entities/button/button.tscn") const ButtonEntity = preload("res://content/entities/button/button.tscn")
static func create_entity(type: String, id: String): static func create_entity(id: String):
var entity = null var entity = null
var type = id.split(".")[0]
match type: match type:
"switch": "switch":

View File

@ -24,6 +24,7 @@ HomeApi="*res://lib/globals/home_api.gd"
AudioPlayer="*res://lib/globals/audio_player.gd" AudioPlayer="*res://lib/globals/audio_player.gd"
EventSystem="*res://lib/globals/event_system.gd" EventSystem="*res://lib/globals/event_system.gd"
SaveSystem="*res://lib/globals/save_system.gd" SaveSystem="*res://lib/globals/save_system.gd"
House="*res://lib/globals/house_body.gd"
[editor_plugins] [editor_plugins]