protected override void Write(ContentWriter output, AnimationData animData)
        {
            BinaryDataWriter data = new BinaryDataWriter();

            ContentBinaryWriter bw;

            #region BindPoseTag
            List <Matrix> bindPose = animData.BindPose;

            if (bindPose != null)
            {
                data.AddEntry(BindPoseCountTag, bindPose.Count);

                bw = data.AddEntry(BindPoseTag);
                for (int i = 0; i < bindPose.Count; i++)
                {
                    bw.Write(bindPose[i]);
                }
                bw.Close();
            }
            #endregion

            #region InvBindPoseTag
            List <Matrix> invBindPose = animData.InverseBindPose;
            if (invBindPose != null)
            {
                data.AddEntry(InvBindPoseCountTag, invBindPose.Count);

                bw = data.AddEntry(InvBindPoseTag);
                for (int i = 0; i < invBindPose.Count; i++)
                {
                    bw.Write(invBindPose[i]);
                }
                bw.Close();
            }

            #endregion

            #region AnimationClipTag

            var aclip = animData.ModelAnimationClips;

            if (aclip != null)
            {
                data.AddEntry(ModelAnimationClipCountTag, aclip.Count);

                bw = data.AddEntry(ModelAnimationClipTag);
                foreach (var e in aclip)
                {
                    bw.WriteStringUnicode(e.Key);

                    ModelAnimationClip clip = e.Value;
                    bw.Write(clip.Duration.TotalSeconds);

                    bw.Write(clip.Keyframes.Count);

                    for (int i = 0; i < clip.Keyframes.Count; i++)
                    {
                        bw.Write(clip.Keyframes[i].Bone);
                        bw.Write(clip.Keyframes[i].Time.TotalSeconds);
                        bw.Write(clip.Keyframes[i].Transform);
                    }
                }
                bw.Close();
            }


            #endregion

            #region RootAnimationClipTag
            aclip = animData.RootAnimationClips;

            if (aclip != null)
            {
                data.AddEntry(RootAnimationClipCountTag, aclip.Count);

                bw = data.AddEntry(RootAnimationClipTag);
                foreach (var e in aclip)
                {
                    bw.WriteStringUnicode(e.Key);

                    ModelAnimationClip clip = e.Value;
                    bw.Write(clip.Duration.TotalSeconds);

                    bw.Write(clip.Keyframes.Count);

                    for (int i = 0; i < clip.Keyframes.Count; i++)
                    {
                        bw.Write(clip.Keyframes[i].Bone);
                        bw.Write(clip.Keyframes[i].Time.TotalSeconds);
                        bw.Write(clip.Keyframes[i].Transform);
                    }
                }
                bw.Close();
            }

            #endregion

            #region BoneHierarchyTag

            List <int> bh = animData.SkeletonHierarchy;
            if (bh != null)
            {
                data.AddEntry(BoneHierarchyCountTag, bh.Count);

                bw = data.AddEntry(BoneHierarchyTag);
                for (int i = 0; i < bh.Count; i++)
                {
                    bw.Write(bh[i]);
                }
                bw.Close();
            }

            #endregion


            output.Write(0); //Õ¼¸öλÖÃ
            output.Flush();

            long start = output.BaseStream.Position;

            data.Save(new VirtualStream(output.BaseStream, output.BaseStream.Position));

            long end  = output.BaseStream.Position;
            int  size = (int)(end - start);

            output.BaseStream.Position = start - 4;
            output.Write(size);
            output.BaseStream.Position = end;
        }