public List <FOBJKey> GetKeys(float FrameCount = -1) { List <FOBJKey> Keys = new List <FOBJKey>(); int clock = 0; Reader.Seek(0); while (Reader.Position() < FOBJ.Data.Length) { int type = Reader.ExtendedByte(); InterpolationType interpolation = (InterpolationType)((type) & 0x0F); int numOfKey = ((type >> 4)) + 1; if (interpolation == 0) { break; } for (int i = 0; i < numOfKey; i++) { double value = 0; double tan = 0; int time = 0; switch (interpolation) { case InterpolationType.Step: value = ReadVal(Reader, FOBJ.ValueFormat, FOBJ.ValueScale); time = Reader.ExtendedByte(); break; case InterpolationType.Linear: value = ReadVal(Reader, FOBJ.ValueFormat, FOBJ.ValueScale); time = Reader.ExtendedByte(); break; case InterpolationType.HermiteValue: value = ReadVal(Reader, FOBJ.ValueFormat, FOBJ.ValueScale); time = Reader.ExtendedByte(); break; case InterpolationType.Hermite: value = ReadVal(Reader, FOBJ.ValueFormat, FOBJ.ValueScale); tan = ReadVal(Reader, FOBJ.TanFormat, FOBJ.TanScale); time = Reader.ExtendedByte(); break; case InterpolationType.HermiteCurve: tan = ReadVal(Reader, FOBJ.TanFormat, FOBJ.TanScale); break; case InterpolationType.Constant: value = ReadVal(Reader, FOBJ.ValueFormat, FOBJ.ValueScale); break; default: throw new Exception("Unknown Interpolation Type " + interpolation.ToString("X")); } //Console.WriteLine(clock + " " + value + " " + FOBJ.ValueFormat ); FOBJKey kf = new FOBJKey(); kf.InterpolationType = interpolation; kf.Value = (float)value; kf.Frame = clock; kf.Tan = (float)tan; Keys.Add(kf); clock += time; } } return(Keys); }