Ejemplo n.º 1
0
        private protected (_CurveNode <T> A, _CurveNode <T> B, float Amount) FindSample(float offset)
        {
            if (_Keys.Count == 0)
            {
                return(default(_CurveNode <T>), default(_CurveNode <T>), 0);
            }

            var(keyA, keyB, amount) = CurveSampler.FindRangeContainingOffset(_Keys.Keys, offset);

            return(_Keys[keyA], _Keys[keyB], amount);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Sets the outgoing tangent to an existing point.
        /// </summary>
        /// <param name="offset">The offset of the existing point.</param>
        /// <param name="tangent">The tangent value.</param>
        public void SetOutgoingTangent(float offset, T tangent)
        {
            Guard.IsTrue(_Keys.ContainsKey(offset), nameof(offset));

            tangent = CloneValue(tangent);

            var(keyA, keyB, _) = CurveSampler.FindRangeContainingOffset(_Keys.Keys, offset);

            if (keyA == keyB)
            {
                var a = _Keys[keyA];

                a.Degree          = 3;
                a.OutgoingTangent = tangent;

                _Keys[keyA] = a;
            }
            else
            {
                var a = _Keys[keyA];
                var b = _Keys[keyB];

                if (keyA != keyB)
                {
                    if (a.Degree == 1)
                    {
                        b.IncomingTangent = GetTangent(a.Point, b.Point);
                    }
                    _Keys[keyB] = b;
                }

                a.Degree = 3;

                a.OutgoingTangent = tangent;

                _Keys[keyA] = a;
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Sets the incoming tangent to an existing point.
        /// </summary>
        /// <param name="offset">The offset of the existing point.</param>
        /// <param name="tangent">The tangent value.</param>
        public void SetIncomingTangent(float offset, T tangent)
        {
            Guard.IsTrue(_Keys.ContainsKey(offset), nameof(offset));

            offset -= float.Epsilon;

            var(keyA, keyB, _) = CurveSampler.FindRangeContainingOffset(_Keys.Keys, offset);

            var a = _Keys[keyA];
            var b = _Keys[keyB];

            if (a.Degree == 1)
            {
                a.OutgoingTangent = GetTangent(a.Point, b.Point);
            }

            a.Degree = 3;

            b.IncomingTangent = tangent;

            _Keys[keyA] = a;
            _Keys[keyB] = b;
        }
Ejemplo n.º 4
0
        public override Vector3 GetPoint(Single offset)
        {
            var sample = FindSample(offset);

            switch (sample.A.Degree)
            {
            case 0:
                return(sample.A.Point);

            case 1:
                return(Vector3.Lerp(sample.A.Point, sample.B.Point, sample.Amount));

            case 3:
                return(CurveSampler.InterpolateCubic
                       (
                           sample.A.Point, sample.A.OutgoingTangent,
                           sample.B.Point, sample.B.IncomingTangent,
                           sample.Amount
                       ));

            default:
                throw new NotSupportedException();
            }
        }
Ejemplo n.º 5
0
 protected override Vector3 GetTangent(Vector3 fromValue, Vector3 toValue)
 {
     return(CurveSampler.CreateTangent(fromValue, toValue));
 }
Ejemplo n.º 6
0
 protected override Quaternion GetTangent(Quaternion fromValue, Quaternion toValue)
 {
     return(CurveSampler.CreateTangent(fromValue, toValue));
 }
Ejemplo n.º 7
0
 protected override SEGMENT GetTangent(SEGMENT fromValue, SEGMENT toValue)
 {
     return(new SEGMENT(CurveSampler.Subtract(toValue, fromValue)));
 }
Ejemplo n.º 8
0
 public SEGMENT InterpolateCubic(SEGMENT start, SEGMENT outgoingTangent, SEGMENT end, SEGMENT incomingTangent, Single amount)
 {
     return(new SEGMENT(CurveSampler.InterpolateCubic(start, outgoingTangent, end, incomingTangent, amount)));
 }
Ejemplo n.º 9
0
 public SEGMENT InterpolateLinear(SEGMENT left, SEGMENT right, float amount)
 {
     return(new SEGMENT(CurveSampler.InterpolateLinear(left, right, amount)));
 }
Ejemplo n.º 10
0
 public float[] InterpolateCubic(float[] start, float[] outgoingTangent, float[] end, float[] incomingTangent, float amount)
 {
     return(CurveSampler.InterpolateCubic(start, outgoingTangent, end, incomingTangent, amount));
 }
Ejemplo n.º 11
0
 public float[] InterpolateLinear(float[] left, float[] right, float amount)
 {
     return(CurveSampler.InterpolateLinear(left, right, amount));
 }
Ejemplo n.º 12
0
 public Quaternion InterpolateCubic(Quaternion start, Quaternion outgoingTangent, Quaternion end, Quaternion incomingTangent, Single amount)
 {
     return(CurveSampler.InterpolateCubic(start, outgoingTangent, end, incomingTangent, amount));
 }
Ejemplo n.º 13
0
 public Vector3 InterpolateCubic(Vector3 start, Vector3 outgoingTangent, Vector3 end, Vector3 incomingTangent, Single amount)
 {
     return(CurveSampler.InterpolateCubic(start, outgoingTangent, end, incomingTangent, amount));
 }