62 lines
1.8 KiB
GDScript
62 lines
1.8 KiB
GDScript
class_name FlowNode extends StaticBody3D
|
|
|
|
@export var connections: Array[FlowNode]
|
|
@export var visualisers: Array[Node3D]
|
|
var visual_scene: PackedScene = preload("res://cube2.tscn")
|
|
@export var traversable: bool = true
|
|
@export var buildable: bool = true
|
|
var best_path: FlowNode :
|
|
get():
|
|
return best_path
|
|
set(value):
|
|
set_connector_color(best_path, Color.DARK_GRAY)
|
|
best_path = value
|
|
set_connector_color(best_path, Color.DARK_GREEN)
|
|
|
|
|
|
func _ready() -> void:
|
|
visualisers = []
|
|
for node: FlowNode in connections:
|
|
var visual: Node3D = visual_scene.instantiate()
|
|
add_child(visual)
|
|
visual.owner = self
|
|
visualisers.append(visual)
|
|
set_connector_color(node, Color.WEB_GRAY)
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
if visible:
|
|
for i: int in connections.size():
|
|
var distance: float = global_position.distance_to(connections[i].global_position)
|
|
visualisers[i].scale = Vector3(0.3, 0.3, 1.0 * (distance / 2.0))
|
|
visualisers[i].position = to_local(connections[i].global_position) / 4.0
|
|
if distance >= 0.05:
|
|
visualisers[i].look_at(connections[i].global_position)
|
|
|
|
|
|
func set_color(new_color: Color) -> void:
|
|
$flow_node/Sphere.material_override.albedo_color = new_color
|
|
|
|
|
|
func set_connector_color(node: FlowNode, new_color: Color) -> void:
|
|
if visible:
|
|
var i: int = connections.find(node)
|
|
visualisers[i].get_child(0).material_override.albedo_color = new_color
|
|
|
|
|
|
func add_connection(node: FlowNode) -> void:
|
|
if !connections.has(node):
|
|
var visual: Node3D = visual_scene.instantiate()
|
|
add_child(visual)
|
|
visual.owner = self
|
|
connections.append(node)
|
|
visualisers.append(visual)
|
|
set_connector_color(node, Color.WEB_GRAY)
|
|
|
|
|
|
func remove_connection(node: FlowNode) -> void:
|
|
if connections.has(node):
|
|
var i: int = connections.find(node)
|
|
visualisers.pop_at(i).queue_free()
|
|
connections.remove_at(i)
|