Files
dungeons/Assets/UltimateXR/Runtime/Scripts/Animation/Interpolation/UxrVarInterpolator.cs
2024-08-06 21:58:35 +02:00

102 lines
3.3 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="UxrVarInterpolator.cs" company="VRMADA">
// Copyright (c) VRMADA, All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
using UnityEngine;
namespace UltimateXR.Animation.Interpolation
{
/// <summary>
/// Base for interpolator classes that interpolate with optional smooth damping.
/// Child classes provide interpolation for different variable types.
/// </summary>
public abstract class UxrVarInterpolator
{
#region Public Types & Data
/// <summary>
/// Gets whether to always return the first variable when interpolating.
/// </summary>
public bool UseStep { get; set; }
/// <summary>
/// Gets or sets the smoothing value [0.0, 1.0]. 0 means no smoothing.
/// </summary>
public float SmoothDamp
{
get => _smoothDamp;
set => _smoothDamp = Mathf.Clamp01(value);
}
#endregion
#region Constructors & Finalizer
/// <summary>
/// Constructor.
/// </summary>
/// <param name="smoothDamp">Smooth damp value [0.0, 1.0]</param>
/// <param name="useStep">Whether to use step interpolation, where the interpolation will always return the start value</param>
protected UxrVarInterpolator(float smoothDamp = 0.0f, bool useStep = false)
{
SmoothDamp = smoothDamp;
UseStep = useStep;
}
#endregion
#region Public Methods
/// <summary>
/// Interpolates between 2 values.
/// </summary>
/// <param name="a">Start value</param>
/// <param name="b">End value</param>
/// <param name="t">Interpolation factor [0.0, 1.0]</param>
/// <returns>Interpolated value</returns>
/// <remarks>
/// The interpolated value will be affected by smoothing if the object was initialized with a smoothDamp value
/// greater than 0.
/// </remarks>
public abstract object Interpolate(object a, object b, float t);
/// <summary>
/// Resets the "memory" of the smooth damp effect, so that the interpolation will restart from the next time
/// <see cref="Interpolate" /> is called.
/// </summary>
public void RestartSmoothDamp()
{
RequiresSmoothDampRestart = true;
}
#endregion
#region Protected Methods
/// <summary>
/// Clears the smooth damp restart variable.
/// </summary>
protected void ClearSmoothDampRestart()
{
RequiresSmoothDampRestart = false;
}
#endregion
#region Protected Types & Data
/// <summary>
/// Gets whether the smooth damp needs to be restarted the next time <see cref="Interpolate" /> is called.
/// </summary>
protected bool RequiresSmoothDampRestart { get; private set; }
#endregion
#region Private Types & Data
private float _smoothDamp;
#endregion
}
}