public void Read(Stream stream)
        {
            using (var io = IoBuffer.FromStream(stream))
            {
                var version = io.ReadUInt32();
                Name = io.ReadLongPascalString();
                Duration = io.ReadFloat();
                Distance = io.ReadFloat();
                IsMoving = io.ReadByte();

                var translationCount = io.ReadUInt32();
                Translations = new Vector3[translationCount];
                for (var i = 0; i < translationCount; i++)
                {
                    Translations[i] = new Vector3
                    {
                        X = io.ReadFloat(),
                        Y = io.ReadFloat(),
                        Z = io.ReadFloat()
                    };
                }

                var rotationCount = io.ReadUInt32();
                Rotations = new Vector4[rotationCount];
                for (var i = 0; i < rotationCount; i++)
                {
                    Rotations[i] = new Vector4
                    {
                        X = io.ReadFloat(),
                        Y = -io.ReadFloat(),
                        Z = -io.ReadFloat(),
                        W = io.ReadFloat()
                    };
                }

                var motionCount = io.ReadUInt32();
                Motions = new AnimationMotion[motionCount];
                for (var i = 0; i < motionCount; i++)
                {
                    var motion = new AnimationMotion();
                    var unknown = io.ReadUInt32();
                    motion.BoneName = io.ReadPascalString();
                    motion.FrameCount = io.ReadUInt32();
                    motion.Duration = io.ReadFloat();
                    motion.HasTranslation = (io.ReadByte() == 1);
                    motion.HasRotation = (io.ReadByte() == 1);
                    motion.FirstTranslationIndex = io.ReadUInt32();
                    motion.FirstRotationIndex = io.ReadUInt32();

                    var hasPropsList = io.ReadByte() == 1;
                    if (hasPropsList)
                    {
                        var propListCount = io.ReadUInt32();
                        var props = new PropertyList[propListCount];
                        for (var x = 0; x < propListCount; x++)
                        {
                            props[x] = ReadPropertyList(io);
                        }
                        motion.Properties = props;
                    }

                    var hasTimeProps = io.ReadByte() == 1;
                    if (hasTimeProps)
                    {
                        var timePropsListCount = io.ReadUInt32();
                        var timePropsList = new TimePropertyList[timePropsListCount];

                        for (var x = 0; x < timePropsListCount; x++)
                        {
                            var list = new TimePropertyList();
                            var timePropsCount = io.ReadUInt32();
                            list.Items = new TimePropertyListItem[timePropsCount];
                            for (var y = 0; y < timePropsCount; y++)
                            {
                                var id = io.ReadUInt32();
                                list.Items[y] = new TimePropertyListItem
                                {
                                    ID = id,
                                    Properties = ReadPropertyList(io)
                                };
                            }
                            timePropsList[x] = list;
                        }
                        motion.TimeProperties = timePropsList;
                    }

                    Motions[i] = motion;
                }
            }
        }
        public void Read(Stream stream)
        {
            using (var io = IoBuffer.FromStream(stream))
            {
                var version = io.ReadUInt32();
                Name     = io.ReadLongPascalString();
                Duration = io.ReadFloat();
                Distance = io.ReadFloat();
                IsMoving = io.ReadByte();

                var translationCount = io.ReadUInt32();
                Translations = new Vector3[translationCount];
                for (var i = 0; i < translationCount; i++)
                {
                    Translations[i] = new Vector3
                    {
                        X = io.ReadFloat(),
                        Y = io.ReadFloat(),
                        Z = io.ReadFloat()
                    };
                }

                var rotationCount = io.ReadUInt32();
                Rotations = new Vector4[rotationCount];
                for (var i = 0; i < rotationCount; i++)
                {
                    Rotations[i] = new Vector4
                    {
                        X = io.ReadFloat(),
                        Y = -io.ReadFloat(),
                        Z = -io.ReadFloat(),
                        W = io.ReadFloat()
                    };
                }

                var motionCount = io.ReadUInt32();
                Motions = new AnimationMotion[motionCount];
                for (var i = 0; i < motionCount; i++)
                {
                    var motion  = new AnimationMotion();
                    var unknown = io.ReadUInt32();
                    motion.BoneName              = io.ReadPascalString();
                    motion.FrameCount            = io.ReadUInt32();
                    motion.Duration              = io.ReadFloat();
                    motion.HasTranslation        = (io.ReadByte() == 1);
                    motion.HasRotation           = (io.ReadByte() == 1);
                    motion.FirstTranslationIndex = io.ReadUInt32();
                    motion.FirstRotationIndex    = io.ReadUInt32();

                    var hasPropsList = io.ReadByte() == 1;
                    if (hasPropsList)
                    {
                        var propListCount = io.ReadUInt32();
                        var props         = new PropertyList[propListCount];
                        for (var x = 0; x < propListCount; x++)
                        {
                            props[x] = ReadPropertyList(io);
                        }
                        motion.Properties = props;
                    }

                    var hasTimeProps = io.ReadByte() == 1;
                    if (hasTimeProps)
                    {
                        var timePropsListCount = io.ReadUInt32();
                        var timePropsList      = new TimePropertyList[timePropsListCount];

                        for (var x = 0; x < timePropsListCount; x++)
                        {
                            var list           = new TimePropertyList();
                            var timePropsCount = io.ReadUInt32();
                            list.Items = new TimePropertyListItem[timePropsCount];
                            for (var y = 0; y < timePropsCount; y++)
                            {
                                var id = io.ReadUInt32();
                                list.Items[y] = new TimePropertyListItem
                                {
                                    ID         = id,
                                    Properties = ReadPropertyList(io)
                                };
                            }
                            timePropsList[x] = list;
                        }
                        motion.TimeProperties = timePropsList;
                    }

                    Motions[i] = motion;
                }
            }
        }