示例#1
0
        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);
        }