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); }
public static SdkMeshFile FromFile(D3D11Device device, D3D11DeviceContext deviceContext, string fileName) { if (device == null) { throw new ArgumentNullException(nameof(device)); } if (deviceContext == null) { throw new ArgumentNullException(nameof(deviceContext)); } if (string.IsNullOrEmpty(fileName)) { throw new ArgumentNullException(nameof(fileName)); } var file = new SdkMeshFile { _d3dDevice = device, _d3dDeviceContext = deviceContext, FilePath = fileName, FileDirectory = Path.GetDirectoryName(fileName) }; SdkMeshRawFile rawFile = SdkMeshRawFile.FromFile(file.FilePath); foreach (SdkMeshRawMaterial rawMaterial in rawFile.Materials) { var material = new SdkMeshMaterial(file._d3dDevice, file._d3dDeviceContext, file.FileDirectory, rawMaterial); file.Materials.Add(material); } foreach (SdkMeshRawMesh rawMesh in rawFile.Meshes) { var mesh = new SdkMeshMesh(file._d3dDevice, rawFile, rawMesh); file.Meshes.Add(mesh); } foreach (SdkMeshRawFrame rawFrame in rawFile.Frames) { var frame = new SdkMeshFrame(rawFrame); file.Frames.Add(frame); } string animFilePath = file.FilePath + "_anim"; if (File.Exists(animFilePath)) { SdkMeshRawAnimFile rawAnimFile = SdkMeshRawAnimFile.FromFile(animFilePath); file.AnimationFrameTransformType = rawAnimFile.Header.FrameTransformType; file.AnimationKeysCount = rawAnimFile.Header.NumAnimationKeys; file.AnimationFPS = rawAnimFile.Header.AnimationFPS; foreach (SdkMeshRawAnimFrameData rawFrame in rawAnimFile.AnimationFrames) { var frame = new SdkMeshAnimationFrame(rawFrame); file.AnimationFrames.Add(frame); } for (int index = 0; index < file.AnimationFrames.Count; index++) { SdkMeshFrame frame = file.FindFrame(file.AnimationFrames[index].FrameName); if (frame != null) { frame.UpdateAnimationFrameIndex(index); } } } return(file); }