Merge pull request #127 from Nitwel/improvements

Improvements & UI Update
This commit is contained in:
Nitwel 2024-04-26 14:54:05 +02:00 committed by GitHub
commit a75f79257f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
87 changed files with 1811 additions and 994 deletions

View File

@ -31,6 +31,8 @@ static func _bind_store(target, prop, store: RdotStore, key, watch_signal=null):
return _bind_state(target, prop, store._proxied_value[key], watch_signal) return _bind_state(target, prop, store._proxied_value[key], watch_signal)
static func _bind_state(target, prop, value, watch_signal=null): static func _bind_state(target, prop, value, watch_signal=null):
assert(state != null, "target cannot be null")
var graph = RdotGraph.getInstance() var graph = RdotGraph.getInstance()
var watch_c = func(new_value): var watch_c = func(new_value):

View File

@ -4,9 +4,9 @@ class_name RdotGraph
static var instance: RdotGraph = null static var instance: RdotGraph = null
static func getInstance() -> RdotGraph: static func getInstance() -> RdotGraph:
if instance == null: if instance == null:
instance = RdotGraph.new() instance = RdotGraph.new()
return instance return instance
var activeConsumer: RdotNode = null var activeConsumer: RdotNode = null
var inNotificationPhase := false var inNotificationPhase := false
@ -17,209 +17,209 @@ var postSignalSetFn := Callable()
var watcherPending := false var watcherPending := false
var watcher = R.Watcher.new(func(_arg): var watcher = R.Watcher.new(func(_arg):
if watcherPending: if watcherPending:
return return
watcherPending=true watcherPending=true
var endOfFrame=func(): var endOfFrame=func():
watcherPending=false watcherPending=false
for s in watcher.getPending(): for s in watcher.getPending():
s.do_get() s.do_get()
watcher.watch() watcher.watch()
endOfFrame.call_deferred() endOfFrame.call_deferred()
) )
func setActiveConsumer(consumer: RdotNode) -> RdotNode: func setActiveConsumer(consumer: RdotNode) -> RdotNode:
var prev = activeConsumer var prev = activeConsumer
activeConsumer = consumer activeConsumer = consumer
return prev return prev
func getActiveConsumer() -> RdotNode: func getActiveConsumer() -> RdotNode:
return activeConsumer return activeConsumer
func isInNotificationPhase() -> bool: func isInNotificationPhase() -> bool:
return inNotificationPhase return inNotificationPhase
func producerAccessed(node: RdotNode): func producerAccessed(node: RdotNode):
assert(inNotificationPhase == false, "Signal read during notification phase") assert(inNotificationPhase == false, "Signal read during notification phase")
if activeConsumer == null: if activeConsumer == null:
return return
if activeConsumer.consumerOnSignalRead.is_null() == false: if activeConsumer.consumerOnSignalRead.is_null() == false:
activeConsumer.consumerOnSignalRead.call(node) activeConsumer.consumerOnSignalRead.call(node)
var idx = activeConsumer.nextProducerIndex; var idx = activeConsumer.nextProducerIndex;
activeConsumer.nextProducerIndex += 1 activeConsumer.nextProducerIndex += 1
assertConsumerNode(activeConsumer) assertConsumerNode(activeConsumer)
if idx < activeConsumer.producerNode.size()&&activeConsumer.producerNode[idx] != node: if idx < activeConsumer.producerNode.size()&&activeConsumer.producerNode[idx] != node:
if consumerIsLive(activeConsumer): if consumerIsLive(activeConsumer):
var staleProducer = activeConsumer.producerNode[idx] var staleProducer = activeConsumer.producerNode[idx]
producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx]) producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx])
if RdotArray.do_get(activeConsumer.producerNode, idx) != node: if RdotArray.do_get(activeConsumer.producerNode, idx) != node:
RdotArray.do_set(activeConsumer.producerNode, idx, node) RdotArray.do_set(activeConsumer.producerNode, idx, node)
RdotArray.do_set(activeConsumer.producerIndexOfThis, idx, producerAddLiveConsumer(node, activeConsumer, idx) if consumerIsLive(activeConsumer) else 0) RdotArray.do_set(activeConsumer.producerIndexOfThis, idx, producerAddLiveConsumer(node, activeConsumer, idx) if consumerIsLive(activeConsumer) else 0)
RdotArray.do_set(activeConsumer.producerLastReadVersion, idx, node.version) RdotArray.do_set(activeConsumer.producerLastReadVersion, idx, node.version)
func producerIncrementEpoch(): func producerIncrementEpoch():
epoch += 1 epoch += 1
func producerUpdateValueVersion(node: RdotNode): func producerUpdateValueVersion(node: RdotNode):
if consumerIsLive(node)&&!node.dirty: if consumerIsLive(node)&&!node.dirty:
return return
if !node.dirty&&node.lastCleanEpoch == epoch: if !node.dirty&&node.lastCleanEpoch == epoch:
return return
if !node.producerMustRecompute(node)&&!consumerPollProducersForChange(node): if !node.producerMustRecompute(node)&&!consumerPollProducersForChange(node):
node.dirty = false; node.dirty = false;
node.lastCleanEpoch = epoch node.lastCleanEpoch = epoch
return return
if node.producerRecomputeValue.is_null() == false: if node.producerRecomputeValue.is_null() == false:
node.producerRecomputeValue.call(node) node.producerRecomputeValue.call(node)
node.dirty = false node.dirty = false
node.lastCleanEpoch = epoch node.lastCleanEpoch = epoch
func producerNotifyConsumers(node: RdotNode): func producerNotifyConsumers(node: RdotNode):
if node.liveConsumerNode == null: if node.liveConsumerNode == null:
return return
var prev = inNotificationPhase var prev = inNotificationPhase
inNotificationPhase = true inNotificationPhase = true
for consumer in node.liveConsumerNode: for consumer in node.liveConsumerNode:
if !consumer.dirty: if !consumer.dirty:
consumerMarkDirty(consumer) consumerMarkDirty(consumer)
inNotificationPhase = prev inNotificationPhase = prev
func producerUpdatesAllowed() -> bool: func producerUpdatesAllowed() -> bool:
return activeConsumer == null||activeConsumer.consumerAllowSignalWrites != false return activeConsumer == null||activeConsumer.consumerAllowSignalWrites != false
func consumerMarkDirty(node: RdotNode): func consumerMarkDirty(node: RdotNode):
node.dirty = true node.dirty = true
producerNotifyConsumers(node) producerNotifyConsumers(node)
if node.consumerMarkedDirty.is_null() == false: if node.consumerMarkedDirty.is_null() == false:
node.consumerMarkedDirty.call(node) node.consumerMarkedDirty.call(node)
func consumerBeforeComputation(node: RdotNode) -> RdotNode: func consumerBeforeComputation(node: RdotNode) -> RdotNode:
if node: if node:
node.nextProducerIndex = 0 node.nextProducerIndex = 0
return setActiveConsumer(node) return setActiveConsumer(node)
func consumerAfterComputation(node: RdotNode, prevConsumer: RdotNode): func consumerAfterComputation(node: RdotNode, prevConsumer: RdotNode):
setActiveConsumer(prevConsumer) setActiveConsumer(prevConsumer)
if node == null||node.producerNode == null||node.producerIndexOfThis == null||node.producerLastReadVersion == null: if node == null||node.producerNode == null||node.producerIndexOfThis == null||node.producerLastReadVersion == null:
return return
if consumerIsLive(node): if consumerIsLive(node):
for i in range(node.nextProducerIndex, node.producerNode.size()): for i in range(node.nextProducerIndex, node.producerNode.size()):
producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]) producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i])
while node.producerNode.size() > node.nextProducerIndex: while node.producerNode.size() > node.nextProducerIndex:
node.producerNode.pop_back() node.producerNode.pop_back()
node.producerLastReadVersion.pop_back() node.producerLastReadVersion.pop_back()
node.producerIndexOfThis.pop_back() node.producerIndexOfThis.pop_back()
func consumerPollProducersForChange(node: RdotNode) -> bool: func consumerPollProducersForChange(node: RdotNode) -> bool:
assertConsumerNode(node) assertConsumerNode(node)
for i in range(node.producerNode.size()): for i in range(node.producerNode.size()):
var producer = node.producerNode[i] var producer = node.producerNode[i]
var seenVersion = node.producerLastReadVersion[i] var seenVersion = node.producerLastReadVersion[i]
if seenVersion != producer.version: if seenVersion != producer.version:
return true return true
producerUpdateValueVersion(producer) producerUpdateValueVersion(producer)
if seenVersion != producer.version: if seenVersion != producer.version:
return true return true
return false return false
func consumerDestroy(node: RdotNode): func consumerDestroy(node: RdotNode):
assertConsumerNode(node) assertConsumerNode(node)
if consumerIsLive(node): if consumerIsLive(node):
for i in range(node.producerNode.size()): for i in range(node.producerNode.size()):
producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]) producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i])
node.producerNode.clear() node.producerNode.clear()
node.producerLastReadVersion.clear() node.producerLastReadVersion.clear()
node.producerIndexOfThis.clear() node.producerIndexOfThis.clear()
if node.liveConsumerNode: if node.liveConsumerNode:
node.liveConsumerNode.clear() node.liveConsumerNode.clear()
node.liveConsumerIndexOfThis.clear() node.liveConsumerIndexOfThis.clear()
static func producerAddLiveConsumer(node: RdotNode, consumer: RdotNode, indexOfThis: int) -> int: static func producerAddLiveConsumer(node: RdotNode, consumer: RdotNode, indexOfThis: int) -> int:
assertProducerNode(node) assertProducerNode(node)
assertConsumerNode(node) assertConsumerNode(node)
if node.liveConsumerNode.size() == 0: if node.liveConsumerNode.size() == 0:
if node.watched.is_null() == false: if node.watched.is_null() == false:
node.watched.call(node.wrapper) node.watched.call(node.wrapper)
for i in range(node.producerNode.size()): for i in range(node.producerNode.size()):
node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i) node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i)
node.liveConsumerIndexOfThis.push_back(indexOfThis) node.liveConsumerIndexOfThis.push_back(indexOfThis)
node.liveConsumerNode.push_back(consumer) node.liveConsumerNode.push_back(consumer)
return node.liveConsumerNode.size() - 1 return node.liveConsumerNode.size() - 1
static func producerRemoveLiveConsumerAtIndex(node: RdotNode, idx: int): static func producerRemoveLiveConsumerAtIndex(node: RdotNode, idx: int):
assertProducerNode(node) assertProducerNode(node)
assertConsumerNode(node) assertConsumerNode(node)
assert(idx < node.liveConsumerNode.size(), "active consumer index %s is out of bounds of %s consumers)" % [idx, node.liveConsumerNode.size()]) assert(idx < node.liveConsumerNode.size(), "active consumer index %s is out of bounds of %s consumers)" % [idx, node.liveConsumerNode.size()])
if node.liveConsumerNode.size() == 1: if node.liveConsumerNode.size() == 1:
if node.unwatched.is_null() == false: if node.unwatched.is_null() == false:
node.unwatched.call(node.wrapper) node.unwatched.call(node.wrapper)
for i in range(node.producerNode.size()): for i in range(node.producerNode.size()):
producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]) producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i])
var lastIdx = node.liveConsumerNode.size() - 1 var lastIdx = node.liveConsumerNode.size() - 1
node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx] node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx]
node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx] node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx]
node.liveConsumerNode.pop_back() node.liveConsumerNode.pop_back()
node.liveConsumerIndexOfThis.pop_back() node.liveConsumerIndexOfThis.pop_back()
if idx < node.liveConsumerNode.size(): if idx < node.liveConsumerNode.size():
var idxProducer = node.liveConsumerIndexOfThis[idx] var idxProducer = node.liveConsumerIndexOfThis[idx]
var consumer = node.liveConsumerNode[idx] var consumer = node.liveConsumerNode[idx]
assertConsumerNode(consumer) assertConsumerNode(consumer)
consumer.producerIndexOfThis[idxProducer] = idx consumer.producerIndexOfThis[idxProducer] = idx
static func consumerIsLive(node: RdotNode) -> bool: static func consumerIsLive(node: RdotNode) -> bool:
return node.consumerIsAlwaysLive||(node.liveConsumerNode != null&&node.liveConsumerNode.size() > 0) return node.consumerIsAlwaysLive||(node.liveConsumerNode != null&&node.liveConsumerNode.size() > 0)
static func assertConsumerNode(node: RdotNode): static func assertConsumerNode(node: RdotNode):
if node.producerNode == null: if node.producerNode == null:
node.producerNode = [] node.producerNode = []
if node.producerIndexOfThis == null: if node.producerIndexOfThis == null:
node.producerIndexOfThis = [] node.producerIndexOfThis = []
if node.producerLastReadVersion == null: if node.producerLastReadVersion == null:
node.producerLastReadVersion = [] node.producerLastReadVersion = []
static func assertProducerNode(node: RdotNode): static func assertProducerNode(node: RdotNode):
if node.liveConsumerNode == null: if node.liveConsumerNode == null:
node.liveConsumerNode = [] node.liveConsumerNode = []
if node.liveConsumerIndexOfThis == null: if node.liveConsumerIndexOfThis == null:
node.liveConsumerIndexOfThis = [] node.liveConsumerIndexOfThis = []

View File

@ -1,21 +1,17 @@
[gd_scene load_steps=6 format=3 uid="uid://c2j7nev6qx25s"] [gd_scene load_steps=5 format=3 uid="uid://c2j7nev6qx25s"]
[ext_resource type="Script" path="res://content/entities/button/button.gd" id="1_ja7lt"] [ext_resource type="Script" path="res://content/entities/button/button.gd" id="1_ja7lt"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_r4tef"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_r4tef"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="3_vrobf"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="3_vrobf"]
[ext_resource type="Script" path="res://content/functions/occludable.gd" id="4_7upxo"]
[sub_resource type="BoxShape3D" id="BoxShape3D_um5pa"] [sub_resource type="BoxShape3D" id="BoxShape3D_um5pa"]
size = Vector3(0.0700684, 0.011734, 0.0703125) size = Vector3(0.07, 0.07, 0.012)
[node name="Button" type="StaticBody3D"] [node name="Button" type="StaticBody3D"]
script = ExtResource("1_ja7lt") script = ExtResource("1_ja7lt")
[node name="Button" parent="." instance=ExtResource("1_r4tef")] [node name="Button" parent="." instance=ExtResource("1_r4tef")]
[node name="Occludable" type="Node" parent="."]
script = ExtResource("4_7upxo")
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("3_vrobf") script = ExtResource("3_vrobf")

View File

@ -1,8 +1,7 @@
[gd_scene load_steps=6 format=3 uid="uid://b0nq4wjfckxsa"] [gd_scene load_steps=5 format=3 uid="uid://b0nq4wjfckxsa"]
[ext_resource type="Script" path="res://content/entities/camera/camera.gd" id="1_htxq3"] [ext_resource type="Script" path="res://content/entities/camera/camera.gd" id="1_htxq3"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="2_e2u6o"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="2_e2u6o"]
[ext_resource type="Script" path="res://content/functions/occludable.gd" id="3_jheyx"]
[sub_resource type="QuadMesh" id="QuadMesh_830bv"] [sub_resource type="QuadMesh" id="QuadMesh_830bv"]
size = Vector2(0.15, 0.15) size = Vector2(0.15, 0.15)
@ -10,7 +9,7 @@ size = Vector2(0.15, 0.15)
[sub_resource type="BoxShape3D" id="BoxShape3D_te0pn"] [sub_resource type="BoxShape3D" id="BoxShape3D_te0pn"]
size = Vector3(0.15, 0.15, 0.01) size = Vector3(0.15, 0.15, 0.01)
[node name="Camera" type="StaticBody3D" ] [node name="Camera" type="StaticBody3D"]
script = ExtResource("1_htxq3") script = ExtResource("1_htxq3")
[node name="View" type="Sprite3D" parent="."] [node name="View" type="Sprite3D" parent="."]
@ -26,6 +25,3 @@ shape = SubResource("BoxShape3D_te0pn")
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("2_e2u6o") script = ExtResource("2_e2u6o")
[node name="Occludable" type="Node" parent="."]
script = ExtResource("3_jheyx")

View File

@ -15,9 +15,9 @@ const color_wheel_img := preload ("res://assets/canvas.png")
@onready var mode_before = $Modes/Previous @onready var mode_before = $Modes/Previous
@onready var mode_label = $Modes/Label @onready var mode_label = $Modes/Label
var state = true var active = R.state(false)
var brightness = 0 # 0-255 var brightness = R.state(0) # 0-255
var color = color_on var color = R.state(color_on)
var color_supported = false var color_supported = false
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
@ -26,7 +26,7 @@ func _ready():
icon.value = "lightbulb" icon.value = "lightbulb"
var stateInfo = await HomeApi.get_state(entity_id) var stateInfo = await HomeApi.get_state(entity_id)
set_state(stateInfo["state"] == "on", stateInfo["attributes"]) set_state(stateInfo)
if stateInfo.has("attributes")&&stateInfo["attributes"].has("effect_list")&&stateInfo["attributes"]["effect_list"].size() > 0: if stateInfo.has("attributes")&&stateInfo["attributes"].has("effect_list")&&stateInfo["attributes"]["effect_list"].size() > 0:
if stateInfo["attributes"].has("effect")&&stateInfo["attributes"]["effect"] != null: if stateInfo["attributes"].has("effect")&&stateInfo["attributes"]["effect"] != null:
@ -66,78 +66,64 @@ func _ready():
if delta.length() > 1: if delta.length() > 1:
delta=delta.normalized() delta=delta.normalized()
print("delta", delta) var picked_color=color_wheel_img.get_image().get_pixel((delta.x * 0.5 + 0.5) * 1000, (delta.y * 0.5 + 0.5) * 1000)
var color=color_wheel_img.get_image().get_pixel((delta.x * 0.5 + 0.5) * 1000, (delta.y * 0.5 + 0.5) * 1000) color_puck.material_override.albedo_color=picked_color
print("color", color)
color_puck.material_override.albedo_color=color
color_puck.position=Vector3(target_point.x, color_puck.position.y, target_point.z) color_puck.position=Vector3(target_point.x, color_puck.position.y, target_point.z)
var attributes={ var attributes={
"rgb_color": [int(color.r * 255), int(color.g * 255), int(color.b * 255)], "rgb_color": [int(picked_color.r * 255), int(picked_color.g * 255), int(picked_color.b * 255)],
} }
HomeApi.set_state(entity_id, "on", attributes) HomeApi.set_state(entity_id, "on", attributes)
set_state(state, attributes)
) )
color_supported = true color_supported = true
else: else:
remove_child(color_wheel) remove_child(color_wheel)
await HomeApi.watch_state(entity_id, func(new_state): await HomeApi.watch_state(entity_id, func(new_state):
if (new_state["state"] == "on") == state: set_state(new_state)
return
set_state(new_state["state"] == "on", new_state["attributes"])
) )
slider.on_value_changed.connect(func(new_value): slider.on_value_changed.connect(func(new_value):
var value=new_value / 100 * 255 var value=new_value / 100 * 255
HomeApi.set_state(entity_id, "on" if state else "off", {"brightness": int(value)}) HomeApi.set_state(entity_id, "on" if active.value else "off", {"brightness": int(value)})
set_state(state, {"brightness": value})
) )
func set_state(new_state: bool, attributes={}): func set_state(stateInfo):
if state == false&&new_state == false: if active.value == false&&stateInfo["state"] == "off":
return return
state = new_state var attributes = stateInfo["attributes"]
if attributes.has("brightness"): active.value = stateInfo["state"] == "on"
brightness = attributes["brightness"]
if attributes.has("brightness")&&attributes["brightness"] != null:
brightness.value = attributes["brightness"]
slider.value = attributes["brightness"] / 255.0 * 100
if attributes.has("rgb_color")&&attributes["rgb_color"] != null: if attributes.has("rgb_color")&&attributes["rgb_color"] != null:
color = Color(attributes["rgb_color"][0] / 255.0, attributes["rgb_color"][1] / 255.0, attributes["rgb_color"][2] / 255.0, 1) color.value = Color(attributes["rgb_color"][0] / 255.0, attributes["rgb_color"][1] / 255.0, attributes["rgb_color"][2] / 255.0, 1)
var tween = create_tween() var tween = create_tween()
var target_color = color_off var target_color = color_off
if state: if active.value:
if brightness == null: if brightness.value == null:
target_color = color if color_supported else color_on target_color = color.value if color_supported else color_on
else: else:
target_color = color_off.lerp(color if color_supported else color_on, brightness / 255.0) target_color = color_off.lerp(color.value if color_supported else color_on, brightness.value / 255.0)
icon_color.value = target_color icon_color.value = target_color
tween.tween_property(lightbulb, "material_override:albedo_color", target_color, 0.3) tween.tween_property(lightbulb, "material_override:albedo_color", target_color, 0.3)
func _on_click(event): func _on_click(event):
if event.target == self: if event.target == self:
var attributes = {} _toggle()
if !state&&brightness != null:
attributes["brightness"] = int(brightness)
HomeApi.set_state(entity_id, "on" if !state else "off", attributes)
set_state(!state, attributes)
func quick_action(): func quick_action():
var attributes = {} _toggle()
if !state&&brightness != null: func _toggle():
attributes["brightness"] = int(brightness) HomeApi.set_state(entity_id, "off" if active.value else "on")
HomeApi.set_state(entity_id, "on" if !state else "off", attributes)
set_state(!state, attributes)

