class_name RegionTransform extends Node @export var offset: Vector3 @export var region: Vector3i @export var target: Node3D func _enter_tree() -> void: if not target: target = get_parent() RegionOrigin.add_node(target) func _exit_tree() -> void: RegionOrigin.remove_node(target) func move_offset(delta_offset: Vector3) -> void: set_offset(offset + delta_offset) func set_offset(new_offset: Vector3) -> void: offset = new_offset var delta_sector: Vector3i = _floor_ftoi(new_offset / 1000.0) region += delta_sector offset -= Vector3(delta_sector) * 1000.0 sync_to_transform() func altitude() -> float: return offset.y + float(region.y) * 1000.0 func sync_to_transform() -> void: target.transform.origin = offset + Vector3(region - RegionOrigin.origin) func sync_from_transform() -> void: set_offset(target.transform.origin) static func _floor_ftoi(vec: Vector3) -> Vector3i: return Vector3i(int(floorf(vec.x)), int(floorf(vec.y)), int(floorf(vec.z)))