AVec.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace ChocolArm64.State
  4. {
  5. [StructLayout(LayoutKind.Explicit, Size = 16)]
  6. public struct AVec
  7. {
  8. [FieldOffset(0x0)] public byte B0;
  9. [FieldOffset(0x1)] public byte B1;
  10. [FieldOffset(0x2)] public byte B2;
  11. [FieldOffset(0x3)] public byte B3;
  12. [FieldOffset(0x4)] public byte B4;
  13. [FieldOffset(0x5)] public byte B5;
  14. [FieldOffset(0x6)] public byte B6;
  15. [FieldOffset(0x7)] public byte B7;
  16. [FieldOffset(0x8)] public byte B8;
  17. [FieldOffset(0x9)] public byte B9;
  18. [FieldOffset(0xa)] public byte B10;
  19. [FieldOffset(0xb)] public byte B11;
  20. [FieldOffset(0xc)] public byte B12;
  21. [FieldOffset(0xd)] public byte B13;
  22. [FieldOffset(0xe)] public byte B14;
  23. [FieldOffset(0xf)] public byte B15;
  24. [FieldOffset(0x0)] public ushort H0;
  25. [FieldOffset(0x2)] public ushort H1;
  26. [FieldOffset(0x4)] public ushort H2;
  27. [FieldOffset(0x6)] public ushort H3;
  28. [FieldOffset(0x8)] public ushort H4;
  29. [FieldOffset(0xa)] public ushort H5;
  30. [FieldOffset(0xc)] public ushort H6;
  31. [FieldOffset(0xe)] public ushort H7;
  32. [FieldOffset(0x0)] public uint W0;
  33. [FieldOffset(0x4)] public uint W1;
  34. [FieldOffset(0x8)] public uint W2;
  35. [FieldOffset(0xc)] public uint W3;
  36. [FieldOffset(0x0)] public float S0;
  37. [FieldOffset(0x4)] public float S1;
  38. [FieldOffset(0x8)] public float S2;
  39. [FieldOffset(0xc)] public float S3;
  40. [FieldOffset(0x0)] public ulong X0;
  41. [FieldOffset(0x8)] public ulong X1;
  42. [FieldOffset(0x0)] public double D0;
  43. [FieldOffset(0x8)] public double D1;
  44. public byte ExtractByte(int Index)
  45. {
  46. switch (Index)
  47. {
  48. case 0: return B0;
  49. case 1: return B1;
  50. case 2: return B2;
  51. case 3: return B3;
  52. case 4: return B4;
  53. case 5: return B5;
  54. case 6: return B6;
  55. case 7: return B7;
  56. case 8: return B8;
  57. case 9: return B9;
  58. case 10: return B10;
  59. case 11: return B11;
  60. case 12: return B12;
  61. case 13: return B13;
  62. case 14: return B14;
  63. case 15: return B15;
  64. }
  65. throw new ArgumentOutOfRangeException(nameof(Index));
  66. }
  67. public ushort ExtractUInt16(int Index)
  68. {
  69. switch (Index)
  70. {
  71. case 0: return H0;
  72. case 1: return H1;
  73. case 2: return H2;
  74. case 3: return H3;
  75. case 4: return H4;
  76. case 5: return H5;
  77. case 6: return H6;
  78. case 7: return H7;
  79. }
  80. throw new ArgumentOutOfRangeException(nameof(Index));
  81. }
  82. public uint ExtractUInt32(int Index)
  83. {
  84. switch (Index)
  85. {
  86. case 0: return W0;
  87. case 1: return W1;
  88. case 2: return W2;
  89. case 3: return W3;
  90. }
  91. throw new ArgumentOutOfRangeException(nameof(Index));
  92. }
  93. public float ExtractSingle(int Index)
  94. {
  95. switch (Index)
  96. {
  97. case 0: return S0;
  98. case 1: return S1;
  99. case 2: return S2;
  100. case 3: return S3;
  101. }
  102. throw new ArgumentOutOfRangeException(nameof(Index));
  103. }
  104. public ulong ExtractUInt64(int Index)
  105. {
  106. switch (Index)
  107. {
  108. case 0: return X0;
  109. case 1: return X1;
  110. }
  111. throw new ArgumentOutOfRangeException(nameof(Index));
  112. }
  113. public double ExtractDouble(int Index)
  114. {
  115. switch (Index)
  116. {
  117. case 0: return D0;
  118. case 1: return D1;
  119. }
  120. throw new ArgumentOutOfRangeException(nameof(Index));
  121. }
  122. public static AVec InsertByte(AVec Vec, int Index, byte Value)
  123. {
  124. switch (Index)
  125. {
  126. case 0: Vec.B0 = Value; break;
  127. case 1: Vec.B1 = Value; break;
  128. case 2: Vec.B2 = Value; break;
  129. case 3: Vec.B3 = Value; break;
  130. case 4: Vec.B4 = Value; break;
  131. case 5: Vec.B5 = Value; break;
  132. case 6: Vec.B6 = Value; break;
  133. case 7: Vec.B7 = Value; break;
  134. case 8: Vec.B8 = Value; break;
  135. case 9: Vec.B9 = Value; break;
  136. case 10: Vec.B10 = Value; break;
  137. case 11: Vec.B11 = Value; break;
  138. case 12: Vec.B12 = Value; break;
  139. case 13: Vec.B13 = Value; break;
  140. case 14: Vec.B14 = Value; break;
  141. case 15: Vec.B15 = Value; break;
  142. default: throw new ArgumentOutOfRangeException(nameof(Index));
  143. }
  144. return Vec;
  145. }
  146. public static AVec InsertUInt16(AVec Vec, int Index, ushort Value)
  147. {
  148. switch (Index)
  149. {
  150. case 0: Vec.H0 = Value; break;
  151. case 1: Vec.H1 = Value; break;
  152. case 2: Vec.H2 = Value; break;
  153. case 3: Vec.H3 = Value; break;
  154. case 4: Vec.H4 = Value; break;
  155. case 5: Vec.H5 = Value; break;
  156. case 6: Vec.H6 = Value; break;
  157. case 7: Vec.H7 = Value; break;
  158. default: throw new ArgumentOutOfRangeException(nameof(Index));
  159. }
  160. return Vec;
  161. }
  162. public static AVec InsertUInt32(AVec Vec, int Index, uint Value)
  163. {
  164. switch (Index)
  165. {
  166. case 0: Vec.W0 = Value; break;
  167. case 1: Vec.W1 = Value; break;
  168. case 2: Vec.W2 = Value; break;
  169. case 3: Vec.W3 = Value; break;
  170. default: throw new ArgumentOutOfRangeException(nameof(Index));
  171. }
  172. return Vec;
  173. }
  174. public static AVec InsertSingle(AVec Vec, int Index, float Value)
  175. {
  176. switch (Index)
  177. {
  178. case 0: Vec.S0 = Value; break;
  179. case 1: Vec.S1 = Value; break;
  180. case 2: Vec.S2 = Value; break;
  181. case 3: Vec.S3 = Value; break;
  182. default: throw new ArgumentOutOfRangeException(nameof(Index));
  183. }
  184. return Vec;
  185. }
  186. public static AVec InsertUInt64(AVec Vec, int Index, ulong Value)
  187. {
  188. switch (Index)
  189. {
  190. case 0: Vec.X0 = Value; break;
  191. case 1: Vec.X1 = Value; break;
  192. default: throw new ArgumentOutOfRangeException(nameof(Index));
  193. }
  194. return Vec;
  195. }
  196. public static AVec InsertDouble(AVec Vec, int Index, double Value)
  197. {
  198. switch (Index)
  199. {
  200. case 0: Vec.D0 = Value; break;
  201. case 1: Vec.D1 = Value; break;
  202. default: throw new ArgumentOutOfRangeException(nameof(Index));
  203. }
  204. return Vec;
  205. }
  206. }
  207. }