Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Motion

    ''' <summary>
    ''' Deterministic easing evaluator for MASMotionSystem. It has no renderer, timer, or host dependency.
    ''' </summary>
    Friend NotInheritable Class MASMotionEasingEvaluator

        Private Sub New()
        End Sub

        Friend Shared Function Evaluate(easing As MASMotionEasing, progress As Single) As Single
            Dim t As Single = Clamp01(progress)

            Select Case easing
                Case MASMotionEasing.Linear
                    Return t

                Case MASMotionEasing.Decelerate
                    Return 1.0F - CSng(Math.Pow(1.0F - t, 3.0R))

                Case MASMotionEasing.Accelerate
                    Return t * t * t

                Case MASMotionEasing.Emphasized
                    If t < 0.5F Then
                        Return 4.0F * t * t * t
                    End If
                    Dim p As Single = -2.0F * t + 2.0F
                    Return 1.0F - (p * p * p) / 2.0F

                Case Else
                    Return t * t * (3.0F - 2.0F * t)
            End Select
        End Function

        Friend Shared Function Clamp01(value As Single) As Single
            If Single.IsNaN(value) OrElse Single.IsInfinity(value) Then Return 0.0F
            If value < 0.0F Then Return 0.0F
            If value > 1.0F Then Return 1.0F
            Return value
        End Function

    End Class

End Namespace
