36 lines
1,018 B
GDScript
36 lines
1,018 B
GDScript
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)))
|