## GUIDE makes controlling a camera pretty easy. By using the 
## window-relative and scale modifiers we can translate mouse input 
## directly into a format suitable for rotation. GUIDE also takes
## care of only sending yaw and pitch input when the camera toggle 
## is pressed, so we don't need to have any complex input code in
## our camera control script.
extends Node3D

@export var camera_pitch:GUIDEAction
@export var camera_yaw:GUIDEAction
@export var camera_toggle:GUIDEAction
@export var camera_move:GUIDEAction

@export var movement_speed:float = 1
@onready var _camera_yaw:Node3D = %CameraYaw
@onready var _camera_pitch:SpringArm3D = %CameraPitch

func _ready():
	camera_toggle.triggered.connect(_hide_mouse)
	camera_toggle.completed.connect(_show_mouse)
	camera_yaw.triggered.connect(_yaw)
	camera_pitch.triggered.connect(_pitch)
	
func _hide_mouse():
	Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
	
func _show_mouse():
	Input.mouse_mode = Input.MOUSE_MODE_VISIBLE

func _yaw():
	_camera_yaw.rotate_y(camera_yaw.value_axis_1d)

func _pitch():
	_camera_pitch.rotate_x(camera_pitch.value_axis_1d)	
	_camera_pitch.rotation_degrees.x = clamp(_camera_pitch.rotation_degrees.x, -75.0, 0.0)

		
func _process(delta):
	# we already used the input-swizzle modifier to get forward as -z, backward as z
	# left as -x and right as x, so we can use this immediately
	position += basis * camera_move.value_axis_3d * movement_speed * delta
	
