immersive-home/app/content/system/house/house.gd

266 lines
6.2 KiB
GDScript3
Raw Normal View History

2023-12-20 02:54:22 +02:00
extends Node3D
const RoomMaterial = preload ("res://content/system/house/room/room_next.tres")
const Room = preload ("./room/room.tscn")
const RoomType = preload ("./room/room.gd")
2024-04-28 21:13:09 +03:00
const Doors = preload ("./doors/doors.gd")
const AlignReference = preload ("./align_reference.gd")
2023-12-20 02:54:22 +02:00
2024-05-22 19:38:28 +03:00
@onready var rooms = $Rooms
@onready var align_reference: AlignReference = $AlignReference
2024-05-22 19:38:28 +03:00
@onready var doors: Doors = $Doors
2023-12-20 02:54:22 +02:00
2024-01-24 18:43:44 +02:00
var fixing_reference: bool = false
2023-12-20 02:54:22 +02:00
var editing_room: RoomType = null
var loaded = R.state(false)
2023-12-20 02:54:22 +02:00
2024-01-25 17:29:33 +02:00
func _ready():
Store.house.on_loaded.connect(func():
update_house()
)
func update_house():
loaded.value = false
2024-05-22 19:38:28 +03:00
for old_room in get_rooms():
old_room.get_parent().remove_child(old_room)
2024-01-27 16:13:43 +02:00
old_room.queue_free()
2024-01-25 17:29:33 +02:00
align_reference.update_align_reference()
2024-04-10 01:21:38 +03:00
for index in range(Store.house.state.rooms.size()):
2024-04-09 18:46:59 +03:00
var new_room = Store.house.state.rooms[index]
2024-03-21 11:51:58 +02:00
if new_room.corners.size() == 0:
2024-04-09 18:46:59 +03:00
Store.house.state.rooms.remove_at(index)
2024-03-21 11:51:58 +02:00
Store.house.save_local()
continue
2024-05-22 19:38:28 +03:00
create_room(new_room.name)
2024-01-25 17:29:33 +02:00
2024-04-09 18:46:59 +03:00
for entity_index in range(Store.house.state.entities.size()):
var entity = Store.house.state.entities[entity_index]
2024-01-28 18:37:26 +02:00
2024-04-11 17:51:30 +03:00
var entity_instance = create_entity_in(entity.id, entity.room, entity.get("interface", null))
2024-01-27 16:38:47 +02:00
if entity_instance == null:
continue
2024-01-27 18:40:35 +02:00
entity_instance.global_position = entity.position
2024-01-25 17:29:33 +02:00
entity_instance.global_rotation = entity.rotation
2024-05-01 18:42:38 +03:00
entity_instance.scale = Vector3(entity.scale, entity.scale, entity.scale) if entity.has("scale") else Vector3(1, 1, 1)
2024-01-22 17:54:15 +02:00
if entity.has("options")&&entity_instance.has_method("set_options"):
entity_instance.set_options(entity.options)
loaded.value = true
2024-05-22 19:38:28 +03:00
func create_room(room_name: String) -> RoomType:
2024-01-27 16:13:43 +02:00
var existing_room = Store.house.get_room(room_name)
if existing_room == null:
2024-04-09 18:46:59 +03:00
Store.house.state.rooms.append({
2024-01-27 16:13:43 +02:00
"name": room_name,
"height": 2.0,
"corners": [],
})
2023-12-20 02:54:22 +02:00
var room = Room.instantiate()
room.name = room_name
2024-05-22 19:38:28 +03:00
rooms.add_child(room)
2023-12-20 02:54:22 +02:00
return room
func edit_room(room_name):
var room = find_room(room_name)
if room == editing_room:
return
App.controller_left.show_grid = false
App.controller_right.show_grid = false
2023-12-20 02:54:22 +02:00
if editing_room != null:
editing_room.editable = false
editing_room = null
if room != null:
room.editable = true
editing_room = room
App.controller_left.show_grid = true
App.controller_right.show_grid = true
2023-12-20 02:54:22 +02:00
func is_valid_room(room_name):
var room = find_room(room_name)
if room == null:
return
return room.wall_corners.get_child_count() >= 3
func delete_room(room_name):
var room = find_room(room_name)
if room == null:
return
if editing_room == room:
editing_room = null
2024-05-24 12:02:50 +03:00
rooms.remove_child(room)
room.queue_free()
2024-05-24 12:02:50 +03:00
Store.house.state.rooms = Store.house.state.rooms.filter(func(r): return r.name != room_name)
2024-01-29 16:35:58 +02:00
Store.house.save_local()
func is_editiong(room_name):
return editing_room != null&&editing_room.name == room_name
2023-12-20 02:54:22 +02:00
func find_room(room_name):
2024-05-22 19:38:28 +03:00
for room in get_rooms():
2024-01-25 17:29:33 +02:00
if room.name == room_name:
return room
2023-12-20 02:54:22 +02:00
return null
func find_room_at(entity_position: Vector3):
2024-05-22 19:38:28 +03:00
for room in get_rooms():
2024-01-25 17:29:33 +02:00
if room.has_point(entity_position):
return room
2023-12-20 02:54:22 +02:00
return null
func rename_room(old_room: String, new_name: String):
var room = find_room(old_room)
if room == null:
return
room.name = new_name
var store_room = Store.house.get_room(old_room)
if store_room != null:
store_room.name = new_name
save_all_entities()
Store.house.save_local()
2024-05-22 19:38:28 +03:00
func get_rooms_aabb():
var rooms = get_rooms()
2024-01-16 16:00:30 +02:00
if rooms.size() == 0:
return AABB()
var min_pos = rooms[0].get_aabb().position
var max_pos = min_pos + rooms[0].get_aabb().size
for room in rooms:
var room_min = room.get_aabb().position
var room_max = room_min + room.get_aabb().size
min_pos.x = min(min_pos.x, room_min.x)
min_pos.y = min(min_pos.y, room_min.y)
min_pos.z = min(min_pos.z, room_min.z)
max_pos.x = max(max_pos.x, room_max.x)
max_pos.y = max(max_pos.y, room_max.y)
max_pos.z = max(max_pos.z, room_max.z)
return AABB(min_pos, max_pos - min_pos)
2024-05-22 19:38:28 +03:00
func get_rooms():
return rooms.get_children()
2023-12-20 02:54:22 +02:00
2024-04-11 17:51:30 +03:00
func create_entity(entity_id: String, entity_position: Vector3, type=null):
2023-12-20 02:54:22 +02:00
var room = find_room_at(entity_position)
if room == null:
return false
2023-12-20 02:54:22 +02:00
2024-04-11 17:51:30 +03:00
var entity = EntityFactory.create_entity(entity_id, type)
2023-12-20 02:54:22 +02:00
if entity == null:
2024-01-27 16:38:47 +02:00
return null
2023-12-20 02:54:22 +02:00
2024-01-25 17:29:33 +02:00
room.get_node("Entities").add_child(entity)
2023-12-20 02:54:22 +02:00
entity.global_position = entity_position
2024-01-27 16:13:43 +02:00
save_all_entities()
2024-01-25 17:29:33 +02:00
return entity
2024-04-11 17:51:30 +03:00
func create_entity_in(entity_id: String, room_name: String, type=null):
2024-01-27 16:38:47 +02:00
var room = find_room(room_name)
if room == null:
return false
2024-01-27 16:38:47 +02:00
2024-04-11 17:51:30 +03:00
var entity = EntityFactory.create_entity(entity_id, type)
2024-01-27 16:38:47 +02:00
if entity == null:
return null
room.get_node("Entities").add_child(entity)
entity.global_position = room.get_aabb().position + room.get_aabb().size / 2.0
return entity
2024-01-24 18:43:44 +02:00
func edit_reference():
fixing_reference = false
2024-01-29 13:37:25 +02:00
align_reference.visible = true
2024-01-24 18:43:44 +02:00
align_reference.disabled = false
func fix_reference():
fixing_reference = true
align_reference.disabled = false
2024-01-29 13:37:25 +02:00
align_reference.visible = true
2024-01-24 18:43:44 +02:00
align_reference.update_initial_positions()
RoomMaterial.set_shader_parameter("show_border", true)
2024-01-24 18:43:44 +02:00
func save_reference():
if fixing_reference:
2024-05-22 19:38:28 +03:00
for room in get_rooms():
2024-01-29 16:35:58 +02:00
room.editable = true
2024-01-24 18:43:44 +02:00
var align_transform = align_reference.global_transform
2024-01-29 16:35:58 +02:00
transform = align_reference.get_new_transform()
2024-01-24 18:43:44 +02:00
align_reference.global_transform = align_transform
2024-01-29 16:35:58 +02:00
align_reference.update_store()
2024-05-22 19:38:28 +03:00
for room in get_rooms():
2024-01-29 16:35:58 +02:00
room.editable = false
save_all_entities()
2024-01-24 18:43:44 +02:00
align_reference.disabled = true
2024-01-29 13:37:25 +02:00
align_reference.visible = false
2024-01-25 17:29:33 +02:00
align_reference.update_initial_positions()
Store.house.save_local()
RoomMaterial.set_shader_parameter("show_border", false)
2024-01-25 17:29:33 +02:00
func save_all_entities():
2024-04-09 18:46:59 +03:00
Store.house.state.entities.clear()
2024-01-25 17:29:33 +02:00
2024-05-22 19:38:28 +03:00
for room in get_rooms():
2024-01-25 17:29:33 +02:00
for entity in room.get_node("Entities").get_children():
var entity_data = {
"id": entity.entity_id,
"position": entity.global_position,
"rotation": entity.global_rotation,
2024-05-01 18:42:38 +03:00
"scale": entity.scale.x,
"room": String(room.name)
2024-01-25 17:29:33 +02:00
}
2024-04-11 17:51:30 +03:00
if entity.has_method("get_interface"):
entity_data["interface"] = entity.get_interface()
if entity.has_method("get_options"):
entity_data["options"] = entity.get_options()
2024-04-09 18:46:59 +03:00
Store.house.state.entities.append(entity_data)
2024-04-17 20:57:34 +03:00
Store.house.state.entities = Store.house.state.entities
2024-01-27 16:38:47 +02:00
Store.house.save_local()