AnimationData.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace OpenVIII.Battle.Dat
  6. {
  7. /// <summary>
  8. /// Section 3a: Model animation - Header
  9. /// </summary>
  10. /// <see cref="http://wiki.ffrtt.ru/index.php/FF8/FileFormat_DAT#Header_.28data_sub_table.29_2"/>
  11. public struct AnimationData : IReadOnlyList<Animation>
  12. {
  13. #region Fields
  14. private readonly IReadOnlyList<Animation> _animations;
  15. #endregion Fields
  16. #region Constructors
  17. public AnimationData(BinaryReader br, long byteOffset, Skeleton skeleton) : this()
  18. {
  19. var cAnimations = br.ReadInt32();
  20. IReadOnlyList<uint> pAnimations = Enumerable.Range(0, cAnimations).Select(_ => checked((uint)(byteOffset + br.ReadUInt32()))).ToList()
  21. .AsReadOnly();
  22. _animations = Animation.CreateInstances(br, pAnimations, skeleton);
  23. }
  24. #endregion Constructors
  25. #region Properties
  26. public int Count => _animations?.Count ?? 0;
  27. #endregion Properties
  28. #region Indexers
  29. public Animation this[int index] => _animations[index];
  30. #endregion Indexers
  31. #region Methods
  32. public static AnimationData CreateInstance(BinaryReader br, long byteOffset, Skeleton skeleton)
  33. {
  34. br.BaseStream.Seek(byteOffset, SeekOrigin.Begin);
  35. return new AnimationData(br, byteOffset, skeleton);
  36. }
  37. public IEnumerator<Animation> GetEnumerator() => _animations.GetEnumerator();
  38. IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_animations).GetEnumerator();
  39. #endregion Methods
  40. }
  41. }