protected override Geometry GetCurrentValueCore(Geometry defaultOriginValue, Geometry defaultDestinationValue, AnimationClock animationClock) { if (_numbersAccumulator == null) { if (_numbersFrom == null) { var geometryStr = defaultOriginValue.ToString(CultureInfo.InvariantCulture); AnimationHelper.DecomposeGeometryStr(geometryStr, out _numbersFrom); } if (_numbersTo == null) { var geometryStr = defaultDestinationValue.ToString(CultureInfo.InvariantCulture); AnimationHelper.DecomposeGeometryStr(geometryStr, out _numbersTo); _strings = Regex.Split(geometryStr, RegexPatterns.DigitsPattern); } UpdateValue(); } if (_numbersAccumulator == null) { return(defaultOriginValue); } var progress = animationClock.CurrentProgress.Value; var easingFunction = EasingFunction; if (easingFunction != null) { progress = easingFunction.Ease(progress); } var accumulated = new double[_numbersAccumulator.Length]; if (IsCumulative) { var currentRepeat = (double)(animationClock.CurrentIteration - 1); if (currentRepeat > 0.0) { accumulated = new double[_numbersAccumulator.Length]; for (var i = 0; i < _numbersAccumulator.Length; i++) { accumulated[i] = _numbersAccumulator[i] * currentRepeat; } } } var numbers = new double[_numbersAccumulator.Length]; for (var i = 0; i < _numbersAccumulator.Length; i++) { numbers[i] = accumulated[i] + _numbersFrom[i] + _numbersAccumulator[i] * progress; } return(AnimationHelper.ComposeGeometry(_strings, numbers)); }
protected override Geometry GetCurrentValueCore(Geometry defaultOriginValue, Geometry defaultDestinationValue, AnimationClock animationClock) { if (_keyFrames == null) { return(defaultDestinationValue); } if (!_areKeyTimesValid) { ResolveKeyTimes(); } if (_sortedResolvedKeyFrames == null) { return(defaultDestinationValue); } var currentTime = animationClock.CurrentTime.Value; var keyFrameCount = _sortedResolvedKeyFrames.Length; var maxKeyFrameIndex = keyFrameCount - 1; double[] currentIterationValue; var currentResolvedKeyFrameIndex = 0; while (currentResolvedKeyFrameIndex < keyFrameCount && currentTime > _sortedResolvedKeyFrames[currentResolvedKeyFrameIndex]._resolvedKeyTime) { currentResolvedKeyFrameIndex++; } while (currentResolvedKeyFrameIndex < maxKeyFrameIndex && currentTime == _sortedResolvedKeyFrames[currentResolvedKeyFrameIndex + 1]._resolvedKeyTime) { currentResolvedKeyFrameIndex++; } if (currentResolvedKeyFrameIndex == keyFrameCount) { currentIterationValue = GetResolvedKeyFrameValue(maxKeyFrameIndex); } else if (currentTime == _sortedResolvedKeyFrames[currentResolvedKeyFrameIndex]._resolvedKeyTime) { currentIterationValue = GetResolvedKeyFrameValue(currentResolvedKeyFrameIndex); } else { double currentSegmentProgress; double[] fromValue; if (currentResolvedKeyFrameIndex == 0) { AnimationHelper.DecomposeGeometryStr(defaultOriginValue.ToString(CultureInfo.InvariantCulture), out fromValue); currentSegmentProgress = currentTime.TotalMilliseconds / _sortedResolvedKeyFrames[0]._resolvedKeyTime.TotalMilliseconds; } else { var previousResolvedKeyFrameIndex = currentResolvedKeyFrameIndex - 1; var previousResolvedKeyTime = _sortedResolvedKeyFrames[previousResolvedKeyFrameIndex]._resolvedKeyTime; fromValue = GetResolvedKeyFrameValue(previousResolvedKeyFrameIndex); var segmentCurrentTime = currentTime - previousResolvedKeyTime; var segmentDuration = _sortedResolvedKeyFrames[currentResolvedKeyFrameIndex]._resolvedKeyTime - previousResolvedKeyTime; currentSegmentProgress = segmentCurrentTime.TotalMilliseconds / segmentDuration.TotalMilliseconds; } currentIterationValue = GetResolvedKeyFrame(currentResolvedKeyFrameIndex).InterpolateValue(fromValue, currentSegmentProgress); } return(AnimationHelper.ComposeGeometry(Strings, currentIterationValue)); }