owlrazum
I am using this code:
@tool
class_name Graph
extends Node3D
@export_group("Editor")
@export var _connect_graph_editor: bool:
set=_on_connect_graph_editor
@export var _generate_places_editor: bool:
set=_on_generate_places_editor
@export var _correct_names_editor: bool:
set(_v):
for place in $Places.get_children():
(place as Place).change_place_name_editor(place.name)
@export var _generation_data: GraphGenerationData
func _on_connect_graph_editor(_v):
var paths_parent = $Paths
for p in paths_parent.get_children():
p.queue_free()
var constructed = {}
var path_scene = preload("res://source/graph_elements/Path.tscn")
var root_owner = get_tree().edited_scene_root
for place in $Places.get_children():
place = place as Place
for connected in place.connectedPlaces:
connected = connected as Place
if (constructed.has(connected.name)):
continue
constructed[place.name] = 1
var path: Node3D = path_scene.instantiate(PackedScene.GEN_EDIT_STATE_INSTANCE)
paths_parent.add_child(path)
path.set_owner(root_owner)
path.name = "%s to %s" % [place.name, connected.name]
var p1 = place.position
var p2 = connected.position
path.look_at_from_position(p1, p2)
path.set_scale(Vector3(1, 1, (p2 - p1).length()))
Utilities.save_scene(self, "res://source/graphs/%s")
func _on_generate_places_editor(_v):
var root_owner = get_tree().edited_scene_root
var places_parent
if not has_node("Places"):
places_parent = Node3D.new()
places_parent.name = "Places"
add_child(places_parent)
places_parent.set_owner(root_owner)
else:
places_parent = $Places
for p in places_parent.get_children():
p.queue_free()
var points: Array[Vector3] = []
var max_iteration = 1000
var iter = 0
while points.size() < _generation_data.num_places:
iter += 1
if (iter > max_iteration):
printerr("iteration limit exceeded")
break
var x = randf_range(- _generation_data.area, _generation_data.area)
var y = randf_range(- _generation_data.area, _generation_data.area)
var valid_point = true
for existing_point in points:
var distance = existing_point.distance_to(Vector3(x, 0, y))
prints("distance at index %s %s" % [points.size(), distance])
if _generation_data.gap_minmax.x > distance or distance > _generation_data.gap_minmax.y:
valid_point = false
break
if valid_point:
points.append(Vector3(x, 0, y))
var place_scene = preload("res://source/graph_elements/place.tscn")
for p in range(points.size()):
var place: Node3D = place_scene.instantiate(PackedScene.GEN_EDIT_STATE_INSTANCE)
places_parent.add_child(place)
place.set_owner(root_owner)
place.change_place_name_editor(_generation_data.place_names[p])
place.position = points[p]
Utilities.save_scene(self, root_owner.scene_file_path)