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);
        }
Example #3
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);
        }