View File

@ -1,9 +1,8 @@
[gd_scene load_steps=15 format=3 uid="uid://cw86rc42dv2d8"] [gd_scene load_steps=14 format=3 uid="uid://cw86rc42dv2d8"]
[ext_resource type="Script" path="res://content/entities/light/light.gd" id="1_ykxy3"] [ext_resource type="Script" path="res://content/entities/light/light.gd" id="1_ykxy3"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="4_4sfxb"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="4_4sfxb"]
[ext_resource type="Material" uid="uid://vce66e7sbc3n" path="res://content/entities/light/light_on.tres" id="5_50gph"] [ext_resource type="Material" uid="uid://vce66e7sbc3n" path="res://content/entities/light/light_on.tres" id="5_50gph"]
[ext_resource type="Script" path="res://content/functions/occludable.gd" id="5_oh4jg"]
[ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="6_mhjlm"] [ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="6_mhjlm"]
[ext_resource type="Texture2D" uid="uid://hy2f6is7qjyv" path="res://assets/canvas.png" id="7_ximu1"] [ext_resource type="Texture2D" uid="uid://hy2f6is7qjyv" path="res://assets/canvas.png" id="7_ximu1"]
[ext_resource type="Script" path="res://content/functions/clickable.gd" id="8_1sfll"] [ext_resource type="Script" path="res://content/functions/clickable.gd" id="8_1sfll"]
@ -37,9 +36,6 @@ script = ExtResource("1_ykxy3")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("SphereShape3D_ukj14") shape = SubResource("SphereShape3D_ukj14")
[node name="Occludable" type="Node" parent="."]
script = ExtResource("5_oh4jg")
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("4_4sfxb") script = ExtResource("4_4sfxb")
@ -59,11 +55,10 @@ height = 0.03
sides = 36 sides = 36
[node name="Slider" parent="." instance=ExtResource("6_mhjlm")] [node name="Slider" parent="." instance=ExtResource("6_mhjlm")]
transform = Transform3D(1.91069e-15, 4.37114e-08, 1, 1, -4.37114e-08, 0, 4.37114e-08, 1, -4.37114e-08, 0.08, 0, 0) transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0.08, 0, 0)
max = 100.0 max = 100.0
value = 100.0 value = 100.0
step = 1.0 step = 1.0
size = Vector3(10, 0.4, 1)
[node name="ColorWheel" type="StaticBody3D" parent="."] [node name="ColorWheel" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -0.15, 0, 0) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -0.15, 0, 0)
@ -95,12 +90,12 @@ mesh = SubResource("CylinderMesh_x68ys")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.11, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.11, 0)
[node name="Next" parent="Modes" instance=ExtResource("8_nhcff")] [node name="Next" parent="Modes" instance=ExtResource("8_nhcff")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -0.04, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.04, 0, 0)
label = "navigate_next" label = "navigate_next"
icon = true icon = true
[node name="Previous" parent="Modes" instance=ExtResource("8_nhcff")] [node name="Previous" parent="Modes" instance=ExtResource("8_nhcff")]
transform = Transform3D(1, 0, 0, 0, 2.98023e-08, -1, 0, 1, 2.98023e-08, -0.1, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.1, 0, 0)
label = "navigate_before" label = "navigate_before"
icon = true icon = true

View File

@ -2,5 +2,6 @@
[resource] [resource]
resource_local_to_scene = true resource_local_to_scene = true
albedo_color = Color(0.231373, 0.231373, 0.231373, 1)
emission = Color(1, 0.65098, 0, 1) emission = Color(1, 0.65098, 0, 1)
emission_energy_multiplier = 0.0 emission_energy_multiplier = 0.0

View File

@ -1,16 +1,15 @@
[gd_scene load_steps=8 format=3 uid="uid://dyktdg7ggiwl4"] [gd_scene load_steps=7 format=3 uid="uid://dyktdg7ggiwl4"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_8opk3"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_8opk3"]
[ext_resource type="Script" path="res://content/entities/media_player/media_player.gd" id="1_ame17"] [ext_resource type="Script" path="res://content/entities/media_player/media_player.gd" id="1_ame17"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="3_bguto"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="3_bguto"]
[ext_resource type="Script" path="res://content/functions/occludable.gd" id="4_fnfum"]
[ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="4_w73hw"] [ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="4_w73hw"]
[ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="5_koe28"] [ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="5_koe28"]
[sub_resource type="BoxShape3D" id="BoxShape3D_vi3eg"] [sub_resource type="BoxShape3D" id="BoxShape3D_vi3eg"]
size = Vector3(0.23, 0.142768, 0.01) size = Vector3(0.23, 0.142768, 0.01)
[node name="MediaPlayer" type="StaticBody3D" ] [node name="MediaPlayer" type="StaticBody3D"]
collision_mask = 0 collision_mask = 0
script = ExtResource("1_ame17") script = ExtResource("1_ame17")
@ -19,17 +18,17 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0364514, -0.01)
shape = SubResource("BoxShape3D_vi3eg") shape = SubResource("BoxShape3D_vi3eg")
[node name="Previous" parent="." instance=ExtResource("1_8opk3")] [node name="Previous" parent="." instance=ExtResource("1_8opk3")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -0.07, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.07, 0, 0)
label = "skip_previous" label = "skip_previous"
icon = true icon = true
[node name="Play" parent="." instance=ExtResource("1_8opk3")] [node name="Play" parent="." instance=ExtResource("1_8opk3")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -4.65661e-08, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.65661e-08, 0, 0)
label = "pause" label = "pause"
icon = true icon = true
[node name="Next" parent="." instance=ExtResource("1_8opk3")] [node name="Next" parent="." instance=ExtResource("1_8opk3")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0.07, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.07, 0, 0)
label = "skip_next" label = "skip_next"
icon = true icon = true
@ -60,20 +59,15 @@ pixel_size = 0.001
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("3_bguto") script = ExtResource("3_bguto")
[node name="Occludable" type="Node" parent="."]
script = ExtResource("4_fnfum")
[node name="Slider" parent="." instance=ExtResource("4_w73hw")] [node name="Slider" parent="." instance=ExtResource("4_w73hw")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, -0.0562844, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0562844, 0)
max = 100.0 max = 100.0
value = 30.0 value = 30.0
step = 1.0 step = 1.0
show_label = true
label_unit = "%" label_unit = "%"
size = Vector3(15, 0.4, 1)
[node name="Label3D" type="Label3D" parent="Slider"] [node name="Label3D" type="Label3D" parent="Slider"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.088399, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.088399, 0, 0.01)
pixel_size = 0.001 pixel_size = 0.001
text = "volume_up" text = "volume_up"
font = ExtResource("5_koe28") font = ExtResource("5_koe28")

View File

@ -1,20 +1,18 @@
[gd_scene load_steps=6 format=3 uid="uid://bbwedgq63bj84"] [gd_scene load_steps=5 format=3 uid="uid://bbwedgq63bj84"]
[ext_resource type="Script" path="res://content/entities/number/number.gd" id="1_26xwp"] [ext_resource type="Script" path="res://content/entities/number/number.gd" id="1_26xwp"]
[ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="2_sninv"] [ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="2_sninv"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="3_x8wda"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="3_x8wda"]
[ext_resource type="Script" path="res://content/functions/occludable.gd" id="4_3xwop"]
[sub_resource type="BoxShape3D" id="BoxShape3D_7mk8w"] [sub_resource type="BoxShape3D" id="BoxShape3D_7mk8w"]
size = Vector3(0.0390625, 0.114258, 0.0142822) size = Vector3(0.0390625, 0.150391, 0.0142822)
[node name="Number" type="StaticBody3D" ] [node name="Number" type="StaticBody3D"]
script = ExtResource("1_26xwp") script = ExtResource("1_26xwp")
[node name="Slider" parent="." instance=ExtResource("2_sninv")] [node name="Slider" parent="." instance=ExtResource("2_sninv")]
transform = Transform3D(8.74228e-08, 4.37114e-08, 1, 1, 4.37114e-08, -8.74228e-08, -4.37114e-08, 1, -4.37114e-08, 0, 0, 0) transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0, 0)
value = 0.0 value = 0.0
size = Vector3(20, 0.8, 2)
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.00762939) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.00762939)
@ -22,6 +20,3 @@ shape = SubResource("BoxShape3D_7mk8w")
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("3_x8wda") script = ExtResource("3_x8wda")
[node name="Occludable" type="Node" parent="."]
script = ExtResource("4_3xwop")

View File

@ -1,16 +1,15 @@
[gd_scene load_steps=7 format=3 uid="uid://xsiy71rsqulj"] [gd_scene load_steps=6 format=3 uid="uid://xsiy71rsqulj"]
[ext_resource type="Script" path="res://content/entities/sensor/sensor.gd" id="1_57ac8"] [ext_resource type="Script" path="res://content/entities/sensor/sensor.gd" id="1_57ac8"]
[ext_resource type="FontVariation" uid="uid://d2ofyimg5s65q" path="res://assets/fonts/ui_font_500.tres" id="2_4np3x"] [ext_resource type="FontVariation" uid="uid://d2ofyimg5s65q" path="res://assets/fonts/ui_font_500.tres" id="2_4np3x"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="2_fpq5q"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="2_fpq5q"]
[ext_resource type="Script" path="res://content/functions/occludable.gd" id="3_l3sp5"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="5_bmtkc"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="5_bmtkc"]
[sub_resource type="BoxShape3D" id="BoxShape3D_phuot"] [sub_resource type="BoxShape3D" id="BoxShape3D_phuot"]
resource_local_to_scene = true resource_local_to_scene = true
size = Vector3(0.18, 0.03, 0.02) size = Vector3(0.18, 0.03, 0.02)
[node name="Sensor" type="StaticBody3D" ] [node name="Sensor" type="StaticBody3D"]
collision_mask = 0 collision_mask = 0
script = ExtResource("1_57ac8") script = ExtResource("1_57ac8")
@ -28,11 +27,8 @@ font_size = 80
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("2_fpq5q") script = ExtResource("2_fpq5q")
[node name="Occludable" type="Node" parent="."]
script = ExtResource("3_l3sp5")
[node name="Button" parent="." instance=ExtResource("5_bmtkc")] [node name="Button" parent="." instance=ExtResource("5_bmtkc")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, -0.1, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.1, 0)
label = "add_chart" label = "add_chart"
icon = true icon = true

View File

@ -4,42 +4,35 @@ const Entity = preload ("../entity.gd")
@onready var sprite: AnimatedSprite3D = $Icon @onready var sprite: AnimatedSprite3D = $Icon
var active = R.state(false)
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
super() super()
var stateInfo = await HomeApi.get_state(entity_id) var stateInfo = await HomeApi.get_state(entity_id)
set_state(stateInfo)
await HomeApi.watch_state(entity_id, func(new_state):
set_state(new_state)
)
R.effect(func(_arg):
sprite.set_frame(1 if active.value else 0)
)
func set_state(stateInfo):
if stateInfo == null: if stateInfo == null:
return return
if stateInfo["state"] == "on": active.value = stateInfo["state"] == "on"
sprite.set_frame(0)
else:
sprite.set_frame(1)
icon.value = "toggle_" + stateInfo["state"] icon.value = "toggle_" + stateInfo["state"]
await HomeApi.watch_state(entity_id, func(new_state):
if new_state["state"] == "on":
sprite.set_frame(0)
else:
sprite.set_frame(1)
icon.value="toggle_" + new_state["state"]
)
func _on_click(_event): func _on_click(_event):
HomeApi.set_state(entity_id, "off" if sprite.get_frame() == 0 else "on") _toggle()
if sprite.get_frame() == 0:
sprite.set_frame(1)
else:
sprite.set_frame(0)
func _on_request_completed():
pass
func quick_action(): func quick_action():
HomeApi.set_state(entity_id, "off" if sprite.get_frame() == 0 else "on") _toggle()
if sprite.get_frame() == 0:
sprite.set_frame(1) func _toggle():
else: HomeApi.set_state(entity_id, "off" if active.value else "on")
sprite.set_frame(0)

View File

@ -1,10 +1,9 @@
[gd_scene load_steps=8 format=3 uid="uid://cscl5k7lhopj5"] [gd_scene load_steps=7 format=3 uid="uid://cscl5k7lhopj5"]
[ext_resource type="Script" path="res://content/entities/switch/switch.gd" id="1_8ffhi"] [ext_resource type="Script" path="res://content/entities/switch/switch.gd" id="1_8ffhi"]
[ext_resource type="Texture2D" uid="uid://br3p0c2foputg" path="res://assets/materials/swich_on.png" id="1_w68gw"] [ext_resource type="Texture2D" uid="uid://br3p0c2foputg" path="res://assets/materials/swich_on.png" id="1_w68gw"]
[ext_resource type="Texture2D" uid="uid://co2ishj2hx57p" path="res://assets/materials/switch_off.png" id="2_86ba1"] [ext_resource type="Texture2D" uid="uid://co2ishj2hx57p" path="res://assets/materials/switch_off.png" id="2_86ba1"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="4_6xr03"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="4_6xr03"]
[ext_resource type="Script" path="res://content/functions/occludable.gd" id="5_j5ucu"]
[sub_resource type="SphereShape3D" id="SphereShape3D_ukj14"] [sub_resource type="SphereShape3D" id="SphereShape3D_ukj14"]
radius = 0.0482081 radius = 0.0482081
@ -13,17 +12,17 @@ radius = 0.0482081
animations = [{ animations = [{
"frames": [{ "frames": [{
"duration": 1.0, "duration": 1.0,
"texture": ExtResource("1_w68gw") "texture": ExtResource("2_86ba1")
}, { }, {
"duration": 1.0, "duration": 1.0,
"texture": ExtResource("2_86ba1") "texture": ExtResource("1_w68gw")
}], }],
"loop": true, "loop": true,
"name": &"default", "name": &"default",
"speed": 5.0 "speed": 5.0
}] }]
[node name="Switch" type="StaticBody3D" ] [node name="Switch" type="StaticBody3D"]
collision_mask = 0 collision_mask = 0
script = ExtResource("1_8ffhi") script = ExtResource("1_8ffhi")
@ -37,6 +36,3 @@ sprite_frames = SubResource("SpriteFrames_ldpuo")
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("4_6xr03") script = ExtResource("4_6xr03")
[node name="Occludable" type="Node" parent="."]
script = ExtResource("5_j5ucu")

View File

@ -8,19 +8,32 @@ signal on_moved()
@export var restricted: bool = false @export var restricted: bool = false
@export var restrict_movement: Callable @export var restrict_movement: Callable
@export var lock_rotation: bool = false @export var lock_rotation: bool = false
@export var disabled: bool = false
var hit_node := Node3D.new() var hit_node := Node3D.new()
var initiator = null
func _on_grab_down(event: EventPointer): func _on_grab_down(event: EventPointer):
if restricted && event.target != get_parent(): if disabled:
return return
event.initiator.node.add_child(hit_node) if restricted&&event.target != get_parent():
return
initiator = event.initiator
if hit_node.get_parent() != null:
hit_node.get_parent().remove_child(hit_node)
initiator.node.add_child(hit_node)
hit_node.global_transform = get_parent().global_transform hit_node.global_transform = get_parent().global_transform
func _on_grab_move(_event: EventPointer): func _on_grab_move(event: EventPointer):
if hit_node.get_parent() == null: if hit_node.get_parent() == null:
return return
if event.initiator != initiator:
return
if restrict_movement: if restrict_movement:
get_parent().global_position = restrict_movement.call(hit_node.global_position) get_parent().global_position = restrict_movement.call(hit_node.global_position)
else: else:
@ -33,7 +46,14 @@ func _on_grab_move(_event: EventPointer):
on_move.emit(get_parent().global_position, Vector3(0, 0, 0)) on_move.emit(get_parent().global_position, Vector3(0, 0, 0))
func _on_grab_up(event: EventPointer): func _on_grab_up(event: EventPointer):
event.initiator.node.remove_child(hit_node) if event.initiator != initiator:
return
if hit_node.get_parent() == null:
return
initiator = null
hit_node.get_parent().remove_child(hit_node)
on_moved.emit() on_moved.emit()
func _get_configuration_warnings() -> PackedStringArray: func _get_configuration_warnings() -> PackedStringArray:
@ -42,5 +62,4 @@ func _get_configuration_warnings() -> PackedStringArray:
if get_parent() is StaticBody3D == false: if get_parent() is StaticBody3D == false:
warnings.append("Movable requires a StaticBody3D as parent.") warnings.append("Movable requires a StaticBody3D as parent.")
return warnings return warnings

View File

@ -1,20 +0,0 @@
extends Function
class_name Occludable
var ray := RayCast3D.new()
@onready var player_camera: XRCamera3D = get_node("/root/Main/XROrigin3D/XRCamera3D")
func _ready():
ray.set_collision_mask_value(1, false)
ray.set_collision_mask_value(5, true)
get_parent().add_child.call_deferred(ray)
EventSystem.on_slow_tick.connect(_slow_tick)
func _slow_tick(_delta):
if player_camera.is_inside_tree() == false||ray.is_inside_tree() == false:
return
ray.target_position = get_parent().to_local(player_camera.global_position)
get_parent().visible = ray.is_colliding() == false

View File

@ -18,13 +18,11 @@ sky_material = ExtResource("5_wgwf8")
[sub_resource type="Environment" id="Environment_7ghp0"] [sub_resource type="Environment" id="Environment_7ghp0"]
background_mode = 1 background_mode = 1
background_color = Color(1, 1, 1, 0) background_color = Color(0, 0, 0, 0)
background_energy_multiplier = 0.0 background_energy_multiplier = 0.0
sky = SubResource("Sky_vhymk") sky = SubResource("Sky_vhymk")
ambient_light_source = 2 ambient_light_source = 2
ambient_light_color = Color(1, 1, 1, 1) ambient_light_color = Color(1, 1, 1, 1)
ambient_light_energy = 0.5
reflected_light_source = 1
ssao_radius = 6.52 ssao_radius = 6.52
ssao_intensity = 5.68 ssao_intensity = 5.68
@ -43,7 +41,7 @@ script = ExtResource("1_uvrd4")
environment = SubResource("Environment_7ghp0") environment = SubResource("Environment_7ghp0")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.834925, -0.386727, -0.39159, 0.550364, 0.586681, 0.594058, 2.91038e-11, -0.711511, 0.702675, -2.91038e-10, 7.21041, 2.06458) transform = Transform3D(1, -2.51787e-05, 0.000567105, -0.000567105, 4.3985e-08, 1, -2.51784e-05, -1, 2.97105e-08, -4.65661e-10, 7.21041, 2.06458)
shadow_enabled = true shadow_enabled = true
[node name="XROrigin3D" type="XROrigin3D" parent="."] [node name="XROrigin3D" type="XROrigin3D" parent="."]
@ -76,16 +74,16 @@ min_camera_height = 0.01
xr_origin = NodePath("../XROrigin3D") xr_origin = NodePath("../XROrigin3D")
[node name="Menu" parent="." instance=ExtResource("8_du83w")] [node name="Menu" parent="." instance=ExtResource("8_du83w")]
transform = Transform3D(0.999998, -0.000514899, -6.55874e-05, 1.96975e-05, 0.163911, -0.986474, 0.000518685, 0.986474, 0.163911, -0.0165588, 0.796337, -0.634317) transform = Transform3D(0.999999, -1.39633e-11, 0, 1.60657e-10, 1, -4.54747e-13, 0, 0, 0.999999, -0.0165677, 0.766337, -0.634317)
[node name="Keyboard" parent="." instance=ExtResource("9_e5n3p")] [node name="Keyboard" parent="." instance=ExtResource("9_e5n3p")]
transform = Transform3D(0.499999, -0.000139169, -6.50204e-05, 5.24307e-05, 0.353553, -0.353553, 0.000144383, 0.353553, 0.353553, -0.0199266, 0.550784, -0.47368) transform = Transform3D(0.5, 5.24309e-05, 0.000144384, -0.000139169, 0.353553, 0.353553, -6.50204e-05, -0.353553, 0.353553, -0.0199266, 0.550784, -0.47368)
[node name="Rooms" type="Node3D" parent="."] [node name="Rooms" type="Node3D" parent="."]
[node name="House" parent="." instance=ExtResource("9_np6mw")] [node name="House" parent="." instance=ExtResource("9_np6mw")]
[node name="Onboarding" parent="." instance=ExtResource("12_uq2nj")] [node name="Onboarding" parent="." instance=ExtResource("12_uq2nj")]
transform = Transform3D(0.999999, -1.39632e-11, 0, 9.48097e-12, 0.999999, 0, 0, 0, 0.999999, -0.529594, 0.820154, -0.600147) transform = Transform3D(1, -1.39636e-11, 0, 4.42413e-11, 1, 0, 0, 0, 1, -0.576793, 0.820168, -0.60016)
[editable path="XROrigin3D/XRControllerLeft"] [editable path="XROrigin3D/XRControllerLeft"]

View File

@ -1,15 +0,0 @@
extends Node3D
@onready var menu_button = $Menu
@onready var mini_button = $Mini
@onready var clock = $Clock
@onready var main = $"/root/Main"
func _ready():
menu_button.on_button_down.connect(func():
main.toggle_menu()
)
mini_button.on_button_down.connect(func():
House.body.mini_view = !House.body.mini_view
)

