253 lines
10 KiB
C#
253 lines
10 KiB
C#
using Unity.Mathematics;
|
|
|
|
namespace UnityEngine.Splines.Interpolators
|
|
{
|
|
/// <summary>
|
|
/// Linearly interpolate between two values a and b by ratio t.
|
|
/// </summary>
|
|
public struct LerpFloat : IInterpolator<float>
|
|
{
|
|
/// <summary>
|
|
/// Linearly interpolates between a and b by t.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public float Interpolate(float a, float b, float t)
|
|
{
|
|
return math.lerp(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Linearly interpolate between two values a and b by ratio t.
|
|
/// </summary>
|
|
public struct LerpFloat2 : IInterpolator<float2>
|
|
{
|
|
/// <summary>
|
|
/// Linearly interpolates between a and b by t.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public float2 Interpolate(float2 a, float2 b, float t)
|
|
{
|
|
return math.lerp(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Linearly interpolate between two values a and b by ratio t.
|
|
/// </summary>
|
|
public struct LerpFloat3 : IInterpolator<float3>
|
|
{
|
|
/// <summary>
|
|
/// Linearly interpolates between a and b by t.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public float3 Interpolate(float3 a, float3 b, float t)
|
|
{
|
|
return math.lerp(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Linearly interpolate between two values a and b by ratio t.
|
|
/// </summary>
|
|
public struct LerpFloat4 : IInterpolator<float4>
|
|
{
|
|
/// <summary>
|
|
/// Linearly interpolates between a and b by t.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public float4 Interpolate(float4 a, float4 b, float t)
|
|
{
|
|
return math.lerp(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Spherically interpolate between two values a and b by ratio t.
|
|
/// </summary>
|
|
public struct SlerpFloat2 : IInterpolator<float2>
|
|
{
|
|
/// <summary>
|
|
/// Spherically interpolates between a and b by t.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The spherically interpolated result between the two values.</returns>
|
|
public float2 Interpolate(float2 a, float2 b, float t)
|
|
{
|
|
// Using Vector3 API as Mathematics does not provide Slerp for float2.
|
|
var result = Vector3.Slerp(new Vector3(a.x, a.y, 0f), new Vector3(b.x, b.y, 0f), t);
|
|
return new float2(result.x, result.y);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Spherically interpolate between two values a and b by ratio t.
|
|
/// </summary>
|
|
public struct SlerpFloat3 : IInterpolator<float3>
|
|
{
|
|
/// <summary>
|
|
/// Spherically interpolates between a and b by t.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The spherically interpolated result between the two values.</returns>
|
|
public float3 Interpolate(float3 a, float3 b, float t)
|
|
{
|
|
// Using Vector3 API as Mathematics does not provide Slerp for float3.
|
|
return Vector3.Slerp(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Linearly interpolate between two values a and b by ratio t.
|
|
/// </summary>
|
|
public struct LerpQuaternion : IInterpolator<quaternion>
|
|
{
|
|
/// <summary>
|
|
/// Linearly interpolates between a and b by t.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public quaternion Interpolate(quaternion a, quaternion b, float t)
|
|
{
|
|
return math.nlerp(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Linearly interpolate between two values a and b by ratio t.
|
|
/// </summary>
|
|
public struct LerpColor : IInterpolator<Color>
|
|
{
|
|
/// <summary>
|
|
/// Linearly interpolates between a and b by t.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public Color Interpolate(Color a, Color b, float t)
|
|
{
|
|
return Color.Lerp(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Interpolate between two values a and b by ratio t with smoothing at the start and end.
|
|
/// </summary>
|
|
public struct SmoothStepFloat : IInterpolator<float>
|
|
{
|
|
/// <summary>
|
|
/// Interpolates between a and b by ratio t with smoothing at the limits.
|
|
/// This function interpolates between min and max in a similar way to Lerp. However, the interpolation will
|
|
/// gradually speed up from the start and slow down toward the end. This is useful for creating natural-looking
|
|
/// animation, fading and other transitions.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public float Interpolate(float a, float b, float t)
|
|
{
|
|
return math.smoothstep(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Interpolate between two values a and b by ratio t with smoothing at the start and end.
|
|
/// </summary>
|
|
public struct SmoothStepFloat2 : IInterpolator<float2>
|
|
{
|
|
/// <summary>
|
|
/// Interpolates between a and b by ratio t with smoothing at the limits.
|
|
/// This function interpolates between min and max in a similar way to Lerp. However, the interpolation will
|
|
/// gradually speed up from the start and slow down toward the end. This is useful for creating natural-looking
|
|
/// animation, fading and other transitions.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public float2 Interpolate(float2 a, float2 b, float t)
|
|
{
|
|
return math.smoothstep(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Interpolate between two values a and b by ratio t with smoothing at the start and end.
|
|
/// </summary>
|
|
public struct SmoothStepFloat3 : IInterpolator<float3>
|
|
{
|
|
/// <summary>
|
|
/// Interpolates between a and b by ratio t with smoothing at the limits.
|
|
/// This function interpolates between min and max in a similar way to Lerp. However, the interpolation will
|
|
/// gradually speed up from the start and slow down toward the end. This is useful for creating natural-looking
|
|
/// animation, fading and other transitions.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public float3 Interpolate(float3 a, float3 b, float t)
|
|
{
|
|
return math.smoothstep(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Interpolate between two values a and b by ratio t with smoothing at the start and end.
|
|
/// </summary>
|
|
public struct SmoothStepFloat4 : IInterpolator<float4>
|
|
{
|
|
/// <summary>
|
|
/// Interpolates between a and b by ratio t with smoothing at the limits.
|
|
/// This function interpolates between min and max in a similar way to Lerp. However, the interpolation will
|
|
/// gradually speed up from the start and slow down toward the end. This is useful for creating natural-looking
|
|
/// animation, fading and other transitions.
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns> The interpolated result between the two values.</returns>
|
|
public float4 Interpolate(float4 a, float4 b, float t)
|
|
{
|
|
return math.smoothstep(a, b, t);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Spherically interpolates between quaternions a and b by ratio t. The parameter t is clamped b the range [0, 1].
|
|
/// </summary>
|
|
public struct SlerpQuaternion : IInterpolator<quaternion>
|
|
{
|
|
/// <summary>
|
|
/// Spherically interpolates between quaternions a and b by ratio t. The parameter t is clamped b the range [0, 1].
|
|
/// </summary>
|
|
/// <param name="a">Start value, returned when t = 0.</param>
|
|
/// <param name="b">End value, returned when t = 1.</param>
|
|
/// <param name="t">Interpolation ratio.</param>
|
|
/// <returns>A quaternion spherically interpolated between quaternions a and b.</returns>
|
|
public quaternion Interpolate(quaternion a, quaternion b, float t)
|
|
{
|
|
return math.slerp(a, b, t);
|
|
}
|
|
}
|
|
}
|