private void computeLifetime(SaitenPath path) { var firstFrameInPath = frames[path].FirstOrDefault(); var lastFrameInPath = frames[path].LastOrDefault(); if (firstFrameInPath == null || lastFrameInPath == null) { return; } var startTime = GetTime(firstFrameInPath); var endTime = GetTime(lastFrameInPath); float originAdjustment = 0.0f; switch (direction.Value) { case ScrollingDirection.Left: originAdjustment = path.OriginPosition.X; break; case ScrollingDirection.Right: originAdjustment = path.DrawWidth - path.OriginPosition.X; break; } path.LifetimeStart = scrollingInfo.Algorithm.GetDisplayStartTime(startTime, originAdjustment, timeRange.Value, scrollLength); path.LifetimeEnd = scrollingInfo.Algorithm.TimeAt(scrollLength * safe_lifetime_end_multiplier, endTime, timeRange.Value, scrollLength); }
protected void CreateNew(T point) { var path = new SaitenPath { PathRadius = PathRadius, }; frames.Add(path, new List <T> { point }); pathInitialStateCache.Add(path, new Cached()); AddInternal(path); }
private void updatePosition(SaitenPath path, double currentTime) { var firstFrameInPath = frames[path].FirstOrDefault(); if (firstFrameInPath == null) { return; } var startTime = GetTime(firstFrameInPath); var multiple = direction.Value == ScrollingDirection.Left ? 1 : -1; var x = scrollingInfo.Algorithm.PositionAt(startTime, currentTime, timeRange.Value, scrollLength); path.X = (x + Offset) * multiple; }
// Cant use AddOnce() since the delegate is re-constructed every invocation private void computePath(SaitenPath path) => path.Schedule(() => { var firstFrameInPath = frames[path].FirstOrDefault(); if (firstFrameInPath == null) { return; } var startTime = GetTime(firstFrameInPath); if (pathInitialStateCache[path].IsValid) { return; } pathInitialStateCache?[path].Validate(); // Calculate path var frameList = frames[path]; if (frameList.Count <= 1) { return; } path.ClearVertices(); bool left = direction.Value == ScrollingDirection.Left; path.Anchor = path.Origin = left ? Anchor.TopLeft : Anchor.TopRight; var centerPosition = calculator.CenterPosition(); var scaleDistance = calculator.Distance(); foreach (var frame in frameList) { var x = scrollingInfo.Algorithm.GetLength(startTime, GetTime(frame), timeRange.Value, scrollLength); path.AddVertex(new Vector2(left ? x : -x, GetPosition(frame) * scaleDistance - centerPosition)); } });
protected void MarkAsInvalid(SaitenPath path) => pathInitialStateCache[path].Invalidate();