class_name Utils
extends Object


const VEC3_HOR := Vector3(1.0, 0.0, 1.0)


static func get_all_children(node: Node, internal: bool = false) -> Array[Node]:
	if not is_instance_valid(node):
		return []
	
	var children: Array[Node] = []
	for child: Node in node.get_children(internal):
		children.append(child)
		if child.get_child_count(internal) > 0:
			children.append_array(get_all_children(child, internal))
	
	return children


static func node_distance(node_a: Node3D, node_b: Node3D, position_modifier := Vector3.ONE) -> float:
	if not is_instance_valid(node_a) or not is_instance_valid(node_b):
		return -1.0
	
	return (node_a.global_position * position_modifier).distance_to(node_b.global_position * position_modifier)


## Returns [code]true[/code] when [param node_a] is close to the [param from] node than [param node_b].[br]
## [b]Note:[/b] Meant to be used with the [method Array.sort_custom] function.
static func sort_by_distance(from: Node3D, node_a: Node3D, node_b: Node3D) -> bool:
	return Utils.node_distance(from, node_a) <= Utils.node_distance(from, node_b)
