Object.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System.Collections.Generic;
  2. using System.Diagnostics;
  3. using System.IO;
  4. namespace OpenVIII.Battle.Dat
  5. {
  6. /// <summary>
  7. /// Section 2b: Object Data
  8. /// </summary>
  9. /// <see cref="http://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_DAT#Object_Data"/>
  10. public class Object
  11. {
  12. #region Fields
  13. public readonly ushort CQuads;
  14. public readonly ushort CTriangles;
  15. public readonly ushort CVertices;
  16. public readonly ulong Padding;
  17. public readonly IReadOnlyList<Quad> Quads;
  18. public readonly IReadOnlyList<Triangle> Triangles;
  19. public readonly IReadOnlyList<VertexData> VertexData;
  20. #endregion Fields
  21. #region Constructors
  22. private Object(BinaryReader br)
  23. {
  24. CVertices = br.ReadUInt16();
  25. VertexData = Dat.VertexData.CreateInstances(br, CVertices);
  26. //padding
  27. br.BaseStream.Seek(4 - (br.BaseStream.Position % 4 == 0 ? 4 : br.BaseStream.Position % 4), SeekOrigin.Current);
  28. CTriangles = br.ReadUInt16();
  29. CQuads = br.ReadUInt16();
  30. Padding = br.ReadUInt64();
  31. Debug.Assert(Padding == 0);
  32. if (CTriangles == 0 && CQuads == 0)
  33. return;
  34. Triangles = Triangle.CreateInstances(br, CTriangles);
  35. Quads = Quad.CreateInstances(br, CQuads);
  36. }
  37. #endregion Constructors
  38. #region Methods
  39. public static Object CreateInstance(BinaryReader br, long byteOffset)
  40. {
  41. br.BaseStream.Seek(byteOffset, SeekOrigin.Begin);
  42. return new Object(br);
  43. }
  44. #endregion Methods
  45. }
  46. }