internal SdkMeshAnimationFrame(SdkMeshRawAnimFrameData rawFrame) { this.FrameName = rawFrame.FrameName; foreach (SdkMeshRawAnimData rawData in rawFrame.AnimationKeys) { var key = new SdkMeshAnimationKey(rawData); this.AnimationKeys.Add(key); } }
internal static SdkMeshRawAnimFrameData Read(BinaryReader reader) { var frame = new SdkMeshRawAnimFrameData { FrameName = Encoding.UTF8.GetString(reader.ReadBytes(MaxFrameName).TakeWhile(t => t != 0).ToArray()) }; reader.ReadInt32(); frame.DataOffset = reader.ReadInt64(); return(frame); }
public static SdkMeshRawAnimFile FromStream(Stream stream) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } var file = new SdkMeshRawAnimFile(); using (var reader = new BinaryReader(stream, Encoding.UTF8, true)) { file.Header = SdkMeshRawAnimHeader.Read(reader); if (file.Header.Version != FileVersion) { throw new InvalidDataException(); } if (stream.Position != file.Header.AnimationDataOffset) { throw new InvalidDataException(); } stream.Seek(file.Header.AnimationDataOffset, SeekOrigin.Begin); for (int frameIndex = 0; frameIndex < file.Header.NumFrames; frameIndex++) { SdkMeshRawAnimFrameData frame = SdkMeshRawAnimFrameData.Read(reader); file.AnimationFrames.Add(frame); } foreach (SdkMeshRawAnimFrameData frame in file.AnimationFrames) { if (stream.Position != file.Header.AnimationDataOffset + frame.DataOffset) { throw new InvalidDataException(); } stream.Seek(file.Header.AnimationDataOffset + frame.DataOffset, SeekOrigin.Begin); for (int keyIndex = 0; keyIndex < file.Header.NumAnimationKeys; keyIndex++) { SdkMeshRawAnimData data = SdkMeshRawAnimData.Read(reader); frame.AnimationKeys.Add(data); } } if (stream.Position != file.Header.AnimationDataOffset + file.Header.AnimationDataSize) { throw new InvalidDataException(); } } return(file); }