Skip to content

Commit

Permalink
add basic implementation for areas
Browse files Browse the repository at this point in the history
  • Loading branch information
Nitwel committed Jun 11, 2024
1 parent 0485adf commit fc87909
Show file tree
Hide file tree
Showing 20 changed files with 460 additions and 34 deletions.
5 changes: 4 additions & 1 deletion app/content/main.tscn
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[gd_scene load_steps=14 format=3 uid="uid://eecv28y6jxk4"]
[gd_scene load_steps=15 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"]
Expand All @@ -13,6 +13,7 @@
[ext_resource type="PackedScene" uid="uid://ds60i5n211hi3" path="res://content/system/miniature/miniature.tscn" id="12_lmxhs"]
[ext_resource type="PackedScene" uid="uid://bhyddd1f0ry1x" path="res://content/ui/onboarding/onboarding.tscn" id="12_uq2nj"]
[ext_resource type="PackedScene" uid="uid://lrehk38exd5n" path="res://content/system/keyboard/keyboard.tscn" id="13_kylpi"]
[ext_resource type="PackedScene" uid="uid://beafp6nhhcxaf" path="res://content/system/areas/areas.tscn" id="14_0s0u7"]

[node name="Main" type="Node3D"]
script = ExtResource("1_uvrd4")
Expand Down Expand Up @@ -66,3 +67,5 @@ script = ExtResource("12_e13ym")

[node name="Keyboard" parent="." instance=ExtResource("13_kylpi")]
transform = Transform3D(0.5, 0, 0, 0, 0.237697, 0.439887, 0, -0.439887, 0.237697, -0.0241798, 0.452996, -0.531271)

[node name="Areas" parent="." instance=ExtResource("14_0s0u7")]
82 changes: 79 additions & 3 deletions app/content/system/areas/area.gd
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,96 @@ extends Node3D
const CornerScene = preload ("./corner.tscn")
const EdgeScene = preload ("./edge.tscn")

@onready var area = $Area3D
@onready var area_collision = $Area3D/CollisionShape3D
@onready var mesh = $MeshInstance3D
@onready var collision = $CollisionShape3D
@onready var name_input = $Input

var edges = []
var corners = []
var grabbing = null
var id: int = 0

@export var size = Vector3(1, 1, 1):
set(value):
if size == value: return

size = value

if is_node_ready() == false:
return

update_nodes()
update_area()
if edit:
update_nodes()

@export var edit: bool = false:
set(value):
if edit == value: return

edit = value

if is_node_ready() == false:
return

clear_nodes()
if Engine.is_editor_hint() == false: remove_child(name_input)

if edit:
generate_nodes()
update_nodes()
if Engine.is_editor_hint() == false: add_child(name_input)
else:
save_to_store()

func _ready():
generate_nodes()
update_nodes()
remove_child(name_input)
name_input.text = name
Update.props(self, ["size", "edit"])

func opposite_corner(corner):
return corners[7 - corners.find(corner)]

func clear_nodes():
for i in range(corners.size()):
remove_child(corners[i])
corners[i].queue_free()

for i in range(edges.size()):
remove_child(edges[i])
edges[i].queue_free()

corners.clear()
edges.clear()
mesh.visible = false
collision.disabled = true

func save_to_store():
if Engine.is_editor_hint():
return
var areas = Store.house.state.areas
var existing = -1

for i in range(areas.size()):
if areas[i].id == id:
existing = i
break

if existing == - 1:
areas.append({
"id": id,
"name": name_input.text,
"position": global_position,
"rotation": global_rotation,
"size": size
})
else:
areas[existing].name = name
areas[existing].position = global_position
areas[existing].rotation = global_rotation
areas[existing].size = size

func generate_nodes():
for i in range(8):
var corner = CornerScene.instantiate()
Expand All @@ -43,6 +113,12 @@ func generate_nodes():
add_child(edge)
edges.append(edge)

mesh.visible = true
collision.disabled = false

func update_area():
area_collision.shape.size = size

func update_nodes():
if corners.size() == 0:
return
Expand Down
18 changes: 17 additions & 1 deletion app/content/system/areas/area.tscn
Original file line number Diff line number Diff line change
@@ -1,23 +1,39 @@
[gd_scene load_steps=5 format=3 uid="uid://drx0fpy7f8xl3"]
[gd_scene load_steps=7 format=3 uid="uid://drx0fpy7f8xl3"]

[ext_resource type="Script" path="res://content/system/areas/area.gd" id="1_d66b1"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="2_bbykk"]
[ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="3_330yx"]

[sub_resource type="BoxShape3D" id="BoxShape3D_facyw"]
size = Vector3(0.1, 0.1, 0.1)

[sub_resource type="BoxMesh" id="BoxMesh_3s51v"]
size = Vector3(0.1, 0.1, 0.1)

[sub_resource type="BoxShape3D" id="BoxShape3D_v55b2"]

[node name="Area" type="StaticBody3D"]
script = ExtResource("1_d66b1")

[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("BoxShape3D_facyw")
disabled = true

[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
visible = false
mesh = SubResource("BoxMesh_3s51v")

[node name="Movable" type="Node" parent="."]
script = ExtResource("2_bbykk")
restricted = true

[node name="Area3D" type="Area3D" parent="."]
collision_layer = 32
collision_mask = 32

[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
shape = SubResource("BoxShape3D_v55b2")

[node name="Input" parent="." instance=ExtResource("3_330yx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.07, 0)
text = "Area"
70 changes: 68 additions & 2 deletions app/content/system/areas/areas.gd
Original file line number Diff line number Diff line change
@@ -1,8 +1,74 @@
extends Node3D

const AreaScene = preload ("./area.tscn")
const AreaNode = preload ("./area.gd")

var editing = false:
set(value):
editing = value

if is_node_ready() == false: return

for area in get_children():
area.edit = value

Store.house.save_local()

func _ready():
R.effect(func(_arg):
pass
Store.house.on_loaded.connect(func():
load_areas()
)

func load_areas():
var areas = Store.house.state.areas

# Remove all areas
for child in get_children():
remove_child(child)
child.queue_free()

print("Loading areas: ", areas)

for area in areas:
var area_scene = AreaScene.instantiate()
area_scene.id = area.id
area_scene.edit = editing
area_scene.name = area.name
add_child(area_scene)
area_scene.global_position = area.position
area_scene.global_rotation = area.rotation
area_scene.size = area.size

if HomeApi.has_integration() == false:
return

HomeApi.api.integration_handler.create_area.call_deferred(area.id, area.name)

func create_area(name: String):
var area = AreaScene.instantiate()
area.id = next_valid_id()
area.name = name
area.position = App.camera.global_position + App.camera.global_transform.basis.z * - 1
area.size = Vector3(0.5, 0.5, 0.5)
area.edit = true
add_child(area)

if HomeApi.has_integration() == false:
return

HomeApi.api.integration_handler.create_area.call_deferred(area.id, area.name)

func rename_area(id: int, name: String):
for area in get_children():
if area is AreaNode&&area.id == id:
area.name = name
area.save_to_store()
break

func next_valid_id():
var id = 0
for area in Store.house.state.areas:
if area.id > id:
id = area.id

return id + 1
15 changes: 15 additions & 0 deletions app/content/system/camera/camera.gd
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
extends XRCamera3D

@onready var area = $Area3D

var last_room = null

func _ready():
area.area_entered.connect(func(area: Area3D):
if HomeApi.has_integration() == false:
return
HomeApi.api.integration_handler.set_area_state(area.get_parent().id, true)
)

area.area_exited.connect(func(area: Area3D):
if HomeApi.has_integration() == false:
return
HomeApi.api.integration_handler.set_area_state(area.get_parent().id, false)
)

func _physics_process(_delta):
if HomeApi.has_integration():
update_room()
Expand Down
12 changes: 11 additions & 1 deletion app/content/system/camera/camera.tscn
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
[gd_scene load_steps=2 format=3 uid="uid://b2kjh1fpjptdr"]
[gd_scene load_steps=3 format=3 uid="uid://b2kjh1fpjptdr"]

[ext_resource type="Script" path="res://content/system/camera/camera.gd" id="1_gapgs"]

[sub_resource type="SphereShape3D" id="SphereShape3D_wsvuf"]
radius = 0.05

[node name="XRCamera3D" type="XRCamera3D"]
transform = Transform3D(0.999999, 0.00106283, -0.000420545, -0.00106267, 0.999999, 0.000379457, 0.000420948, -0.000378989, 1, 0.0356617, 0.71033, 0.00564247)
cull_mask = 524287
current = true
script = ExtResource("1_gapgs")

[node name="Area3D" type="Area3D" parent="."]
collision_layer = 32
collision_mask = 32

[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
shape = SubResource("SphereShape3D_wsvuf")
8 changes: 4 additions & 4 deletions app/content/ui/components/button/button.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
[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_a7u7t"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_63gmh"]
resource_local_to_scene = true
render_priority = 10
shader = ExtResource("2_db5by")
Expand All @@ -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_hyhj8"]
[sub_resource type="QuadMesh" id="QuadMesh_hn875"]
size = Vector2(0.04, 0.04)

[sub_resource type="BoxShape3D" id="BoxShape3D_xwopm"]
Expand All @@ -43,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_a7u7t")
mesh = SubResource("QuadMesh_hyhj8")
material_override = SubResource("ShaderMaterial_63gmh")
mesh = SubResource("QuadMesh_hn875")
skeleton = NodePath("../..")
script = ExtResource("3_skm86")
size = Vector2(0.04, 0.04)
Expand Down
17 changes: 15 additions & 2 deletions app/content/ui/menu/automate/automate_menu.gd
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
extends Node3D

@onready var background = $Background
@onready var add_button = $Interface/TabsContent3D/AreasMenu/AddButton
@onready var name_input = $Interface/TabsContent3D/AreasMenu/NameInput

func _ready():
background.visible = false

visibility_changed.connect(func():
if visible:
pass
App.areas.editing=visible
)

tree_entered.connect(func():
App.areas.editing=true
)

tree_exiting.connect(func():
App.areas.editing=false
)

add_button.on_button_up.connect(func():
App.areas.create_area(name_input.text)
)
9 changes: 7 additions & 2 deletions app/content/ui/menu/automate/automate_menu.tscn
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
[gd_scene load_steps=8 format=3 uid="uid://djv5mfv25g3et"]
[gd_scene load_steps=9 format=3 uid="uid://djv5mfv25g3et"]

[ext_resource type="Script" path="res://content/ui/menu/automate/automate_menu.gd" id="1_0piv0"]
[ext_resource type="Script" path="res://content/ui/components/tabs/tabs.gd" id="2_kdpx6"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="3_701lt"]
[ext_resource type="Script" path="res://content/ui/components/tabs/tabs_content.gd" id="4_7gwq5"]
[ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="5_r8hil"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="8_cd0o6"]

[sub_resource type="ShaderMaterial" id="ShaderMaterial_2asng"]
Expand Down Expand Up @@ -45,11 +46,15 @@ tabs = NodePath("../Tabs3D")

[node name="AreasMenu" type="Node3D" parent="Interface/TabsContent3D"]

[node name="Areas" parent="Interface/TabsContent3D/AreasMenu" instance=ExtResource("3_701lt")]
[node name="AddButton" parent="Interface/TabsContent3D/AreasMenu" instance=ExtResource("3_701lt")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.05, -0.29, 0)
label = "add"
icon = true

[node name="NameInput" parent="Interface/TabsContent3D/AreasMenu" instance=ExtResource("5_r8hil")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.16, -0.29, 0)
text = "MyArea"

[node name="Background" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 1.06581e-14, 0, -1.06581e-14, 1, 0.21, -0.16, 0)
material_override = SubResource("ShaderMaterial_2asng")
Expand Down
4 changes: 3 additions & 1 deletion app/lib/globals/main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ const Menu = preload ("res://content/ui/menu/menu.gd")
const Miniature = preload ("res://content/system/miniature/miniature.gd")
const ControllerLeft = preload ("res://content/system/controller_left/controller_left.gd")
const ControllerRight = preload ("res://content/system/controller_right/controller_right.gd")
const Areas = preload ("res://content/system/areas/areas.gd")

@onready var main: Main = get_node_or_null("/root/Main")
@onready var house: House = get_node_or_null("/root/Main/House")
@onready var menu: Menu = get_node_or_null("/root/Main/Menu")
@onready var camera: XRCamera3D = get_node_or_null("/root/Main/XROrigin3D/XRCamera3D")
@onready var miniature: Miniature = get_node_or_null("/root/Main/Miniature")
@onready var controller_left: ControllerLeft = get_node_or_null("/root/Main/XROrigin3D/XRControllerLeft")
@onready var controller_right: ControllerRight = get_node_or_null("/root/Main/XROrigin3D/XRControllerRight")
@onready var controller_right: ControllerRight = get_node_or_null("/root/Main/XROrigin3D/XRControllerRight")
@onready var areas: Areas = get_node_or_null("/root/Main/Areas")
Loading

0 comments on commit fc87909

Please sign in to comment.