conforms file names to consistant standard
This commit is contained in:
BIN
scenes/flow_field/cube.glb
Normal file
BIN
scenes/flow_field/cube.glb
Normal file
Binary file not shown.
42
scenes/flow_field/cube.glb.import
Normal file
42
scenes/flow_field/cube.glb.import
Normal 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
|
||||
11
scenes/flow_field/cube2.tscn
Normal file
11
scenes/flow_field/cube2.tscn
Normal 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")
|
||||
118
scenes/flow_field/flow_field.gd
Normal file
118
scenes/flow_field/flow_field.gd
Normal 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
|
||||
1
scenes/flow_field/flow_field.gd.uid
Normal file
1
scenes/flow_field/flow_field.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://r4nmfr8jfcjx
|
||||
12
scenes/flow_field/flow_field.tscn
Normal file
12
scenes/flow_field/flow_field.tscn
Normal 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("..")
|
||||
27
scenes/flow_field/flow_field_data.gd
Normal file
27
scenes/flow_field/flow_field_data.gd
Normal 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
|
||||
1
scenes/flow_field/flow_field_data.gd.uid
Normal file
1
scenes/flow_field/flow_field_data.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ds7m1p5666qby
|
||||
65
scenes/flow_field/flow_field_editor.gd
Normal file
65
scenes/flow_field/flow_field_editor.gd
Normal 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)
|
||||
1
scenes/flow_field/flow_field_editor.gd.uid
Normal file
1
scenes/flow_field/flow_field_editor.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://d348pxbcsomw4
|
||||
55
scenes/flow_field/flow_field_tester.gd
Normal file
55
scenes/flow_field/flow_field_tester.gd
Normal 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
|
||||
1
scenes/flow_field/flow_field_tester.gd.uid
Normal file
1
scenes/flow_field/flow_field_tester.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://io82eo46is7q
|
||||
14
scenes/flow_field/flow_field_tester.tscn
Normal file
14
scenes/flow_field/flow_field_tester.tscn
Normal 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)
|
||||
379
scenes/flow_field/flow_field_tool.gd
Normal file
379
scenes/flow_field/flow_field_tool.gd
Normal 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)
|
||||
1
scenes/flow_field/flow_field_tool.gd.uid
Normal file
1
scenes/flow_field/flow_field_tool.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://05c5q1v2nv8p
|
||||
216
scenes/flow_field/flow_field_tool.tscn
Normal file
216
scenes/flow_field/flow_field_tool.tscn
Normal 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"]
|
||||
662
scenes/flow_field/flow_field_tool_output.tscn
Normal file
662
scenes/flow_field/flow_field_tool_output.tscn
Normal 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
|
||||
62
scenes/flow_field/flow_node.gd
Normal file
62
scenes/flow_field/flow_node.gd
Normal 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)
|
||||
1
scenes/flow_field/flow_node.gd.uid
Normal file
1
scenes/flow_field/flow_node.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c86ygtor5tksd
|
||||
BIN
scenes/flow_field/flow_node.glb
Normal file
BIN
scenes/flow_field/flow_node.glb
Normal file
Binary file not shown.
42
scenes/flow_field/flow_node.glb.import
Normal file
42
scenes/flow_field/flow_node.glb.import
Normal 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
|
||||
18
scenes/flow_field/flow_node.tscn
Normal file
18
scenes/flow_field/flow_node.tscn
Normal 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")]
|
||||
11
scenes/flow_field/flow_node2.tscn
Normal file
11
scenes/flow_field/flow_node2.tscn
Normal 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")
|
||||
70
scenes/flow_field/flow_node_data.gd
Normal file
70
scenes/flow_field/flow_node_data.gd
Normal 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
|
||||
1
scenes/flow_field/flow_node_data.gd.uid
Normal file
1
scenes/flow_field/flow_node_data.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://udtpnemisl0t
|
||||
Reference in New Issue
Block a user