public static byte[] GetBytes(AnimationFile input)
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (BinaryWriter writer = new BinaryWriter(memoryStream))
                {
                    // Header
                    writer.Write(input.Header.AnimationType);                       // Animtype
                    writer.Write((uint)1);                                          // Uknown_always 1
                    writer.Write(input.Header.FrameRate);                           // Framerate
                    writer.Write((short)input.Header.SkeletonName.Length);          // SkeletonNAme length
                    for (int i = 0; i < input.Header.SkeletonName.Length; i++)      // SkeletonNAme
                    {
                        writer.Write(input.Header.SkeletonName[i]);
                    }
                    writer.Write((uint)0);                                          // Uknown_always 0

                    if (input.Header.AnimationType == 7)
                    {
                        writer.Write(input.Header.AnimationTotalPlayTimeInSec);
                    }

                    //Body - Bones
                    writer.Write((uint)input.Bones.Length);
                    foreach (var bone in input.Bones)
                    {
                        writer.Write((short)bone.Name.Length);

                        for (int i = 0; i < bone.Name.Length; i++)
                        {
                            writer.Write(bone.Name[i]);
                        }
                        writer.Write(bone.ParentId);
                    }

                    // Body - remapping
                    for (int i = 0; i < input.TranslationMappings.Count; i++)
                    {
                        writer.Write(input.TranslationMappings[i].FileWriteValue);
                    }

                    for (int i = 0; i < input.TranslationMappings.Count; i++)
                    {
                        writer.Write(input.RotationMappings[i].FileWriteValue);
                    }

                    // Static frame
                    if (input.Header.AnimationType == 7)
                    {
                        if (input.StaticFrame != null)
                        {
                            writer.Write((uint)input.StaticFrame.Transforms.Count());   //staticPosCount
                            writer.Write((uint)input.StaticFrame.Quaternion.Count());   //staticRotCount
                            WriteFrame(writer, input.StaticFrame);
                        }
                        else
                        {
                            writer.Write((uint)0);   //staticPosCount
                            writer.Write((uint)0);   //staticRotCount
                        }
                    }

                    // Dyamic frame
                    if (input.DynamicFrames.Any())
                    {
                        writer.Write(input.DynamicFrames.First().Transforms.Count());   // animPosCount
                        writer.Write(input.DynamicFrames.First().Quaternion.Count());   // animRotCount
                        writer.Write(input.DynamicFrames.Count());                      // Frame count
                        for (int i = 0; i < input.DynamicFrames.Count(); i++)
                        {
                            WriteFrame(writer, input.DynamicFrames[i]);
                        }
                    }
                    else
                    {
                        writer.Write((int)0);   // animPosCount
                        writer.Write((int)0);   // animRotCount
                        writer.Write((int)3);   // Frame count, why 3 when empty?
                    }

                    return(memoryStream.ToArray());
                }
            }
        }
        public static AnimationFile Create(ByteChunk chunk)
        {
            if (chunk.BytesLeft == 0)
            {
                throw new Exception("Trying to load animation with no data, chunk size = 0");
            }
            var output = new AnimationFile();

            chunk.Reset();
            output.Header = GetAnimationHeader(chunk);

            var boneCount = chunk.ReadUInt32();

            output.Bones = new BoneInfo[boneCount];
            for (int i = 0; i < boneCount; i++)
            {
                var boneNameSize = chunk.ReadShort();
                output.Bones[i] = new BoneInfo()
                {
                    Name     = chunk.ReadFixedLength(boneNameSize),
                    ParentId = chunk.ReadInt32(),
                    Id       = i
                };
            }

            // Remapping tables, not sure how they really should be used, but this works.
            for (int i = 0; i < boneCount; i++)
            {
                int mappingValue = chunk.ReadInt32();
                output.TranslationMappings.Add(new AnimationBoneMapping(mappingValue));
            }

            for (int i = 0; i < boneCount; i++)
            {
                int mappingValue = chunk.ReadInt32();
                output.RotationMappings.Add(new AnimationBoneMapping(mappingValue));
            }

            // A single static frame - Can be inverse, a pose or empty. Not sure? Hand animations are stored here
            if (output.Header.AnimationType == 7)
            {
                var staticPosCount = chunk.ReadUInt32();
                var staticRotCount = chunk.ReadUInt32();
                if (staticPosCount != 0 || staticRotCount != 0)
                {
                    output.StaticFrame = ReadFrame(chunk, staticPosCount, staticRotCount);
                }
            }

            // Animation Data
            var animPosCount = chunk.ReadInt32();
            var animRotCount = chunk.ReadInt32();
            var frameCount   = chunk.ReadInt32();  // Always 3 when there is no data? Why?

            if (animPosCount != 0 || animRotCount != 0)
            {
                for (int i = 0; i < frameCount; i++)
                {
                    var frame = ReadFrame(chunk, (uint)animPosCount, (uint)animRotCount);
                    output.DynamicFrames.Add(frame);
                }
            }
            // ----------------------

            return(output);
        }