Geometry.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. namespace OpenVIII.Battle.Dat
  6. {
  7. /// <summary>
  8. /// Section 2: Model geometry
  9. /// </summary>
  10. /// <see cref="http://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_DAT#Header_.28data_sub_table.29"/>
  11. [StructLayout(LayoutKind.Sequential, Pack = 1)]
  12. public class Geometry
  13. {
  14. #region Fields
  15. /// <summary>
  16. /// Number of objects
  17. /// </summary>
  18. public readonly int CObjects;
  19. /// <summary>
  20. /// Object Data (see below)
  21. /// </summary>
  22. public readonly IReadOnlyList<Object> Objects;
  23. /// <summary>
  24. /// Object Positions
  25. /// </summary>
  26. public readonly IReadOnlyList<uint> PObjects;
  27. /// <summary>
  28. /// Total count of vertices
  29. /// </summary>
  30. public readonly uint CTotalVertices;
  31. #endregion Fields
  32. #region Constructors
  33. private Geometry(BinaryReader br, long byteOffset)
  34. {
  35. CObjects = br.ReadInt32();
  36. PObjects = Enumerable.Range(0, CObjects).Select(_ => br.ReadUInt32()).ToList().AsReadOnly();
  37. Objects = PObjects.Select(pOffset => Object.CreateInstance(br, pOffset + byteOffset)).ToList().AsReadOnly();
  38. CTotalVertices = br.ReadUInt32();
  39. }
  40. #endregion Constructors
  41. #region Methods
  42. public static Geometry CreateInstance(BinaryReader br, long byteOffset)
  43. {
  44. br.BaseStream.Seek(byteOffset, SeekOrigin.Begin);
  45. return new Geometry(br, byteOffset);
  46. }
  47. #endregion Methods
  48. }
  49. }