|
|
|
@ -123,121 +123,130 @@ namespace Avalonia.Animation |
|
|
|
|
|
|
|
double _tempDuration = 0d, _easedTime; |
|
|
|
|
|
|
|
checkstate: |
|
|
|
switch (_currentState) |
|
|
|
bool handled = false; |
|
|
|
|
|
|
|
while (!handled) |
|
|
|
{ |
|
|
|
case KeyFramesStates.DoDelay: |
|
|
|
switch (_currentState) |
|
|
|
{ |
|
|
|
case KeyFramesStates.DoDelay: |
|
|
|
|
|
|
|
if (_fillMode == FillMode.Backward |
|
|
|
|| _fillMode == FillMode.Both) |
|
|
|
{ |
|
|
|
if (_currentIteration == 0) |
|
|
|
if (_fillMode == FillMode.Backward |
|
|
|
|| _fillMode == FillMode.Both) |
|
|
|
{ |
|
|
|
_targetObserver.OnNext(_firstKFValue); |
|
|
|
if (_currentIteration == 0) |
|
|
|
{ |
|
|
|
_targetObserver.OnNext(_firstKFValue); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_targetObserver.OnNext(_lastInterpValue); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (_delayFrameCount > _delayTotalFrameCount) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.DoRun; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_targetObserver.OnNext(_lastInterpValue); |
|
|
|
handled = true; |
|
|
|
_delayFrameCount++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (_delayFrameCount > _delayTotalFrameCount) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.DoRun; |
|
|
|
goto checkstate; |
|
|
|
} |
|
|
|
_delayFrameCount++; |
|
|
|
break; |
|
|
|
|
|
|
|
case KeyFramesStates.DoRun: |
|
|
|
|
|
|
|
if (_isReversed) |
|
|
|
_currentState = KeyFramesStates.RunBackwards; |
|
|
|
else |
|
|
|
_currentState = KeyFramesStates.RunForwards; |
|
|
|
|
|
|
|
goto checkstate; |
|
|
|
|
|
|
|
case KeyFramesStates.RunForwards: |
|
|
|
|
|
|
|
if (_durationFrameCount > _durationTotalFrameCount) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.RunComplete; |
|
|
|
goto checkstate; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
_tempDuration = (double)_durationFrameCount / _durationTotalFrameCount; |
|
|
|
_currentState = KeyFramesStates.RunApplyValue; |
|
|
|
case KeyFramesStates.DoRun: |
|
|
|
|
|
|
|
goto checkstate; |
|
|
|
if (_isReversed) |
|
|
|
_currentState = KeyFramesStates.RunBackwards; |
|
|
|
else |
|
|
|
_currentState = KeyFramesStates.RunForwards; |
|
|
|
|
|
|
|
case KeyFramesStates.RunBackwards: |
|
|
|
break; |
|
|
|
|
|
|
|
if (_durationFrameCount > _durationTotalFrameCount) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.RunComplete; |
|
|
|
goto checkstate; |
|
|
|
} |
|
|
|
case KeyFramesStates.RunForwards: |
|
|
|
|
|
|
|
_tempDuration = (double)(_durationTotalFrameCount - _durationFrameCount) / _durationTotalFrameCount; |
|
|
|
_currentState = KeyFramesStates.RunApplyValue; |
|
|
|
if (_durationFrameCount > _durationTotalFrameCount) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.RunComplete; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_tempDuration = (double)_durationFrameCount / _durationTotalFrameCount; |
|
|
|
_currentState = KeyFramesStates.RunApplyValue; |
|
|
|
|
|
|
|
goto checkstate; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case KeyFramesStates.RunApplyValue: |
|
|
|
case KeyFramesStates.RunBackwards: |
|
|
|
|
|
|
|
_easedTime = _targetAnimation.Easing.Ease(_tempDuration); |
|
|
|
if (_durationFrameCount > _durationTotalFrameCount) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.RunComplete; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_tempDuration = (double)(_durationTotalFrameCount - _durationFrameCount) / _durationTotalFrameCount; |
|
|
|
_currentState = KeyFramesStates.RunApplyValue; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
_durationFrameCount++; |
|
|
|
_lastInterpValue = Interpolator(_easedTime, _neutralValue); |
|
|
|
_targetObserver.OnNext(_lastInterpValue); |
|
|
|
_currentState = KeyFramesStates.DoRun; |
|
|
|
case KeyFramesStates.RunApplyValue: |
|
|
|
|
|
|
|
break; |
|
|
|
_easedTime = _targetAnimation.Easing.Ease(_tempDuration); |
|
|
|
|
|
|
|
case KeyFramesStates.RunComplete: |
|
|
|
_durationFrameCount++; |
|
|
|
_lastInterpValue = Interpolator(_easedTime, _neutralValue); |
|
|
|
_targetObserver.OnNext(_lastInterpValue); |
|
|
|
_currentState = KeyFramesStates.DoRun; |
|
|
|
handled = true; |
|
|
|
break; |
|
|
|
|
|
|
|
if (_checkLoopAndRepeat) |
|
|
|
{ |
|
|
|
_delayFrameCount = 0; |
|
|
|
_durationFrameCount = 0; |
|
|
|
case KeyFramesStates.RunComplete: |
|
|
|
|
|
|
|
if (_isLooping) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.DoRun; |
|
|
|
} |
|
|
|
else if (_isRepeating) |
|
|
|
if (_checkLoopAndRepeat) |
|
|
|
{ |
|
|
|
if (_currentIteration >= _repeatCount) |
|
|
|
_delayFrameCount = 0; |
|
|
|
_durationFrameCount = 0; |
|
|
|
|
|
|
|
if (_isLooping) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.Stop; |
|
|
|
_currentState = KeyFramesStates.DoRun; |
|
|
|
} |
|
|
|
else |
|
|
|
else if (_isRepeating) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.DoRun; |
|
|
|
if (_currentIteration >= _repeatCount) |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.Stop; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_currentState = KeyFramesStates.DoRun; |
|
|
|
} |
|
|
|
_currentIteration++; |
|
|
|
} |
|
|
|
_currentIteration++; |
|
|
|
} |
|
|
|
|
|
|
|
if (_animationDirection == PlaybackDirection.Alternate |
|
|
|
|| _animationDirection == PlaybackDirection.AlternateReverse) |
|
|
|
_isReversed = !_isReversed; |
|
|
|
if (_animationDirection == PlaybackDirection.Alternate |
|
|
|
|| _animationDirection == PlaybackDirection.AlternateReverse) |
|
|
|
_isReversed = !_isReversed; |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
_currentState = KeyFramesStates.Stop; |
|
|
|
goto checkstate; |
|
|
|
_currentState = KeyFramesStates.Stop; |
|
|
|
break; |
|
|
|
|
|
|
|
case KeyFramesStates.Stop: |
|
|
|
case KeyFramesStates.Stop: |
|
|
|
|
|
|
|
if (_fillMode == FillMode.Forward |
|
|
|
|| _fillMode == FillMode.Both) |
|
|
|
{ |
|
|
|
_targetControl.SetValue(_parent.Property, _lastInterpValue, BindingPriority.LocalValue); |
|
|
|
} |
|
|
|
_targetObserver.OnCompleted(); |
|
|
|
break; |
|
|
|
if (_fillMode == FillMode.Forward |
|
|
|
|| _fillMode == FillMode.Both) |
|
|
|
{ |
|
|
|
_targetControl.SetValue(_parent.Property, _lastInterpValue, BindingPriority.LocalValue); |
|
|
|
} |
|
|
|
_targetObserver.OnCompleted(); |
|
|
|
handled = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -253,4 +262,4 @@ namespace Avalonia.Animation |
|
|
|
_currentState = KeyFramesStates.Disposed; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|