extends Node3D signal camera_changed(camera: Camera3D) @export_group("Camera") @export var camera_iso : Camera3D @export var pivot : Node3D @export var camera_front : Camera3D @export var camera_side1 : Camera3D @export var camera_side2 : Camera3D @export var camera_top : Camera3D @export_group("Camera Movememnt") @export var move_speed : float = 20.0 @export var rotation_speed : float = 0.2 @export_group("Cinematic Mode") @export var change_camera_time : float = 10.0 @export_group("Isometric Zoom") @export var normal_size : float = 35.0 @export var zoom_size : float = 60.0 @export var zoom_time : float = 1.2 var is_zoomed : bool = false var zoom_tween : Tween var is_cinematic_mode : bool = false var cinematic_timer : float = 0.0 var cinematic_index : int = 0 var array_camera : Array[Camera3D] = [] var initial_pivot_transformation : Transform3D func _ready(): UIEvents.change_camera_request.connect(on_change_camera_request) if pivot: initial_pivot_transformation = pivot.transform if camera_iso: array_camera.append(camera_iso) if camera_front: array_camera.append(camera_front) if camera_side1: array_camera.append(camera_side1) if camera_side2: array_camera.append(camera_side2) if camera_top: array_camera.append(camera_top) if camera_iso: set_camera(camera_iso) func sync_zoom(new_size: float, new_fov: float, photo_is_zoomed: bool = false) -> void: if camera_iso: if zoom_tween and zoom_tween.is_valid(): zoom_tween.kill() camera_iso.size = new_size camera_iso.fov = new_fov is_zoomed = photo_is_zoomed var target_size = zoom_size if is_zoomed else normal_size if not is_equal_approx(camera_iso.size, target_size): zoom_tween = create_tween() zoom_tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT) zoom_tween.tween_property(camera_iso, "size", target_size, zoom_time) zoom_tween.parallel().tween_property(camera_iso, "fov", target_size, zoom_time) func set_camera(camera: Camera3D): camera.make_current() emit_signal("camera_changed", camera) func _process(delta: float) -> void: var current_cam = get_viewport().get_camera_3d() var is_photo_mode = current_cam != null and not current_cam in array_camera if not is_photo_mode: if is_cinematic_mode and array_camera.size() > 0: cinematic_timer += delta if cinematic_timer >= change_camera_time: cinematic_timer = 0.0 cinematic_index = (cinematic_index + 1) % array_camera.size() var next_cam = array_camera[cinematic_index] set_camera(next_cam) if camera_iso == null or current_cam != camera_iso: return if Input.is_action_just_pressed("zoom_in"): if is_zoomed == false: return is_zoomed = false var target_size = normal_size if zoom_tween and zoom_tween.is_valid(): zoom_tween.kill() zoom_tween = create_tween() zoom_tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT) zoom_tween.tween_property(camera_iso, "size", target_size, zoom_time) zoom_tween.parallel().tween_property(camera_iso, "fov", target_size, zoom_time) elif Input.is_action_just_pressed("zoom_out"): if is_zoomed == true: return is_zoomed = true var target_size = zoom_size if zoom_tween and zoom_tween.is_valid(): zoom_tween.kill() zoom_tween = create_tween() zoom_tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT) zoom_tween.tween_property(camera_iso, "size", target_size, zoom_time) zoom_tween.parallel().tween_property(camera_iso, "fov", target_size, zoom_time) func on_change_camera_request(camera_index: int) -> void: var next_cam = array_camera[camera_index] set_camera(next_cam) #func _unhandled_input(event: InputEvent) -> void: #var current_cam = get_viewport().get_camera_3d() #var is_photo_mode = current_cam != null and not current_cam in array_camera #if is_photo_mode: #return # #if event is InputEventKey and event.pressed and not event.echo: #match event.keycode: #KEY_1: #if array_camera.size() > 0: set_camera(array_camera[0]) #KEY_2: #if array_camera.size() > 1: set_camera(array_camera[1]) #KEY_3: #if array_camera.size() > 2: set_camera(array_camera[2]) #KEY_4: #if array_camera.size() > 3: set_camera(array_camera[3]) #KEY_5: #if array_camera.size() > 4: set_camera(array_camera[4])