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));
    }
Exemple #2
0
    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));
    }