Files
JJBB/Assets/Plugins/Cinemachine/Base/Runtime/Behaviours/CinemachineSmoother.cs
2024-08-23 15:49:34 +08:00

104 lines
4.9 KiB
C#

#if false // GML We disable smoother because people are too tempted to use it. It won't give good results.
using UnityEngine;
using Cinemachine.Utility;
namespace Cinemachine
{
/// <summary>
/// An add-on module for Cinemachine Virtual Camera which post-processes
/// the final position and orientation of the virtual camera, as a kind of low-pass filter.
/// </summary>
[DocumentationSorting(17, DocumentationSortingAttribute.Level.UserRef)]
[ExecuteInEditMode]
[AddComponentMenu("")] // Hide in menu
[SaveDuringPlay]
public class CinemachineSmoother : CinemachineExtension
{
/// <summary>
/// The strength of the smoothing for position. This is applied after the vcam cas calculated its state.
/// </summary>
[Range(0f, 10f)]
[Tooltip("The strength of the smoothing for position. Higher numbers smooth more but reduce performance and introduce lag.")]
public float m_PositionSmoothing = 1;
/// <summary>
/// The strength of the smoothing for the LookAt target. This is applied after the vcam cas calculated its state.
/// </summary>
[Range(0f, 10f)]
[Tooltip("The strength of the smoothing for the LookAt target. Higher numbers smooth more but reduce performance and introduce lag.")]
public float m_LookAtSmoothing = 1;
/// <summary>
/// The strength of the smoothing for rotation. This is applied after the vcam cas calculated its state.
/// </summary>
[Range(0f, 10f)]
[Tooltip("The strength of the smoothing for rotation. Higher numbers smooth more but reduce performance and introduce lag.")]
public float m_RotationSmoothing = 1;
protected override void PostPipelineStageCallback(
CinemachineVirtualCameraBase vcam,
CinemachineCore.Stage stage, ref CameraState state, float deltaTime)
{
if (stage == CinemachineCore.Stage.Body)
{
VcamExtraState extra = GetExtraState<VcamExtraState>(vcam);
if (m_PositionSmoothing > 0)
{
if (deltaTime < 0)
extra.mSmoothingFilter = null; // reset the filter
state.PositionCorrection
+= ApplySmoothing(vcam, state.CorrectedPosition, extra) - state.CorrectedPosition;
}
if (m_LookAtSmoothing > 0 && state.HasLookAt)
{
if (deltaTime < 0)
extra.mSmoothingFilterLookAt = null; // reset the filter
state.ReferenceLookAt = ApplySmoothingLookAt(vcam, state.ReferenceLookAt, extra);
}
}
if (stage == CinemachineCore.Stage.Aim)
{
if (m_RotationSmoothing > 0)
{
VcamExtraState extra = GetExtraState<VcamExtraState>(vcam);
if (deltaTime < 0)
extra.mSmoothingFilterRotation = null; // reset the filter
Quaternion q = Quaternion.Inverse(state.CorrectedOrientation)
* ApplySmoothing(vcam, state.CorrectedOrientation, state.ReferenceUp, extra);
state.OrientationCorrection = state.OrientationCorrection * q;
}
}
}
class VcamExtraState
{
public GaussianWindow1D_Vector3 mSmoothingFilter;
public GaussianWindow1D_Vector3 mSmoothingFilterLookAt;
public GaussianWindow1D_CameraRotation mSmoothingFilterRotation;
};
private Vector3 ApplySmoothing(CinemachineVirtualCameraBase vcam, Vector3 pos, VcamExtraState extra)
{
if (extra.mSmoothingFilter == null || extra.mSmoothingFilter.Sigma != m_PositionSmoothing)
extra.mSmoothingFilter = new GaussianWindow1D_Vector3(m_PositionSmoothing);
return extra.mSmoothingFilter.Filter(pos);
}
private Vector3 ApplySmoothingLookAt(CinemachineVirtualCameraBase vcam, Vector3 pos, VcamExtraState extra)
{
if (extra.mSmoothingFilterLookAt == null || extra.mSmoothingFilterLookAt.Sigma != m_LookAtSmoothing)
extra.mSmoothingFilterLookAt = new GaussianWindow1D_Vector3(m_LookAtSmoothing);
return extra.mSmoothingFilterLookAt.Filter(pos);
}
private Quaternion ApplySmoothing(CinemachineVirtualCameraBase vcam, Quaternion rot, Vector3 up, VcamExtraState extra)
{
if (extra.mSmoothingFilterRotation == null || extra.mSmoothingFilterRotation.Sigma != m_RotationSmoothing)
extra.mSmoothingFilterRotation = new GaussianWindow1D_CameraRotation(m_RotationSmoothing);
Vector3 camRot = Quaternion.identity.GetCameraRotationToTarget(rot * Vector3.forward, up);
return Quaternion.identity.ApplyCameraRotation(extra.mSmoothingFilterRotation.Filter(camRot), up);
}
}
}
#endif