using System.Diagnostics; using System.Collections; using System.Collections.Generic; using System; using Godot; namespace Rokojori { [Tool] [Icon("res://addons/rokojori_action_library/Icons/VirtualCamera3DSlot.svg") ] [GlobalClass] public partial class VirtualCamera3DSlot:RJAction { [Export] public RJVirtualCamera3D camera; [Export] public float priority; CameraEffectRunner cameraEffectRunner = null; float _effectTimePosition = 0; float _smoothedPriority; public float smoothedPriority => _smoothedPriority; Smoother smoother = new Smoother(); public void Update( double delta, VirtualCamera3DManager manager ) { if ( cameraEffectRunner != null ) { if ( cameraEffectRunner.isFinished ) { cameraEffectRunner = null; } else { cameraEffectRunner.Update(); } } _smoothedPriority = smoother.SmoothWithCoefficient( _smoothedPriority, priority, manager.safeSmoothing, (float) delta, manager.smoothStepDelta ); } public void SetCameraEffect( CameraEffect effect ) { cameraEffectRunner = new CameraEffectRunner( effect ); } public Vector3 GetCameraPosition() { if ( camera == null ) { return Vector3.Zero; } if ( cameraEffectRunner == null ) { return camera.GetCameraPosition(); } var offset = camera.GetGlobalOffset( cameraEffectRunner.position ); return camera.GetCameraPosition() + offset; } public Quaternion GetCameraRotation() { if ( camera == null ) { return Quaternion.Identity; } if ( cameraEffectRunner == null ) { return camera.GetCameraRotation(); } return camera.GetCameraRotation() * cameraEffectRunner.rotation; } public float GetCameraFOV() { if ( camera == null ) { return 65; } if ( cameraEffectRunner == null ) { return camera.GetCameraFOV(); } return camera.GetCameraFOV() + cameraEffectRunner.fov; } public override void _OnTrigger() { var vm = GetParent(); if ( vm == null ) { return; } vm.SetActiveSlot( this ); } } }