class_name CameraRays
extends Node3D

@export_flags_3d_physics var collision_mask := 1

var occlusion_distance: float = 1000
var occlusion_point: Vector3
var pivot: Node3D

func _ready():
	pivot = get_parent()

func _physics_process(_delta):
	occlusion_distance = Global.camera.far

	var corner: Vector2 = get_viewport().get_visible_rect().size
	var space_state = get_world_3d().direct_space_state

	send_ray(space_state, Vector2(0, 0))
	send_ray(space_state, Vector2(corner.x, 0))
	send_ray(space_state, Vector2(0, corner.y))
	send_ray(space_state, Vector2(corner.x, corner.y))
	send_ray(space_state, Vector2(corner.x / 2, corner.y / 2))

func send_ray(space_state: PhysicsDirectSpaceState3D, pos: Vector2):
	var from := pivot.global_position
	var to := Global.camera.project_position(pos, -1)
	var query = PhysicsRayQueryParameters3D.create(from, to, collision_mask)
	var result = space_state.intersect_ray(query)
	
	if result:
		var hit_point: Vector3 = result.position
		var diff := hit_point - pivot.global_position
		var distance := diff.length()

		if distance < occlusion_distance:
			occlusion_distance = distance
			occlusion_point = hit_point