Files
tgcc/core/camera_move.gd
2026-07-01 19:09:56 +02:00

127 lines
3.6 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_moving_enabled : bool = true
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) -> void:
if camera_iso:
camera_iso.size = new_size
camera_iso.fov = new_fov
if abs(new_size - zoom_size) < abs(new_size - normal_size):
is_zoomed = true
else:
is_zoomed = false
func set_camera(camera: Camera3D):
camera.make_current()
emit_signal("camera_changed", camera)
func _process(delta: float) -> void:
if camera_iso == null or get_viewport().get_camera_3d() != camera_iso:
return
if Input.is_action_just_pressed("photo_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("photo_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 _process_movement(delta):
#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)
#is_moving_enabled = (next_cam == camera_iso)
#
#if not is_moving_enabled or pivot == null:
#return
#
#var input_dir = Vector3.ZERO
#if Input.is_key_pressed(KEY_W): input_dir.z -= 1
#if Input.is_key_pressed(KEY_S): input_dir.z += 1
#if Input.is_key_pressed(KEY_A): input_dir.x -= 1
#if Input.is_key_pressed(KEY_D): input_dir.x += 1
#
#if input_dir != Vector3.ZERO:
#input_dir = input_dir.normalized()
#
#var forward = pivot.transform.basis.z
#var right = pivot.transform.basis.x
#forward.y = 0
#right.y = 0
#
#forward = forward.normalized()
#right = right.normalized()
#
#var motion = (forward * input_dir.z + right * input_dir.x)
#pivot.position += motion * move_speed * delta