public void DrawCurve(float minTime, float maxTime, Color color, Matrix4x4 transform, int component, Color wrapColor)
        {
            if (minTime < cachedRangeStart || maxTime > cachedRangeEnd)
            {
                CalculateCurves(minTime, maxTime);
                if (minTime <= rangeStart && maxTime >= rangeEnd)
                {
                    // if we are covering whole range
                    cachedRangeStart = Mathf.NegativeInfinity;
                    cachedRangeEnd   = Mathf.Infinity;
                }
                else
                {
                    cachedRangeStart = minTime;
                    cachedRangeEnd   = maxTime;
                }
            }

            List <Vector3> polyLine = new List <Vector3>();

            foreach (KeyValuePair <float, Vector3> kvp in points)
            {
                polyLine.Add(new Vector3(kvp.Key, kvp.Value[component]));
            }

            NormalCurveRenderer.DrawCurveWrapped(minTime, maxTime, rangeStart, rangeEnd, preWrapMode, postWrapMode, color, transform, polyLine.ToArray(), wrapColor);
        }
        private void CalculateCurves(float minTime, float maxTime)
        {
            points = new SortedDictionary <float, Vector3>();

            float[,] ranges = NormalCurveRenderer.CalculateRanges(minTime, maxTime, rangeStart, rangeEnd, preWrapMode, postWrapMode);
            for (int i = 0; i < ranges.GetLength(0); i++)
            {
                AddPoints(ranges[i, 0], ranges[i, 1]);
            }
        }