Cameras.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. namespace OpenVIII.Fields
  6. {
  7. /// <summary>
  8. /// Cameras
  9. /// </summary>
  10. /// <see cref="http://wiki.ffrtt.ru/index.php?title=FF7/Field/Camera_Matrix"/>
  11. /// <seealso cref="https://github.com/myst6re/deling/blob/master/files/CaFile.cpp"/>
  12. /// <seealso cref="https://github.com/myst6re/deling/blob/master/files/CaFile.h"/>
  13. /// <seealso cref="https://github.com/myst6re/deling/blob/master/WalkmeshGLWidget.cpp"/>
  14. /// <seealso cref="https://github.com/myst6re/deling/blob/master/WalkmeshGLWidget.h"/>
  15. public class Cameras : IReadOnlyList<Camera>
  16. {
  17. #region Fields
  18. private const int AltSizeOfCamera = 0x26;
  19. private const int SizeOfCamera = 0x28;
  20. private readonly IReadOnlyList<Camera> _cameras;
  21. #endregion Fields
  22. #region Constructors
  23. public Cameras(IReadOnlyList<Camera> cameras) => _cameras = cameras;
  24. #endregion Constructors
  25. #region Properties
  26. public int Count => _cameras.Count;
  27. #endregion Properties
  28. #region Indexers
  29. public Camera this[int index] => _cameras[index];
  30. #endregion Indexers
  31. #region Methods
  32. public static Cameras CreateInstance(byte[] idb)
  33. {
  34. if (idb == null || idb.Length == 0) return null;
  35. var sizeofCamera = SizeOfCamera;
  36. int count;
  37. if (idb.Length / SizeOfCamera > idb.Length / AltSizeOfCamera)
  38. count = idb.Length / SizeOfCamera;
  39. else
  40. {
  41. sizeofCamera = AltSizeOfCamera;
  42. count = idb.Length / sizeofCamera;
  43. }
  44. Debug.Assert(count >= 1);
  45. return new Cameras(Enumerable.Range(0, count).Select(x => Camera.CreateInstance(idb, x * sizeofCamera)).ToList()
  46. .AsReadOnly());
  47. }
  48. public IEnumerator<Camera> GetEnumerator() => _cameras.GetEnumerator();
  49. IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_cameras).GetEnumerator();
  50. #endregion Methods
  51. }
  52. }