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); }