View File

@ -1,23 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://bexxngoxcegul"]
[ext_resource type="Script" path="res://content/system/armband/armband.gd" id="1_4tskg"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_egcvm"]
[node name="Armband" type="Node3D"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
script = ExtResource("1_4tskg")
[node name="Menu" parent="." instance=ExtResource("1_egcvm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.04, 0, 0.04)
label = "menu"
icon = true
[node name="Mini" parent="." instance=ExtResource("1_egcvm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, 0, 0.04)
label = "view_comfy"
icon = true
[node name="Clock" type="Label3D" parent="."]
transform = Transform3D(1, 4.37114e-08, 4.37114e-08, -4.37114e-08, -4.37114e-08, 1, 4.37114e-08, -1, -4.37114e-08, 0, 0.02, -0.02)
pixel_size = 0.001
text = "10:00"

View File

@ -26,6 +26,10 @@ func _ready():
var index = AudioServer.get_bus_index("Record") var index = AudioServer.get_bus_index("Record")
effect = AudioServer.get_bus_effect(index, 0) effect = AudioServer.get_bus_effect(index, 0)
chat_assistant.visible = false
chat_user.visible = false
loader.visible = false
if !HomeApi.has_connected(): if !HomeApi.has_connected():
await HomeApi.on_connect await HomeApi.on_connect
@ -91,6 +95,9 @@ func finish():
loader.visible = false loader.visible = false
func _process(_delta): func _process(_delta):
if voice_assistant == null:
return
var sterioData: PackedVector2Array = effect.get_buffer(effect.get_frames_available()) var sterioData: PackedVector2Array = effect.get_buffer(effect.get_frames_available())
if sterioData.size() == 0: if sterioData.size() == 0:

View File

@ -119,3 +119,4 @@ libraries = {
} }
[node name="Raycast" parent="." instance=ExtResource("4_n7lao")] [node name="Raycast" parent="." instance=ExtResource("4_n7lao")]
is_right = false

View File

@ -34,7 +34,7 @@ func _ready():
) )
func _on_click(_event: EventPointer): func _on_click(_event: EventPointer):
if entity.has_method("quick_action"): if entity.has_method("quick_action")&&miniature.entity_select.selection_active() == false:
entity.quick_action() entity.quick_action()
else: else:
miniature.entity_select.toggle(entity) miniature.entity_select.toggle(entity)
@ -61,7 +61,7 @@ func _on_touch_move(_event: EventTouch):
func _on_touch_leave(_event: EventTouch): func _on_touch_leave(_event: EventTouch):
if touch_ran: return if touch_ran: return
if entity.has_method("quick_action"): if entity.has_method("quick_action")&&miniature.entity_select.selection_active() == false:
entity.quick_action() entity.quick_action()
else: else:
miniature.entity_select.toggle(entity) miniature.entity_select.toggle(entity)

View File

@ -17,10 +17,12 @@ const Miniature = preload ("res://content/system/house/mini/miniature.gd")
@onready var humidity_button = $XRHandLeft/Palm/QuickActions/Humidity @onready var humidity_button = $XRHandLeft/Palm/QuickActions/Humidity
@export var ray_left: RayCast3D @export var ray_left: RayCast3D
@export var ray_right: RayCast3D @export var ray_right: RayCast3D
var initiator: Initiator = Initiator.new() var left_initiator: Initiator = Initiator.new()
var right_initiator: Initiator = Initiator.new()
var touch: Touch var touch: Touch
var collide: Collide var collide: Collide
var pointer: Pointer var left_pointer: Pointer
var right_pointer: Pointer
var press_distance = 0.03 var press_distance = 0.03
var grip_distance = 0.03 var grip_distance = 0.03
var close_distance = 0.1 var close_distance = 0.1
@ -43,7 +45,7 @@ func _ready():
add_child(touch) add_child(touch)
add_child(collide) add_child(collide)
_ready_hand(hand_right) _ready_hand()
mini_view_button.on_button_up.connect(func(): mini_view_button.on_button_up.connect(func():
House.body.mini_view.small.value=!House.body.mini_view.small.value House.body.mini_view.small.value=!House.body.mini_view.small.value
@ -63,12 +65,18 @@ func _ready():
House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.HUMIDITY House.body.mini_view.heatmap_type.value=Miniature.HeatmapType.HUMIDITY
) )
func _ready_hand(hand: OpenXRHand): func _ready_hand():
initiator.type = Initiator.Type.HAND_RIGHT if hand == hand_right else Initiator.Type.HAND_LEFT left_initiator.type = Initiator.Type.HAND_LEFT
initiator.node = ray_left.get_parent() if hand == hand_left else ray_right.get_parent() left_initiator.node = ray_left.get_parent()
pointer = Pointer.new(initiator, ray_left if hand == hand_left else ray_right) left_pointer = Pointer.new(left_initiator, ray_left)
add_child(pointer) add_child(left_pointer)
right_initiator.type = Initiator.Type.HAND_RIGHT
right_initiator.node = ray_right.get_parent()
right_pointer = Pointer.new(right_initiator, ray_right)
add_child(right_pointer)
func _process(_delta): func _process(_delta):
if main.camera.global_transform.basis.z.dot(palm.global_transform.basis.y) > 0.85: if main.camera.global_transform.basis.z.dot(palm.global_transform.basis.y) > 0.85:
@ -86,6 +94,7 @@ func _process_hand(hand: OpenXRHand):
var middle_tip = hand.get_node("MiddleTip/Marker3D") var middle_tip = hand.get_node("MiddleTip/Marker3D")
var _ray = ray_left if hand == hand_left else ray_right var _ray = ray_left if hand == hand_left else ray_right
var initiator = left_initiator if hand == hand_left else right_initiator
var distance_trigger = index_tip.global_position.distance_to(thumb_tip.global_position) var distance_trigger = index_tip.global_position.distance_to(thumb_tip.global_position)
var distance_grab = middle_tip.global_position.distance_to(thumb_tip.global_position) var distance_grab = middle_tip.global_position.distance_to(thumb_tip.global_position)
@ -113,12 +122,12 @@ func _process_hand(hand: OpenXRHand):
initiator.on_release.emit(Initiator.EventType.GRIP) initiator.on_release.emit(Initiator.EventType.GRIP)
grabbed_left = false grabbed_left = false
else: else:
if trigger_close&&!grabbed_right: if trigger_close&&!grabbed_left:
initiator.on_press.emit(Initiator.EventType.GRIP) initiator.on_press.emit(Initiator.EventType.GRIP)
grabbed_right = true grabbed_left = true
elif !trigger_close&&grabbed_right: elif !trigger_close&&grabbed_left:
initiator.on_release.emit(Initiator.EventType.GRIP) initiator.on_release.emit(Initiator.EventType.GRIP)
grabbed_right = false grabbed_left = false
else: else:
if !distance_close: if !distance_close:
if trigger_close&&!pressed_right: if trigger_close&&!pressed_right:

View File

@ -84,7 +84,7 @@ shape = SubResource("CapsuleShape3D_dopke")
transform = Transform3D(-0.707107, -8.74228e-08, -0.707107, 6.18173e-08, -1, 6.18173e-08, -0.707107, -8.29045e-24, 0.707107, 0.01, -0.04, -5.58794e-09) transform = Transform3D(-0.707107, -8.74228e-08, -0.707107, 6.18173e-08, -1, 6.18173e-08, -0.707107, -8.29045e-24, 0.707107, 0.01, -0.04, -5.58794e-09)
[node name="QuickActions" type="Node3D" parent="XRHandLeft/Palm"] [node name="QuickActions" type="Node3D" parent="XRHandLeft/Palm"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0) transform = Transform3D(0.5, -4.47035e-08, -4.37114e-08, 4.37114e-08, -2.18557e-08, 0.5, -4.47035e-08, -0.5, -2.18557e-08, 0.005, 0, 0.005)
[node name="MiniView" parent="XRHandLeft/Palm/QuickActions" instance=ExtResource("3_te2p8")] [node name="MiniView" parent="XRHandLeft/Palm/QuickActions" instance=ExtResource("3_te2p8")]
transform = Transform3D(1, -3.55271e-15, -4.33681e-19, 3.55271e-15, 1, 3.5525e-15, -4.33681e-19, -3.55291e-15, 1, -0.0600001, 0, 0) transform = Transform3D(1, -3.55271e-15, -4.33681e-19, 3.55271e-15, 1, 3.5525e-15, -4.33681e-19, -3.55291e-15, 1, -0.0600001, 0, 0)

View File

@ -51,6 +51,9 @@ func update_align_reference():
corner1.global_position = Store.house.state.align_position1 corner1.global_position = Store.house.state.align_position1
corner2.global_position = Store.house.state.align_position2 corner2.global_position = Store.house.state.align_position2
if corner1.global_position == corner2.global_position:
corner2.global_position = corner1.global_position + Vector3(1, 0, 0)
corner2.look_at(corner1.global_position, Vector3.UP) corner2.look_at(corner1.global_position, Vector3.UP)
corner2.rotate(Vector3.UP, deg_to_rad( - 90)) corner2.rotate(Vector3.UP, deg_to_rad( - 90))

View File

@ -4,17 +4,20 @@ const DotScene = preload ("res://content/system/dot/dot.tscn")
const Entity = preload ("res://content/entities/entity.gd") const Entity = preload ("res://content/entities/entity.gd")
@onready var dots = $"../Small/Dots" @onready var dots = $"../Small/Dots"
@onready var main = $"/root/Main"
var active_type = null var active_type = null
var editing = R.state([]) var editing = R.state([])
var group_entity = null var group_entity = null
var house_small = null
func _ready(): func _ready():
await House.body.ready await House.body.ready
# Update Group Entity # Update Group Entity
R.effect(func(_arg): R.effect(func(_arg):
if editing.value.size() == 0: if house_small.value == false||editing.value.size() == 0:
if group_entity != null: if group_entity != null:
group_entity.queue_free() group_entity.queue_free()
group_entity=null group_entity=null
@ -23,7 +26,9 @@ func _ready():
group_entity=EntityFactory.create_entity(id, active_type) group_entity=EntityFactory.create_entity(id, active_type)
for entity_node in group_entity.get_children(): for entity_node in group_entity.get_children():
if entity_node is Movable: if entity_node is Movable:
group_entity.remove_child(entity_node) entity_node.disabled=true
group_entity.transform=Transform3D().looking_at(to_local((main.camera.global_position)), Vector3.UP, true)
add_child(group_entity) add_child(group_entity)
else: else:
HomeApi.groups.update_entities(group_entity.entity_id, editing.value.map(func(entity): return entity.entity_id)) HomeApi.groups.update_entities(group_entity.entity_id, editing.value.map(func(entity): return entity.entity_id))
@ -58,6 +63,9 @@ func _ready():
dots.add_child(dot) dots.add_child(dot)
) )
func selection_active():
return editing.value.size() > 0
func toggle(entity: Entity): func toggle(entity: Entity):
if active_type == null: if active_type == null:
active_type = entity.entity_id.split(".")[0] active_type = entity.entity_id.split(".")[0]

View File

@ -4,9 +4,11 @@
[ext_resource type="Texture2D" uid="uid://bbuq4wn7e5o2q" path="res://content/system/house/mini/temp_gradient.tres" id="2_3lwi8"] [ext_resource type="Texture2D" uid="uid://bbuq4wn7e5o2q" path="res://content/system/house/mini/temp_gradient.tres" id="2_3lwi8"]
[resource] [resource]
render_priority = 0 render_priority = 10
shader = ExtResource("1_sbr3e") shader = ExtResource("1_sbr3e")
shader_parameter/data = PackedFloat32Array() shader_parameter/data = PackedFloat32Array()
shader_parameter/data_size = 0 shader_parameter/data_size = 0
shader_parameter/alpha = 0.3 shader_parameter/alpha = 0.3
shader_parameter/roughness = 0.15
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/color_gradient = ExtResource("2_3lwi8") shader_parameter/color_gradient = ExtResource("2_3lwi8")

View File

@ -1,11 +1,14 @@
shader_type spatial; shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_disabled, diffuse_lambert, specular_schlick_ggx, unshaded; render_mode blend_mix, depth_draw_opaque, cull_disabled, diffuse_burley, specular_schlick_ggx, shadows_disabled;
uniform vec4 data[100]; uniform vec4 data[100];
uniform int data_size: hint_range(0, 100, 1); uniform int data_size: hint_range(0, 100, 1);
uniform float alpha: hint_range(0.0, 1.0, 0.1) = 0.3; uniform float alpha: hint_range(0.0, 1.0, 0.1) = 0.3;
uniform sampler2D color_gradient; uniform sampler2D color_gradient;
uniform float roughness : hint_range(0.0, 1.0) = 0.15;
uniform vec4 edge_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
varying vec3 color; varying vec3 color;
float simple_weight(int index, vec3 world_pos, float p) { float simple_weight(int index, vec3 world_pos, float p) {
@ -17,6 +20,12 @@ float sphere_weight(int index, vec3 world_pos, float r) {
return pow(max(0, r - dist) / (r * dist), 2); return pow(max(0, r - dist) / (r * dist), 2);
} }
float SchlickFresnel(float u) {
float m = 1.0 - u;
float m2 = m * m;
return m2 * m2 * m;
}
void vertex() { void vertex() {
color = vec3(1.0, 1.0, 1.0); color = vec3(1.0, 1.0, 1.0);
@ -60,4 +69,15 @@ void vertex() {
void fragment() { void fragment() {
ALBEDO = vec3(color.xyz); ALBEDO = vec3(color.xyz);
ALPHA = alpha; ALPHA = alpha;
float VdotN = dot(VIEW, NORMAL);
float fresnel = clamp(SchlickFresnel(VdotN), 0.0, 1.0);
// apply glass look
float a = mix(0.001, 1.0, ALPHA);
ALPHA = mix(fresnel * edge_color.a, 1.0, a);
ALBEDO = mix(edge_color.rgb * edge_color.a, ALBEDO, a);
ROUGHNESS = roughness;
SPECULAR = 0.5 * inversesqrt(ALPHA);
DEPTH = FRAGCOORD.z - 0.00001;
} }

View File

@ -9,7 +9,6 @@ const temperature_gradient = preload ("./temp_gradient.tres")
@onready var small_node = $Body/Small @onready var small_node = $Body/Small
@onready var model = $Body/Small/Model @onready var model = $Body/Small/Model
@onready var collision_shape = $Body/CollisionShape3D @onready var collision_shape = $Body/CollisionShape3D
@onready var toggle_heatmap = $Body/HeatmapButton
@onready var entity_select = $Body/EntitySelect @onready var entity_select = $Body/EntitySelect
enum HeatmapType { enum HeatmapType {
@ -38,6 +37,8 @@ func _ready():
wall_material.set_shader_parameter("data", []) wall_material.set_shader_parameter("data", [])
wall_material.set_shader_parameter("data_size", 0) wall_material.set_shader_parameter("data_size", 0)
entity_select.house_small = small
if Store.house.is_loaded() == false: if Store.house.is_loaded() == false:
await Store.house.on_loaded await Store.house.on_loaded

View File

@ -13,6 +13,7 @@ script = ExtResource("1_b53yn")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Body"] [node name="CollisionShape3D" type="CollisionShape3D" parent="Body"]
shape = SubResource("BoxShape3D_bckw3") shape = SubResource("BoxShape3D_bckw3")
disabled = true
[node name="Movable" type="Node" parent="Body"] [node name="Movable" type="Node" parent="Body"]
script = ExtResource("2_x7oed") script = ExtResource("2_x7oed")

View File

@ -1,7 +1,8 @@
[gd_scene load_steps=8 format=3 uid="uid://bswgmclohuqui"] [gd_scene load_steps=9 format=3 uid="uid://bswgmclohuqui"]
[ext_resource type="Script" path="res://content/system/house/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/house/room/wall.tres" id="3_w4vos"]
[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/house/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/house/room/states/edit.gd" id="7_ap14h"] [ext_resource type="Script" path="res://content/system/house/room/states/edit.gd" id="7_ap14h"]
@ -25,8 +26,10 @@ shape = SubResource("WorldBoundaryShape3D_08sv0")
script = ExtResource("1_ugebq") script = ExtResource("1_ugebq")
[node name="WallMesh" type="MeshInstance3D" parent="."] [node name="WallMesh" type="MeshInstance3D" parent="."]
material_override = ExtResource("3_w4vos")
[node name="CeilingMesh" type="MeshInstance3D" parent="."] [node name="CeilingMesh" type="MeshInstance3D" parent="."]
material_override = ExtResource("3_w4vos")
[node name="WallCollision" type="StaticBody3D" parent="."] [node name="WallCollision" type="StaticBody3D" parent="."]
collision_layer = 24 collision_layer = 24

View File

@ -8,9 +8,6 @@ func _on_enter():
if room_store == null||room_store.corners.size() < 3: if room_store == null||room_store.corners.size() < 3:
return return
room.wall_mesh.visible = false
room.ceiling_mesh.visible = false
room.wall_mesh.mesh = Room.generate_wall_mesh(room_store) room.wall_mesh.mesh = Room.generate_wall_mesh(room_store)
if room.wall_mesh.mesh == null: if room.wall_mesh.mesh == null:
@ -38,3 +35,5 @@ func _on_leave():
room.room_floor.get_node("CollisionShape3D").disabled = true room.room_floor.get_node("CollisionShape3D").disabled = true
room.wall_collision.shape = null room.wall_collision.shape = null
room.wall_mesh.mesh = null
room.ceiling_mesh.mesh = null

View File

@ -1,6 +1,8 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://bbx6fv7jq50tr"] [gd_resource type="StandardMaterial3D" format=3 uid="uid://bbx6fv7jq50tr"]
[resource] [resource]
transparency = 1 render_priority = -100
blend_mode = 2
cull_mode = 2 cull_mode = 2
albedo_color = Color(1, 1, 1, 0) depth_draw_mode = 1
shading_mode = 0

View File

@ -71,6 +71,7 @@ func create_key(key: Key):
var key_node = button_scene.instantiate() var key_node = button_scene.instantiate()
key_node.label = EventKey.key_to_string(key, caps) key_node.label = EventKey.key_to_string(key, caps)
key_node.size = Vector3(0.05, 0.05, 0.01)
key_node.focusable = false key_node.focusable = false
key_node.font_size = 32 key_node.font_size = 32
key_node.echo = true key_node.echo = true

View File

@ -4,60 +4,72 @@
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_xdpwr"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_xdpwr"]
[ext_resource type="Script" path="res://content/ui/components/grid_container/grid_container.gd" id="3_mx544"] [ext_resource type="Script" path="res://content/ui/components/grid_container/grid_container.gd" id="3_mx544"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="4_86fct"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="4_86fct"]
[ext_resource type="Material" uid="uid://bnwimm214q67g" path="res://assets/materials/sec-500.material" id="5_8c8rc"] [ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="5_0dbg6"]
[ext_resource type="Script" path="res://content/functions/occludable.gd" id="6_y4sdl"]
[sub_resource type="BoxShape3D" id="BoxShape3D_k5ib7"] [sub_resource type="BoxShape3D" id="BoxShape3D_k5ib7"]
size = Vector3(0.79, 0.01, 0.26) size = Vector3(0.86, 0.27, 0.02)
[sub_resource type="BoxMesh" id="BoxMesh_7rntc"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_x72nd"]
size = Vector3(0.79, 0.01, 0.26) render_priority = 19
shader = ExtResource("5_0dbg6")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.86, 0.27)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_88pdc"]
size = Vector2(0.86, 0.27)
[node name="Keyboard" type="StaticBody3D" groups=["ui_focus_stop"]] [node name="Keyboard" type="StaticBody3D" groups=["ui_focus_stop"]]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0) transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
collision_layer = 2 collision_layer = 6
collision_mask = 2 collision_mask = 0
script = ExtResource("1_maojw") script = ExtResource("1_maojw")
[node name="Backspace" parent="." instance=ExtResource("1_xdpwr")] [node name="Backspace" parent="." instance=ExtResource("1_xdpwr")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.349964, 0, -0.0700361) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.38, 0.09, 0)
focusable = false focusable = false
label = "backspace" label = "backspace"
icon = true icon = true
echo = true echo = true
size = Vector3(0.05, 0.05, 0.01)
metadata/key = 4194308 metadata/key = 4194308
[node name="Caps" parent="." instance=ExtResource("1_xdpwr")] [node name="Caps" parent="." instance=ExtResource("1_xdpwr")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.370036, 0, 0.059964) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.39, -0.03, 0)
focusable = false focusable = false
label = "keyboard_capslock" label = "keyboard_capslock"
icon = true icon = true
toggleable = true toggleable = true
size = Vector3(0.05, 0.05, 0.01)
[node name="Paste" parent="." instance=ExtResource("1_xdpwr")] [node name="Paste" parent="." instance=ExtResource("1_xdpwr")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.349964, 0, 0.089964) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.38, -0.09, 0)
focusable = false focusable = false
label = "assignment" label = "assignment"
icon = true icon = true
size = Vector3(0.05, 0.05, 0.01)
[node name="Keys" type="Node3D" parent="."] [node name="Keys" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.310036, 0, -0.090036) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.325, 0.09, 0)
script = ExtResource("3_mx544") script = ExtResource("3_mx544")
columns = 11 columns = 11
depth_gap = 0.06 gaps = Vector2(0.01, 0.01)
size = Vector3(0.6, 1, 1) size = Vector3(0.6, 0.15, 1)
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("4_86fct") script = ExtResource("4_86fct")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0093171, -0.009645, 0.00284005) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.01)
shape = SubResource("BoxShape3D_k5ib7") shape = SubResource("BoxShape3D_k5ib7")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."] [node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0093171, -0.009645, 0.00284005) material_override = SubResource("ShaderMaterial_x72nd")
material_override = ExtResource("5_8c8rc") mesh = SubResource("QuadMesh_88pdc")
mesh = SubResource("BoxMesh_7rntc")
[node name="Occludable" type="Node" parent="."]
script = ExtResource("6_y4sdl")

View File

@ -31,6 +31,7 @@ lower_fade = 0.000919435
[node name="CursorSprite" type="Sprite3D" parent="Cursor"] [node name="CursorSprite" type="Sprite3D" parent="Cursor"]
transform = Transform3D(0.03, 2.71051e-20, 0, -5.42101e-20, 0.03, -2.03288e-21, -2.46521e-33, 2.5411e-21, 0.03, 0, 0, 0) transform = Transform3D(0.03, 2.71051e-20, 0, -5.42101e-20, 0.03, -2.03288e-21, -2.46521e-33, 2.5411e-21, 0.03, 0, 0, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 90
texture = ExtResource("1_2f2iv") texture = ExtResource("1_2f2iv")
[node name="Ray" type="MeshInstance3D" parent="."] [node name="Ray" type="MeshInstance3D" parent="."]

View File

@ -1,6 +1,6 @@
@tool @tool
extends Node3D extends Container3D
class_name Button3D class_name Button3D
signal on_button_down() signal on_button_down()
@ -12,8 +12,13 @@ const ECHO_WAIT_INITIAL = 0.5
const ECHO_WAIT_REPEAT = 0.1 const ECHO_WAIT_REPEAT = 0.1
@onready var body: StaticBody3D = $Body @onready var body: StaticBody3D = $Body
@onready var panel: Panel3D = $Body/Panel3D
@onready var collision: CollisionShape3D = $Body/CollisionShape3D
@onready var label_node: Label3D = $Body/Label @onready var label_node: Label3D = $Body/Label
@onready var finger_area: Area3D = $FingerArea @onready var finger_area: Area3D = $FingerArea
@onready var finger_area_collision: CollisionShape3D = $FingerArea/CollisionShape3D
@onready var touch_collision: CollisionShape3D = $TouchBody/CollisionShape3D
@onready var touch: StaticBody3D = $TouchBody
@export var focusable: bool = true: @export var focusable: bool = true:
set(value): set(value):
@ -42,19 +47,26 @@ const ECHO_WAIT_REPEAT = 0.1
if icon: if icon:
label_node.font = IconFont label_node.font = IconFont
label_node.font_size = 36 label_node.font_size = size.x / 0.05 * 36
label_node.width = 1000 label_node.width = 1000
label_node.autowrap_mode = TextServer.AUTOWRAP_OFF label_node.autowrap_mode = TextServer.AUTOWRAP_OFF
else: else:
label_node.font = null label_node.font = null
label_node.font_size = font_size label_node.font_size = font_size
label_node.width = 50 label_node.width = size.x / label_node.pixel_size
label_node.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART label_node.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
@export var toggleable: bool = false @export var toggleable: bool = false
@export var disabled: bool = false @export var disabled: bool = false
@export var echo: bool = false @export var echo: bool = false
@export var initial_active: bool = false @export var initial_active: bool = false:
set(value):
if initial_active == value:
return
initial_active = value
if !is_inside_tree(): return
update_animation(1.0 if initial_active else 0.0)
var active: bool = false: var active: bool = false:
set(value): set(value):
@ -64,6 +76,7 @@ var active: bool = false:
on_toggled.emit(value) on_toggled.emit(value)
active = value active = value
if !is_inside_tree(): return if !is_inside_tree(): return
panel.active = active
update_animation(1.0 if active else 0.0) update_animation(1.0 if active else 0.0)
var echo_timer: Timer = null var echo_timer: Timer = null
@ -72,6 +85,8 @@ func _ready():
if initial_active: if initial_active:
active = true active = true
_update()
Update.props(self, ["active", "external_value", "icon", "label", "font_size", "disabled"]) Update.props(self, ["active", "external_value", "icon", "label", "font_size", "disabled"])
if echo: if echo:
@ -92,8 +107,8 @@ func update_animation(value: float):
var tween = create_tween() var tween = create_tween()
tween.set_parallel(true) tween.set_parallel(true)
tween.tween_property(body, "scale:y", lerpf(1.0, 0.5, value), 0.2) tween.tween_property(body, "scale:z", lerpf(1.0, 0.5, value), 0.2)
tween.tween_property(body, "position:y", lerpf(0.01, 0.005, value), 0.2) tween.tween_property(body, "position:z", lerpf(size.z / 2, size.z / 4, value), 0.2)
func _on_press_down(event): func _on_press_down(event):
if disabled: if disabled:
@ -131,6 +146,15 @@ func _on_press_up(event):
active = false active = false
on_button_up.emit() on_button_up.emit()
func _on_ray_enter(_event: EventPointer):
if disabled:
return
panel.hovering = true
func _on_ray_leave(_event: EventPointer):
panel.hovering = false
func _on_touch_enter(event: EventTouch): func _on_touch_enter(event: EventTouch):
if event.target != finger_area: if event.target != finger_area:
return return
@ -181,12 +205,25 @@ func _touch_change(event: EventTouch):
var pos = Vector3(0, 1, 0) var pos = Vector3(0, 1, 0)
for finger in event.fingers: for finger in event.fingers:
var finger_pos = to_local(finger.area.global_position) var finger_pos = to_local(finger.area.global_position)
if pos.y > finger_pos.y: if pos.z > finger_pos.z:
pos = finger_pos pos = finger_pos
var button_height = 0.2 var button_height = 0.2
var button_center = 0.1 var button_center = 0.1
var percent = clamp((button_center + button_height / 2 - pos.y) / (button_height / 2), 0, 1) var percent = clamp((button_center + button_height / 2 - pos.z) / (button_height / 2), 0, 1)
update_animation(percent) update_animation(percent)
func _update():
body.position = Vector3(0, 0, size.z / 2)
finger_area.position = Vector3(0, 0, -0.015)
touch.position = Vector3(0, 0, size.z / 2)
panel.size = Vector2(size.x, size.y)
panel.position = Vector3(0, 0, size.z / 2)
collision.shape.size = Vector3(size.x, size.y, size.z)
label_node.width = size.x / label_node.pixel_size
label_node.position = Vector3(0, 0, size.z / 2 + 0.001)
finger_area_collision.shape.size = Vector3(size.x, size.y, 0.03)

View File

@ -1,59 +1,80 @@
[gd_scene load_steps=7 format=3 uid="uid://bsjqdvkt0u87c"] [gd_scene load_steps=8 format=3 uid="uid://bsjqdvkt0u87c"]
[ext_resource type="Script" path="res://content/ui/components/button/button.gd" id="1_74x7g"] [ext_resource type="Script" path="res://content/ui/components/button/button.gd" id="1_74x7g"]
[ext_resource type="ArrayMesh" uid="uid://iv4lk77axlk4" path="res://assets/immersive_home/button.obj" id="2_cve3l"] [ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="2_db5by"]
[ext_resource type="Material" uid="uid://bujy3egn1oqac" path="res://assets/materials/pri-500.material" id="2_wx7av"] [ext_resource type="Script" path="res://content/ui/components/panel/panel.gd" id="3_skm86"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_tulmb"]
resource_local_to_scene = true
render_priority = 10
shader = ExtResource("2_db5by")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(1, 1)
shader_parameter/border_size = 0.01
shader_parameter/border_fade_in = 0.05
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.2
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_hvywi"]
size = Vector2(0.04, 0.04)
[sub_resource type="BoxShape3D" id="BoxShape3D_xwopm"] [sub_resource type="BoxShape3D" id="BoxShape3D_xwopm"]
size = Vector3(0.05, 0.02, 0.05) resource_local_to_scene = true
size = Vector3(0.04, 0.04, 0.01)
[sub_resource type="BoxShape3D" id="BoxShape3D_bqjii"] [sub_resource type="BoxShape3D" id="BoxShape3D_bqjii"]
size = Vector3(0.0501598, 0.0390937, 0.0501598) resource_local_to_scene = true
size = Vector3(0.04, 0.04, 0.03)
[sub_resource type="BoxShape3D" id="BoxShape3D_vkbuh"]
size = Vector3(0.05, 0.03, 0.05)
[node name="Button" type="Node3D" groups=["ui_focus"]] [node name="Button" type="Node3D" groups=["ui_focus"]]
script = ExtResource("1_74x7g") script = ExtResource("1_74x7g")
label = "Example Text" label = "Example Text"
size = Vector3(0.04, 0.04, 0.01)
[node name="Body" type="StaticBody3D" parent="." groups=["ui_focus_skip"]] [node name="Body" type="StaticBody3D" parent="." groups=["ui_focus_skip"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.01, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.005)
collision_layer = 2 collision_layer = 2
collision_mask = 0 collision_mask = 0
[node name="MeshInstance3D" type="MeshInstance3D" parent="Body"] [node name="Panel3D" type="MeshInstance3D" parent="Body"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.005, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.005)
material_override = ExtResource("2_wx7av") material_override = SubResource("ShaderMaterial_tulmb")
mesh = ExtResource("2_cve3l") mesh = SubResource("QuadMesh_hvywi")
skeleton = NodePath("../..") skeleton = NodePath("../..")
script = ExtResource("3_skm86")
size = Vector2(0.04, 0.04)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Body"] [node name="CollisionShape3D" type="CollisionShape3D" parent="Body"]
shape = SubResource("BoxShape3D_xwopm") shape = SubResource("BoxShape3D_xwopm")
[node name="Label" type="Label3D" parent="Body"] [node name="Label" type="Label3D" parent="Body"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.0107199, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.006)
pixel_size = 0.001 pixel_size = 0.001
double_sided = false
render_priority = 30
text = "Example Text" text = "Example Text"
font_size = 10 font_size = 10
outline_size = 0 outline_size = 0
autowrap_mode = 3 autowrap_mode = 3
width = 50.0 width = 40.0
[node name="FingerArea" type="Area3D" parent="."] [node name="FingerArea" type="Area3D" parent="." groups=["ui_focus_skip"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0101447, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.015)
collision_layer = 4 collision_layer = 4
collision_mask = 0 collision_mask = 0
monitoring = false monitoring = false
[node name="CollisionShape3D" type="CollisionShape3D" parent="FingerArea"] [node name="CollisionShape3D" type="CollisionShape3D" parent="FingerArea"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.00975001, 0)
shape = SubResource("BoxShape3D_bqjii") shape = SubResource("BoxShape3D_bqjii")
[node name="TouchBody" type="StaticBody3D" parent="."] [node name="TouchBody" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.005)
collision_layer = 4 collision_layer = 4
collision_mask = 0 collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="TouchBody"] [node name="CollisionShape3D" type="CollisionShape3D" parent="TouchBody"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.005, 0) shape = SubResource("BoxShape3D_xwopm")
shape = SubResource("BoxShape3D_vkbuh")

View File

@ -1,15 +1,18 @@
@tool
extends Node3D extends Node3D
class_name Container3D class_name Container3D
@export var size := Vector3(1.0, 1.0, 1.0) : @export var size := Vector3(1.0, 1.0, 1.0):
set(value): set(value):
size = value size = Vector3(max(0, value.x), max(0, value.y), max(0, value.z))
_update_container()
@export var padding: Vector4 = Vector4(0, 0, 0, 0) : if !is_inside_tree(): return
set(value):
padding = value
_update_container()
func _update_container(): _update()
func _ready():
_update()
func _update():
pass pass

View File

@ -0,0 +1,100 @@
@tool
extends Container3D
class_name FlexContainer3D
enum Justification {
START,
CENTER,
END,
SPACE_BETWEEN,
SPACE_AROUND,
SPACE_EVENLY,
}
@export var justification: Justification = Justification.START:
set(value):
justification = value
_update()
@export var vertical: bool = false:
set(value):
vertical = value
_update()
@export var gap: float = 0.0:
set(value):
gap = value
_update()
func _ready():
_update()
func _update():
var width = size.y if vertical else size.x
var children_size := Vector2(0, 0)
var child_count = 0
for child in get_children():
if child is Container3D == false:
continue
if vertical:
children_size.x = max(child.size.x, children_size.x)
children_size.y += child.size.y + gap
else:
children_size.x += child.size.x + gap
children_size.y = max(child.size.y, children_size.y)
child_count += 1
if child_count == 0:
return
var children_scale = Vector2(size.x, size.y) / children_size
children_size.clamp(Vector2(0, 0), Vector2(size.x, size.y))
children_scale = children_scale.clamp(Vector2(0.001, 0.001), Vector2(1, 1))
var offset = 0.0
var children_width = children_size.y if vertical else children_size.x
match justification:
Justification.START:
offset = 0.0
Justification.CENTER:
offset = (width - children_width) / 2.0
Justification.END:
offset = width - children_width
Justification.SPACE_BETWEEN:
offset = 0.0
Justification.SPACE_AROUND:
offset = (width - children_width) / child_count / 2.0
Justification.SPACE_EVENLY:
offset = (width - children_width) / (child_count + 1)
for child in get_children():
if child is Container3D == false:
continue
child.scale = Vector3(children_scale.x, children_scale.y, 1)
if vertical:
var child_width = child.size.y * children_scale.y
child.position = Vector3(0, -offset - child_width / 2.0, 0)
offset += child.size.y * children_scale.y
else:
var child_width = child.size.x * children_scale.x
child.position = Vector3(offset + child_width / 2.0, 0, 0)
offset += child.size.x * children_scale.x
match justification:
Justification.START, Justification.CENTER, Justification.END:
offset += gap
Justification.SPACE_BETWEEN:
offset += (width - children_width) / (child_count - 1)
Justification.SPACE_AROUND:
offset += (width - children_width) / child_count
Justification.SPACE_EVENLY:
offset += (width - children_width) / (child_count + 1)

View File

@ -2,41 +2,46 @@
extends Container3D extends Container3D
class_name GridContainer3D class_name GridContainer3D
@export var columns := 5:
@export var columns := 5 :
set(value): set(value):
columns = value columns = value
_update_container() _update()
@export var rows := 1 : @export var gaps := Vector2(0, 0):
set(value): set(value):
rows = value gaps = value
_update_container() _update()
@export var depth_gap := 1.0 :
set(value):
depth_gap = value
_update_container()
func _ready(): func _ready():
_update_container() _update()
func get_gaps() -> Vector3: child_entered_tree.connect(func(_arg):
return Vector3( _update()
(float(size.x) / (columns - 1 )) if columns != 1 else 0.0,
(float(size.y) / (rows - 1)) if rows != 1 else 0.0,
depth_gap
) )
child_exiting_tree.connect(func(_arg):
_update()
)
func _update_container(): child_order_changed.connect(func():
var i := 0 _update()
var gaps := get_gaps() )
func _update():
var column := 0
var row_pos := 0.0
var column_max_height := 0.0
for child in get_children(): for child in get_children():
var x := (i % columns) * gaps.x if child is Container3D == false:
var y := ((i / columns) % rows) * gaps.y continue
var z := (i / (columns * rows)) * gaps.z
column_max_height = max(column_max_height, child.size.y)
child.position = Vector3(column * ((size.x / columns) + gaps.x), row_pos, 0)
column += 1
if column >= columns:
column = 0
row_pos -= column_max_height + gaps.y
child.set_position(Vector3(x, -y, z))
i += 1

View File

@ -1,24 +1,15 @@
@tool @tool
extends StaticBody3D extends Container3D
class_name Input3D class_name Input3D
var text_handler = preload ("res://content/ui/components/input/text_handler.gd").new() var text_handler = preload ("res://content/ui/components/input/text_handler.gd").new()
@onready var caret: MeshInstance3D = $Label/Caret @onready var caret: MeshInstance3D = $Body/Label/Caret
@onready var mesh_box: MeshInstance3D = $Box @onready var panel: Panel3D = $Body/Panel3D
@onready var collision: CollisionShape3D = $Collision @onready var body: StaticBody3D = $Body
@onready var collision: CollisionShape3D = $Body/Collision
@onready var animation: AnimationPlayer = $AnimationPlayer @onready var animation: AnimationPlayer = $AnimationPlayer
@onready var label: Label3D = $Label @onready var label: Label3D = $Body/Label
@export_range(0.1, 2, 0.01, "suffix:m") var width: float = 0.15:
set(value):
width = value
text_handler.width = value
if !is_inside_tree(): return
mesh_box.mesh.size.x = width
collision.shape.size.x = width
label.position.x = -width / 2 + 0.002
@export var text: String: @export var text: String:
set(value): set(value):
@ -38,7 +29,7 @@ var text_handler = preload ("res://content/ui/components/input/text_handler.gd")
label.modulate = Color(0.7, 0.7, 0.7) label.modulate = Color(0.7, 0.7, 0.7)
add_to_group("ui_focus_skip") add_to_group("ui_focus_skip")
animation.stop() animation.stop()
caret.hide() caret.visible = false
else: else:
label.modulate = Color(1, 1, 1) label.modulate = Color(1, 1, 1)
remove_from_group("ui_focus_skip") remove_from_group("ui_focus_skip")
@ -48,10 +39,11 @@ var keyboard_input: bool = false
var input_plane = Plane(Vector3.UP, Vector3.ZERO) var input_plane = Plane(Vector3.UP, Vector3.ZERO)
func _ready(): func _ready():
Update.props(self, ["text", "disabled", "width"])
text_handler.label = label text_handler.label = label
Update.props(self, ["text", "disabled", "width"])
_update()
if Engine.is_editor_hint(): if Engine.is_editor_hint():
return return
@ -112,13 +104,23 @@ func _on_press_move(event):
caret.position.x = text_handler.get_caret_position() caret.position.x = text_handler.get_caret_position()
label.text = text_handler.get_display_text() label.text = text_handler.get_display_text()
func _on_ray_enter(_event: EventPointer):
if disabled:
return
panel.hovering = true
func _on_ray_leave(_event: EventPointer):
panel.hovering = false
func _on_focus_in(_event): func _on_focus_in(_event):
if disabled: if disabled:
return return
caret.position.x = text_handler.get_caret_position() caret.position.x = text_handler.get_caret_position()
label.text = text_handler.get_display_text() label.text = text_handler.get_display_text()
caret.show() caret.visible = true
panel.active = true
animation.play("blink") animation.play("blink")
func update_caret_position(event): func update_caret_position(event):
@ -143,7 +145,8 @@ func _on_focus_out(_event):
return return
animation.stop() animation.stop()
caret.hide() caret.visible = false
panel.active = false
func _draw_debug_text_gaps(): func _draw_debug_text_gaps():
if text_handler.gap_offsets == null: if text_handler.gap_offsets == null:
@ -156,3 +159,12 @@ func _draw_debug_text_gaps():
label.to_global(Vector3(offset, 0.01, 0)), label.to_global(Vector3(offset, 0.01, 0)),
Color(1, 0, 0) if i != text_handler.overflow_index else Color(0, 1, 0) Color(1, 0, 0) if i != text_handler.overflow_index else Color(0, 1, 0)
) )
func _update():
text_handler.width = size.x
panel.size = Vector2(size.x, size.y)
panel.position.z = size.z / 2
collision.shape.size = size
label.position = Vector3( - size.x / 2 + 0.002, 0, size.z / 2)
label.text = text_handler.get_display_text()
body.position = Vector3(0, 0, size.z / 2)

View File

@ -1,16 +1,34 @@
[gd_scene load_steps=10 format=3 uid="uid://blrhy2uccrdn4"] [gd_scene load_steps=13 format=3 uid="uid://blrhy2uccrdn4"]
[ext_resource type="Material" uid="uid://bujy3egn1oqac" path="res://assets/materials/pri-500.material" id="1_0kd7r"]
[ext_resource type="Script" path="res://content/ui/components/input/input.gd" id="1_uml3t"] [ext_resource type="Script" path="res://content/ui/components/input/input.gd" id="1_uml3t"]
[ext_resource type="Script" path="res://content/ui/components/panel/panel.gd" id="3_3bvrj"]
[ext_resource type="FontVariation" uid="uid://d2ofyimg5s65q" path="res://assets/fonts/ui_font_500.tres" id="3_ij5fh"] [ext_resource type="FontVariation" uid="uid://d2ofyimg5s65q" path="res://assets/fonts/ui_font_500.tres" id="3_ij5fh"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="3_nl02b"]
[sub_resource type="BoxMesh" id="BoxMesh_kjbca"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_exbug"]
resource_local_to_scene = true resource_local_to_scene = true
size = Vector3(0.15, 0.006, 0.03) render_priority = 10
shader = ExtResource("3_nl02b")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(3.75, 0.75)
shader_parameter/border_size = 0.01
shader_parameter/border_fade_in = 0.05
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.2
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_lemta"]
size = Vector2(0.15, 0.03)
[sub_resource type="BoxShape3D" id="BoxShape3D_x4yp8"] [sub_resource type="BoxShape3D" id="BoxShape3D_x4yp8"]
resource_local_to_scene = true resource_local_to_scene = true
size = Vector3(0.15, 0.006, 0.03) size = Vector3(0.15, 0.03, 0.01)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_x1ra7"]
shading_mode = 0
[sub_resource type="BoxMesh" id="BoxMesh_2736g"] [sub_resource type="BoxMesh" id="BoxMesh_2736g"]
size = Vector3(0.001, 0.02, 0.001) size = Vector3(0.001, 0.02, 0.001)
@ -52,36 +70,46 @@ _data = {
"blink": SubResource("Animation_8ny1h") "blink": SubResource("Animation_8ny1h")
} }
[node name="Input" type="StaticBody3D" groups=["ui_focus"]] [node name="Input" type="Node3D" groups=["ui_focus"]]
collision_layer = 6
collision_mask = 0
script = ExtResource("1_uml3t") script = ExtResource("1_uml3t")
text = "Example" text = "Example Text"
size = Vector3(0.15, 0.03, 0.01)
[node name="Box" type="MeshInstance3D" parent="."] [node name="Body" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.003, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.005)
material_override = ExtResource("1_0kd7r") collision_layer = 6
mesh = SubResource("BoxMesh_kjbca") collision_mask = 6
[node name="Collision" type="CollisionShape3D" parent="."] [node name="Panel3D" type="MeshInstance3D" parent="Body"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.003, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.005)
material_override = SubResource("ShaderMaterial_exbug")
mesh = SubResource("QuadMesh_lemta")
script = ExtResource("3_3bvrj")
size = Vector2(0.15, 0.03)
[node name="Collision" type="CollisionShape3D" parent="Body"]
shape = SubResource("BoxShape3D_x4yp8") shape = SubResource("BoxShape3D_x4yp8")
[node name="Label" type="Label3D" parent="."] [node name="Label" type="Label3D" parent="Body"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.073, 0.00618291, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.073, 0, 0.005)
pixel_size = 0.001 pixel_size = 0.001
text = "Example" double_sided = false
render_priority = 30
outline_render_priority = 29
text = "Example Text"
font = ExtResource("3_ij5fh") font = ExtResource("3_ij5fh")
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="Caret" type="MeshInstance3D" parent="Label"] [node name="Caret" type="MeshInstance3D" parent="Body/Label"]
visible = false visible = false
material_override = SubResource("StandardMaterial3D_x1ra7")
mesh = SubResource("BoxMesh_2736g") mesh = SubResource("BoxMesh_2736g")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."] [node name="AnimationPlayer" type="AnimationPlayer" parent="."]
root_node = NodePath("../Body")
libraries = { libraries = {
"": SubResource("AnimationLibrary_1sy4t") "": SubResource("AnimationLibrary_1sy4t")
} }

View File

@ -5,7 +5,12 @@ const FontTools = preload ("res://lib/utils/font_tools.gd")
var label: Label3D var label: Label3D
var text: String = "" var text: String = ""
var width: float = 0.2 var width: float = 0.2:
set(value):
width = max(0.0, value)
gap_offsets = _calculate_text_gaps()
overflow_index = _calculate_overflow_index()
caret_position = 0
var gap_offsets = null var gap_offsets = null
var overflow_index: int = -1 var overflow_index: int = -1
var char_offset: int = 0 var char_offset: int = 0
@ -13,9 +18,6 @@ var caret_position: int = 3:
set(value): set(value):
caret_position = clampi(value, 0, text.length()) caret_position = clampi(value, 0, text.length())
func set_width(value: float):
width = value
func set_text(value: String, insert: bool=false): func set_text(value: String, insert: bool=false):
var old_text = text var old_text = text
text = value text = value

View File

@ -0,0 +1,32 @@
@tool
extends Container3D
class_name LabelContainer3D
const FontTools = preload ("res://lib/utils/font_tools.gd")
@onready var label: Label3D = $Label3D
@export var text: String = "Example":
set(value):
text = value
if !is_inside_tree(): return
_update_text()
@export var font_size: int = 18:
set(value):
font_size = value
if !is_inside_tree(): return
_update_text()
func _ready():
_update_text()
func _update_text():
label.font_size = font_size
label.text = text
var text_size = FontTools.get_font_size(label)
size = Vector3(text_size.x, text_size.y, 0.1)

View File

@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://blkfqa3ttk0d2"]
[ext_resource type="Script" path="res://content/ui/components/label_container/label_container.gd" id="1_hqtij"]
[ext_resource type="FontVariation" uid="uid://d2ofyimg5s65q" path="res://assets/fonts/ui_font_500.tres" id="2_6y3jl"]
[node name="LabelContainer" type="Node3D"]
script = ExtResource("1_hqtij")
size = Vector3(0.08, 0.023, 0.1)
[node name="Label3D" type="Label3D" parent="."]
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Example"
font = ExtResource("2_6y3jl")
font_size = 18
outline_size = 0

View File

@ -10,7 +10,7 @@ cull_mode = 2
shading_mode = 0 shading_mode = 0
albedo_color = Color(0.109804, 0.721569, 0.262745, 1) albedo_color = Color(0.109804, 0.721569, 0.262745, 1)
[sub_resource type="ArrayMesh" id="ArrayMesh_mec1l"] [sub_resource type="ArrayMesh" id="ArrayMesh_5xylt"]
_surfaces = [{ _surfaces = [{
"aabb": AABB(-0.000587015, -0.000596339, 0.0005, 0.501171, 0.301189, 1e-05), "aabb": AABB(-0.000587015, -0.000596339, 0.0005, 0.501171, 0.301189, 1e-05),
"format": 34359742465, "format": 34359742465,
@ -43,7 +43,7 @@ script = ExtResource("1_n7fu8")
[node name="Line" type="MeshInstance3D" parent="."] [node name="Line" type="MeshInstance3D" parent="."]
material_override = SubResource("StandardMaterial3D_20gpn") material_override = SubResource("StandardMaterial3D_20gpn")
mesh = SubResource("ArrayMesh_mec1l") mesh = SubResource("ArrayMesh_5xylt")
[node name="Plane" type="MeshInstance3D" parent="."] [node name="Plane" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0.15, -0.001) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0.15, -0.001)

View File

@ -1,15 +1,29 @@
[gd_scene load_steps=10 format=3 uid="uid://bqj7qwj5mgd30"] [gd_scene load_steps=11 format=3 uid="uid://bqj7qwj5mgd30"]
[ext_resource type="Script" path="res://content/ui/components/notification/notification.gd" id="1_yw3yb"] [ext_resource type="Script" path="res://content/ui/components/notification/notification.gd" id="1_yw3yb"]
[ext_resource type="Material" uid="uid://bujy3egn1oqac" path="res://assets/materials/pri-500.material" id="2_5b8oo"] [ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="2_b68od"]
[ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="3_1ljpc"] [ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="3_1ljpc"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="4_ocg5j"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="4_ocg5j"]
[sub_resource type="BoxMesh" id="BoxMesh_s37oj"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_0ktvn"]
size = Vector3(0.25, 0.01, 0.05) render_priority = 10
shader = ExtResource("2_b68od")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.25, 0.05)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.025
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_dx2yp"]
size = Vector2(0.25, 0.05)
[sub_resource type="BoxShape3D" id="BoxShape3D_m4d21"] [sub_resource type="BoxShape3D" id="BoxShape3D_m4d21"]
size = Vector3(0.25, 0.01, 0.05) size = Vector3(0.25, 0.05, 0.01)
[sub_resource type="Animation" id="Animation_bkual"] [sub_resource type="Animation" id="Animation_bkual"]
length = 0.001 length = 0.001
@ -164,25 +178,30 @@ script = ExtResource("1_yw3yb")
collision_layer = 6 collision_layer = 6
collision_mask = 0 collision_mask = 0
[node name="MeshInstance3D" type="MeshInstance3D" parent="AnimationNode"] [node name="MeshInstance3D2" type="MeshInstance3D" parent="AnimationNode"]
material_override = ExtResource("2_5b8oo") material_override = SubResource("ShaderMaterial_0ktvn")
mesh = SubResource("BoxMesh_s37oj") mesh = SubResource("QuadMesh_dx2yp")
[node name="CollisionShape3D" type="CollisionShape3D" parent="AnimationNode"] [node name="CollisionShape3D" type="CollisionShape3D" parent="AnimationNode"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.005)
shape = SubResource("BoxShape3D_m4d21") shape = SubResource("BoxShape3D_m4d21")
[node name="Text" type="Label3D" parent="AnimationNode"] [node name="Text" type="Label3D" parent="AnimationNode"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.08, 0.006, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.08, 0, 0.001)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
font_size = 10 font_size = 10
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
autowrap_mode = 3 autowrap_mode = 3
width = 190.0 width = 170.0
[node name="Icon" type="Label3D" parent="AnimationNode"] [node name="Icon" type="Label3D" parent="AnimationNode"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.1, 0.006, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.1, 0, 0.001)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "info" text = "info"
font = ExtResource("3_1ljpc") font = ExtResource("3_1ljpc")
font_size = 24 font_size = 24
@ -194,7 +213,7 @@ libraries = {
} }
[node name="Button" parent="AnimationNode" instance=ExtResource("4_ocg5j")] [node name="Button" parent="AnimationNode" instance=ExtResource("4_ocg5j")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0.12, -0.003, -0.02) transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0.1, 0, 0)
label = "close" label = "close"
icon = true icon = true

View File

@ -0,0 +1,109 @@
@tool
extends FlexContainer3D
class_name Pagination3D
signal on_page_changed(page: int)
const ButtonScene = preload ("res://content/ui/components/button/button.tscn")
const LabelScene = preload ("res://content/ui/components/label_container/label_container.tscn")
@onready var prev_button = $Prev
@onready var next_button = $Next
@export var page: int = 0:
set(value):
if page == value: return
page = clamp(value, 0, pages - 1)
_update()
@export var pages: int = 5:
set(value):
if pages == value: return
pages = max(1, value)
_update()
@export var visible_pages: int = 5:
set(value):
if visible_pages == value: return
visible_pages = max(5, value)
_update()
func _ready():
_update()
prev_button.on_button_up.connect(func():
page -= 1
on_page_changed.emit(page)
)
next_button.on_button_up.connect(func():
page += 1
on_page_changed.emit(page)
)
func _update():
if !is_node_ready(): return
for child in get_children():
if child != prev_button&&child != next_button:
remove_child(child)
child.queue_free()
var display_pages = min(pages, visible_pages)
var center_pos = floor(display_pages / 2)
var start_dots = pages > visible_pages&&page > visible_pages - center_pos - 1
var end_dots = pages > visible_pages&&page < pages - visible_pages + floor((display_pages - 1) / 2)
var at_start = page == 0
prev_button.disabled = at_start
prev_button.visible = !at_start
var at_end = page == pages - 1
next_button.disabled = at_end
next_button.visible = !at_end
prev_button.size = Vector3(size.y, size.y, size.z)
next_button.size = Vector3(size.y, size.y, size.z)
for i in range(display_pages):
if (start_dots&&i == 1)||(end_dots&&i == display_pages - 2):
var container = Container3D.new()
container.size = Vector3(size.y, size.y, size.z)
add_child(container)
move_child(container, -2)
var dots = LabelScene.instantiate()
dots.text = "..."
container.add_child(dots)
continue
var button = ButtonScene.instantiate()
button.size = Vector3(size.y, size.y, size.z)
button.toggleable = true
if i == 0:
button.label = "1"
elif i == display_pages - 1:
button.label = str(pages)
elif pages <= visible_pages:
button.label = str(i + 1)
elif visible_pages % 2 == 1:
button.label = str(clamp(page, center_pos, pages - 1 - center_pos) - center_pos + i + 1)
else:
button.label = str(clamp(page + 1, 3, pages - 3) - center_pos + i + 1)
button.on_button_down.connect(func():
page=int(button.label) - 1
on_page_changed.emit(page)
)
if (int(button.label) - 1) == page:
button.initial_active = true
button.disabled = true
add_child(button)
move_child(button, -2)
super._update()

View File

@ -0,0 +1,24 @@
[gd_scene load_steps=3 format=3 uid="uid://bef3gamrm6at2"]
[ext_resource type="Script" path="res://content/ui/components/pagination/pagination.gd" id="1_3ylfj"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="2_lsc4w"]
[node name="Pagination" type="Node3D"]
script = ExtResource("1_3ylfj")
page = 1
pages = 4
visible_pages = 7
gap = 0.01
size = Vector3(9.92, 0.05, 0.01)
[node name="Prev" parent="." instance=ExtResource("2_lsc4w")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.025, 0, 0)
label = "navigate_before"
icon = true
size = Vector3(0.05, 0.05, 0.01)
[node name="Next" parent="." instance=ExtResource("2_lsc4w")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.325, 0, 0)
label = "navigate_next"
icon = true
size = Vector3(0.05, 0.05, 0.01)

View File

@ -0,0 +1,81 @@
shader_type spatial;
render_mode diffuse_burley, specular_schlick_ggx, blend_mix, cull_disabled, shadows_disabled;
group_uniforms Color;
uniform vec4 color : source_color = vec4(1.0, 1.0, 1.0, 0.3);
uniform vec4 border_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
uniform vec4 edge_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
group_uniforms Size;
uniform vec2 size = vec2(1.0, 1.0);
uniform float border_size: hint_range(0.0, 0.5) = 0.001;
uniform float border_fade_in: hint_range(0.0, 0.5) = 0.005;
uniform float border_fade_out: hint_range(0.0, 0.5) = 0.0;
uniform float corner_radius = 0.04;
group_uniforms Roughness;
uniform float roughness : hint_range(0.0, 1.0) = 0.3;
uniform float grain_amount : hint_range(0.0, 1.0) = 0.02;
float rectangle(vec2 position) {
vec2 component_wise_edge_distance = abs(position) - (vec2(0.5, 0.5) * size + corner_radius * (size - 1.0));
float outsideDistance = length(max(component_wise_edge_distance, 0));
float insideDistance = min(max(component_wise_edge_distance.x, component_wise_edge_distance.y), 0);
return outsideDistance + insideDistance;
}
float SchlickFresnel(float u) {
float m = 1.0 - u;
float m2 = m * m;
return m2 * m2 * m;
}
void fragment() {
float VdotN = dot(VIEW, NORMAL);
float fresnel = clamp(SchlickFresnel(VdotN), 0.0, 1.0);
ALBEDO = border_color.xyz;
ALPHA = 0.0;
float border_scale = 1.0 + 2.0 * corner_radius;
float d = rectangle((UV - 0.5) * size * border_scale);
float border_width = (border_size + border_fade_in + border_fade_out) * border_scale;
bool inside = false;
if (d >= corner_radius - border_width && d <= corner_radius) {
// Border
float rel_d = (d - corner_radius + border_width) / border_width;
float alpha = min((rel_d / (border_fade_in * border_scale / border_width)), (1.0 - (rel_d)) / (border_fade_out * border_scale / border_width));
if (d < corner_radius - (border_size + border_fade_out) * border_scale) {
// Inner Fade
ALBEDO = mix(color, border_color, alpha).xyz;
ALPHA = mix(color.w, border_color.w, alpha);
inside = true;
} else {
// Outer Fade
ALBEDO = border_color.xyz;
ALPHA = mix(0.0, border_color.w, alpha);
}
} else if (d < corner_radius - border_width ) {
// Inside
ALBEDO = color.xyz;
ALPHA = color.w;
inside = true;
}
if (inside) {
float a = mix(0.001, 1.0, ALPHA);
ALPHA = mix(fresnel * edge_color.a, 1.0, a);
ALBEDO = mix(edge_color.rgb * edge_color.a, ALBEDO.rgb, a);
ROUGHNESS = roughness;
SPECULAR = 0.5 * inversesqrt(ALPHA);
float noise = (fract(sin(dot(UV, vec2(12.9898, 78.233))) * 43758.5453) - 0.5) * 2.0;
ALBEDO += noise * grain_amount;
}
}

View File

@ -0,0 +1,67 @@
@tool
extends MeshInstance3D
class_name Panel3D
const PanelMaterial = preload ("panel.material")
const COLOR = Color(1.0, 1.0, 1.0, 0.3)
const BORDER_COLOR = Color(1.0, 1.0, 1.0, 1.0)
const COLOR_ACTIVE = Color(0.949, 0.353, 0.22, 0.3)
const BORDER_COLOR_ACTIVE = Color(0.949, 0.353, 0.22, 1.0)
const COLOR_HOVER = Color(0.5, 0.5, 0.5, 0.3)
const BORDER_COLOR_HOVER = Color(0.7, 0.7, 0.7, 1.0)
@export var hovering = false:
set(value):
hovering = value
_update_style()
@export var active = false:
set(value):
active = value
_update_style()
@export var size = Vector2(1, 1):
set(value):
size = value
_update_size()
@export var corner_radius = 0.2:
set(value):
corner_radius = value
_update_corner_radius()
@export var border = 0.6:
set(value):
border = value
_update_border()
func _ready():
mesh = QuadMesh.new()
material_override = PanelMaterial.duplicate()
_update_style()
_update_size()
_update_corner_radius()
_update_border()
func _update_border():
material_override.set_shader_parameter("border_size", border * 1.0 / 60.0)
material_override.set_shader_parameter("border_fade_in", border * 5.0 / 60.0)
func _update_corner_radius():
material_override.set_shader_parameter("corner_radius", corner_radius)
func _update_style():
if active:
material_override.set_shader_parameter("color", COLOR_ACTIVE)
material_override.set_shader_parameter("border_color", BORDER_COLOR_ACTIVE)
elif hovering:
material_override.set_shader_parameter("color", COLOR_HOVER)
material_override.set_shader_parameter("border_color", BORDER_COLOR_HOVER)
else:
material_override.set_shader_parameter("color", COLOR)
material_override.set_shader_parameter("border_color", BORDER_COLOR)
func _update_size():
mesh.size = size
material_override.set_shader_parameter("size", size * 25)

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5698a4c471cde4f3d6593fd94837a5f7238dfc832323c3ee96658f480a23c7a3
size 450

View File

@ -0,0 +1,30 @@
[gd_scene load_steps=5 format=3 uid="uid://dnam3fe36gg62"]
[ext_resource type="Script" path="res://content/ui/components/panel/panel.gd" id="1_2jq4a"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="1_mpdsy"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_jbi6t"]
resource_local_to_scene = true
render_priority = 10
shader = ExtResource("1_mpdsy")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(1, 1)
shader_parameter/border_size = 0.01
shader_parameter/border_fade_in = 0.05
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.04
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_vcnnc"]
size = Vector2(0.04, 0.04)
[node name="Panel" type="MeshInstance3D"]
material_override = SubResource("ShaderMaterial_jbi6t")
mesh = SubResource("QuadMesh_vcnnc")
script = ExtResource("1_2jq4a")
size = Vector2(0.04, 0.04)
corner_radius = null
border = null

View File

@ -1,5 +1,5 @@
@tool @tool
extends Node3D extends Container3D
class_name Slider3D class_name Slider3D
@export var min: float = 0.0: @export var min: float = 0.0:
@ -42,32 +42,11 @@ class_name Slider3D
if !is_inside_tree(): return if !is_inside_tree(): return
label.text = str(value) + " " + label_unit label.text = str(value) + " " + label_unit
@export var size: Vector3 = Vector3(0.2, 0.01, 0.02): # Warning, units are in cm
set(value):
size = value
if !is_inside_tree(): return
_update_shape()
@export var cutout_border: float = 0.02:
set(value):
cutout_border = value
if !is_inside_tree(): return
_update_shape()
@export var cutout_depth: float = 0.05:
set(value):
cutout_depth = value
if !is_inside_tree(): return
_update_shape()
@onready var outside_rod: CSGBox3D = $Rod/Outside
@onready var cutout: CSGCombiner3D = $Rod/Cutout
@onready var cutout_box: CSGBox3D = $Rod/Cutout/Length
@onready var cutout_end_left: CSGCylinder3D = $Rod/Cutout/EndLeft
@onready var cutout_end_right: CSGCylinder3D = $Rod/Cutout/EndRight
@onready var label: Label3D = $Label @onready var label: Label3D = $Label
@onready var body_collision_shape: CollisionShape3D = $CollisionBody/CollisionShape3D @onready var mesh: MeshInstance3D = $Body/MeshInstance3D
@onready var body_collision_shape: CollisionShape3D = $Body/CollisionShape3D
@onready var area_collision_shape: CollisionShape3D = $Area3D/CollisionShape3D @onready var area_collision_shape: CollisionShape3D = $Area3D/CollisionShape3D
@onready var slider_knob: MeshInstance3D = $Knob @onready var slider_knob: MeshInstance3D = $Knob
signal on_value_changed(value: float) signal on_value_changed(value: float)
@ -78,7 +57,7 @@ func _ready():
Update.props(self, ["value", "show_label", "label_unit"]) Update.props(self, ["value", "show_label", "label_unit"])
_update_slider() _update_slider()
_update_shape() _update()
move_plane = Plane(Vector3.UP, Vector3(0, size.y / 200, 0)) move_plane = Plane(Vector3.UP, Vector3(0, size.y / 200, 0))
func _on_press_down(event: EventPointer): func _on_press_down(event: EventPointer):
@ -91,9 +70,7 @@ func _on_touch_enter(event: EventTouch):
_handle_touch(event) _handle_touch(event)
func _get_slider_min_max(): func _get_slider_min_max():
var cutout_radius = (size.z - cutout_border * 2) / 2 return Vector2( - size.x / 2 + 0.01, size.x / 2 - 0.01)
return Vector2( - size.x / 2 + cutout_border + cutout_radius, size.x / 2 - cutout_border - cutout_radius) / 100
func _handle_press(event: EventPointer): func _handle_press(event: EventPointer):
var ray_pos = event.ray.global_position var ray_pos = event.ray.global_position
@ -134,46 +111,20 @@ func _update_slider():
slider_knob.position.x = lerp(min_max.x, min_max.y, click_percent) slider_knob.position.x = lerp(min_max.x, min_max.y, click_percent)
func _update_shape(): func _update():
outside_rod.size = size _update_slider()
body_collision_shape.shape.size = size
body_collision_shape.position = Vector3(0, 0, size.z / 2)
body_collision_shape.shape.size = size * 0.01 area_collision_shape.shape.size = Vector3(size.x, size.y, 0.01)
area_collision_shape.shape.size = Vector3(size.x, size.y * 2, size.z) * 0.01 area_collision_shape.position = Vector3(0, 0, size.z + 0.005)
area_collision_shape.position = Vector3(0, size.y, 0) * 0.01
var cutout_width = size.z - cutout_border * 2 mesh.position = Vector3(0, 0, size.z)
mesh.mesh.size = Vector2(size.x, size.y)
mesh.material_override.set_shader_parameter("size", Vector2(size.x, size.y) * 10.0)
cutout_box.size = Vector3( slider_knob.position.z = size.z + 0.002
size.x - cutout_border * 2 - (cutout_width), slider_knob.mesh.size = Vector2(size.y * 0.75, size.y * 0.75)
cutout_depth, slider_knob.material_override.set_shader_parameter("size", Vector2(size.y * 7.5, size.y * 7.5))
cutout_width
)
cutout.position = Vector3( label.position = Vector3(size.x / 2 + 0.005, 0, size.z)
0,
size.y / 2 - cutout_depth / 2 + 0.001,
0
)
cutout_end_left.radius = cutout_box.size.z / 2
cutout_end_right.radius = cutout_box.size.z / 2
cutout_end_left.height = cutout_depth
cutout_end_right.height = cutout_depth
cutout_end_left.position = Vector3(
- cutout_box.size.x / 2,
0,
0
)
cutout_end_right.position = Vector3(
cutout_box.size.x / 2,
0,
0
)
label.position = Vector3(
size.x / 200 + 0.005,
0,
0
)

View File

@ -1,92 +1,92 @@
[gd_scene load_steps=7 format=3 uid="uid://pk5k1q8bx0rj"] [gd_scene load_steps=9 format=3 uid="uid://pk5k1q8bx0rj"]
[ext_resource type="Script" path="res://content/ui/components/slider/slider.gd" id="1_ylune"] [ext_resource type="Script" path="res://content/ui/components/slider/slider.gd" id="1_ylune"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="2_by0d8"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_eiwwn"]
albedo_color = Color(0.133333, 0.133333, 0.133333, 1)
[sub_resource type="CylinderMesh" id="CylinderMesh_77ny1"]
material = SubResource("StandardMaterial3D_eiwwn")
top_radius = 0.008
bottom_radius = 0.008
height = 0.003
[sub_resource type="CylinderMesh" id="CylinderMesh_v34nn"]
top_radius = 0.002
bottom_radius = 0.002
height = 0.005
[sub_resource type="BoxShape3D" id="BoxShape3D_h1mn1"] [sub_resource type="BoxShape3D" id="BoxShape3D_h1mn1"]
size = Vector3(0.2, 0.004, 0.01) resource_local_to_scene = true
size = Vector3(0.15, 0.02, 0.01)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_vgpd3"]
resource_local_to_scene = true
render_priority = 20
shader = ExtResource("2_by0d8")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(1.5, 0.2)
shader_parameter/border_size = 0.005
shader_parameter/border_fade_in = 0.04
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.12
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_k78f4"]
resource_local_to_scene = true
size = Vector2(0.15, 0.02)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_mv0la"]
resource_local_to_scene = true
render_priority = 30
shader = ExtResource("2_by0d8")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.15, 0.15)
shader_parameter/border_size = 0.002
shader_parameter/border_fade_in = 0.02
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.085
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_vw14o"]
resource_local_to_scene = true
size = Vector2(0.015, 0.015)
[sub_resource type="BoxShape3D" id="BoxShape3D_s64dk"] [sub_resource type="BoxShape3D" id="BoxShape3D_s64dk"]
size = Vector3(0.2, 0.008, 0.01) resource_local_to_scene = true
size = Vector3(0.15, 0.02, 0.01)
[node name="Slider" type="Node3D"] [node name="Slider" type="Node3D"]
script = ExtResource("1_ylune") script = ExtResource("1_ylune")
size = Vector3(20, 0.4, 1) show_label = true
cutout_border = 0.2 size = Vector3(0.15, 0.02, 0.01)
cutout_depth = 0.36
[node name="Rod" type="CSGCombiner3D" parent="."] [node name="Body" type="StaticBody3D" parent="."]
transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, 0, 0, 0)
snap = 0.0001
[node name="Outside" type="CSGBox3D" parent="Rod"]
snap = 0.0001
size = Vector3(20, 0.4, 1)
[node name="Cutout" type="CSGCombiner3D" parent="Rod"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.021, 0)
operation = 2
snap = 0.0001
[node name="Length" type="CSGBox3D" parent="Rod/Cutout"]
snap = 0.0001
size = Vector3(19, 0.36, 0.6)
[node name="EndRight" type="CSGCylinder3D" parent="Rod/Cutout"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 0, 0)
snap = 0.0001
radius = 0.3
height = 0.36
sides = 36
[node name="EndLeft" type="CSGCylinder3D" parent="Rod/Cutout"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 0, 0)
snap = 0.0001
radius = 0.3
height = 0.36
sides = 36
[node name="Knob" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.057, 0.00409426, 0)
mesh = SubResource("CylinderMesh_77ny1")
[node name="Pin" type="MeshInstance3D" parent="Knob"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.00353538, 0)
mesh = SubResource("CylinderMesh_v34nn")
[node name="CollisionBody" type="StaticBody3D" parent="."]
collision_layer = 6 collision_layer = 6
collision_mask = 6 collision_mask = 6
[node name="CollisionShape3D" type="CollisionShape3D" parent="CollisionBody"] [node name="CollisionShape3D" type="CollisionShape3D" parent="Body"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.005)
shape = SubResource("BoxShape3D_h1mn1") shape = SubResource("BoxShape3D_h1mn1")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Body"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.01)
material_override = SubResource("ShaderMaterial_vgpd3")
mesh = SubResource("QuadMesh_k78f4")
[node name="Label" type="Label3D" parent="."] [node name="Label" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.105, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.08, 0, 0.01)
visible = false
pixel_size = 0.001 pixel_size = 0.001
render_priority = 30
outline_render_priority = 29
text = "0.2 " text = "0.2 "
font_size = 10 font_size = 10
outline_size = 4 outline_size = 4
horizontal_alignment = 0 horizontal_alignment = 0
[node name="Knob" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.039, 0, 0.012)
material_override = SubResource("ShaderMaterial_mv0la")
mesh = SubResource("QuadMesh_vw14o")
skeleton = NodePath("../Body")
[node name="Area3D" type="Area3D" parent="."] [node name="Area3D" type="Area3D" parent="."]
collision_layer = 4 collision_layer = 4
collision_mask = 4 collision_mask = 4
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] [node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.004, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.015)
shape = SubResource("BoxShape3D_s64dk") shape = SubResource("BoxShape3D_s64dk")

View File

@ -1,4 +1,5 @@
extends Node3D @tool
extends FlexContainer3D
class_name Tabs3D class_name Tabs3D
signal on_select(selected: int) signal on_select(selected: int)
@ -8,6 +9,11 @@ var selected = R.state(null)
@export var initial_selected: Node3D @export var initial_selected: Node3D
func _ready(): func _ready():
_update()
if Engine.is_editor_hint():
return
if initial_selected: if initial_selected:
selected.value = initial_selected selected.value = initial_selected

View File

@ -16,6 +16,6 @@ func _ready():
R.effect(func(_arg): R.effect(func(_arg):
if tabs.selected.value.get_index() == i: if tabs.selected.value.get_index() == i:
add_child(child) add_child(child)
else: elif child.get_parent() == self:
remove_child(child) remove_child(child)
) )

View File

@ -1,8 +0,0 @@
extends Node3D
@onready var button = $Button
@export var id: String = "0"
func set_device_name(text):
assert(button != null, "Device has to be added to the scene tree")
button.label = text

View File

@ -1,14 +0,0 @@
[gd_scene load_steps=4 format=3 uid="uid://dbe8slnyhro2n"]
[ext_resource type="Script" path="res://content/ui/menu/edit/device/device.gd" id="1_rbo86"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="2_go2es"]
[ext_resource type="Script" path="res://content/functions/clickable.gd" id="3_6wicx"]
[node name="Device" type="Node3D"]
script = ExtResource("1_rbo86")
[node name="Button" parent="." instance=ExtResource("2_go2es")]
focusable = true
[node name="Clickable" type="Node" parent="."]
script = ExtResource("3_6wicx")

View File

@ -0,0 +1,46 @@
extends Node3D
signal on_select_device(device_id)
const ButtonScene = preload ("res://content/ui/components/button/button.tscn")
@onready var grid_container = $GridContainer3D
@onready var pagination = $Pagination3D
var page = R.state(0)
var page_size = 28.0
func _ready():
var pages = R.computed(func(_arg):
var devices=Store.devices.state.devices
return ceil(devices.size() / page_size)
)
var visible_devices = R.computed(func(_arg):
var devices=Store.devices.state.devices
return devices.slice(page.value * page_size, page.value * page_size + page_size)
)
R.bind(pagination, "pages", pages)
R.bind(pagination, "page", page, pagination.on_page_changed)
R.effect(func(_arg):
for child in grid_container.get_children():
grid_container.remove_child(child)
child.free()
for device in visible_devices.value:
var info=device.values()[0]
var button_instance=ButtonScene.instantiate()
button_instance.label=info["name"]
button_instance.font_size=8
button_instance.on_button_up.connect(func():
on_select_device.emit(device.keys()[0])
)
grid_container.add_child(button_instance)
)

View File

@ -2,164 +2,45 @@ extends Node3D
const ButtonScene = preload ("res://content/ui/components/button/button.tscn") const ButtonScene = preload ("res://content/ui/components/button/button.tscn")
@onready var devices_node: GridContainer3D = $Devices @onready var devices_page = $Devices
@onready var next_page_button = $Buttons/NextPageButton @onready var entities_page = $Entities
@onready var previous_page_button = $Buttons/PreviousPageButton
@onready var page_number_label = $PageNumberLabel var selected_device = R.state(null)
var devices = []
var page = 0
var last_device_page = 0
var page_size = 20
var pages = 0
var selected_device = null
# Called when the node enters the scene tree for the first time.
func _ready(): func _ready():
next_page_button.on_button_down.connect(func(): entities_page.selected_device = selected_device
next_page() remove_child(entities_page)
devices_page.on_select_device.connect(func(device):
selected_device.value=device
entities_page.page.value=0
) )
previous_page_button.on_button_down.connect(func(): entities_page.on_select_entity.connect(func(entity_name):
previous_page() AudioPlayer.play_effect("spawn")
var entity=House.body.create_entity(entity_name, global_position)
if entity == null:
EventSystem.notify("Entity is not in Room", EventNotify.Type.INFO)
) )
func _enter_tree(): entities_page.on_back.connect(func():
if !HomeApi.has_connected(): await HomeApi.on_connect selected_device.value=null
if is_node_ready():
load_devices()
func load_devices():
if devices.size() == 0:
devices = await HomeApi.get_devices()
devices.sort_custom(func(a, b):
return a.values()[0]["name"].to_lower() < b.values()[0]["name"].to_lower()
)
for device in devices:
device.values()[0]["entities"].sort_custom(func(a, b):
return a.to_lower() < b.to_lower()
)
render()
HomeApi.on_disconnect.connect(func():
devices=[]
if is_node_ready():
render()
)
func update_pages():
if selected_device == null:
pages = ceil(float(devices.size()) / page_size)
else:
for device in devices:
if device.keys()[0] == selected_device:
pages = ceil(float(device.values()[0]["entities"].size()) / page_size)
func get_page():
if selected_device == null:
return devices.slice(page * page_size, page * page_size + page_size)
else:
for device in devices:
if device.keys()[0] == selected_device:
return device.values()[0]["entities"].slice(page * page_size, page * page_size + page_size)
func next_page():
if page >= pages - 1:
return
page += 1
render()
func previous_page():
if page <= 0:
return
page -= 1
render()
func render():
if devices.size() == 0:
return
update_pages()
page_number_label.set_text(str(page + 1) + " / " + str(pages))
var has_prev_page = page > 0
var has_next_page = page < pages - 1
previous_page_button.visible = has_prev_page
previous_page_button.disabled = !has_prev_page
previous_page_button.body.get_node("CollisionShape3D").disabled = !has_prev_page
next_page_button.visible = has_next_page
next_page_button.disabled = !has_next_page
next_page_button.body.get_node("CollisionShape3D").disabled = !has_next_page
clear_menu()
if selected_device == null:
render_devices()
else:
render_entities()
func render_devices():
var page_devices = get_page()
for device in page_devices:
var info = device.values()[0]
var button_instance = ButtonScene.instantiate()
button_instance.label = info["name"]
button_instance.on_button_down.connect(func():
_on_device_click(device.keys()[0])
)
devices_node.add_child(button_instance)
devices_node._update_container()
func render_entities():
var entities = get_page()
var back_button = ButtonScene.instantiate()
back_button.label = "arrow_back"
back_button.icon = true
back_button.on_button_down.connect(func():
_on_entity_click("#back")
) )
devices_node.add_child(back_button)
for entity in entities: R.effect(func(_arg):
var button_instance = ButtonScene.instantiate() if selected_device.value == null:
button_instance.label = entity if devices_page.is_inside_tree() == false:
button_instance.on_button_down.connect(func(): add_child(devices_page)
_on_entity_click(entity)
)
devices_node.add_child(button_instance)
devices_node._update_container() if entities_page.is_inside_tree():
remove_child(entities_page)
func _on_device_click(device_id): if selected_device.value != null:
selected_device = device_id if entities_page.is_inside_tree() == false:
last_device_page = page add_child(entities_page)
page = 0
render() if devices_page.is_inside_tree():
remove_child(devices_page)
func _on_entity_click(entity_name): )
if entity_name == "#back":
selected_device = null
page = last_device_page
AudioPlayer.play_effect("click")
render()
return
AudioPlayer.play_effect("spawn")
var entity = House.body.create_entity(entity_name, global_position)
if entity == null:
EventSystem.notify("Entity is not in Room", EventNotify.Type.INFO)
func clear_menu():
for child in devices_node.get_children():
devices_node.remove_child(child)
child.queue_free()

View File

@ -1,33 +1,95 @@
[gd_scene load_steps=4 format=3 uid="uid://crrb0l3ekuotj"] [gd_scene load_steps=11 format=3 uid="uid://crrb0l3ekuotj"]
[ext_resource type="Script" path="res://content/ui/menu/edit/edit_menu.gd" id="1_34cbn"] [ext_resource type="Script" path="res://content/ui/menu/edit/edit_menu.gd" id="1_34cbn"]
[ext_resource type="Script" path="res://content/ui/menu/edit/devices.gd" id="2_rkvf4"]
[ext_resource type="Script" path="res://content/ui/components/grid_container/grid_container.gd" id="3_0xvyw"] [ext_resource type="Script" path="res://content/ui/components/grid_container/grid_container.gd" id="3_0xvyw"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="4_tvimg"] [ext_resource type="PackedScene" uid="uid://bef3gamrm6at2" path="res://content/ui/components/pagination/pagination.tscn" id="4_4jiu6"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="4_lpv7m"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="4_xunmy"]
[ext_resource type="Script" path="res://content/ui/menu/edit/entities.gd" id="5_t34xe"]
[ext_resource type="Script" path="res://content/ui/components/flex_container/flex_container.gd" id="6_cr6p6"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_hstwo"]
render_priority = -3
shader = ExtResource("4_xunmy")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.42, 0.32)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_4pj6f"]
size = Vector2(0.42, 0.32)
[node name="EditMenu" type="Node3D"] [node name="EditMenu" type="Node3D"]
script = ExtResource("1_34cbn") script = ExtResource("1_34cbn")
[node name="Devices" type="Node3D" parent="."] [node name="Devices" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0.01, 0.03) script = ExtResource("2_rkvf4")
[node name="GridContainer3D" type="Node3D" parent="Devices"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.05, -0.08, 0)
script = ExtResource("3_0xvyw") script = ExtResource("3_0xvyw")
depth_gap = 0.06 columns = 7
size = Vector3(0.24, 0.1, 0.1) gaps = Vector2(0.01, 0.01)
size = Vector3(0.28, 0.1, 0.1)
[node name="PageNumberLabel" type="Label3D" parent="."] [node name="Label3D" type="Label3D" parent="Devices"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.26, 0.01, 0.27) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.03, 0)
pixel_size = 0.001 pixel_size = 0.001
text = "0 / 0" double_sided = false
font_size = 18 render_priority = 15
outline_render_priority = 14
text = "Devices"
font_size = 24
outline_size = 0 outline_size = 0
horizontal_alignment = 0
[node name="Buttons" type="Node3D" parent="."] [node name="Pagination3D" parent="Devices" instance=ExtResource("4_4jiu6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.19, 0.01, 0.27) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.29, 0)
pages = 10
size = Vector3(9.92, 0.03, 0.01)
[node name="NextPageButton" parent="Buttons" instance=ExtResource("4_tvimg")] [node name="Entities" type="Node3D" parent="."]
label = "navigate_next" script = ExtResource("5_t34xe")
[node name="FlexContainer3D" type="Node3D" parent="Entities"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, -0.06, 0)
script = ExtResource("6_cr6p6")
vertical = true
gap = 0.01
size = Vector3(1, 0.2, 1)
[node name="Pagination3D" parent="Entities" instance=ExtResource("4_4jiu6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.29, 0)
pages = 10
size = Vector3(9.92, 0.03, 0.01)
[node name="Label3D" type="Label3D" parent="Entities"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.05, -0.03, 0)
pixel_size = 0.001
double_sided = false
render_priority = 15
outline_render_priority = 14
text = "My Entity"
font_size = 24
outline_size = 0
horizontal_alignment = 0
[node name="Button" parent="Entities" instance=ExtResource("4_lpv7m")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, -0.03, 0)
label = "arrow_back"
icon = true icon = true
size = Vector3(0.03, 0.03, 0.01)
[node name="PreviousPageButton" parent="Buttons" instance=ExtResource("4_tvimg")] [node name="Background" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.08, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 1.06581e-14, 0, -1.06581e-14, 1, 0.21, -0.16, 0)
label = "navigate_before" visible = false
icon = true material_override = SubResource("ShaderMaterial_hstwo")
mesh = SubResource("QuadMesh_4pj6f")
skeleton = NodePath("../..")

View File

@ -0,0 +1,58 @@
extends Node3D
signal on_select_entity(entity_id)
signal on_back()
const EntityScene = preload ("entity.tscn")
@onready var entity_container = $FlexContainer3D
@onready var pagination = $Pagination3D
@onready var back_button = $Button
var page = R.state(0)
var page_size = 5.0
var selected_device = R.state(null)
func _ready():
var entities = R.computed(func(_arg):
var devices=Store.devices.state.devices
for device in devices:
if device.keys()[0] == selected_device.value:
return device.values()[0]["entities"]
return []
)
var pages = R.computed(func(_arg):
return ceil(entities.value.size() / page_size)
)
var visible_entities = R.computed(func(_arg):
return entities.value.slice(page.value * page_size, page.value * page_size + page_size)
)
R.bind(pagination, "pages", pages)
R.bind(pagination, "page", page, pagination.on_page_changed)
back_button.on_button_up.connect(func():
on_back.emit()
)
R.effect(func(_arg):
for child in entity_container.get_children():
entity_container.remove_child(child)
child.queue_free()
for entity in visible_entities.value:
var entity_node=EntityScene.instantiate()
entity_node.icon=EntityFactory.get_entity_icon(entity.split(".")[0])
entity_node.text=entity
entity_node.on_select.connect(func():
on_select_entity.emit(entity)
)
entity_container.add_child(entity_node)
entity_container._update()
)

View File

@ -0,0 +1,32 @@
@tool
extends FlexContainer3D
signal on_select()
@onready var button = $Button
@onready var label = $LabelContainer
@export var icon: String = "question_mark":
set(value):
icon = value
_update()
@export var text: String = "Button":
set(value):
text = value
_update()
func _ready():
super._ready()
button.on_button_up.connect(func():
on_select.emit()
)
func _update():
if !is_node_ready(): return
button.label = icon
label.text = text
super._update()

View File

@ -0,0 +1,22 @@
[gd_scene load_steps=4 format=3 uid="uid://uogsamyglyw5"]
[ext_resource type="Script" path="res://content/ui/menu/edit/entity.gd" id="1_d4c6l"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="2_gi1de"]
[ext_resource type="PackedScene" uid="uid://blkfqa3ttk0d2" path="res://content/ui/components/label_container/label_container.tscn" id="3_vva3t"]
[node name="Entity" type="Node3D"]
script = ExtResource("1_d4c6l")
gap = 0.01
size = Vector3(0.35, 0.03, 1)
[node name="Button" parent="." instance=ExtResource("2_gi1de")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.015, 0, 0)
label = "question_mark"
icon = true
size = Vector3(0.03, 0.03, 0.01)
[node name="LabelContainer" parent="." instance=ExtResource("3_vva3t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0615, 0, 0)
text = "Button"
font_size = 12
size = Vector3(0.043, 0.015, 0.1)

View File

@ -1,9 +0,0 @@
extends StaticBody3D
@onready var label: Label3D = $Label
@export var text = "Default"
func set_entity_name(text):
assert(label != null, "Entity has to be added to the scene tree")
label.text = text.replace(".", "\n")
self.text = text

View File

@ -1,32 +0,0 @@
[gd_scene load_steps=5 format=3 uid="uid://xo0o5nrfjl23"]
[ext_resource type="Script" path="res://content/ui/menu/edit/entity/entity.gd" id="1_825oj"]
[ext_resource type="Script" path="res://content/functions/clickable.gd" id="2_i054q"]
[sub_resource type="BoxMesh" id="BoxMesh_aa3i4"]
size = Vector3(0.05, 0.01, 0.05)
[sub_resource type="BoxShape3D" id="BoxShape3D_28fjq"]
size = Vector3(0.05, 0.01, 0.05)
[node name="Entity" type="StaticBody3D"]
script = ExtResource("1_825oj")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("BoxMesh_aa3i4")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("BoxShape3D_28fjq")
[node name="Label" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.007, 0)
pixel_size = 0.001
modulate = Color(0, 0, 0, 1)
text = "Text"
font_size = 8
outline_size = 0
autowrap_mode = 3
width = 50.0
[node name="Clickable" type="Node" parent="."]
script = ExtResource("2_i054q")

View File

@ -35,7 +35,7 @@ func _ready():
notification_node.type=event.type notification_node.type=event.type
for child in notify_place.get_children(): for child in notify_place.get_children():
child.position += Vector3(0, 0, -0.06) child.position += Vector3(0, 0.06, 0)
notify_place.add_child(notification_node) notify_place.add_child(notification_node)
) )
@ -44,6 +44,4 @@ func move_into_view():
var camera_transform = main.camera.global_transform var camera_transform = main.camera.global_transform
camera_transform.origin -= camera_transform.basis.z * 0.5 camera_transform.origin -= camera_transform.basis.z * 0.5
camera_transform.basis = camera_transform.basis.rotated(camera_transform.basis.x, deg_to_rad(90))
global_transform = camera_transform global_transform = camera_transform

View File

@ -1,8 +1,8 @@
[gd_scene load_steps=19 format=3 uid="uid://c3kdssrmv84kv"] [gd_scene load_steps=20 format=3 uid="uid://c3kdssrmv84kv"]
[ext_resource type="Script" path="res://content/ui/menu/menu.gd" id="1_ng4u3"] [ext_resource type="Script" path="res://content/ui/menu/menu.gd" id="1_ng4u3"]
[ext_resource type="Material" uid="uid://bnwimm214q67g" path="res://assets/materials/sec-500.material" id="2_0x5at"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="2_8coxu"] [ext_resource type="Script" path="res://content/functions/movable.gd" id="2_8coxu"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="3_htaoi"]
[ext_resource type="Script" path="res://content/ui/components/tabs/tabs.gd" id="4_eavfx"] [ext_resource type="Script" path="res://content/ui/components/tabs/tabs.gd" id="4_eavfx"]
[ext_resource type="PackedScene" uid="uid://crrb0l3ekuotj" path="res://content/ui/menu/edit/edit_menu.tscn" id="4_r2raj"] [ext_resource type="PackedScene" uid="uid://crrb0l3ekuotj" path="res://content/ui/menu/edit/edit_menu.tscn" id="4_r2raj"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="5_w4i01"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="5_w4i01"]
@ -13,16 +13,42 @@
[ext_resource type="PackedScene" uid="uid://c6r4higceibif" path="res://content/ui/menu/settings/settings_menu.tscn" id="11_7wm6b"] [ext_resource type="PackedScene" uid="uid://c6r4higceibif" path="res://content/ui/menu/settings/settings_menu.tscn" id="11_7wm6b"]
[sub_resource type="BoxShape3D" id="BoxShape3D_e1esh"] [sub_resource type="BoxShape3D" id="BoxShape3D_e1esh"]
size = Vector3(0.38, 0.0128076, 0.32) size = Vector3(0.51, 0.32, 0.013)
[sub_resource type="BoxShape3D" id="BoxShape3D_6xn1i"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_du6qr"]
size = Vector3(0.3, 0.0264844, 0.3) render_priority = 0
shader = ExtResource("3_htaoi")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.42, 0.32)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_01s1g"] [sub_resource type="QuadMesh" id="QuadMesh_4bh1v"]
lightmap_size_hint = Vector2i(4, 3)
size = Vector2(0.42, 0.32)
[sub_resource type="BoxMesh" id="BoxMesh_08du6"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_mhqg4"]
material = SubResource("StandardMaterial3D_01s1g") render_priority = 0
size = Vector3(0.3, 0.01, 0.3) shader = ExtResource("3_htaoi")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.07, 0.32)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_7q1en"]
size = Vector2(0.07, 0.32)
[sub_resource type="Animation" id="Animation_61md4"] [sub_resource type="Animation" id="Animation_61md4"]
length = 0.001 length = 0.001
@ -162,69 +188,78 @@ _data = {
} }
[node name="Menu" type="StaticBody3D"] [node name="Menu" type="StaticBody3D"]
collision_layer = 2 collision_layer = 6
collision_mask = 2 collision_mask = 6
script = ExtResource("1_ng4u3") script = ExtResource("1_ng4u3")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.02, -0.00286309, 1.49012e-08) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, -0.005)
shape = SubResource("BoxShape3D_e1esh") shape = SubResource("BoxShape3D_e1esh")
[node name="Movable" type="Node" parent="."] [node name="Movable" type="Node" parent="."]
script = ExtResource("2_8coxu") script = ExtResource("2_8coxu")
[node name="AnimationContainer" type="StaticBody3D" parent="."] [node name="AnimationContainer" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.2, 0, -0.15) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.23, 0.15, 0)
collision_layer = 6
collision_mask = 6
[node name="CollisionShape3D" type="CollisionShape3D" parent="AnimationContainer"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.21, -0.00824219, 0.15)
shape = SubResource("BoxShape3D_6xn1i")
[node name="Background" type="MeshInstance3D" parent="AnimationContainer"] [node name="Background" type="MeshInstance3D" parent="AnimationContainer"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.21, 0, 0.15) transform = Transform3D(1, 0, 0, 0, 1, 1.06581e-14, 0, -1.06581e-14, 1, 0.23, -0.15, 0)
material_override = ExtResource("2_0x5at") material_override = SubResource("ShaderMaterial_du6qr")
mesh = SubResource("BoxMesh_08du6") mesh = SubResource("QuadMesh_4bh1v")
skeleton = NodePath("../..")
[node name="Background2" type="MeshInstance3D" parent="AnimationContainer"]
transform = Transform3D(1, 0, 0, 0, 1, 1.06581e-14, 0, -1.06581e-14, 1, -0.02, -0.15, 0)
material_override = SubResource("ShaderMaterial_mhqg4")
mesh = SubResource("QuadMesh_7q1en")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="Tabs" type="Node3D" parent="AnimationContainer" node_paths=PackedStringArray("initial_selected")] [node name="Tabs" type="Node3D" parent="AnimationContainer" node_paths=PackedStringArray("initial_selected")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.02, -0.005, 0)
script = ExtResource("4_eavfx") script = ExtResource("4_eavfx")
initial_selected = NodePath("View") initial_selected = NodePath("View")
vertical = true
gap = 0.01
size = Vector3(0.05, 0.4, 1)
[node name="View" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] [node name="View" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.03) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.025, 0)
label = "visibility" label = "visibility"
icon = true icon = true
toggleable = true toggleable = true
disabled = true
size = Vector3(0.05, 0.05, 0.01)
[node name="Edit" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] [node name="Edit" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.09) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.085, 0)
label = "widgets" label = "widgets"
icon = true icon = true
toggleable = true toggleable = true
size = Vector3(0.05, 0.05, 0.01)
[node name="Room" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] [node name="Room" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.15) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.145, 0)
label = "view_in_ar" label = "view_in_ar"
icon = true icon = true
toggleable = true toggleable = true
size = Vector3(0.05, 0.05, 0.01)
[node name="Automate" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] [node name="Automate" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.21) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.205, 0)
label = "schema" label = "schema"
icon = true icon = true
toggleable = true toggleable = true
size = Vector3(0.05, 0.05, 0.01)
[node name="Settings" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")] [node name="Settings" parent="AnimationContainer/Tabs" instance=ExtResource("5_w4i01")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.27) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.265, 0)
label = "settings" label = "settings"
icon = true icon = true
toggleable = true toggleable = true
size = Vector3(0.05, 0.05, 0.01)
[node name="TabsContent" type="Node3D" parent="AnimationContainer" node_paths=PackedStringArray("tabs")] [node name="TabsContent" type="Node3D" parent="AnimationContainer" node_paths=PackedStringArray("tabs")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, 0.00999999, 0)
script = ExtResource("6_7rntr") script = ExtResource("6_7rntr")
tabs = NodePath("../Tabs") tabs = NodePath("../Tabs")
@ -243,11 +278,11 @@ visible = false
visible = false visible = false
[node name="NotifyPlace" type="Marker3D" parent="AnimationContainer"] [node name="NotifyPlace" type="Marker3D" parent="AnimationContainer"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, 0, -0.05) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, 0.06, 0)
gizmo_extents = 0.02 gizmo_extents = 0.02
[node name="KeyboardPlace" type="Marker3D" parent="AnimationContainer"] [node name="KeyboardPlace" type="Marker3D" parent="AnimationContainer"]
transform = Transform3D(0.5, 0, 0, 0, 0.353553, 0.353553, 0, -0.353553, 0.353553, 0.2, 0.130848, 0.45) transform = Transform3D(0.5, 0, 0, 0, 0.353553, 0.353553, 0, -0.353553, 0.353553, 0.2, -0.38, 0.16)
gizmo_extents = 0.02 gizmo_extents = 0.02
[node name="ImmersiveHomePanels" type="MeshInstance3D" parent="."] [node name="ImmersiveHomePanels" type="MeshInstance3D" parent="."]

