111 lines
3.4 KiB
GDScript
111 lines
3.4 KiB
GDScript
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():
|
|
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)
|