public void Update()
 {
     if (m_animate)
     {
         float now = Time.time;
         m_timeElapsed = now - m_startTime;
         m_t           = m_timeElapsed / m_duration;
         if (null != m_RescaleTime)
         {
             m_t = m_RescaleTime(m_t);
         }
         current.rotation = Quaternion.Lerp(m_start.rotation, m_end.rotation, m_t);
         current.radius   = Mathf.Lerp(m_start.radius, m_end.radius, m_t);
         current.position = Vector3.Lerp(m_start.position, m_end.position, m_t);
         if (now >= (m_startTime + m_duration))
         {
             m_animate     = false;
             m_RescaleTime = null; // always reset time scale function after each animation
             if (null != m_OnComplete)
             {
                 m_OnComplete();
             }
         }
     }
 }
 public void StartAnimation(Xform startState, Xform endState, float duration, OnCompleteCallback OnComplete = null, TimeScaleFunction RescaleTime = null)
 {
     m_start       = startState;
     m_end         = endState;
     current       = startState;
     m_duration    = duration;
     m_startTime   = Time.time;
     m_timeElapsed = 0;
     m_t           = 0;
     m_animate     = true;
     m_OnComplete  = OnComplete;
     m_RescaleTime = RescaleTime;
 }
 public void StartRotation(float toDegZ, float duration, OnCompleteCallback OnComplete = null, TimeScaleFunction RescaleTime = null)
 {
     m_start        = current;
     m_end          = current;
     m_duration     = duration;
     m_startTime    = Time.time;
     m_timeElapsed  = 0;
     m_t            = 0;
     m_animate      = true;
     m_OnComplete   = OnComplete;
     m_RescaleTime  = RescaleTime;
     m_end.rotation = Quaternion.Euler(0, 0, toDegZ);
 }