View File

@ -1,43 +1,62 @@
[gd_scene load_steps=9 format=3 uid="uid://c01gkeldvjwtr"] [gd_scene load_steps=10 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="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="4_cghmp"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="4_cghmp"]
[ext_resource type="Script" path="res://content/ui/components/tabs/tabs.gd" id="5_ddrep"] [ext_resource type="Script" path="res://content/ui/components/tabs/tabs.gd" id="5_ddrep"]
[ext_resource type="PackedScene" uid="uid://dd71loi64gnmp" path="res://content/ui/menu/room/views/overview.tscn" id="6_206ad"] [ext_resource type="PackedScene" uid="uid://dd71loi64gnmp" path="res://content/ui/menu/room/views/overview.tscn" id="6_206ad"]
[ext_resource type="Script" path="res://content/ui/components/tabs/tabs_content.gd" id="6_ba00g"] [ext_resource type="Script" path="res://content/ui/components/tabs/tabs_content.gd" id="6_ba00g"]
[ext_resource type="PackedScene" uid="uid://bpta22fahai46" path="res://content/ui/menu/room/views/rooms.tscn" id="7_2f8e0"] [ext_resource type="PackedScene" uid="uid://bpta22fahai46" path="res://content/ui/menu/room/views/rooms.tscn" id="7_2f8e0"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="7_bxp1w"]
[sub_resource type="BoxMesh" id="BoxMesh_e37nn"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_2asng"]
size = Vector3(0.3, 0.01, 0.3) render_priority = -3
shader = ExtResource("7_bxp1w")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.42, 0.32)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_16sg5"]
size = Vector2(0.42, 0.32)
[node name="RoomMenu" type="Node3D"] [node name="RoomMenu" type="Node3D"]
script = ExtResource("1_ch4jb") script = ExtResource("1_ch4jb")
[node name="Background" type="MeshInstance3D" parent="."]
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")
[node name="Interface" type="Node3D" parent="."] [node name="Interface" type="Node3D" parent="."]
[node name="Tabs3D" type="Node3D" parent="Interface" node_paths=PackedStringArray("initial_selected")] [node name="Tabs3D" type="Node3D" parent="Interface" node_paths=PackedStringArray("initial_selected")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.04, 0)
script = ExtResource("5_ddrep") script = ExtResource("5_ddrep")
initial_selected = NodePath("Overview") initial_selected = NodePath("Overview")
gap = 0.01
[node name="Overview" parent="Interface/Tabs3D" instance=ExtResource("4_cghmp")] [node name="Overview" parent="Interface/Tabs3D" instance=ExtResource("4_cghmp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0, 0.02) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0, 0)
label = "Overview" label = "Overview"
size = Vector3(0.06, 0.04, 0.01)
[node name="Rooms" parent="Interface/Tabs3D" instance=ExtResource("4_cghmp")] [node name="Rooms" parent="Interface/Tabs3D" instance=ExtResource("4_cghmp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.09, 0, 0.02) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1, 0, 0)
label = "Rooms" label = "Rooms"
size = Vector3(0.06, 0.04, 0.01)
[node name="TabsContent3D" type="Node3D" parent="Interface" node_paths=PackedStringArray("tabs")] [node name="TabsContent3D" type="Node3D" parent="Interface" node_paths=PackedStringArray("tabs")]
script = ExtResource("6_ba00g") script = ExtResource("6_ba00g")
tabs = NodePath("../Tabs3D") tabs = NodePath("../Tabs3D")
[node name="Overview" parent="Interface/TabsContent3D" instance=ExtResource("6_206ad")] [node name="Overview" parent="Interface/TabsContent3D" instance=ExtResource("6_206ad")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.04)
[node name="Rooms" parent="Interface/TabsContent3D" instance=ExtResource("7_2f8e0")] [node name="Rooms" parent="Interface/TabsContent3D" instance=ExtResource("7_2f8e0")]
[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)
visible = false
material_override = SubResource("ShaderMaterial_2asng")
mesh = SubResource("QuadMesh_16sg5")
skeleton = NodePath("../..")

View File

@ -1,24 +1,52 @@
[gd_scene load_steps=3 format=3 uid="uid://dd71loi64gnmp"] [gd_scene load_steps=6 format=3 uid="uid://dd71loi64gnmp"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_fteh8"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_fteh8"]
[ext_resource type="Script" path="res://content/ui/menu/room/views/overview.gd" id="1_jesad"] [ext_resource type="Script" path="res://content/ui/menu/room/views/overview.gd" id="1_jesad"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="3_2yl2s"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_n3lbn"]
render_priority = -3
shader = ExtResource("3_2yl2s")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.42, 0.32)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_l1dos"]
size = Vector2(0.42, 0.32)
[node name="Overview" type="Node3D"] [node name="Overview" type="Node3D"]
script = ExtResource("1_jesad") script = ExtResource("1_jesad")
[node name="EditButton" parent="." instance=ExtResource("1_fteh8")] [node name="EditButton" parent="." instance=ExtResource("1_fteh8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04, 0, 0.07) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04, -0.12, 0)
label = "edit" label = "edit"
icon = true icon = true
[node name="FixButton" parent="." instance=ExtResource("1_fteh8")] [node name="FixButton" parent="." instance=ExtResource("1_fteh8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1, 0, 0.07) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1, -0.12, 0)
label = "healing" label = "healing"
icon = true icon = true
[node name="Label3D" type="Label3D" parent="."] [node name="Label3D" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.06, 0.01, 0.02) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, -0.08, 0.01)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Reference" text = "Reference"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0
[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)
visible = false
material_override = SubResource("ShaderMaterial_n3lbn")
mesh = SubResource("QuadMesh_l1dos")
skeleton = NodePath("../..")

View File

@ -104,7 +104,7 @@ func _on_click(event: EventPointer):
func _generate_room_map(): func _generate_room_map():
var rooms = Store.house.state.rooms var rooms = Store.house.state.rooms
var target_size = Vector2(0.2, 0.24) var target_size = Vector2(0.2, 0.2)
var target_offset = Vector2(0, 0.05) var target_offset = Vector2(0, 0.05)
for old_room in rooms_map.get_children(): for old_room in rooms_map.get_children():
@ -156,6 +156,7 @@ func _generate_room_map():
var scale_value = min(target_scale.x, target_scale.y) var scale_value = min(target_scale.x, target_scale.y)
rooms_map.position.x = -current_min.x * scale_value + target_offset.x rooms_map.position.x = -current_min.x * scale_value + target_offset.x
rooms_map.position.z = -current_min.y * scale_value + target_offset.y rooms_map.position.y = current_min.y * scale_value - target_offset.y
rooms_map.position.z = 0.002
rooms_map.scale = Vector3(scale_value, scale_value, scale_value) rooms_map.scale = Vector3(scale_value, scale_value, scale_value)

View File

@ -1,21 +1,46 @@
[gd_scene load_steps=4 format=3 uid="uid://bpta22fahai46"] [gd_scene load_steps=7 format=3 uid="uid://bpta22fahai46"]
[ext_resource type="Script" path="res://content/ui/menu/room/views/rooms.gd" id="1_3a1oa"] [ext_resource type="Script" path="res://content/ui/menu/room/views/rooms.gd" id="1_3a1oa"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_y3lty"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_y3lty"]
[ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="2_hstw7"] [ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="2_hstw7"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="4_jx6i3"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_dah0r"]
render_priority = -3
shader = ExtResource("4_jx6i3")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.42, 0.32)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_fq44b"]
size = Vector2(0.42, 0.32)
[node name="Rooms" type="Node3D"] [node name="Rooms" type="Node3D"]
script = ExtResource("1_3a1oa") script = ExtResource("1_3a1oa")
[node name="Rooms" type="Node3D" parent="."] [node name="Rooms" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0.01, 0.17) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0.14, -0.15, 0)
[node name="Button" parent="." instance=ExtResource("1_y3lty")] [node name="Button" parent="." instance=ExtResource("1_y3lty")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.27, 0, 0.27) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, -0.28, 0)
label = "add" label = "add"
icon = true icon = true
[node name="Input" parent="." instance=ExtResource("2_hstw7")] [node name="Input" parent="." instance=ExtResource("2_hstw7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.12, 0.005, 0.27) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.09, -0.28, 0)
text = "Room 1" text = "Room 1"
disabled = true disabled = true
[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)
visible = false
material_override = SubResource("ShaderMaterial_dah0r")
mesh = SubResource("QuadMesh_fq44b")
skeleton = NodePath("../..")

View File

@ -12,8 +12,10 @@ const credits_scene = preload ("./credits.tscn")
@onready var clear_save = $Content/ClearSave @onready var clear_save = $Content/ClearSave
@onready var background = $Background @onready var background = $Background
@onready var voice_assist = $Content/VoiceAssist @onready var voice_assist = $Content/VoiceAssist
@onready var version_label = $Content/LabelVersion
func _ready(): func _ready():
_load_game_version()
var settings_store = Store.settings.state var settings_store = Store.settings.state
background.visible = false background.visible = false
@ -96,3 +98,9 @@ func _ready():
R.bind(voice_assist, "label", button_label) R.bind(voice_assist, "label", button_label)
R.bind(voice_assist, "active", settings_store, "voice_assistant") R.bind(voice_assist, "active", settings_store, "voice_assistant")
func _load_game_version():
var presets = ConfigFile.new()
presets.load("res://export_presets.cfg")
version_label.text = "%s (%s)" % [presets.get_value("preset.1.options", "version/name", "v0.0.0"), presets.get_value("preset.1.options", "version/code", 0)]

View File

@ -1,39 +1,52 @@
[gd_scene load_steps=9 format=3 uid="uid://c6r4higceibif"] [gd_scene load_steps=10 format=3 uid="uid://c6r4higceibif"]
[ext_resource type="Script" path="res://content/ui/menu/settings/settings_menu.gd" id="1_0lte6"] [ext_resource type="Script" path="res://content/ui/menu/settings/settings_menu.gd" id="1_0lte6"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_faxng"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="1_faxng"]
[ext_resource type="Material" uid="uid://bujy3egn1oqac" path="res://assets/materials/pri-500.material" id="2_6lhhi"]
[ext_resource type="Script" path="res://content/functions/clickable.gd" id="3_qmg6q"] [ext_resource type="Script" path="res://content/functions/clickable.gd" id="3_qmg6q"]
[ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="4_q3x6k"] [ext_resource type="PackedScene" uid="uid://blrhy2uccrdn4" path="res://content/ui/components/input/input.tscn" id="4_q3x6k"]
[ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="5_eiwd4"] [ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="5_eiwd4"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="6_mubnp"]
[sub_resource type="BoxMesh" id="BoxMesh_e51x8"]
size = Vector3(0.3, 0.01, 0.3)
[sub_resource type="BoxShape3D" id="BoxShape3D_3qdps"] [sub_resource type="BoxShape3D" id="BoxShape3D_3qdps"]
size = Vector3(0.08, 0.01, 0.02) size = Vector3(0.07, 0.02, 0.01)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_3iv64"]
render_priority = -3
shader = ExtResource("6_mubnp")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.42, 0.32)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_d0l0p"]
size = Vector2(0.42, 0.32)
[node name="SettingsMenu" type="Node3D"] [node name="SettingsMenu" type="Node3D"]
script = ExtResource("1_0lte6") script = ExtResource("1_0lte6")
[node name="Background" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0, 0.15)
material_override = ExtResource("2_6lhhi")
mesh = SubResource("BoxMesh_e51x8")
[node name="Content" type="Node3D" parent="."] [node name="Content" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.007, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.007, 0)
[node name="ConnectionStatus" type="Label3D" parent="Content"] [node name="ConnectionStatus" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.250698, 0, 0.151303) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.251, -0.151, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Disconnected" text = "Disconnected"
font_size = 8 font_size = 8
outline_size = 0 outline_size = 0
[node name="LabelURL" type="Label3D" parent="Content"] [node name="LabelURL" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.01, 0, 0.03) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.03, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "url: text = "url:
" "
font_size = 18 font_size = 18
@ -41,51 +54,63 @@ outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="InputURL" parent="Content" instance=ExtResource("4_q3x6k")] [node name="InputURL" parent="Content" instance=ExtResource("4_q3x6k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, 0, 0.03) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, -0.03, 0)
text = "ws://192.168.0.1:8123" text = "ws://192.168.0.1:8123"
size = Vector3(0.2, 0.03, 0.01)
[node name="LabelToken" type="Label3D" parent="Content"] [node name="LabelToken" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.01, 0, 0.07) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.07, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "token:" text = "token:"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="InputToken" parent="Content" instance=ExtResource("4_q3x6k")] [node name="InputToken" parent="Content" instance=ExtResource("4_q3x6k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, 0, 0.07) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, -0.07, 0)
text = "..." text = "..."
size = Vector3(0.2, 0.03, 0.01)
[node name="LabelConnect" type="Label3D" parent="Content"] [node name="LabelConnect" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.14, 0, 0.12) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.14, -0.12, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Connect" text = "Connect"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="Connect" parent="Content" instance=ExtResource("1_faxng")] [node name="Connect" parent="Content" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0, 0.12) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, -0.12, 0)
label = "login" label = "login"
icon = true icon = true
[node name="Credits" type="StaticBody3D" parent="Content"] [node name="Credits" type="StaticBody3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0102286, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.37, -0.300229, 0)
visible = false
[node name="CollisionShape3D" type="CollisionShape3D" parent="Content/Credits"] [node name="CollisionShape3D" type="CollisionShape3D" parent="Content/Credits"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.26, 0.005, 0.29) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.005, 0, 0)
shape = SubResource("BoxShape3D_3qdps") shape = SubResource("BoxShape3D_3qdps")
disabled = true
[node name="Label" type="Label3D" parent="Content/Credits"] [node name="Label" type="Label3D" parent="Content/Credits"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.26, 0.0102286, 0.29) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.98023e-08, 0, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "credits" text = "credits"
font_size = 12 font_size = 12
outline_size = 0 outline_size = 0
[node name="Hearth" type="Label3D" parent="Content/Credits"] [node name="Hearth" type="Label3D" parent="Content/Credits"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.29, 0.0102286, 0.29) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
modulate = Color(0.584314, 0, 0, 1) modulate = Color(0.584314, 0, 0, 1)
text = "favorite" text = "favorite"
font = ExtResource("5_eiwd4") font = ExtResource("5_eiwd4")
@ -96,34 +121,40 @@ outline_size = 0
script = ExtResource("3_qmg6q") script = ExtResource("3_qmg6q")
[node name="SaveLabel" type="Label3D" parent="Content"] [node name="SaveLabel" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.01, 0, 0.21) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.21, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Manual Save:" text = "Manual Save:"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="Save" parent="Content" instance=ExtResource("1_faxng")] [node name="Save" parent="Content" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.17, 0, 0.21) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.17, -0.21, 0)
label = "save" label = "save"
icon = true icon = true
[node name="clearSaveLabel" type="Label3D" parent="Content"] [node name="clearSaveLabel" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.01, 0, 0.26) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.26, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Clear Save:" text = "Clear Save:"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="ClearSave" parent="Content" instance=ExtResource("1_faxng")] [node name="ClearSave" parent="Content" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.17, 0, 0.27) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.17, -0.27, 0)
label = "close" label = "close"
icon = true icon = true
[node name="clearSaveWarning" type="Label3D" parent="Content"] [node name="clearSaveWarning" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.01, 0, 0.28) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.28, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
modulate = Color(1, 0, 0, 1) modulate = Color(1, 0, 0, 1)
text = "Caution! This will delete all your rooms and placed devices." text = "Caution! This will delete all your rooms and placed devices."
font_size = 8 font_size = 8
@ -133,16 +164,34 @@ autowrap_mode = 3
width = 150.0 width = 150.0
[node name="VoiceAssist" parent="Content" instance=ExtResource("1_faxng")] [node name="VoiceAssist" parent="Content" instance=ExtResource("1_faxng")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1, 0, 0.12) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1, -0.12, 0)
label = "mic_off" label = "mic_off"
icon = true icon = true
toggleable = true toggleable = true
[node name="LabelVoiceAssist" type="Label3D" parent="Content"] [node name="LabelVoiceAssist" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.01, 0, 0.12) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, -0.12, 0)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Voice- text = "Voice-
Assist:" Assist:"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="LabelVersion" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.41, -0.31, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "v0.0.0"
font_size = 10
outline_size = 0
horizontal_alignment = 2
[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_3iv64")
mesh = SubResource("QuadMesh_d0l0p")
skeleton = NodePath("../..")

View File

@ -1,108 +1,135 @@
[gd_scene load_steps=6 format=3 uid="uid://ddpxthb414unp"] [gd_scene load_steps=7 format=3 uid="uid://ddpxthb414unp"]
[ext_resource type="Script" path="res://content/ui/menu/view/view_menu.gd" id="1_hxajx"] [ext_resource type="Script" path="res://content/ui/menu/view/view_menu.gd" id="1_hxajx"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="2_qan1b"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="2_qan1b"]
[ext_resource type="Material" uid="uid://bujy3egn1oqac" path="res://assets/materials/pri-500.material" id="2_se6ic"]
[ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="4_d3xhb"] [ext_resource type="PackedScene" uid="uid://pk5k1q8bx0rj" path="res://content/ui/components/slider/slider.tscn" id="4_d3xhb"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="5_cjxo5"]
[sub_resource type="BoxMesh" id="BoxMesh_qr3bi"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_e5hvo"]
size = Vector3(0.3, 0.01, 0.3) render_priority = 10
shader = ExtResource("5_cjxo5")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.42, 0.32)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_1j6jf"]
size = Vector2(0.42, 0.32)
[node name="ViewMenu" type="Node3D"] [node name="ViewMenu" type="Node3D"]
script = ExtResource("1_hxajx") script = ExtResource("1_hxajx")
[node name="Background" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0, 0.15)
material_override = ExtResource("2_se6ic")
mesh = SubResource("BoxMesh_qr3bi")
[node name="Content" type="Node3D" parent="."] [node name="Content" type="Node3D" parent="."]
[node name="MiniView" parent="Content" instance=ExtResource("2_qan1b")] [node name="MiniView" parent="Content" instance=ExtResource("2_qan1b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0, 0.03) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04, -0.04, 0)
label = "view_comfy" label = "view_comfy"
icon = true icon = true
toggleable = true toggleable = true
[node name="MiniViewLabel" type="Label3D" parent="Content"] [node name="MiniViewLabel" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0.07, 0.01, 0.03) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.07, -0.04, 0)
pixel_size = 0.001 pixel_size = 0.001
double_sided = false
render_priority = 15
outline_render_priority = 14
text = "Mini View" text = "Mini View"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="HeatMap" parent="Content" instance=ExtResource("2_qan1b")] [node name="HeatMap" parent="Content" instance=ExtResource("2_qan1b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0, 0.09) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04, -0.1, 0)
label = "device_thermostat" label = "device_thermostat"
icon = true icon = true
toggleable = true toggleable = true
[node name="HeatMapLabel" type="Label3D" parent="Content"] [node name="HeatMapLabel" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0.07, 0.01, 0.09) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.07, -0.1, 0)
pixel_size = 0.001 pixel_size = 0.001
double_sided = false
render_priority = 15
outline_render_priority = 14
text = "Heat Map" text = "Heat Map"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="HumidityMap" parent="Content" instance=ExtResource("2_qan1b")] [node name="HumidityMap" parent="Content" instance=ExtResource("2_qan1b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, 0, 0.15) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04, -0.16, 0)
label = "humidity_mid" label = "humidity_mid"
icon = true icon = true
toggleable = true toggleable = true
[node name="HumidityMapLabel" type="Label3D" parent="Content"] [node name="HumidityMapLabel" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0.07, 0.01, 0.15) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.07, -0.16, 0)
pixel_size = 0.001 pixel_size = 0.001
double_sided = false
render_priority = 15
outline_render_priority = 14
text = "Humidity Map" text = "Humidity Map"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="MinSlider" parent="Content" instance=ExtResource("4_d3xhb")] [node name="MinSlider" parent="Content" instance=ExtResource("4_d3xhb")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0.01, 0.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.09, -0.21, 0)
value = 0.0 value = 0.0
step = 1.0 step = 1.0
show_label = true
size = Vector3(10, 0.4, 1)
[node name="MinValue" type="Label3D" parent="Content"] [node name="MinValue" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0.15, 0.01, 0.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, -0.21, 0)
pixel_size = 0.001 pixel_size = 0.001
double_sided = false
render_priority = 15
outline_render_priority = 14
text = "Min Value" text = "Min Value"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="MaxSlider" parent="Content" instance=ExtResource("4_d3xhb")] [node name="MaxSlider" parent="Content" instance=ExtResource("4_d3xhb")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0.01, 0.24) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.09, -0.25, 0)
value = 0.0 value = 0.0
step = 1.0 step = 1.0
show_label = true
size = Vector3(10, 0.4, 1)
[node name="MaxValue" type="Label3D" parent="Content"] [node name="MaxValue" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0.15, 0.01, 0.24) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, -0.25, 0)
pixel_size = 0.001 pixel_size = 0.001
double_sided = false
render_priority = 15
outline_render_priority = 14
text = "Max Value" text = "Max Value"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[node name="OpacitySlider" parent="Content" instance=ExtResource("4_d3xhb")] [node name="OpacitySlider" parent="Content" instance=ExtResource("4_d3xhb")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0.01, 0.28) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.09, -0.29, 0)
max = 100.0 max = 100.0
value = 30.0 value = 30.0
step = 10.0 step = 10.0
show_label = true
label_unit = "%" label_unit = "%"
size = Vector3(10, 0.4, 1)
[node name="OpacityLabel" type="Label3D" parent="Content"] [node name="OpacityLabel" type="Label3D" parent="Content"]
transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0.15, 0.01, 0.28) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, -0.29, 0)
pixel_size = 0.001 pixel_size = 0.001
double_sided = false
render_priority = 15
outline_render_priority = 14
text = "Opacity" text = "Opacity"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
[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_e5hvo")
mesh = SubResource("QuadMesh_1j6jf")
skeleton = NodePath("../..")

View File

@ -3,9 +3,10 @@ extends Node3D
@onready var getting_started_button = $GettingStartedButton @onready var getting_started_button = $GettingStartedButton
@onready var close_button = $CloseButton @onready var close_button = $CloseButton
@onready var camera = $"/root/Main/XROrigin3D/XRCamera3D" @onready var camera = $"/root/Main/XROrigin3D/XRCamera3D"
var next_new_position = global_position var next_new_position = null
func _ready(): func _ready():
next_new_position = global_position
if Store.settings.is_loaded() == false: if Store.settings.is_loaded() == false:
await Store.settings.on_loaded await Store.settings.on_loaded

View File

@ -1,28 +1,43 @@
[gd_scene load_steps=6 format=3 uid="uid://bhyddd1f0ry1x"] [gd_scene load_steps=7 format=3 uid="uid://bhyddd1f0ry1x"]
[ext_resource type="Script" path="res://content/ui/onboarding/onboarding.gd" id="1_k4yvw"] [ext_resource type="Script" path="res://content/ui/onboarding/onboarding.gd" id="1_k4yvw"]
[ext_resource type="Material" uid="uid://bujy3egn1oqac" path="res://assets/materials/pri-500.material" id="2_aleti"] [ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="2_87aan"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="3_hlpow"] [ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="3_hlpow"]
[sub_resource type="BoxShape3D" id="BoxShape3D_nfwtf"] [sub_resource type="BoxShape3D" id="BoxShape3D_nfwtf"]
size = Vector3(0.5, 0.3, 0.01) size = Vector3(0.5, 0.3, 0.01)
[sub_resource type="BoxMesh" id="BoxMesh_yknqs"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_d2ck8"]
size = Vector3(0.5, 0.3, 0.01) render_priority = 10
shader = ExtResource("2_87aan")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(0.5, 0.3)
shader_parameter/border_size = 0.001
shader_parameter/border_fade_in = 0.005
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.02
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_ij2lj"]
size = Vector2(0.5, 0.3)
[node name="Onboarding" type="StaticBody3D"] [node name="Onboarding" type="StaticBody3D"]
collision_layer = 6 collision_layer = 6
collision_mask = 6 collision_mask = 0
script = ExtResource("1_k4yvw") script = ExtResource("1_k4yvw")
[node name="Label3D2" type="Label3D" parent="."] [node name="Label3D2" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.23, -0.1, 0.006) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.23, -0.11, 0.001)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 30
outline_render_priority = 29
text = "Getting Started" text = "Getting Started"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 0
vertical_alignment = 0
autowrap_mode = 3 autowrap_mode = 3
width = 470.0 width = 470.0
@ -30,12 +45,14 @@ width = 470.0
shape = SubResource("BoxShape3D_nfwtf") shape = SubResource("BoxShape3D_nfwtf")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."] [node name="MeshInstance3D" type="MeshInstance3D" parent="."]
material_override = ExtResource("2_aleti") material_override = SubResource("ShaderMaterial_d2ck8")
mesh = SubResource("BoxMesh_yknqs") mesh = SubResource("QuadMesh_ij2lj")
[node name="GettingStartedLabel" type="Label3D" parent="."] [node name="GettingStartedLabel" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.23, 0.14, 0.006) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.23, 0.13, 0.001)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 30
outline_render_priority = 29
text = "Hey! text = "Hey!
This app is still early in development and still has a lot of rough edges. Things might break or are sometimes difficult to use, this will improve the more polished the app becomes. This app is still early in development and still has a lot of rough edges. Things might break or are sometimes difficult to use, this will improve the more polished the app becomes.
@ -49,22 +66,23 @@ autowrap_mode = 3
width = 470.0 width = 470.0
[node name="GettingStartedButton" parent="." instance=ExtResource("3_hlpow")] [node name="GettingStartedButton" parent="." instance=ExtResource("3_hlpow")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -0.05, -0.11, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.06, -0.11, 0.001)
label = "open_in_new" label = "open_in_new"
icon = true icon = true
[node name="CloseButton" parent="." instance=ExtResource("3_hlpow")] [node name="CloseButton" parent="." instance=ExtResource("3_hlpow")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0.21, -0.11, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.21, -0.11, 0.001)
label = "done" label = "done"
icon = true icon = true
[node name="CloseLabel" type="Label3D" parent="."] [node name="CloseLabel" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, -0.1, 0.006) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18, -0.11, 0.001)
pixel_size = 0.001 pixel_size = 0.001
render_priority = 30
outline_render_priority = 29
text = "Understood" text = "Understood"
font_size = 18 font_size = 18
outline_size = 0 outline_size = 0
horizontal_alignment = 0 horizontal_alignment = 2
vertical_alignment = 0
autowrap_mode = 3 autowrap_mode = 3
width = 470.0 width = 470.0

Binary file not shown.

View File

@ -6,7 +6,7 @@ runnable=true
dedicated_server=false dedicated_server=false
custom_features="" custom_features=""
export_filter="all_resources" export_filter="all_resources"
include_filter="*.j2,*.woff2" include_filter="*.j2,*.woff2,export_presets.cfg"
exclude_filter="" exclude_filter=""
export_path="builds/android/immersive-home-debug.apk" export_path="builds/android/immersive-home-debug.apk"
encryption_include_filters="" encryption_include_filters=""
@ -134,6 +134,7 @@ permissions/mount_format_filesystems=false
permissions/mount_unmount_filesystems=false permissions/mount_unmount_filesystems=false
permissions/nfc=false permissions/nfc=false
permissions/persistent_activity=false permissions/persistent_activity=false
permissions/post_notifications=false
permissions/process_outgoing_calls=false permissions/process_outgoing_calls=false
permissions/read_calendar=false permissions/read_calendar=false
permissions/read_call_log=false permissions/read_call_log=false
@ -229,7 +230,7 @@ runnable=false
dedicated_server=false dedicated_server=false
custom_features="" custom_features=""
export_filter="all_resources" export_filter="all_resources"
include_filter="*.j2,*.woff2" include_filter="*.j2,*.woff2,export_presets.cfg"
exclude_filter="" exclude_filter=""
export_path="builds/android/immersive-home.apk" export_path="builds/android/immersive-home.apk"
encryption_include_filters="" encryption_include_filters=""
@ -244,7 +245,7 @@ custom_template/release=""
gradle_build/use_gradle_build=true gradle_build/use_gradle_build=true
gradle_build/export_format=0 gradle_build/export_format=0
gradle_build/min_sdk="" gradle_build/min_sdk=""
gradle_build/target_sdk="32" gradle_build/target_sdk=""
architectures/armeabi-v7a=false architectures/armeabi-v7a=false
architectures/arm64-v8a=true architectures/arm64-v8a=true
architectures/x86=false architectures/x86=false
@ -357,6 +358,7 @@ permissions/mount_format_filesystems=false
permissions/mount_unmount_filesystems=false permissions/mount_unmount_filesystems=false
permissions/nfc=false permissions/nfc=false
permissions/persistent_activity=false permissions/persistent_activity=false
permissions/post_notifications=false
permissions/process_outgoing_calls=false permissions/process_outgoing_calls=false
permissions/read_calendar=false permissions/read_calendar=false
permissions/read_call_log=false permissions/read_call_log=false

View File

@ -1,8 +1,6 @@
extends Event extends EventBubble
## Emitted when a Node with the `ui_focus` group is focused or unfocused. ## Emitted when a Node with the `ui_focus` group is focused or unfocused.
class_name EventFocus class_name EventFocus
## The Node that is being focused or unfocused.
var target: Node
## The Node that was previously focused or unfocused. ## The Node that was previously focused or unfocused.
var previous_target: Node var previous_target: Node

View File

@ -96,8 +96,10 @@ func _handle_focus(target: Variant, event: EventBubble):
var event_focus = EventFocus.new() var event_focus = EventFocus.new()
event_focus.previous_target = _active_node event_focus.previous_target = _active_node
event_focus.target = target event_focus.target = target
event_focus.bubbling = false
if _active_node != null&&_active_node.has_method(FN_PREFIX + "focus_out"): if _active_node != null&&_active_node.has_method(FN_PREFIX + "focus_out"):
emit("focus_out", event_focus)
_active_node.call(FN_PREFIX + "focus_out", event_focus) _active_node.call(FN_PREFIX + "focus_out", event_focus)
on_focus_out.emit(event_focus) on_focus_out.emit(event_focus)

View File

@ -2,7 +2,28 @@ extends StoreClass
const StoreClass = preload ("./store.gd") const StoreClass = preload ("./store.gd")
func _init(): func _init():
self.state = R.state({}) self.state = R.state({
"devices": []
})
HomeApi.on_connect.connect(func():
var devices=await HomeApi.get_devices()
devices.sort_custom(func(a, b):
return a.values()[0]["name"].to_lower() < b.values()[0]["name"].to_lower()
)
for device in devices:
device.values()[0]["entities"].sort_custom(func(a, b):
return a.to_lower() < b.to_lower()
)
self.state.devices=devices
)
HomeApi.on_disconnect.connect(func():
self.state.devices=[]
)
func clear(): func clear():
pass pass

View File

@ -39,3 +39,24 @@ static func create_entity(id: String, type=null):
entity.entity_id = id entity.entity_id = id
return entity return entity
static func get_entity_icon(type: String) -> String:
match type:
"switch":
return "toggle_on"
"light":
return "lightbulb"
"sensor":
return "sensors"
"media_player":
return "play_circle"
"camera":
return "photo_camera"
"button":
return "radio_button_checked"
"number":
return "sliders"
"line_chart":
return "finance"
_:
return "question_mark"

View File

@ -1,5 +1,5 @@
## Returns the size of a Label3D in standard units ## Returns the size of a Label3D in standard units
static func get_font_size(label: Label3D, chars=null): static func get_font_size(label: Label3D, chars=null) -> Vector2:
var font = label.font var font = label.font
if font == null: if font == null: