public Quaternion Evaluate(float curveT)
        {
            if (_keyCount == 0)
            {
                return(Quaternion.identity);
            }

            if (_keyCount == 1)
            {
                return(_curveData.keys[0].value);
            }

            curveT = WrapTime(curveT);
            int lhsIndex = 0, rhsIndex = 0;

            FindIndexForSampling(curveT, ref lhsIndex, ref rhsIndex);
            RotationKeyFrame lhsKey = _curveData.keys[lhsIndex];
            RotationKeyFrame rhsKey = _curveData.keys[rhsIndex];

            float      dx = rhsKey.time - lhsKey.time;
            Quaternion m1, m2;
            float      t;

            if (dx != 0f)
            {
                t  = (curveT - lhsKey.time) / dx;
                m1 = lhsKey.outSlope.MultyScalar(dx);
                m2 = rhsKey.inSlope.MultyScalar(dx);
            }
            else
            {
                t  = 0f;
                m1 = Quaternion.identity;
                m2 = Quaternion.identity;
            }

            Quaternion ret = CurveUtils.HermiteInterpolate(t, lhsKey.value, m1, m2, rhsKey.value);

            CurveUtils.HandleSteppedCurve(ref lhsKey, ref rhsKey, ref ret);

            return(ret);
        }
        public Vector3 Evaluate(float curveT)
        {
            if (_keyCount == 0)
            {
                return(Vector3.zero);
            }

            if (_keyCount == 1)
            {
                return(_curveData.keys[0].value);
            }

            curveT = WrapTime(curveT);
            int lhsIndex = 0, rhsIndex = 0;

            FindIndexForSampling(curveT, ref lhsIndex, ref rhsIndex);
            Vector3KeyFrame lhsKey = _curveData.keys[lhsIndex];
            Vector3KeyFrame rhsKey = _curveData.keys[rhsIndex];

            float   dx = rhsKey.time - lhsKey.time;
            Vector3 m1, m2;
            float   t;

            if (dx != 0f)
            {
                t  = (curveT - lhsKey.time) / dx;
                m1 = lhsKey.outSlope * dx;
                m2 = rhsKey.inSlope * dx;
            }
            else
            {
                t  = 0f;
                m1 = Vector3.zero;
                m2 = Vector3.zero;
            }

            Vector3 ret = CurveUtils.HermiteInterpolate(t, lhsKey.value, m1, m2, rhsKey.value);

            CurveUtils.HandleSteppedCurve(ref lhsKey, ref rhsKey, ref ret);

            return(ret);
        }