Beispiel #1
0
        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);
        }
        internal static SdkMeshRawAnimHeader Read(BinaryReader reader)
        {
            var header = new SdkMeshRawAnimHeader
            {
                Version             = reader.ReadInt32(),
                IsBigEndian         = reader.ReadInt32() != 0,
                FrameTransformType  = (SdkMeshFrameTransformType)reader.ReadInt32(),
                NumFrames           = reader.ReadInt32(),
                NumAnimationKeys    = reader.ReadInt32(),
                AnimationFPS        = reader.ReadInt32(),
                AnimationDataSize   = reader.ReadInt64(),
                AnimationDataOffset = reader.ReadInt64()
            };

            return(header);
        }