public void StartInterpolating()
 {
     if (CurrentState == InterpolatorState.Uninitialized)
     {
         CurrentState = InterpolatorState.WaitingFirstFrame;
     }
 }
 private void SetStateAndRemove(T newState)
 {
     if (newState != null)
     {
         CurrentState = InterpolatorState.Interpolating;
         PastState    = newState;
         _time        = PastState.TimeStamp();
         _frames.Remove(newState);
     }
 }
        private void PickPastState()
        {
            if (CurrentState == InterpolatorState.Uninitialized)
            {
                return;
            }

            var newPastState = _frames.FirstOrDefault().Key;

            if (CurrentState == InterpolatorState.WaitingFirstFrame)
            {
                if (_frames.Count >= FrameBufferSize)
                {
                    SetStateAndRemove(newPastState);
                }
                return;
            }

            if (_targetState == null &&
                (_time - PastState.TimeStamp() > MaxTimeUntilJump || _frames.Count < FrameBufferSize))
            {
                PastState    = default(T);
                CurrentState = InterpolatorState.WaitingFirstFrame;
                return;
            }

            if (_targetState == null)
            {
                return;
            }

            while (newPastState != null && newPastState.TimeStamp() <= _targetState.TimeStamp())
            {
                _frames.Remove(newPastState);
                newPastState = _frames.FirstOrDefault().Key;
            }
        }