Camera.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using Microsoft.Xna.Framework;
  2. using System.Diagnostics.CodeAnalysis;
  3. using System.IO;
  4. namespace OpenVIII.Fields
  5. {
  6. /// <summary>
  7. /// Camera
  8. /// </summary>
  9. [SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Local")]
  10. [SuppressMessage("ReSharper", "UnusedMember.Global")]
  11. public class Camera
  12. {
  13. #region Constructors
  14. private Camera(byte[] cab, long offset)
  15. {
  16. using (var br = new BinaryReader(new MemoryStream(cab)))
  17. {
  18. br.BaseStream.Seek(offset, SeekOrigin.Begin);
  19. const float multiple = 4096f;
  20. Axis = (
  21. new Vector3(br.ReadInt16(), br.ReadInt16(), br.ReadInt16()) / multiple,
  22. new Vector3(br.ReadInt16(), br.ReadInt16(), br.ReadInt16()) / multiple,
  23. new Vector3(br.ReadInt16(), br.ReadInt16(), br.ReadInt16()) / multiple);
  24. br.BaseStream.Seek(2, SeekOrigin.Current);
  25. Space = new Vector3(br.ReadInt32(), br.ReadInt32(), br.ReadInt32()) / multiple;
  26. Pan = (br.ReadInt16(), br.ReadInt16());
  27. Zoom = br.ReadUInt16();
  28. Position = -(Space * Axis.X + Space * Axis.Y + Space * Axis.X);
  29. }
  30. }
  31. #endregion Constructors
  32. #region Properties
  33. public (Vector3 X, Vector3 Y, Vector3 Z) Axis { get; }
  34. public (short X, short Y) Pan { get; }
  35. public Vector3 Position { get; }
  36. public Matrix RotationMatrix => new Matrix { Left = Axis.X, Down = Axis.Y, Backward = Axis.Z };
  37. public Vector3 Space { get; }
  38. public float Zoom { get; }
  39. #endregion Properties
  40. #region Methods
  41. public static Camera CreateInstance(byte[] idb, long offset) => new Camera(idb, offset);
  42. public Matrix CreateLookAt() => Matrix.CreateLookAt(Position - Axis.Z * 2, Axis.Z + Position, Axis.Y);
  43. public Matrix CreateWorld() => Matrix.CreateWorld(Position, Axis.Z, Axis.Y);
  44. #endregion Methods
  45. }
  46. }