public override float GetFrameValue(float frame, float startFrame = 0) { if (InterpolationType == STInterpoaltionType.Constant) { return(Constant); } if (KeyFrames.Count == 0) { return(0); } if (KeyFrames.Count == 1) { return(KeyFrames[0].Value); } STKeyFrame LK = KeyFrames.First(); STKeyFrame RK = KeyFrames.Last(); float Frame = frame - startFrame; foreach (STKeyFrame keyFrame in KeyFrames) { if (keyFrame.Frame <= Frame) { LK = keyFrame; } if (keyFrame.Frame >= Frame && keyFrame.Frame < RK.Frame) { RK = keyFrame; } } if (LK.Frame != RK.Frame) { float FrameDiff = Frame - LK.Frame; float Weight = FrameDiff / (RK.Frame - LK.Frame); switch (InterpolationType) { case STInterpoaltionType.Constant: return(LK.Value); case STInterpoaltionType.Step: return(LK.Value); case STInterpoaltionType.Linear: return(InterpolationHelper.Lerp(LK.Value, RK.Value, Weight)); case STInterpoaltionType.Bezier: { return(InterpolationHelper.Lerp(LK.Value, RK.Value, Weight)); STBezierKeyFrame bezierKeyLK = (STBezierKeyFrame)LK; STBezierKeyFrame bezierKeyRK = (STBezierKeyFrame)RK; float length = RK.Frame - LK.Frame; return(InterpolationHelper.BezierInterpolate(frame, bezierKeyLK.Frame, bezierKeyRK.Frame, bezierKeyLK.SlopeIn, bezierKeyRK.SlopeOut, bezierKeyLK.Value, bezierKeyRK.Value)); } case STInterpoaltionType.Hermite: { STHermiteKeyFrame hermiteKeyLK = (STHermiteKeyFrame)LK; STHermiteKeyFrame hermiteKeyRK = (STHermiteKeyFrame)RK; float length = RK.Frame - LK.Frame; return(InterpolationHelper.HermiteInterpolate(frame, hermiteKeyLK.Frame, hermiteKeyRK.Frame, hermiteKeyLK.TangentIn, hermiteKeyLK.TangentOut, hermiteKeyLK.Value, hermiteKeyRK.Value)); } } } return(LK.Value); }