conforms file names to consistant standard

This commit is contained in:
2026-02-21 04:24:04 +11:00
parent 6b67dd9755
commit 5a4ad8633a
1991 changed files with 3836 additions and 7976 deletions

BIN
scenes/flow_field/cube.glb Normal file

Binary file not shown.

View File

@@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bkokjrjns7l6j"
path="res://.godot/imported/cube.glb-f68a1666bcfbfeb32cf66159f04b5623.scn"
[deps]
source_file="res://scenes/flow_field/cube.glb"
dest_files=["res://.godot/imported/cube.glb-f68a1666bcfbfeb32cf66159f04b5623.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@@ -0,0 +1,11 @@
[gd_scene format=3 uid="uid://ravcalfsha76"]
[ext_resource type="PackedScene" uid="uid://bkokjrjns7l6j" path="res://scenes/flow_field/cube.glb" id="1_7p7qy"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_35c3u"]
resource_local_to_scene = true
[node name="cube" unique_id=163499116 instance=ExtResource("1_7p7qy")]
[node name="Cube" parent="." index="0" unique_id=583197030]
material_override = SubResource("StandardMaterial3D_35c3u")

View File

@@ -0,0 +1,118 @@
class_name FlowField
extends Node3D
signal path_updated()
@export var start_points: Array[Node3D]
@export var goal_points: Array[Node3D]
var start_nodes: Array[FlowNodeData]
var goal_nodes: Array[FlowNodeData]
var magic_node: FlowNodeData
var data: FlowFieldData :
get():
return data
set(value):
data = value
for node: FlowNodeData in data.nodes:
if node.type == FlowNodeData.NodeType.START:
start_nodes.append(node)
if node.type == FlowNodeData.NodeType.GOAL:
goal_nodes.append(node)
func get_closest_point(pos: Vector3, traversable_required: bool = false, buildable_required: bool = false) -> FlowNodeData:
var closest_point: FlowNodeData = null
var closest_dist: float = 100000.0
for node: FlowNodeData in data.nodes:
if node.position.distance_to(pos) < closest_dist:
if !traversable_required or node.traversable:
if !buildable_required or node.buildable:
closest_dist = node.position.distance_to(pos)
closest_point = node
return closest_point
func test_traversability() -> bool:
for node: FlowNodeData in start_nodes:
while node.best_path != null:
if node.best_path.traversable:
node = node.best_path
else:
return false
return true
func iterate_search(search_frontier: Array[FlowNodeData], reached: Array[FlowNodeData]) -> void:
var current: FlowNodeData = search_frontier.pop_front()
for node: FlowNodeData in current.connected_nodes:
if !reached.has(node):
reached.append(node)
if node.traversable:
search_frontier.append(node)
node.best_path = current
func calculate() -> void:
var reached: Array[FlowNodeData] = []
var search_frontier: Array[FlowNodeData] = []
for node: FlowNodeData in goal_nodes:
node.best_path = null
reached.append(node)
search_frontier.append(node)
while search_frontier.size() > 0:
iterate_search(search_frontier, reached)
func traversable_after_blocking_point(point: FlowNodeData) -> bool:
magic_node = null
var reached: Array[FlowNodeData] = [point]
var search_frontier: Array[FlowNodeData] = []
for node: FlowNodeData in point.connected_nodes:
if node.best_path == point and node.traversable:
reached.append(node)
search_frontier.append(node)
if search_frontier.size() == 0: # if no neighbors rely on this node, then we're all good
return true
while search_frontier.size() > 0:
var current: FlowNodeData = search_frontier.pop_front()
for node: FlowNodeData in current.connected_nodes:
if !reached.has(node):
if node.traversable and node.best_path != node and !reached.has(node.best_path):
#if we havent already seen the node this neighbor goes to,
#then all our searched nodes could swap to go this direction
#and the path would still be traversable
magic_node = node
return true
reached.append(node)
if node.traversable:
search_frontier.append(node)
return false
func toggle_goal(nodes_to_toggle: Array[FlowNodeData]) -> void:
for node: FlowNodeData in nodes_to_toggle:
if goal_nodes.has(node):
goal_nodes.erase(node)
else:
goal_nodes.append(node)
func toggle_start(nodes_to_toggle: Array[FlowNodeData]) -> void:
for node: FlowNodeData in nodes_to_toggle:
if start_nodes.has(node):
start_nodes.erase(node)
else:
start_nodes.append(node)
func toggle_traversable(node: FlowNodeData) -> bool:
node.traversable = !node.traversable
calculate()
#TODO: technically the path only changed if the new path IS traversable
path_updated.emit()
return test_traversability()
func toggle_buildable(node: FlowNodeData) -> void:
node.buildable = !node.buildable

View File

@@ -0,0 +1 @@
uid://r4nmfr8jfcjx

View File

@@ -0,0 +1,12 @@
[gd_scene format=3 uid="uid://b7dwsqfmdqr8"]
[ext_resource type="Script" uid="uid://r4nmfr8jfcjx" path="res://scenes/flow_field/flow_field.gd" id="1_l46ob"]
[ext_resource type="PackedScene" uid="uid://bssfvyxv5uo1f" path="res://scenes/flow_field/flow_node.tscn" id="2_d6vkn"]
[ext_resource type="PackedScene" uid="uid://cccowrgelgswj" path="res://scenes/flow_field/flow_field_tool.tscn" id="3_apokv"]
[node name="FlowField" type="Node3D" unique_id=1081112083]
script = ExtResource("1_l46ob")
flow_node_scene = ExtResource("2_d6vkn")
[node name="FlowFieldTool" parent="." unique_id=156436804 node_paths=PackedStringArray("flow_field") instance=ExtResource("3_apokv")]
flow_field = NodePath("..")

View File

@@ -0,0 +1,27 @@
class_name FlowFieldData
extends RefCounted
var nodes: Array[FlowNodeData]
var grids: int = 0
func to_dict() -> Dictionary:
var dict: Dictionary = {}
for node: FlowNodeData in nodes:
dict[node.node_id] = node.to_dict()
dict["grids"] = grids
return dict
static func from_dict(dict: Dictionary) -> FlowFieldData:
var flow: FlowFieldData = FlowFieldData.new()
var unpopulated: Dictionary[FlowNodeData, Dictionary] = {}
for key: String in dict.keys():
if key.is_valid_int():
var data: FlowNodeData = FlowNodeData.from_dict(dict[key])
flow.nodes.append(data)
unpopulated[data] = dict[key]
for key: FlowNodeData in unpopulated.keys():
key.populate_connections(unpopulated[key], flow.nodes)
flow.grids = dict["grids"]
return flow

View File

@@ -0,0 +1 @@
uid://ds7m1p5666qby

View File

@@ -0,0 +1,65 @@
class_name FlowFieldEditor
extends Node
@export var flow_field: FlowField
func create_grid(x_size: int, y_size: int, gap: float) -> Array[FlowNodeData]:
flow_field.data.grids += 1
var grid_id: int = flow_field.data.grids
var grid: Array[Array] = []
var created_nodes: Array[FlowNodeData] = []
for x: int in x_size:
var row: Array[FlowNodeData] = []
for y: int in y_size:
var point_position: Vector3 = Vector3((x - floori(x_size / 2.0)) * gap, 0, (y - floori(y_size / 2.0)) * gap)
var created_node: FlowNodeData = create_node(point_position, grid_id, x, y)
created_nodes.append(created_node)
row.append(created_node)
grid.append(row)
for x: int in grid.size():
for y: int in grid[x].size():
if y > 0:
connect_nodes(grid[x][y], grid[x][y - 1])
if x > 0:
connect_nodes(grid[x][y], grid[x - 1][y])
if y < grid[x].size() - 1:
connect_nodes(grid[x][y], grid[x][y + 1])
if x < grid.size() - 1:
connect_nodes(grid[x][y], grid[x + 1][y])
return created_nodes
func create_node(pos: Vector3 = Vector3.ZERO, grid_id: int = -1, grid_x: int = 0, grid_y: int = 0) -> FlowNodeData:
var node: FlowNodeData = FlowNodeData.new()
node.node_id = flow_field.data.nodes.size()
node.grid_id = grid_id
node.grid_x = grid_x
node.grid_y = grid_y
node.position = pos
flow_field.data.nodes.append(node)
return node
func delete_node(node: FlowNodeData) -> void:
for neighbor: FlowNodeData in node.connections:
disconnect_nodes(node, neighbor)
flow_field.data.nodes.erase(node)
func connect_nodes(a: FlowNodeData, b: FlowNodeData) -> void:
if a != b:
if a.connected_nodes.has(b):
a.connected_nodes.append(b)
if b.connected_nodes.has(a):
b.add_connection(a)
func disconnect_nodes(a: FlowNodeData, b: FlowNodeData) -> void:
if a != b:
if a.connected_nodes.has(b):
a.connected_nodes.erase(b)
if b.connected_nodes.has(a):
b.connected_nodes.erase(a)

View File

@@ -0,0 +1 @@
uid://d348pxbcsomw4

View File

@@ -0,0 +1,55 @@
class_name FlowFieldTester extends Control
var flow_field: FlowField
var flow_field_tool: FlowFieldEditor
var node_boxes: Array[ColorRect]
var offset: Vector2
var hovered: ColorRect
func _ready() -> void:
flow_field = FlowField.new()
var flow_field_data: FlowFieldData = FlowFieldData.new()
flow_field.data_file = flow_field_data
flow_field_tool = FlowFieldEditor.new()
add_child(flow_field)
add_child(flow_field_tool)
flow_field_tool.flow_field = flow_field
flow_field_tool.create_grid(10, 10, 1)
var furthest_negative_vector: Vector2 = Vector2.ZERO
for node: FlowNodeData in flow_field.data.nodes:
var box: ColorRect = ColorRect.new()
box.position = Vector2(node.position.x * 15.0, node.position.z * 15.0)
if node.position.x * 15.0 < furthest_negative_vector.x:
furthest_negative_vector.x = node.position.x * 15.0
if node.position.z * 15.0 < furthest_negative_vector.y:
furthest_negative_vector.y = node.position.z * 15.0
box.size = Vector2(10.0, 10.0)
box.mouse_entered.connect(box_hovered.bind(box))
node_boxes.append(box)
$CanvasLayer.add_child(box)
print(furthest_negative_vector)
$CanvasLayer.offset = -furthest_negative_vector
update_colors()
func box_hovered(box: ColorRect) -> void:
hovered = box
update_colors()
func update_colors() -> void:
var x: int = 0
for box: ColorRect in node_boxes:
if flow_field.nodes[x].traversable:
box.color = Color.GREEN
else:
box.color = Color.RED
if box == hovered:
box.color = Color.AQUAMARINE
x += 1
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseButton and event.button_index == 0:
pass

View File

@@ -0,0 +1 @@
uid://io82eo46is7q

View File

@@ -0,0 +1,14 @@
[gd_scene format=3 uid="uid://dn50ruo00vbyt"]
[ext_resource type="Script" uid="uid://io82eo46is7q" path="res://scenes/flow_field/flow_field_tester.gd" id="1_rs8ix"]
[node name="Control" type="Control" unique_id=815879095]
physics_interpolation_mode = 0
layout_mode = 3
anchors_preset = 0
script = ExtResource("1_rs8ix")
metadata/_custom_type_script = "uid://io82eo46is7q"
[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=420705436]
offset = Vector2(21.645, 26.07)
transform = Transform2D(1, 0, 0, 1, 21.645, 26.07)

View File

@@ -0,0 +1,379 @@
class_name FlowFieldTool
extends Node
@export_group("Basic Function")
@export var zone_list: Array[PackedScene]
@export var zone_holder: Node3D
@export var visualiser_scene: PackedScene
@export_group("Flow Field Editor")
@export var raycast: RayCast3D
@export var project_raycast: RayCast3D
@export var camera: Camera3D
@export var camera_pivot: Node3D
@export var position_field: HBoxContainer
@export var position_x: LineEdit
@export var position_y: LineEdit
@export var position_z: LineEdit
@export var x_field: LineEdit
@export var y_field: LineEdit
@export var z_field: LineEdit
@export var x_size_field: LineEdit
@export var y_size_field: LineEdit
@export var gap_field: LineEdit
@export var save_path: LineEdit
var flow_field: FlowField
var visualisers: Dictionary[FlowNodeData, FlowNodeVisualiser]
var hover: FlowNodeVisualiser = null
var selected: Array[FlowNodeVisualiser] = []
var vector_dirty: bool = false
var editing: bool = false
var selected_zone: int = -1
var level: Level
var radius: float = 0
var up_angle: float = 0
var rotate_held: bool = false
var flow_field_editor: FlowFieldEditor
var path_vfx: PathVFX
func _ready() -> void:
flow_field_editor = FlowFieldEditor.new()
add_child(flow_field_editor)
var i: int = 0
for zone: PackedScene in zone_list:
i += 1
$VBoxContainer2/OptionButton.add_item("Zone " + str(i))
$VBoxContainer2/OptionButton.select(0)
$VBoxContainer2/OptionButton.item_selected.connect(select_zone)
_on_trash_button_pressed()
path_vfx = PathVFX.new()
path_vfx.line_width = 0.4
path_vfx.material = load("res://path_material.tres")
add_child(path_vfx)
func setup_visualisers_from_flow_field_data(data: FlowFieldData) -> void:
for visualiser: FlowNodeVisualiser in visualisers.keys():
visualiser.queue_free()
visualisers = {}
for node: FlowNodeData in data.nodes:
add_visual(node)
for node: FlowNodeData in visualisers.keys():
add_visual_connections(node)
func add_visual(data: FlowNodeData) -> void:
var visual: FlowNodeVisualiser = visualiser_scene.instantiate() as FlowNodeVisualiser
visual.data = data
visual.position = data.position
add_child(visual)
visualisers[data] = visual
func add_visual_connections(data: FlowNodeData) -> void:
var connections: Array[FlowNodeVisualiser] = []
for node: FlowNodeData in data.connected_nodes:
connections.append(visualisers[node])
visualisers[data].connections = connections
visualisers[data].setup_connection_visualisers()
func select_zone(zone_index: int) -> void:
selected_zone = zone_index
func load_zone() -> void:
_on_trash_button_pressed()
if level:
level.queue_free()
level = zone_list[selected_zone].instantiate() as Level
level.flow_field = flow_field
zone_holder.add_child(level)
camera.make_current()
editing = true
func _process(delta: float) -> void:
if editing:
if raycast.is_colliding() and (!hover or hover != raycast.get_collider()):
hover = raycast.get_collider()
if hover and !raycast.is_colliding():
hover = null
if selected.size() == 1 and vector_dirty:
$Position/Button.visible = true
position_field.visible = true
x_field.text = str(selected[0].global_position.x)
y_field.text = str(selected[0].global_position.y)
z_field.text = str(selected[0].global_position.z)
vector_dirty = false
elif selected.size() > 1:
$Position/Button.visible = false
position_field.visible = true
elif selected.size() < 1:
position_field.visible = false
set_node_colors()
if Input.is_action_just_pressed("Secondary Fire"):
rotate_held = true
if Input.is_action_just_released("Secondary Fire"):
rotate_held = false
var y: float = Input.get_axis("Move Forward", "Move Backward")
var x: float = Input.get_axis("Move Left", "Move Right")
var input_vector: Vector2 = Input.get_vector("Move Left", "Move Right", "Move Forward", "Move Backward")
var movement: Vector3 = ((camera_pivot.transform.basis.z * input_vector.y) + (camera_pivot.transform.basis.x * input_vector.x))
var vec2: Vector2 = Vector2(movement.x, movement.z).normalized()
camera_pivot.position += Vector3(vec2.x, 0.0, vec2.y) * delta * 30.0
func set_node_colors() -> void:
for node: FlowNodeVisualiser in visualisers.values():
if node.data.traversable and node.data.buildable:
node.set_color(Color.WEB_GRAY)
elif node.data.traversable and !node.data.buildable:
node.set_color(Color.CORAL)
else:
node.set_color(Color.BLACK)
if flow_field.goal_nodes.has(node.data):
node.set_color(Color.BLUE)
if flow_field.start_nodes.has(node.data):
node.set_color(Color.PINK)
if selected.has(node):
node.set_color(Color.GREEN)
if node == hover:
node.set_color(Color.RED)
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
var from: Vector3 = camera.project_ray_origin(event.position)
var to: Vector3 = camera.project_local_ray_normal(event.position)
raycast.global_position = from
raycast.target_position = to * 1000.0
if event is InputEventMouseButton and event.button_index == 1 and hover:
if !selected.has(hover):
selected.append(hover)
vector_dirty = true
if event is InputEventMouseButton and event.button_index == 2 and selected.size() > 0:
selected = []
if event is InputEventMouseButton and event.button_index == 5:
zoom_in()
if event is InputEventMouseButton and event.button_index == 4:
zoom_out()
if event is InputEventMouseMotion and rotate_held:
camera_pivot.rotation.y -= (event.relative.x * get_viewport().get_final_transform().x.x) * (Data.preferences.mouse_sens / 10000.0) * (-1 if Data.preferences.invert_lookY else 1)
up_angle -= (event.relative.y * get_viewport().get_final_transform().y.y) * (Data.preferences.mouse_sens / 10000.0) * (-1 if Data.preferences.invert_lookY else 1)
up_angle = clamp(up_angle, deg_to_rad(-90), deg_to_rad(90))
camera_pivot.rotation.x = up_angle
func zoom_out() -> void:
camera.position.z -= 0.3
func zoom_in() -> void:
camera.position.z += 0.3
func _on_x_field_changed(text: String) -> void:
selected[0].global_position.x = float(text)
func _on_y_field_changed(text: String) -> void:
selected[0].global_position.y = float(text)
func _on_z_field_changed(text: String) -> void:
selected[0].global_position.z = float(text)
## Connects many nodes to a single single node, if any connections already
## exist, this function disconnects them instead
func connect_many_nodes(common_node: FlowNodeData, child_nodes: Array[FlowNodeData]) -> void:
for node: FlowNodeData in child_nodes:
if common_node.connections.has(node):
flow_field_editor.disconnect_nodes(common_node, node)
else:
flow_field_editor.connect_nodes(common_node, node)
func set_position() -> void:
for node: FlowNodeVisualiser in selected:
var vector: Vector3 = Vector3(float(position_x.text), float(position_y.text), float(position_z.text))
node.data.position = vector
node.global_position = vector
func offset_position() -> void:
for node: FlowNodeVisualiser in selected:
var vector: Vector3 = Vector3(float(position_x.text), float(position_y.text), float(position_z.text))
node.data.position += vector
node.global_position += vector
func _on_create_button_pressed() -> void:
add_visual(flow_field_editor.create_node())
func _on_generate_grid_button_pressed() -> void:
for node: FlowNodeData in flow_field_editor.create_grid(int(x_size_field.text), int(y_size_field.text), float(gap_field.text)):
add_visual(node)
selected.append(node)
create_grid_select_button(flow_field.data.grids)
func create_grid_select_button(grid: int) -> void:
var button: Button = Button.new()
button.text = "Grid " + str(grid)
button.pressed.connect(select_in_grid.bind(grid))
$VBoxContainer3.add_child(button)
func _on_calculate_button_pressed() -> void:
flow_field.calculate()
var points: Array[Vector3] = []
var node: FlowNodeData = flow_field.get_closest_point(flow_field.start_nodes[0].position, true, false)
points.append(node.position + Vector3(0, 0.1, 0))
while node.best_path:
node = node.best_path
points.append(node.position + Vector3(0, 0.1, 0))
path_vfx.path(points)
func _on_connect_button_pressed() -> void:
flow_field.connect_many_nodes(selected[0], selected.slice(1, selected.size()))
func _on_mark_goal_button_pressed() -> void:
for node: FlowNodeVisualiser in selected:
flow_field.toggle_goal([node.data])
selected = []
vector_dirty = true
func _on_mark_start_button_pressed() -> void:
for node: FlowNodeVisualiser in selected:
flow_field.toggle_start([node.data])
selected = []
vector_dirty = true
func _on_extrude_button_pressed() -> void:
if selected.size() == 1:
var node: FlowNodeVisualiser = visualiser_scene.instantiate() as FlowNodeVisualiser
add_child(node)
node.data = flow_field.create_node(selected[0].position)
node.add_connection(selected[0])
selected[0].add_connection(node)
selected[0].set_color(Color.WEB_GRAY)
selected = []
selected.append(node)
vector_dirty = true
func _on_toggle_traversable_button_pressed() -> void:
for node: FlowNodeVisualiser in selected:
if !flow_field.toggle_traversable(node.data):
flow_field.toggle_traversable(node.data)
selected = []
return
selected = []
func _on_toggle_buildable_button_pressed() -> void:
for node: FlowNodeVisualiser in selected:
flow_field.toggle_buildable(node.data)
#TODO: This doesnt work as you'd expect because of physics frames
func _on_project_downwards_button_pressed() -> void:
for node: FlowNodeVisualiser in selected:
project_raycast.position = node.position + Vector3.UP
project_raycast.target_position = Vector3.DOWN * 100.0
await get_tree().physics_frame
await get_tree().physics_frame
await get_tree().physics_frame
await get_tree().physics_frame
if project_raycast.is_colliding():
node.position = project_raycast.get_collision_point()
node.data.position = node.position
func _on_save_button_pressed() -> void:
var string: String = JSON.stringify(flow_field.data.to_dict())
var path: String = save_path.text + ".json"
var dir: DirAccess = DirAccess.open("user://")
if !dir.dir_exists("pathing_graphs"):
dir.make_dir("pathing_graphs")
dir.change_dir("pathing_graphs")
var save_file: FileAccess = FileAccess.open("user://pathing_graphs/" + path, FileAccess.WRITE)
save_file.store_line(string)
static func load_flow_field_from_disc(path: String) -> FlowFieldData:
if FileAccess.file_exists(path):
var save_file: FileAccess = FileAccess.open(path, FileAccess.READ)
var json_string: String = save_file.get_line()
var json: JSON = JSON.new()
var parse_result: Error = json.parse(json_string)
if parse_result == OK:
var dict: Dictionary = json.data
var flow_field_data: FlowFieldData = FlowFieldData.from_dict(dict)
return flow_field_data
return FlowFieldData.new()
func _on_load_button_pressed() -> void:
if FileAccess.file_exists("user://pathing_graphs/" + save_path.text + ".json"):
var save_file: FileAccess = FileAccess.open("user://pathing_graphs/" + save_path.text + ".json", FileAccess.READ)
var json_string: String = save_file.get_line()
var json: JSON = JSON.new()
var parse_result: Error = json.parse(json_string)
if parse_result == OK:
var dict: Dictionary = json.data
var flow_field_data: FlowFieldData = FlowFieldData.from_dict(dict)
flow_field.data = flow_field_data
for grid: int in flow_field_data.grids:
create_grid_select_button(grid + 1)
setup_visualisers_from_flow_field_data(flow_field_data)
func _on_trash_button_pressed() -> void:
if flow_field:
flow_field.queue_free()
for visualiser: FlowNodeVisualiser in visualisers.values():
visualiser.queue_free()
visualisers = {}
for child: Node in $VBoxContainer3.get_children():
child.queue_free()
flow_field = FlowField.new()
flow_field.data = FlowFieldData.new()
add_child(flow_field)
flow_field_editor.flow_field = flow_field
if level:
level.flow_field = flow_field
func _on_select_all_pressed() -> void:
selected = []
for node: FlowNodeVisualiser in flow_field.nodes:
selected.append(node)
func select_in_grid(grid: int) -> void:
selected = []
for node: FlowNodeVisualiser in flow_field.nodes:
if node.data.grid_id == grid:
selected.append(node)
func _on_print_ids_pressed() -> void:
for node: FlowNodeVisualiser in selected:
print(node.data.node_id)

View File

@@ -0,0 +1 @@
uid://05c5q1v2nv8p

View File

@@ -0,0 +1,216 @@
[gd_scene format=3 uid="uid://cccowrgelgswj"]
[ext_resource type="Script" uid="uid://05c5q1v2nv8p" path="res://scenes/flow_field/flow_field_tool.gd" id="1_e7pmn"]
[ext_resource type="PackedScene" uid="uid://y1qa1g3ic8sp" path="res://zones/moat/scn_moat.tscn" id="2_030xf"]
[ext_resource type="PackedScene" uid="uid://csq7if8wojp4g" path="res://zones/cave/scn_cave.tscn" id="3_xar7e"]
[ext_resource type="PackedScene" uid="uid://bssfvyxv5uo1f" path="res://scenes/flow_field/flow_node.tscn" id="4_50p2d"]
[sub_resource type="Environment" id="Environment_e7pmn"]
ambient_light_source = 2
ambient_light_color = Color(0.728822, 0.728822, 0.728822, 1)
[node name="FlowFieldTool" type="Node" unique_id=897052359 node_paths=PackedStringArray("zone_holder", "raycast", "project_raycast", "camera", "camera_pivot", "position_field", "position_x", "position_y", "position_z", "x_field", "y_field", "z_field", "x_size_field", "y_size_field", "gap_field", "save_path")]
script = ExtResource("1_e7pmn")
zone_list = Array[PackedScene]([ExtResource("2_030xf"), ExtResource("3_xar7e")])
zone_holder = NodePath("ZoneHolder")
visualiser_scene = ExtResource("4_50p2d")
raycast = NodePath("CameraFocus/Camera3D/RayCast3D")
project_raycast = NodePath("RayCast3D")
camera = NodePath("CameraFocus/Camera3D")
camera_pivot = NodePath("CameraFocus")
position_field = NodePath("Position")
position_x = NodePath("Position/x")
position_y = NodePath("Position/y")
position_z = NodePath("Position/z")
x_field = NodePath("Position/x")
y_field = NodePath("Position/y")
z_field = NodePath("Position/z")
x_size_field = NodePath("VBoxContainer/HBoxContainer/x_size")
y_size_field = NodePath("VBoxContainer/HBoxContainer/y_size")
gap_field = NodePath("VBoxContainer/HBoxContainer/gap")
save_path = NodePath("VBoxContainer/FileNameInput")
metadata/_custom_type_script = "uid://05c5q1v2nv8p"
[node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=1159336300]
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -173.0
offset_bottom = 572.0
grow_horizontal = 0
[node name="Button" type="Button" parent="VBoxContainer" unique_id=1948996218]
layout_mode = 2
text = "Trash FlowField"
[node name="Create" type="Button" parent="VBoxContainer" unique_id=1093532280]
layout_mode = 2
text = "Create Node"
[node name="Delete" type="Button" parent="VBoxContainer" unique_id=118550812]
layout_mode = 2
text = "Remove Node"
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer" unique_id=616970402]
layout_mode = 2
[node name="GenerateGrid" type="Button" parent="VBoxContainer/HBoxContainer" unique_id=1844049824]
layout_mode = 2
text = "Generate Grid"
[node name="x_size" type="LineEdit" parent="VBoxContainer/HBoxContainer" unique_id=1197701586]
layout_mode = 2
text = "15"
placeholder_text = "x_size"
[node name="y_size" type="LineEdit" parent="VBoxContainer/HBoxContainer" unique_id=900625826]
layout_mode = 2
text = "7"
placeholder_text = "y_size"
[node name="gap" type="LineEdit" parent="VBoxContainer/HBoxContainer" unique_id=1334558468]
layout_mode = 2
text = "2.5"
placeholder_text = "gap"
[node name="SelectAll" type="Button" parent="VBoxContainer" unique_id=1460776735]
layout_mode = 2
text = "Select All Nodes"
[node name="Connect" type="Button" parent="VBoxContainer" unique_id=330867073]
layout_mode = 2
text = "Connect Nodes"
[node name="ProjectDownwards" type="Button" parent="VBoxContainer" unique_id=2071376561]
layout_mode = 2
text = "Stick node to floor"
[node name="MarkGoal" type="Button" parent="VBoxContainer" unique_id=474927781]
layout_mode = 2
text = "Toggle Goal"
[node name="MarkStart" type="Button" parent="VBoxContainer" unique_id=535844071]
layout_mode = 2
text = "Toggle Start"
[node name="ToggleTraversable" type="Button" parent="VBoxContainer" unique_id=1888674029]
layout_mode = 2
text = "Toggle Traversable"
[node name="ToggleBuildable" type="Button" parent="VBoxContainer" unique_id=1196891911]
layout_mode = 2
text = "Toggle Buildable"
[node name="Extrude" type="Button" parent="VBoxContainer" unique_id=114169861]
layout_mode = 2
text = "Extrude"
[node name="Calculate" type="Button" parent="VBoxContainer" unique_id=966487363]
layout_mode = 2
text = "Calculate"
[node name="Finalize" type="Button" parent="VBoxContainer" unique_id=1604655281]
layout_mode = 2
text = "Finalize"
[node name="FileNameInput" type="LineEdit" parent="VBoxContainer" unique_id=1302446264]
layout_mode = 2
placeholder_text = "level title"
alignment = 1
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer" unique_id=426824804]
layout_mode = 2
[node name="Save" type="Button" parent="VBoxContainer/HBoxContainer2" unique_id=128915038]
layout_mode = 2
size_flags_horizontal = 3
text = "Save"
[node name="Load" type="Button" parent="VBoxContainer/HBoxContainer2" unique_id=397086630]
layout_mode = 2
size_flags_horizontal = 3
text = "Load"
[node name="Button2" type="Button" parent="VBoxContainer" unique_id=1458001763]
layout_mode = 2
text = "Print Node_IDS"
[node name="Position" type="HBoxContainer" parent="." unique_id=1194117729]
anchors_preset = -1
anchor_left = 0.4
anchor_right = 0.6
grow_horizontal = 2
[node name="x" type="LineEdit" parent="Position" unique_id=1634710518]
layout_mode = 2
size_flags_horizontal = 3
[node name="y" type="LineEdit" parent="Position" unique_id=2145405236]
layout_mode = 2
size_flags_horizontal = 3
[node name="z" type="LineEdit" parent="Position" unique_id=1899083093]
layout_mode = 2
size_flags_horizontal = 3
[node name="Button" type="Button" parent="Position" unique_id=362195148]
layout_mode = 2
text = "Set Position"
[node name="Button2" type="Button" parent="Position" unique_id=1670413853]
layout_mode = 2
text = "Add Offset"
[node name="CameraFocus" type="Node3D" parent="." unique_id=1567712529]
[node name="Camera3D" type="Camera3D" parent="CameraFocus" unique_id=1970273041]
transform = Transform3D(1, 0, 0, 0, 1.0000002, 0, 0, 0, 1.0000002, 0, 0, 3)
environment = SubResource("Environment_e7pmn")
[node name="RayCast3D" type="RayCast3D" parent="CameraFocus/Camera3D" unique_id=1801773920]
collision_mask = 64
[node name="CSGSphere3D" type="CSGSphere3D" parent="CameraFocus" unique_id=275568945]
[node name="RayCast3D" type="RayCast3D" parent="." unique_id=431196612]
[node name="ZoneHolder" type="Node3D" parent="." unique_id=1127890663]
[node name="VBoxContainer2" type="HBoxContainer" parent="." unique_id=1656150952]
offset_right = 40.0
offset_bottom = 40.0
[node name="OptionButton" type="OptionButton" parent="VBoxContainer2" unique_id=298744483]
layout_mode = 2
[node name="Button" type="Button" parent="VBoxContainer2" unique_id=1468940506]
layout_mode = 2
text = "Load zone"
[node name="VBoxContainer3" type="VBoxContainer" parent="." unique_id=179301019]
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = -40.0
offset_right = 40.0
grow_vertical = 0
[connection signal="pressed" from="VBoxContainer/Button" to="." method="_on_trash_button_pressed"]
[connection signal="pressed" from="VBoxContainer/Create" to="." method="_on_create_button_pressed"]
[connection signal="pressed" from="VBoxContainer/Delete" to="." method="_on_create_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/GenerateGrid" to="." method="_on_generate_grid_button_pressed"]
[connection signal="pressed" from="VBoxContainer/SelectAll" to="." method="_on_select_all_pressed"]
[connection signal="pressed" from="VBoxContainer/Connect" to="." method="_on_connect_button_pressed"]
[connection signal="pressed" from="VBoxContainer/ProjectDownwards" to="." method="_on_project_downwards_button_pressed"]
[connection signal="pressed" from="VBoxContainer/MarkGoal" to="." method="_on_mark_goal_button_pressed"]
[connection signal="pressed" from="VBoxContainer/MarkStart" to="." method="_on_mark_start_button_pressed"]
[connection signal="pressed" from="VBoxContainer/ToggleTraversable" to="." method="_on_toggle_traversable_button_pressed"]
[connection signal="pressed" from="VBoxContainer/ToggleBuildable" to="." method="_on_toggle_buildable_button_pressed"]
[connection signal="pressed" from="VBoxContainer/Extrude" to="." method="_on_extrude_button_pressed"]
[connection signal="pressed" from="VBoxContainer/Calculate" to="." method="_on_calculate_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer2/Save" to="." method="_on_save_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer2/Load" to="." method="_on_load_button_pressed"]
[connection signal="pressed" from="VBoxContainer/Button2" to="." method="_on_print_ids_pressed"]
[connection signal="pressed" from="Position/Button" to="." method="set_position"]
[connection signal="pressed" from="Position/Button2" to="." method="offset_position"]
[connection signal="pressed" from="VBoxContainer2/Button" to="." method="load_zone"]

View File

@@ -0,0 +1,662 @@
[gd_scene format=3 uid="uid://2vv6mrxiwibf"]
[ext_resource type="Script" uid="uid://r4nmfr8jfcjx" path="res://scenes/flow_field/flow_field.gd" id="1_ca7vt"]
[ext_resource type="PackedScene" uid="uid://bssfvyxv5uo1f" path="res://scenes/flow_field/flow_node.tscn" id="2_s6hwk"]
[node name="FlowField" type="Node3D" unique_id=72463082 node_paths=PackedStringArray("nodes", "goals")]
script = ExtResource("1_ca7vt")
flow_node_scene = ExtResource("2_s6hwk")
nodes = [NodePath("FlowNode"), NodePath("@StaticBody3D@10"), NodePath("@StaticBody3D@11"), NodePath("@StaticBody3D@12"), NodePath("@StaticBody3D@13"), NodePath("@StaticBody3D@14"), NodePath("@StaticBody3D@15"), NodePath("@StaticBody3D@16"), NodePath("@StaticBody3D@17"), NodePath("@StaticBody3D@18"), NodePath("@StaticBody3D@19"), NodePath("@StaticBody3D@20"), NodePath("@StaticBody3D@21"), NodePath("@StaticBody3D@22"), NodePath("@StaticBody3D@23"), NodePath("@StaticBody3D@24"), NodePath("@StaticBody3D@25"), NodePath("@StaticBody3D@26"), NodePath("@StaticBody3D@27"), NodePath("@StaticBody3D@28"), NodePath("@StaticBody3D@29"), NodePath("@StaticBody3D@30"), NodePath("@StaticBody3D@31"), NodePath("@StaticBody3D@32"), NodePath("@StaticBody3D@33"), NodePath("@StaticBody3D@34"), NodePath("@StaticBody3D@35"), NodePath("@StaticBody3D@36"), NodePath("@StaticBody3D@37"), NodePath("@StaticBody3D@38"), NodePath("@StaticBody3D@39"), NodePath("@StaticBody3D@40"), NodePath("@StaticBody3D@41"), NodePath("@StaticBody3D@42"), NodePath("@StaticBody3D@43"), NodePath("@StaticBody3D@44"), NodePath("@StaticBody3D@45"), NodePath("@StaticBody3D@46"), NodePath("@StaticBody3D@47"), NodePath("@StaticBody3D@48"), NodePath("@StaticBody3D@49"), NodePath("@StaticBody3D@50"), NodePath("@StaticBody3D@51"), NodePath("@StaticBody3D@52"), NodePath("@StaticBody3D@53"), NodePath("@StaticBody3D@54"), NodePath("@StaticBody3D@55"), NodePath("@StaticBody3D@56"), NodePath("@StaticBody3D@57"), NodePath("@StaticBody3D@58"), NodePath("@StaticBody3D@59"), NodePath("@StaticBody3D@60"), NodePath("@StaticBody3D@61"), NodePath("@StaticBody3D@62"), NodePath("@StaticBody3D@63"), NodePath("@StaticBody3D@64"), NodePath("@StaticBody3D@65"), NodePath("@StaticBody3D@66"), NodePath("@StaticBody3D@67"), NodePath("@StaticBody3D@68"), NodePath("@StaticBody3D@69"), NodePath("@StaticBody3D@70"), NodePath("@StaticBody3D@71"), NodePath("@StaticBody3D@72"), NodePath("@StaticBody3D@73"), NodePath("@StaticBody3D@74"), NodePath("@StaticBody3D@75"), NodePath("@StaticBody3D@76"), NodePath("@StaticBody3D@77"), NodePath("@StaticBody3D@78"), NodePath("@StaticBody3D@79"), NodePath("@StaticBody3D@80"), NodePath("@StaticBody3D@81"), NodePath("@StaticBody3D@82"), NodePath("@StaticBody3D@83"), NodePath("@StaticBody3D@84"), NodePath("@StaticBody3D@85"), NodePath("@StaticBody3D@86"), NodePath("@StaticBody3D@87"), NodePath("@StaticBody3D@88"), NodePath("@StaticBody3D@89"), NodePath("@StaticBody3D@90"), NodePath("@StaticBody3D@91"), NodePath("@StaticBody3D@92"), NodePath("@StaticBody3D@93"), NodePath("@StaticBody3D@94"), NodePath("@StaticBody3D@95"), NodePath("@StaticBody3D@96"), NodePath("@StaticBody3D@97"), NodePath("@StaticBody3D@98"), NodePath("@StaticBody3D@99"), NodePath("@StaticBody3D@100"), NodePath("@StaticBody3D@101"), NodePath("@StaticBody3D@102"), NodePath("@StaticBody3D@103"), NodePath("@StaticBody3D@104"), NodePath("@StaticBody3D@105"), NodePath("@StaticBody3D@106"), NodePath("@StaticBody3D@107"), NodePath("@StaticBody3D@108"), NodePath("@StaticBody3D@109"), NodePath("@StaticBody3D@110"), NodePath("@StaticBody3D@111"), NodePath("@StaticBody3D@112"), NodePath("@StaticBody3D@113"), NodePath("@StaticBody3D@385"), NodePath("@StaticBody3D@387"), NodePath("@StaticBody3D@389"), NodePath("@StaticBody3D@391"), NodePath("@StaticBody3D@393"), NodePath("@StaticBody3D@395"), NodePath("@StaticBody3D@397"), NodePath("@StaticBody3D@411"), NodePath("@StaticBody3D@414"), NodePath("@StaticBody3D@416"), NodePath("@StaticBody3D@458"), NodePath("@StaticBody3D@464"), NodePath("@StaticBody3D@466"), NodePath("@StaticBody3D@468"), NodePath("@StaticBody3D@470"), NodePath("@StaticBody3D@472"), NodePath("@StaticBody3D@474"), NodePath("@StaticBody3D@476"), NodePath("@StaticBody3D@490"), NodePath("@StaticBody3D@493"), NodePath("@StaticBody3D@495")]
goals = [NodePath("@StaticBody3D@458")]
metadata/_custom_type_script = "uid://r4nmfr8jfcjx"
[node name="FlowNode" parent="." unique_id=328620212 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.5, 0.00175571, -7.5)
connections = [NodePath("../@StaticBody3D@10"), NodePath("../@StaticBody3D@16"), NodePath("../@StaticBody3D@464")]
visualisers = [null, null, null]
[node name="@StaticBody3D@10" parent="." unique_id=757115662 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.5, -0.0404969, -5)
connections = [NodePath("../FlowNode"), NodePath("../@StaticBody3D@11"), NodePath("../@StaticBody3D@17"), NodePath("../@StaticBody3D@466")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@11" parent="." unique_id=91866818 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.5, -0.0404969, -2.5)
connections = [NodePath("../@StaticBody3D@10"), NodePath("../@StaticBody3D@12"), NodePath("../@StaticBody3D@18"), NodePath("../@StaticBody3D@468")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@12" parent="." unique_id=1562096635 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.5, -0.0404969, 2.84217e-14)
connections = [NodePath("../@StaticBody3D@11"), NodePath("../@StaticBody3D@13"), NodePath("../@StaticBody3D@19"), NodePath("../@StaticBody3D@470")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@13" parent="." unique_id=315845522 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.5, -0.0404972, 2.5)
connections = [NodePath("../@StaticBody3D@12"), NodePath("../@StaticBody3D@14"), NodePath("../@StaticBody3D@20"), NodePath("../@StaticBody3D@472")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@14" parent="." unique_id=1356566661 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.5, -0.0404972, 5)
connections = [NodePath("../@StaticBody3D@13"), NodePath("../@StaticBody3D@15"), NodePath("../@StaticBody3D@21"), NodePath("../@StaticBody3D@474")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@15" parent="." unique_id=2018001205 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.5, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@14"), NodePath("../@StaticBody3D@22"), NodePath("../@StaticBody3D@476")]
visualisers = [null, null, null]
[node name="@StaticBody3D@16" parent="." unique_id=1952971850 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.0017556, -7.5)
connections = [NodePath("../FlowNode"), NodePath("../@StaticBody3D@17"), NodePath("../@StaticBody3D@23")]
visualisers = [null, null, null]
[node name="@StaticBody3D@17" parent="." unique_id=1395521277 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -0.0404969, -5)
connections = [NodePath("../@StaticBody3D@10"), NodePath("../@StaticBody3D@16"), NodePath("../@StaticBody3D@18"), NodePath("../@StaticBody3D@24")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@18" parent="." unique_id=1221249238 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -0.0404969, -2.5)
connections = [NodePath("../@StaticBody3D@11"), NodePath("../@StaticBody3D@17"), NodePath("../@StaticBody3D@19"), NodePath("../@StaticBody3D@25")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@19" parent="." unique_id=1578090308 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -0.0404969, -2.84217e-14)
connections = [NodePath("../@StaticBody3D@12"), NodePath("../@StaticBody3D@18"), NodePath("../@StaticBody3D@20"), NodePath("../@StaticBody3D@26")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@20" parent="." unique_id=643883522 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -0.0404972, 2.5)
connections = [NodePath("../@StaticBody3D@13"), NodePath("../@StaticBody3D@19"), NodePath("../@StaticBody3D@21"), NodePath("../@StaticBody3D@27")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@21" parent="." unique_id=1872145165 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -0.0404972, 5)
connections = [NodePath("../@StaticBody3D@14"), NodePath("../@StaticBody3D@20"), NodePath("../@StaticBody3D@22"), NodePath("../@StaticBody3D@28")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@22" parent="." unique_id=1512762088 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@15"), NodePath("../@StaticBody3D@21"), NodePath("../@StaticBody3D@29")]
visualisers = [null, null, null]
[node name="@StaticBody3D@23" parent="." unique_id=617097145 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 0.0017556, -7.5)
connections = [NodePath("../@StaticBody3D@16"), NodePath("../@StaticBody3D@24"), NodePath("../@StaticBody3D@30")]
visualisers = [null, null, null]
[node name="@StaticBody3D@24" parent="." unique_id=797413766 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, -0.0404971, -5)
connections = [NodePath("../@StaticBody3D@17"), NodePath("../@StaticBody3D@23"), NodePath("../@StaticBody3D@25"), NodePath("../@StaticBody3D@31")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@25" parent="." unique_id=1635314950 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, -0.0404969, -2.5)
connections = [NodePath("../@StaticBody3D@18"), NodePath("../@StaticBody3D@24"), NodePath("../@StaticBody3D@26"), NodePath("../@StaticBody3D@32")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@26" parent="." unique_id=776099452 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, -0.0404969, -2.84217e-14)
connections = [NodePath("../@StaticBody3D@19"), NodePath("../@StaticBody3D@25"), NodePath("../@StaticBody3D@27"), NodePath("../@StaticBody3D@33")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@27" parent="." unique_id=1607428862 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, -0.0404972, 2.5)
connections = [NodePath("../@StaticBody3D@20"), NodePath("../@StaticBody3D@26"), NodePath("../@StaticBody3D@28"), NodePath("../@StaticBody3D@34")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@28" parent="." unique_id=2061993066 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, -0.0404972, 5)
connections = [NodePath("../@StaticBody3D@21"), NodePath("../@StaticBody3D@27"), NodePath("../@StaticBody3D@29"), NodePath("../@StaticBody3D@35")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@29" parent="." unique_id=492952396 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@22"), NodePath("../@StaticBody3D@28"), NodePath("../@StaticBody3D@36")]
visualisers = [null, null, null]
[node name="@StaticBody3D@30" parent="." unique_id=373504999 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0.0017556, -7.5)
connections = [NodePath("../@StaticBody3D@23"), NodePath("../@StaticBody3D@31"), NodePath("../@StaticBody3D@37")]
visualisers = [null, null, null]
[node name="@StaticBody3D@31" parent="." unique_id=1673544189 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -0.0404971, -5)
connections = [NodePath("../@StaticBody3D@24"), NodePath("../@StaticBody3D@30"), NodePath("../@StaticBody3D@32"), NodePath("../@StaticBody3D@38")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@32" parent="." unique_id=1670560719 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -0.0404969, -2.5)
connections = [NodePath("../@StaticBody3D@25"), NodePath("../@StaticBody3D@31"), NodePath("../@StaticBody3D@33"), NodePath("../@StaticBody3D@39")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@33" parent="." unique_id=1382769971 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -0.0404969, 2.84217e-14)
connections = [NodePath("../@StaticBody3D@26"), NodePath("../@StaticBody3D@32"), NodePath("../@StaticBody3D@34"), NodePath("../@StaticBody3D@40")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@34" parent="." unique_id=1877899723 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -0.0404972, 2.5)
connections = [NodePath("../@StaticBody3D@27"), NodePath("../@StaticBody3D@33"), NodePath("../@StaticBody3D@35"), NodePath("../@StaticBody3D@41")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@35" parent="." unique_id=173179606 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -0.0404972, 5)
connections = [NodePath("../@StaticBody3D@28"), NodePath("../@StaticBody3D@34"), NodePath("../@StaticBody3D@36"), NodePath("../@StaticBody3D@42")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@36" parent="." unique_id=1314031653 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0.00175571, 7.5)
connections = [NodePath("../@StaticBody3D@29"), NodePath("../@StaticBody3D@35"), NodePath("../@StaticBody3D@43")]
visualisers = [null, null, null]
[node name="@StaticBody3D@37" parent="." unique_id=248711168 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, 0.0017556, -7.5)
connections = [NodePath("../@StaticBody3D@30"), NodePath("../@StaticBody3D@38"), NodePath("../@StaticBody3D@44")]
visualisers = [null, null, null]
[node name="@StaticBody3D@38" parent="." unique_id=498061123 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, -0.0404971, -5)
connections = [NodePath("../@StaticBody3D@31"), NodePath("../@StaticBody3D@37"), NodePath("../@StaticBody3D@39"), NodePath("../@StaticBody3D@45")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@39" parent="." unique_id=41382391 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, -0.0404969, -2.5)
connections = [NodePath("../@StaticBody3D@32"), NodePath("../@StaticBody3D@38"), NodePath("../@StaticBody3D@40"), NodePath("../@StaticBody3D@46")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@40" parent="." unique_id=1058091315 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, -0.0404969, -2.84217e-14)
connections = [NodePath("../@StaticBody3D@33"), NodePath("../@StaticBody3D@39"), NodePath("../@StaticBody3D@41"), NodePath("../@StaticBody3D@47")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@41" parent="." unique_id=1006899114 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, -0.0404972, 2.5)
connections = [NodePath("../@StaticBody3D@34"), NodePath("../@StaticBody3D@40"), NodePath("../@StaticBody3D@42"), NodePath("../@StaticBody3D@48")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@42" parent="." unique_id=567193682 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, -0.0404972, 5)
connections = [NodePath("../@StaticBody3D@35"), NodePath("../@StaticBody3D@41"), NodePath("../@StaticBody3D@43"), NodePath("../@StaticBody3D@49")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@43" parent="." unique_id=1250409949 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, 0.00175571, 7.5)
connections = [NodePath("../@StaticBody3D@36"), NodePath("../@StaticBody3D@42"), NodePath("../@StaticBody3D@50")]
visualisers = [null, null, null]
[node name="@StaticBody3D@44" parent="." unique_id=638967872 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0.0017556, -7.5)
connections = [NodePath("../@StaticBody3D@37"), NodePath("../@StaticBody3D@45"), NodePath("../@StaticBody3D@51")]
visualisers = [null, null, null]
[node name="@StaticBody3D@45" parent="." unique_id=1493409843 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, -0.0404971, -5)
connections = [NodePath("../@StaticBody3D@38"), NodePath("../@StaticBody3D@44"), NodePath("../@StaticBody3D@46"), NodePath("../@StaticBody3D@52")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@46" parent="." unique_id=1997114351 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, -0.0404969, -2.5)
connections = [NodePath("../@StaticBody3D@39"), NodePath("../@StaticBody3D@45"), NodePath("../@StaticBody3D@47"), NodePath("../@StaticBody3D@53")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@47" parent="." unique_id=1624909819 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, -0.0404969, 0)
connections = [NodePath("../@StaticBody3D@40"), NodePath("../@StaticBody3D@46"), NodePath("../@StaticBody3D@48"), NodePath("../@StaticBody3D@54")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@48" parent="." unique_id=151474352 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, -0.0404972, 2.5)
connections = [NodePath("../@StaticBody3D@41"), NodePath("../@StaticBody3D@47"), NodePath("../@StaticBody3D@49"), NodePath("../@StaticBody3D@55")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@49" parent="." unique_id=1793069746 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, -0.0404972, 5)
connections = [NodePath("../@StaticBody3D@42"), NodePath("../@StaticBody3D@48"), NodePath("../@StaticBody3D@50"), NodePath("../@StaticBody3D@56")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@50" parent="." unique_id=1243081493 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0.00175571, 7.5)
connections = [NodePath("../@StaticBody3D@43"), NodePath("../@StaticBody3D@49"), NodePath("../@StaticBody3D@57")]
visualisers = [null, null, null]
[node name="@StaticBody3D@51" parent="." unique_id=1149808827 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 0.0017556, -7.5)
connections = [NodePath("../@StaticBody3D@44"), NodePath("../@StaticBody3D@52"), NodePath("../@StaticBody3D@58")]
visualisers = [null, null, null]
[node name="@StaticBody3D@52" parent="." unique_id=367514059 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, -0.0404971, -5)
connections = [NodePath("../@StaticBody3D@45"), NodePath("../@StaticBody3D@51"), NodePath("../@StaticBody3D@53"), NodePath("../@StaticBody3D@59")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@53" parent="." unique_id=406475631 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, -0.0404969, -2.5)
connections = [NodePath("../@StaticBody3D@46"), NodePath("../@StaticBody3D@52"), NodePath("../@StaticBody3D@54"), NodePath("../@StaticBody3D@60")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@54" parent="." unique_id=657445226 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, -0.0404969, 0)
connections = [NodePath("../@StaticBody3D@47"), NodePath("../@StaticBody3D@53"), NodePath("../@StaticBody3D@55"), NodePath("../@StaticBody3D@61")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@55" parent="." unique_id=1930679825 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, -0.0404972, 2.5)
connections = [NodePath("../@StaticBody3D@48"), NodePath("../@StaticBody3D@54"), NodePath("../@StaticBody3D@56"), NodePath("../@StaticBody3D@62")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@56" parent="." unique_id=793229507 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, -0.0404972, 5)
connections = [NodePath("../@StaticBody3D@49"), NodePath("../@StaticBody3D@55"), NodePath("../@StaticBody3D@57"), NodePath("../@StaticBody3D@63")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@57" parent="." unique_id=924190174 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 0.00175571, 7.5)
connections = [NodePath("../@StaticBody3D@50"), NodePath("../@StaticBody3D@56"), NodePath("../@StaticBody3D@64")]
visualisers = [null, null, null]
[node name="@StaticBody3D@58" parent="." unique_id=288395528 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0017556, -7.5)
connections = [NodePath("../@StaticBody3D@51"), NodePath("../@StaticBody3D@59"), NodePath("../@StaticBody3D@65")]
visualisers = [null, null, null]
[node name="@StaticBody3D@59" parent="." unique_id=873721864 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0404971, -5)
connections = [NodePath("../@StaticBody3D@52"), NodePath("../@StaticBody3D@58"), NodePath("../@StaticBody3D@60"), NodePath("../@StaticBody3D@66")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@60" parent="." unique_id=830467168 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0404969, -2.5)
connections = [NodePath("../@StaticBody3D@53"), NodePath("../@StaticBody3D@59"), NodePath("../@StaticBody3D@61"), NodePath("../@StaticBody3D@67")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@61" parent="." unique_id=291321264 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0404969, 0)
connections = [NodePath("../@StaticBody3D@54"), NodePath("../@StaticBody3D@60"), NodePath("../@StaticBody3D@62"), NodePath("../@StaticBody3D@68")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@62" parent="." unique_id=441065785 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0404972, 2.5)
connections = [NodePath("../@StaticBody3D@55"), NodePath("../@StaticBody3D@61"), NodePath("../@StaticBody3D@63"), NodePath("../@StaticBody3D@69")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@63" parent="." unique_id=1406770755 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0404972, 5)
connections = [NodePath("../@StaticBody3D@56"), NodePath("../@StaticBody3D@62"), NodePath("../@StaticBody3D@64"), NodePath("../@StaticBody3D@70")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@64" parent="." unique_id=1913941933 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00175571, 7.5)
connections = [NodePath("../@StaticBody3D@57"), NodePath("../@StaticBody3D@63"), NodePath("../@StaticBody3D@71")]
visualisers = [null, null, null]
[node name="@StaticBody3D@65" parent="." unique_id=1202203283 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.00175571, -7.5)
connections = [NodePath("../@StaticBody3D@58"), NodePath("../@StaticBody3D@66"), NodePath("../@StaticBody3D@72")]
visualisers = [null, null, null]
[node name="@StaticBody3D@66" parent="." unique_id=1132634448 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, -0.0404972, -5)
connections = [NodePath("../@StaticBody3D@59"), NodePath("../@StaticBody3D@65"), NodePath("../@StaticBody3D@67"), NodePath("../@StaticBody3D@73")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@67" parent="." unique_id=1287910585 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, -0.0404972, -2.5)
connections = [NodePath("../@StaticBody3D@60"), NodePath("../@StaticBody3D@66"), NodePath("../@StaticBody3D@68"), NodePath("../@StaticBody3D@74")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@68" parent="." unique_id=594961650 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, -0.0404972, 0)
connections = [NodePath("../@StaticBody3D@61"), NodePath("../@StaticBody3D@67"), NodePath("../@StaticBody3D@69"), NodePath("../@StaticBody3D@75")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@69" parent="." unique_id=1526097240 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, -0.0404969, 2.5)
connections = [NodePath("../@StaticBody3D@62"), NodePath("../@StaticBody3D@68"), NodePath("../@StaticBody3D@70"), NodePath("../@StaticBody3D@76")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@70" parent="." unique_id=174822479 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, -0.0404971, 5)
connections = [NodePath("../@StaticBody3D@63"), NodePath("../@StaticBody3D@69"), NodePath("../@StaticBody3D@71"), NodePath("../@StaticBody3D@77")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@71" parent="." unique_id=943724471 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@64"), NodePath("../@StaticBody3D@70"), NodePath("../@StaticBody3D@78")]
visualisers = [null, null, null]
[node name="@StaticBody3D@72" parent="." unique_id=76295832 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0.00175571, -7.5)
connections = [NodePath("../@StaticBody3D@65"), NodePath("../@StaticBody3D@73"), NodePath("../@StaticBody3D@79")]
visualisers = [null, null, null]
[node name="@StaticBody3D@73" parent="." unique_id=985871701 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, -0.0404972, -5)
connections = [NodePath("../@StaticBody3D@66"), NodePath("../@StaticBody3D@72"), NodePath("../@StaticBody3D@74"), NodePath("../@StaticBody3D@80")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@74" parent="." unique_id=1781554201 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, -0.0404972, -2.5)
connections = [NodePath("../@StaticBody3D@67"), NodePath("../@StaticBody3D@73"), NodePath("../@StaticBody3D@75"), NodePath("../@StaticBody3D@81")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@75" parent="." unique_id=996434416 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, -0.0404969, -1.42109e-14)
connections = [NodePath("../@StaticBody3D@68"), NodePath("../@StaticBody3D@74"), NodePath("../@StaticBody3D@76"), NodePath("../@StaticBody3D@82")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@76" parent="." unique_id=592036863 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, -0.0404969, 2.5)
connections = [NodePath("../@StaticBody3D@69"), NodePath("../@StaticBody3D@75"), NodePath("../@StaticBody3D@77"), NodePath("../@StaticBody3D@83")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@77" parent="." unique_id=813506650 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, -0.0404971, 5)
connections = [NodePath("../@StaticBody3D@70"), NodePath("../@StaticBody3D@76"), NodePath("../@StaticBody3D@78"), NodePath("../@StaticBody3D@84")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@78" parent="." unique_id=1188307799 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@71"), NodePath("../@StaticBody3D@77"), NodePath("../@StaticBody3D@85")]
visualisers = [null, null, null]
[node name="@StaticBody3D@79" parent="." unique_id=1971827989 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, 0.00175571, -7.5)
connections = [NodePath("../@StaticBody3D@72"), NodePath("../@StaticBody3D@80"), NodePath("../@StaticBody3D@86")]
visualisers = [null, null, null]
[node name="@StaticBody3D@80" parent="." unique_id=28074274 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, -0.0404972, -5)
connections = [NodePath("../@StaticBody3D@73"), NodePath("../@StaticBody3D@79"), NodePath("../@StaticBody3D@81"), NodePath("../@StaticBody3D@87")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@81" parent="." unique_id=1563446494 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, -0.0404972, -2.5)
connections = [NodePath("../@StaticBody3D@74"), NodePath("../@StaticBody3D@80"), NodePath("../@StaticBody3D@82"), NodePath("../@StaticBody3D@88")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@82" parent="." unique_id=693122304 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, -0.0404969, -2.84217e-14)
connections = [NodePath("../@StaticBody3D@75"), NodePath("../@StaticBody3D@81"), NodePath("../@StaticBody3D@83"), NodePath("../@StaticBody3D@89")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@83" parent="." unique_id=944465678 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, -0.0404969, 2.5)
connections = [NodePath("../@StaticBody3D@76"), NodePath("../@StaticBody3D@82"), NodePath("../@StaticBody3D@84"), NodePath("../@StaticBody3D@90")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@84" parent="." unique_id=895551446 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, -0.0404971, 5)
connections = [NodePath("../@StaticBody3D@77"), NodePath("../@StaticBody3D@83"), NodePath("../@StaticBody3D@85"), NodePath("../@StaticBody3D@91")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@85" parent="." unique_id=1655235344 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@78"), NodePath("../@StaticBody3D@84"), NodePath("../@StaticBody3D@92")]
visualisers = [null, null, null]
[node name="@StaticBody3D@86" parent="." unique_id=504654313 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0.00175571, -7.5)
connections = [NodePath("../@StaticBody3D@79"), NodePath("../@StaticBody3D@87"), NodePath("../@StaticBody3D@93")]
visualisers = [null, null, null]
[node name="@StaticBody3D@87" parent="." unique_id=261503331 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -0.0404972, -5)
connections = [NodePath("../@StaticBody3D@80"), NodePath("../@StaticBody3D@86"), NodePath("../@StaticBody3D@88"), NodePath("../@StaticBody3D@94")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@88" parent="." unique_id=2080958354 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -0.0404972, -2.5)
connections = [NodePath("../@StaticBody3D@81"), NodePath("../@StaticBody3D@87"), NodePath("../@StaticBody3D@89"), NodePath("../@StaticBody3D@95")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@89" parent="." unique_id=132645163 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -0.0404969, 0)
connections = [NodePath("../@StaticBody3D@82"), NodePath("../@StaticBody3D@88"), NodePath("../@StaticBody3D@90"), NodePath("../@StaticBody3D@96")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@90" parent="." unique_id=775897287 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -0.0404969, 2.5)
connections = [NodePath("../@StaticBody3D@83"), NodePath("../@StaticBody3D@89"), NodePath("../@StaticBody3D@91"), NodePath("../@StaticBody3D@97")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@91" parent="." unique_id=194561316 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -0.0404971, 5)
connections = [NodePath("../@StaticBody3D@84"), NodePath("../@StaticBody3D@90"), NodePath("../@StaticBody3D@92"), NodePath("../@StaticBody3D@98")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@92" parent="." unique_id=1608798716 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@85"), NodePath("../@StaticBody3D@91"), NodePath("../@StaticBody3D@99")]
visualisers = [null, null, null]
[node name="@StaticBody3D@93" parent="." unique_id=709169041 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, 0.00175571, -7.5)
connections = [NodePath("../@StaticBody3D@86"), NodePath("../@StaticBody3D@94"), NodePath("../@StaticBody3D@100")]
visualisers = [null, null, null]
[node name="@StaticBody3D@94" parent="." unique_id=168204741 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, -0.0404972, -5)
connections = [NodePath("../@StaticBody3D@87"), NodePath("../@StaticBody3D@93"), NodePath("../@StaticBody3D@95"), NodePath("../@StaticBody3D@101")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@95" parent="." unique_id=1667951340 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, -0.0404972, -2.5)
connections = [NodePath("../@StaticBody3D@88"), NodePath("../@StaticBody3D@94"), NodePath("../@StaticBody3D@96"), NodePath("../@StaticBody3D@102")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@96" parent="." unique_id=972486030 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, -0.0404969, 0)
connections = [NodePath("../@StaticBody3D@89"), NodePath("../@StaticBody3D@95"), NodePath("../@StaticBody3D@97"), NodePath("../@StaticBody3D@103")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@97" parent="." unique_id=453341856 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, -0.0404969, 2.5)
connections = [NodePath("../@StaticBody3D@90"), NodePath("../@StaticBody3D@96"), NodePath("../@StaticBody3D@98"), NodePath("../@StaticBody3D@104")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@98" parent="." unique_id=1306245900 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, -0.0404971, 5)
connections = [NodePath("../@StaticBody3D@91"), NodePath("../@StaticBody3D@97"), NodePath("../@StaticBody3D@99"), NodePath("../@StaticBody3D@105")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@99" parent="." unique_id=660072411 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@92"), NodePath("../@StaticBody3D@98"), NodePath("../@StaticBody3D@106")]
visualisers = [null, null, null]
[node name="@StaticBody3D@100" parent="." unique_id=1820379262 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, 0.00175571, -7.5)
connections = [NodePath("../@StaticBody3D@93"), NodePath("../@StaticBody3D@101"), NodePath("../@StaticBody3D@107")]
visualisers = [null, null, null]
[node name="@StaticBody3D@101" parent="." unique_id=12570627 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, -0.0404972, -5)
connections = [NodePath("../@StaticBody3D@94"), NodePath("../@StaticBody3D@100"), NodePath("../@StaticBody3D@102"), NodePath("../@StaticBody3D@108")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@102" parent="." unique_id=115702871 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, -0.0404972, -2.5)
connections = [NodePath("../@StaticBody3D@95"), NodePath("../@StaticBody3D@101"), NodePath("../@StaticBody3D@103"), NodePath("../@StaticBody3D@109")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@103" parent="." unique_id=837797651 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, -0.0404969, -2.84217e-14)
connections = [NodePath("../@StaticBody3D@96"), NodePath("../@StaticBody3D@102"), NodePath("../@StaticBody3D@104"), NodePath("../@StaticBody3D@110")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@104" parent="." unique_id=1330074079 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, -0.0404969, 2.5)
connections = [NodePath("../@StaticBody3D@97"), NodePath("../@StaticBody3D@103"), NodePath("../@StaticBody3D@105"), NodePath("../@StaticBody3D@111")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@105" parent="." unique_id=1805228083 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, -0.0404969, 5)
connections = [NodePath("../@StaticBody3D@98"), NodePath("../@StaticBody3D@104"), NodePath("../@StaticBody3D@106"), NodePath("../@StaticBody3D@112")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@106" parent="." unique_id=1932081713 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, 0.00175571, 7.5)
connections = [NodePath("../@StaticBody3D@99"), NodePath("../@StaticBody3D@105"), NodePath("../@StaticBody3D@113")]
visualisers = [null, null, null]
[node name="@StaticBody3D@107" parent="." unique_id=1529071954 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.5, 0.00175571, -7.5)
connections = [NodePath("../@StaticBody3D@100"), NodePath("../@StaticBody3D@108"), NodePath("../@StaticBody3D@397")]
visualisers = [null, null, null]
[node name="@StaticBody3D@108" parent="." unique_id=675226672 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.5, -0.0404972, -5)
connections = [NodePath("../@StaticBody3D@101"), NodePath("../@StaticBody3D@107"), NodePath("../@StaticBody3D@109"), NodePath("../@StaticBody3D@395")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@109" parent="." unique_id=2131023073 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.5, -0.0404972, -2.5)
connections = [NodePath("../@StaticBody3D@102"), NodePath("../@StaticBody3D@108"), NodePath("../@StaticBody3D@110"), NodePath("../@StaticBody3D@393")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@110" parent="." unique_id=1447878297 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.5, -0.0404969, 2.84217e-14)
connections = [NodePath("../@StaticBody3D@103"), NodePath("../@StaticBody3D@109"), NodePath("../@StaticBody3D@111"), NodePath("../@StaticBody3D@391")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@111" parent="." unique_id=712017595 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.5, -0.0404969, 2.5)
connections = [NodePath("../@StaticBody3D@104"), NodePath("../@StaticBody3D@110"), NodePath("../@StaticBody3D@112"), NodePath("../@StaticBody3D@389")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@112" parent="." unique_id=1912169701 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.5, -0.0404969, 5)
connections = [NodePath("../@StaticBody3D@105"), NodePath("../@StaticBody3D@111"), NodePath("../@StaticBody3D@113"), NodePath("../@StaticBody3D@387")]
visualisers = [null, null, null, null]
[node name="@StaticBody3D@113" parent="." unique_id=1356088392 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17.5, 0.0017556, 7.5)
connections = [NodePath("../@StaticBody3D@106"), NodePath("../@StaticBody3D@112"), NodePath("../@StaticBody3D@385")]
visualisers = [null, null, null]
[node name="@StaticBody3D@385" parent="." unique_id=1294078555 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.215, 0.0945654, 7.5)
connections = [NodePath("../@StaticBody3D@113"), NodePath("../@StaticBody3D@387"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@414"), NodePath("../@StaticBody3D@416")]
visualisers = [null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@387" parent="." unique_id=1595261462 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.215, -0.0885693, 5)
connections = [NodePath("../@StaticBody3D@112"), NodePath("../@StaticBody3D@385"), NodePath("../@StaticBody3D@389"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@414"), NodePath("../@StaticBody3D@416")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@389" parent="." unique_id=179065096 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.215, -0.0848544, 2.5)
connections = [NodePath("../@StaticBody3D@111"), NodePath("../@StaticBody3D@391"), NodePath("../@StaticBody3D@387"), NodePath("../@StaticBody3D@416"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@414")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@391" parent="." unique_id=1461123363 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.215, -0.0806967, 2.84217e-14)
connections = [NodePath("../@StaticBody3D@110"), NodePath("../@StaticBody3D@393"), NodePath("../@StaticBody3D@389"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@414"), NodePath("../@StaticBody3D@416")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@393" parent="." unique_id=986300354 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.215, -0.0848545, -2.5)
connections = [NodePath("../@StaticBody3D@109"), NodePath("../@StaticBody3D@395"), NodePath("../@StaticBody3D@391"), NodePath("../@StaticBody3D@414"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@416")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@395" parent="." unique_id=823365518 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.215, -0.0885694, -5)
connections = [NodePath("../@StaticBody3D@108"), NodePath("../@StaticBody3D@397"), NodePath("../@StaticBody3D@393"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@414"), NodePath("../@StaticBody3D@416")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@397" parent="." unique_id=985819522 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.215, 0.0945654, -7.5)
connections = [NodePath("../@StaticBody3D@107"), NodePath("../@StaticBody3D@395"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@414"), NodePath("../@StaticBody3D@416")]
visualisers = [null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@411" parent="." unique_id=942087383 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 27.215, -1.0593, 0)
connections = [NodePath("../@StaticBody3D@391"), NodePath("../@StaticBody3D@416"), NodePath("../@StaticBody3D@414"), NodePath("../@StaticBody3D@385"), NodePath("../@StaticBody3D@387"), NodePath("../@StaticBody3D@389"), NodePath("../@StaticBody3D@393"), NodePath("../@StaticBody3D@395"), NodePath("../@StaticBody3D@397"), NodePath("../@StaticBody3D@458")]
visualisers = [null, null, null, null, null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@414" parent="." unique_id=1454840132 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 27.215, -1.05915, -2.5)
connections = [NodePath("../@StaticBody3D@393"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@397"), NodePath("../@StaticBody3D@395"), NodePath("../@StaticBody3D@391"), NodePath("../@StaticBody3D@389"), NodePath("../@StaticBody3D@387"), NodePath("../@StaticBody3D@385"), NodePath("../@StaticBody3D@458")]
visualisers = [null, null, null, null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@416" parent="." unique_id=64522456 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 27.215, -1.05945, 2.5)
connections = [NodePath("../@StaticBody3D@389"), NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@385"), NodePath("../@StaticBody3D@387"), NodePath("../@StaticBody3D@391"), NodePath("../@StaticBody3D@393"), NodePath("../@StaticBody3D@395"), NodePath("../@StaticBody3D@397"), NodePath("../@StaticBody3D@458")]
visualisers = [null, null, null, null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@458" parent="." unique_id=1467197443 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 44.215, -1.05955, 0)
connections = [NodePath("../@StaticBody3D@411"), NodePath("../@StaticBody3D@416"), NodePath("../@StaticBody3D@414")]
visualisers = [null, null, null]
buildable = false
[node name="@StaticBody3D@464" parent="." unique_id=1434980999 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.285, 0.10004, -7.5)
connections = [NodePath("../FlowNode"), NodePath("../@StaticBody3D@466"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@495"), NodePath("../@StaticBody3D@493")]
visualisers = [null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@466" parent="." unique_id=1293394447 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.285, -0.079766, -5)
connections = [NodePath("../@StaticBody3D@10"), NodePath("../@StaticBody3D@468"), NodePath("../@StaticBody3D@464"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@495"), NodePath("../@StaticBody3D@493")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@468" parent="." unique_id=195127986 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.285, -0.0764061, -2.5)
connections = [NodePath("../@StaticBody3D@11"), NodePath("../@StaticBody3D@470"), NodePath("../@StaticBody3D@466"), NodePath("../@StaticBody3D@495"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@493")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@470" parent="." unique_id=189009953 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.285, -0.0730402, -2.84217e-14)
connections = [NodePath("../@StaticBody3D@12"), NodePath("../@StaticBody3D@472"), NodePath("../@StaticBody3D@468"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@495"), NodePath("../@StaticBody3D@493")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@472" parent="." unique_id=635282593 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.285, -0.0764062, 2.5)
connections = [NodePath("../@StaticBody3D@13"), NodePath("../@StaticBody3D@474"), NodePath("../@StaticBody3D@470"), NodePath("../@StaticBody3D@493"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@495")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@474" parent="." unique_id=844528211 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.285, -0.0797663, 5)
connections = [NodePath("../@StaticBody3D@14"), NodePath("../@StaticBody3D@472"), NodePath("../@StaticBody3D@476"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@495"), NodePath("../@StaticBody3D@493")]
visualisers = [null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@476" parent="." unique_id=886910695 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.285, 0.10004, 7.5)
connections = [NodePath("../@StaticBody3D@15"), NodePath("../@StaticBody3D@474"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@495"), NodePath("../@StaticBody3D@493")]
visualisers = [null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@490" parent="." unique_id=137896375 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.385, -1.0444, -2.84217e-14)
connections = [NodePath("../@StaticBody3D@470"), NodePath("../@StaticBody3D@493"), NodePath("../@StaticBody3D@495"), NodePath("../@StaticBody3D@472"), NodePath("../@StaticBody3D@474"), NodePath("../@StaticBody3D@476"), NodePath("../@StaticBody3D@468"), NodePath("../@StaticBody3D@466"), NodePath("../@StaticBody3D@464")]
visualisers = [null, null, null, null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@493" parent="." unique_id=452610810 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.385, -1.05029, 4)
connections = [NodePath("../@StaticBody3D@472"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@476"), NodePath("../@StaticBody3D@474"), NodePath("../@StaticBody3D@470"), NodePath("../@StaticBody3D@468"), NodePath("../@StaticBody3D@466"), NodePath("../@StaticBody3D@464")]
visualisers = [null, null, null, null, null, null, null, null]
buildable = false
[node name="@StaticBody3D@495" parent="." unique_id=1197271690 node_paths=PackedStringArray("connections", "visualisers") instance=ExtResource("2_s6hwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.385, -1.05029, -4)
connections = [NodePath("../@StaticBody3D@468"), NodePath("../@StaticBody3D@490"), NodePath("../@StaticBody3D@464"), NodePath("../@StaticBody3D@466"), NodePath("../@StaticBody3D@470"), NodePath("../@StaticBody3D@472"), NodePath("../@StaticBody3D@474"), NodePath("../@StaticBody3D@476")]
visualisers = [null, null, null, null, null, null, null, null]
buildable = false

View File

@@ -0,0 +1,62 @@
class_name FlowNodeVisualiser
extends StaticBody3D
var data: FlowNodeData
var connections: Array[FlowNodeVisualiser]
var visualisers: Array[Node3D]
var visual_scene: PackedScene = preload("res://Scenes/FlowField/cube2.tscn")
var best_path: FlowNodeVisualiser :
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 setup_connection_visualisers() -> void:
visualisers = []
for node: FlowNodeVisualiser in connections:
var visual: Node3D = visual_scene.instantiate()
add_child(visual)
visual.owner = self
visualisers.append(visual)
set_connector_color(node, Color.WEB_GRAY)
@warning_ignore("unused_parameter")
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: FlowNodeVisualiser, 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: FlowNodeVisualiser) -> 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: FlowNodeVisualiser) -> void:
if connections.has(node):
var i: int = connections.find(node)
visualisers.pop_at(i).queue_free()
connections.remove_at(i)

View File

@@ -0,0 +1 @@
uid://c86ygtor5tksd

Binary file not shown.

View File

@@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bs4en6twugqjl"
path="res://.godot/imported/flow_node.glb-03115bd13e3be35ef5e101089fe751ff.scn"
[deps]
source_file="res://scenes/flow_field/flow_node.glb"
dest_files=["res://.godot/imported/flow_node.glb-03115bd13e3be35ef5e101089fe751ff.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@@ -0,0 +1,18 @@
[gd_scene format=3 uid="uid://bssfvyxv5uo1f"]
[ext_resource type="Script" uid="uid://c86ygtor5tksd" path="res://scenes/flow_field/flow_node.gd" id="1_ng65h"]
[ext_resource type="PackedScene" uid="uid://h7el2c2awv6" path="res://scenes/flow_field/flow_node2.tscn" id="2_bmgs5"]
[sub_resource type="SphereShape3D" id="SphereShape3D_bmgs5"]
radius = 0.4
[node name="FlowNode" type="StaticBody3D" unique_id=693964790]
collision_layer = 64
collision_mask = 0
script = ExtResource("1_ng65h")
metadata/_custom_type_script = "uid://c86ygtor5tksd"
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=218852378]
shape = SubResource("SphereShape3D_bmgs5")
[node name="flow_node" parent="." unique_id=1362505504 instance=ExtResource("2_bmgs5")]

View File

@@ -0,0 +1,11 @@
[gd_scene format=3 uid="uid://h7el2c2awv6"]
[ext_resource type="PackedScene" uid="uid://bs4en6twugqjl" path="res://scenes/flow_field/flow_node.glb" id="1_tnepb"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0r20u"]
resource_local_to_scene = true
[node name="flow_node" unique_id=1309943906 instance=ExtResource("1_tnepb")]
[node name="Sphere" parent="." index="0" unique_id=661581070]
material_override = SubResource("StandardMaterial3D_0r20u")

View File

@@ -0,0 +1,70 @@
class_name FlowNodeData
extends RefCounted
enum NodeType {
STANDARD = 0,
START = 1,
GOAL = 2,
OBSTACLE = 3,
}
var node_id: int = -1
var position: Vector3 = Vector3.ZERO
var type: NodeType = NodeType.STANDARD
var buildable: bool = true
var traversable: bool = true
var connected_nodes: Array[FlowNodeData]
var best_path: FlowNodeData
var in_grid: bool = false
var grid_id: int = -1
var grid_x: int = 0
var grid_y: int = 0
#This function cannot fill in the connection information until a complete set
#of nodes have been loaded and can be looped over
static func from_dict(dict: Dictionary) -> FlowNodeData:
var data: FlowNodeData = FlowNodeData.new()
data.node_id = dict["node_id"]
data.position.x = dict["position_x"]
data.position.y = dict["position_y"]
data.position.z = dict["position_z"]
data.type = dict["type"]
data.buildable = dict["buildable"]
data.in_grid = dict["in_grid"]
data.grid_id = dict["grid_id"]
data.grid_x = dict["grid_x"]
data.grid_y = dict["grid_y"]
if data.type == NodeType.OBSTACLE:
data.buildable = false
data.traversable = false
return data
func populate_connections(dict: Dictionary, node_array: Array[FlowNodeData]) -> void:
var connections_array: Array = dict["connected_nodes"]
for x: float in connections_array:
for y: FlowNodeData in node_array:
if y.node_id == int(x):
connected_nodes.append(y)
func to_dict() -> Dictionary:
var dict: Dictionary = {}
var connections: Array[int] = []
for node: FlowNodeData in connected_nodes:
connections.append(node.node_id)
dict["connected_nodes"] = connections
dict["node_id"] = node_id
dict["position_x"] = position.x
dict["position_y"] = position.y
dict["position_z"] = position.z
dict["type"] = type
dict["buildable"] = buildable
dict["in_grid"] = in_grid
dict["grid_id"] = grid_id
dict["grid_x"] = grid_x
dict["grid_y"] = grid_y
return dict

View File

@@ -0,0 +1 @@
uid://udtpnemisl0t