babylon.math.SIMD.ts 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. module BABYLON {
  2. declare var SIMD;
  3. export class SIMDVector3 {
  4. public static TransformCoordinatesToRefSIMD(vector: Vector3, transformation: Matrix, result: Vector3): void {
  5. var v = SIMD.float32x4.loadXYZ((<any>vector)._data, 0);
  6. var m0 = SIMD.float32x4.load(transformation.m, 0);
  7. var m1 = SIMD.float32x4.load(transformation.m, 4);
  8. var m2 = SIMD.float32x4.load(transformation.m, 8);
  9. var m3 = SIMD.float32x4.load(transformation.m, 12);
  10. var r = SIMD.float32x4.add(SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(v, 0, 0, 0, 0), m0), SIMD.float32x4.mul(SIMD.float32x4.swizzle(v, 1, 1, 1, 1), m1)), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(v, 2, 2, 2, 2), m2), m3));
  11. r = SIMD.float32x4.div(r, SIMD.float32x4.swizzle(r, 3, 3, 3, 3));
  12. SIMD.float32x4.storeXYZ((<any>result)._data, 0, r);
  13. }
  14. public static TransformCoordinatesFromFloatsToRefSIMD(x: number, y: number, z: number, transformation: Matrix, result: Vector3): void {
  15. var v0 = SIMD.float32x4.splat(x);
  16. var v1 = SIMD.float32x4.splat(y);
  17. var v2 = SIMD.float32x4.splat(z);
  18. var m0 = SIMD.float32x4.load(transformation.m, 0);
  19. var m1 = SIMD.float32x4.load(transformation.m, 4);
  20. var m2 = SIMD.float32x4.load(transformation.m, 8);
  21. var m3 = SIMD.float32x4.load(transformation.m, 12);
  22. var r = SIMD.float32x4.add(SIMD.float32x4.add(SIMD.float32x4.mul(v0, m0), SIMD.float32x4.mul(v1, m1)), SIMD.float32x4.add(SIMD.float32x4.mul(v2, m2), m3));
  23. r = SIMD.float32x4.div(r, SIMD.float32x4.swizzle(r, 3, 3, 3, 3));
  24. SIMD.float32x4.storeXYZ((<any>result)._data, 0, r);
  25. }
  26. }
  27. export class SIMDMatrix {
  28. public multiplyToArraySIMD(other: Matrix, result: Matrix, offset = 0): void {
  29. var tm = (<any>this).m;
  30. var om = other.m;
  31. var om0 = SIMD.float32x4.load(om, 0);
  32. var om1 = SIMD.float32x4.load(om, 4);
  33. var om2 = SIMD.float32x4.load(om, 8);
  34. var om3 = SIMD.float32x4.load(om, 12);
  35. var tm0 = SIMD.float32x4.load(tm, 0);
  36. SIMD.float32x4.store(result, offset + 0, SIMD.float32x4.add(
  37. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm0, 0, 0, 0, 0), om0),
  38. SIMD.float32x4.add(
  39. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm0, 1, 1, 1, 1), om1),
  40. SIMD.float32x4.add(
  41. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm0, 2, 2, 2, 2), om2),
  42. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm0, 3, 3, 3, 3), om3)))));
  43. var tm1 = SIMD.float32x4.load(tm, 4);
  44. SIMD.float32x4.store(result, offset + 4, SIMD.float32x4.add(
  45. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm1, 0, 0, 0, 0), om0),
  46. SIMD.float32x4.add(
  47. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm1, 1, 1, 1, 1), om1),
  48. SIMD.float32x4.add(
  49. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm1, 2, 2, 2, 2), om2),
  50. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm1, 3, 3, 3, 3), om3)))));
  51. var tm2 = SIMD.float32x4.load(tm, 8);
  52. SIMD.float32x4.store(result, offset + 8, SIMD.float32x4.add(
  53. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm2, 0, 0, 0, 0), om0),
  54. SIMD.float32x4.add(
  55. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm2, 1, 1, 1, 1), om1),
  56. SIMD.float32x4.add(
  57. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm2, 2, 2, 2, 2), om2),
  58. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm2, 3, 3, 3, 3), om3)))));
  59. var tm3 = SIMD.float32x4.load(tm, 12);
  60. SIMD.float32x4.store(result, offset + 12, SIMD.float32x4.add(
  61. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm3, 0, 0, 0, 0), om0),
  62. SIMD.float32x4.add(
  63. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm3, 1, 1, 1, 1), om1),
  64. SIMD.float32x4.add(
  65. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm3, 2, 2, 2, 2), om2),
  66. SIMD.float32x4.mul(SIMD.float32x4.swizzle(tm3, 3, 3, 3, 3), om3)))));
  67. }
  68. public invertToRefSIMD(other: Matrix): Matrix {
  69. var src = (<any>this).m;
  70. var dest = other.m;
  71. var row0, row1, row2, row3;
  72. var tmp1;
  73. var minor0, minor1, minor2, minor3;
  74. var det;
  75. // Load the 4 rows
  76. var src0 = SIMD.float32x4.load(src, 0);
  77. var src1 = SIMD.float32x4.load(src, 4);
  78. var src2 = SIMD.float32x4.load(src, 8);
  79. var src3 = SIMD.float32x4.load(src, 12);
  80. // Transpose the source matrix. Sort of. Not a true transpose operation
  81. tmp1 = SIMD.float32x4.shuffle(src0, src1, 0, 1, 4, 5);
  82. row1 = SIMD.float32x4.shuffle(src2, src3, 0, 1, 4, 5);
  83. row0 = SIMD.float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);
  84. row1 = SIMD.float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);
  85. tmp1 = SIMD.float32x4.shuffle(src0, src1, 2, 3, 6, 7);
  86. row3 = SIMD.float32x4.shuffle(src2, src3, 2, 3, 6, 7);
  87. row2 = SIMD.float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);
  88. row3 = SIMD.float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);
  89. // This is a true transposition, but it will lead to an incorrect result
  90. //tmp1 = SIMD.float32x4.shuffle(src0, src1, 0, 1, 4, 5);
  91. //tmp2 = SIMD.float32x4.shuffle(src2, src3, 0, 1, 4, 5);
  92. //row0 = SIMD.float32x4.shuffle(tmp1, tmp2, 0, 2, 4, 6);
  93. //row1 = SIMD.float32x4.shuffle(tmp1, tmp2, 1, 3, 5, 7);
  94. //tmp1 = SIMD.float32x4.shuffle(src0, src1, 2, 3, 6, 7);
  95. //tmp2 = SIMD.float32x4.shuffle(src2, src3, 2, 3, 6, 7);
  96. //row2 = SIMD.float32x4.shuffle(tmp1, tmp2, 0, 2, 4, 6);
  97. //row3 = SIMD.float32x4.shuffle(tmp1, tmp2, 1, 3, 5, 7);
  98. // ----
  99. tmp1 = SIMD.float32x4.mul(row2, row3);
  100. tmp1 = SIMD.float32x4.swizzle(tmp1, 1, 0, 3, 2); // 0xB1 = 10110001
  101. minor0 = SIMD.float32x4.mul(row1, tmp1);
  102. minor1 = SIMD.float32x4.mul(row0, tmp1);
  103. tmp1 = SIMD.float32x4.swizzle(tmp1, 2, 3, 0, 1); // 0x4E = 01001110
  104. minor0 = SIMD.float32x4.sub(SIMD.float32x4.mul(row1, tmp1), minor0);
  105. minor1 = SIMD.float32x4.sub(SIMD.float32x4.mul(row0, tmp1), minor1);
  106. minor1 = SIMD.float32x4.swizzle(minor1, 2, 3, 0, 1); // 0x4E = 01001110
  107. // ----
  108. tmp1 = SIMD.float32x4.mul(row1, row2);
  109. tmp1 = SIMD.float32x4.swizzle(tmp1, 1, 0, 3, 2); // 0xB1 = 10110001
  110. minor0 = SIMD.float32x4.add(SIMD.float32x4.mul(row3, tmp1), minor0);
  111. minor3 = SIMD.float32x4.mul(row0, tmp1);
  112. tmp1 = SIMD.float32x4.swizzle(tmp1, 2, 3, 0, 1); // 0x4E = 01001110
  113. minor0 = SIMD.float32x4.sub(minor0, SIMD.float32x4.mul(row3, tmp1));
  114. minor3 = SIMD.float32x4.sub(SIMD.float32x4.mul(row0, tmp1), minor3);
  115. minor3 = SIMD.float32x4.swizzle(minor3, 2, 3, 0, 1); // 0x4E = 01001110
  116. // ----
  117. tmp1 = SIMD.float32x4.mul(SIMD.float32x4.swizzle(row1, 2, 3, 0, 1), row3); // 0x4E = 01001110
  118. tmp1 = SIMD.float32x4.swizzle(tmp1, 1, 0, 3, 2); // 0xB1 = 10110001
  119. row2 = SIMD.float32x4.swizzle(row2, 2, 3, 0, 1); // 0x4E = 01001110
  120. minor0 = SIMD.float32x4.add(SIMD.float32x4.mul(row2, tmp1), minor0);
  121. minor2 = SIMD.float32x4.mul(row0, tmp1);
  122. tmp1 = SIMD.float32x4.swizzle(tmp1, 2, 3, 0, 1); // 0x4E = 01001110
  123. minor0 = SIMD.float32x4.sub(minor0, SIMD.float32x4.mul(row2, tmp1));
  124. minor2 = SIMD.float32x4.sub(SIMD.float32x4.mul(row0, tmp1), minor2);
  125. minor2 = SIMD.float32x4.swizzle(minor2, 2, 3, 0, 1); // 0x4E = 01001110
  126. // ----
  127. tmp1 = SIMD.float32x4.mul(row0, row1);
  128. tmp1 = SIMD.float32x4.swizzle(tmp1, 1, 0, 3, 2); // 0xB1 = 10110001
  129. minor2 = SIMD.float32x4.add(SIMD.float32x4.mul(row3, tmp1), minor2);
  130. minor3 = SIMD.float32x4.sub(SIMD.float32x4.mul(row2, tmp1), minor3);
  131. tmp1 = SIMD.float32x4.swizzle(tmp1, 2, 3, 0, 1); // 0x4E = 01001110
  132. minor2 = SIMD.float32x4.sub(SIMD.float32x4.mul(row3, tmp1), minor2);
  133. minor3 = SIMD.float32x4.sub(minor3, SIMD.float32x4.mul(row2, tmp1));
  134. // ----
  135. tmp1 = SIMD.float32x4.mul(row0, row3);
  136. tmp1 = SIMD.float32x4.swizzle(tmp1, 1, 0, 3, 2); // 0xB1 = 10110001
  137. minor1 = SIMD.float32x4.sub(minor1, SIMD.float32x4.mul(row2, tmp1));
  138. minor2 = SIMD.float32x4.add(SIMD.float32x4.mul(row1, tmp1), minor2);
  139. tmp1 = SIMD.float32x4.swizzle(tmp1, 2, 3, 0, 1); // 0x4E = 01001110
  140. minor1 = SIMD.float32x4.add(SIMD.float32x4.mul(row2, tmp1), minor1);
  141. minor2 = SIMD.float32x4.sub(minor2, SIMD.float32x4.mul(row1, tmp1));
  142. // ----
  143. tmp1 = SIMD.float32x4.mul(row0, row2);
  144. tmp1 = SIMD.float32x4.swizzle(tmp1, 1, 0, 3, 2); // 0xB1 = 10110001
  145. minor1 = SIMD.float32x4.add(SIMD.float32x4.mul(row3, tmp1), minor1);
  146. minor3 = SIMD.float32x4.sub(minor3, SIMD.float32x4.mul(row1, tmp1));
  147. tmp1 = SIMD.float32x4.swizzle(tmp1, 2, 3, 0, 1); // 0x4E = 01001110
  148. minor1 = SIMD.float32x4.sub(minor1, SIMD.float32x4.mul(row3, tmp1));
  149. minor3 = SIMD.float32x4.add(SIMD.float32x4.mul(row1, tmp1), minor3);
  150. // Compute determinant
  151. det = SIMD.float32x4.mul(row0, minor0);
  152. det = SIMD.float32x4.add(SIMD.float32x4.swizzle(det, 2, 3, 0, 1), det); // 0x4E = 01001110
  153. det = SIMD.float32x4.add(SIMD.float32x4.swizzle(det, 1, 0, 3, 2), det); // 0xB1 = 10110001
  154. tmp1 = SIMD.float32x4.reciprocalApproximation(det);
  155. det = SIMD.float32x4.sub(SIMD.float32x4.add(tmp1, tmp1), SIMD.float32x4.mul(det, SIMD.float32x4.mul(tmp1, tmp1)));
  156. det = SIMD.float32x4.swizzle(det, 0, 0, 0, 0);
  157. // These shuffles aren't necessary if the faulty transposition is done
  158. // up at the top of this function.
  159. //minor0 = SIMD.float32x4.swizzle(minor0, 2, 1, 0, 3);
  160. //minor1 = SIMD.float32x4.swizzle(minor1, 2, 1, 0, 3);
  161. //minor2 = SIMD.float32x4.swizzle(minor2, 2, 1, 0, 3);
  162. //minor3 = SIMD.float32x4.swizzle(minor3, 2, 1, 0, 3);
  163. // Compute final values by multiplying with 1/det
  164. minor0 = SIMD.float32x4.mul(det, minor0);
  165. minor1 = SIMD.float32x4.mul(det, minor1);
  166. minor2 = SIMD.float32x4.mul(det, minor2);
  167. minor3 = SIMD.float32x4.mul(det, minor3);
  168. SIMD.float32x4.store(dest, 0, minor0);
  169. SIMD.float32x4.store(dest, 4, minor1);
  170. SIMD.float32x4.store(dest, 8, minor2);
  171. SIMD.float32x4.store(dest, 12, minor3);
  172. return (<any>this);
  173. }
  174. public static LookAtLHToRefSIMD(eyeRef: Vector3, targetRef: Vector3, upRef: Vector3, result: Matrix): void {
  175. var out = result.m;
  176. var center = SIMD.float32x4(targetRef.x, targetRef.y, targetRef.z, 0);
  177. var eye = SIMD.float32x4(eyeRef.x, eyeRef.y, eyeRef.z, 0);
  178. var up = SIMD.float32x4(upRef.x, upRef.y, upRef.z, 0);
  179. // cc.kmVec3Subtract(f, pCenter, pEye);
  180. var f = SIMD.float32x4.sub(center, eye);
  181. // cc.kmVec3Normalize(f, f);
  182. var tmp = SIMD.float32x4.mul(f, f);
  183. tmp = SIMD.float32x4.add(tmp, SIMD.float32x4.add(SIMD.float32x4.swizzle(tmp, 1, 2, 0, 3), SIMD.float32x4.swizzle(tmp, 2, 0, 1, 3)));
  184. f = SIMD.float32x4.mul(f, SIMD.float32x4.reciprocalSqrtApproximation(tmp));
  185. // cc.kmVec3Assign(up, pUp);
  186. // cc.kmVec3Normalize(up, up);
  187. tmp = SIMD.float32x4.mul(up, up);
  188. tmp = SIMD.float32x4.add(tmp, SIMD.float32x4.add(SIMD.float32x4.swizzle(tmp, 1, 2, 0, 3), SIMD.float32x4.swizzle(tmp, 2, 0, 1, 3)));
  189. up = SIMD.float32x4.mul(up, SIMD.float32x4.reciprocalSqrtApproximation(tmp));
  190. // cc.kmVec3Cross(s, f, up);
  191. var s = SIMD.float32x4.sub(SIMD.float32x4.mul(SIMD.float32x4.swizzle(f, 1, 2, 0, 3), SIMD.float32x4.swizzle(up, 2, 0, 1, 3)), SIMD.float32x4.mul(SIMD.float32x4.swizzle(f, 2, 0, 1, 3), SIMD.float32x4.swizzle(up, 1, 2, 0, 3)));
  192. // cc.kmVec3Normalize(s, s);
  193. tmp = SIMD.float32x4.mul(s, s);
  194. tmp = SIMD.float32x4.add(tmp, SIMD.float32x4.add(SIMD.float32x4.swizzle(tmp, 1, 2, 0, 3), SIMD.float32x4.swizzle(tmp, 2, 0, 1, 3)));
  195. s = SIMD.float32x4.mul(s, SIMD.float32x4.reciprocalSqrtApproximation(tmp));
  196. // cc.kmVec3Cross(u, s, f);
  197. var u = SIMD.float32x4.sub(SIMD.float32x4.mul(SIMD.float32x4.swizzle(s, 1, 2, 0, 3), SIMD.float32x4.swizzle(f, 2, 0, 1, 3)), SIMD.float32x4.mul(SIMD.float32x4.swizzle(s, 2, 0, 1, 3), SIMD.float32x4.swizzle(f, 1, 2, 0, 3)));
  198. // cc.kmVec3Normalize(s, s);
  199. tmp = SIMD.float32x4.mul(s, s);
  200. tmp = SIMD.float32x4.add(tmp, SIMD.float32x4.add(SIMD.float32x4.swizzle(tmp, 1, 2, 0, 3), SIMD.float32x4.swizzle(tmp, 2, 0, 1, 3)));
  201. s = SIMD.float32x4.mul(s, SIMD.float32x4.reciprocalSqrtApproximation(tmp));
  202. var zero = SIMD.float32x4.splat(0.0);
  203. s = SIMD.float32x4.neg(s);
  204. var tmp01 = SIMD.float32x4.shuffle(s, u, 0, 1, 4, 5);
  205. var tmp23 = SIMD.float32x4.shuffle(f, zero, 0, 1, 4, 5);
  206. var a0 = SIMD.float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);
  207. var a1 = SIMD.float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);
  208. tmp01 = SIMD.float32x4.shuffle(s, u, 2, 3, 6, 7);
  209. tmp23 = SIMD.float32x4.shuffle(f, zero, 2, 3, 6, 7);
  210. var a2 = SIMD.float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);
  211. var a3 = SIMD.float32x4(0.0, 0.0, 0.0, 1.0);
  212. var b0 = SIMD.float32x4(1.0, 0.0, 0.0, 0.0);
  213. var b1 = SIMD.float32x4(0.0, 1.0, 0.0, 0.0);
  214. var b2 = SIMD.float32x4(0.0, 0.0, 1.0, 0.0);
  215. var b3 = SIMD.float32x4.neg(eye);
  216. b3 = SIMD.float32x4.withW(b3, 1.0);
  217. SIMD.float32x4.store(out, 0, SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b0, 0, 0, 0, 0), a0), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b0, 1, 1, 1, 1), a1), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b0, 2, 2, 2, 2), a2), SIMD.float32x4.mul(SIMD.float32x4.swizzle(b0, 3, 3, 3, 3), a3)))));
  218. SIMD.float32x4.store(out, 4, SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b1, 0, 0, 0, 0), a0), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b1, 1, 1, 1, 1), a1), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b1, 2, 2, 2, 2), a2), SIMD.float32x4.mul(SIMD.float32x4.swizzle(b1, 3, 3, 3, 3), a3)))));
  219. SIMD.float32x4.store(out, 8, SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b2, 0, 0, 0, 0), a0), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b2, 1, 1, 1, 1), a1), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b2, 2, 2, 2, 2), a2), SIMD.float32x4.mul(SIMD.float32x4.swizzle(b2, 3, 3, 3, 3), a3)))));
  220. SIMD.float32x4.store(out, 12, SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b3, 0, 0, 0, 0), a0), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b3, 1, 1, 1, 1), a1), SIMD.float32x4.add(SIMD.float32x4.mul(SIMD.float32x4.swizzle(b3, 2, 2, 2, 2), a2), SIMD.float32x4.mul(SIMD.float32x4.swizzle(b3, 3, 3, 3, 3), a3)))));
  221. }
  222. }
  223. var previousMultiplyToArray = Matrix.prototype.multiplyToArray;
  224. var previousInvertToRef = Matrix.prototype.invertToRef;
  225. var previousLookAtLHToRef = Matrix.LookAtLHToRef;
  226. var previousTransformCoordinatesToRef = Vector3.TransformCoordinatesToRef;
  227. var previousTransformCoordinatesFromFloatsToRef = Vector3.TransformCoordinatesFromFloatsToRef;
  228. export class SIMDHelper {
  229. private static _isEnabled = false;
  230. public static get IsEnabled(): boolean {
  231. return SIMDHelper._isEnabled;
  232. }
  233. public static DisableSIMD(): void {
  234. // Replace functions
  235. Matrix.prototype.multiplyToArray = <any>previousMultiplyToArray;
  236. Matrix.prototype.invertToRef = <any>previousInvertToRef;
  237. Matrix.LookAtLHToRef = <any>previousLookAtLHToRef;
  238. Vector3.TransformCoordinatesToRef = <any>previousTransformCoordinatesToRef;
  239. Vector3.TransformCoordinatesFromFloatsToRef = <any>previousTransformCoordinatesFromFloatsToRef;
  240. SIMDHelper._isEnabled = false;
  241. }
  242. public static EnableSIMD(): void {
  243. if (window.SIMD === undefined) {
  244. return;
  245. }
  246. // Replace functions
  247. Matrix.prototype.multiplyToArray = <any>SIMDMatrix.prototype.multiplyToArraySIMD;
  248. Matrix.prototype.invertToRef = <any>SIMDMatrix.prototype.invertToRefSIMD;
  249. Matrix.LookAtLHToRef = <any>SIMDMatrix.LookAtLHToRefSIMD;
  250. Vector3.TransformCoordinatesToRef = <any>SIMDVector3.TransformCoordinatesToRefSIMD;
  251. Vector3.TransformCoordinatesFromFloatsToRef = <any>SIMDVector3.TransformCoordinatesFromFloatsToRefSIMD;
  252. Object.defineProperty(Vector3.prototype, "x", {
  253. get() { return this._data[0]; },
  254. set(value: number) {
  255. if (!this._data) {
  256. this._data = new Float32Array(3);
  257. }
  258. this._data[0] = value;
  259. }
  260. });
  261. Object.defineProperty(Vector3.prototype, "y", {
  262. get() { return this._data[1]; },
  263. set(value: number) {
  264. this._data[1] = value;
  265. }
  266. });
  267. Object.defineProperty(Vector3.prototype, "z", {
  268. get() { return this._data[2]; },
  269. set(value: number) {
  270. this._data[2] = value;
  271. }
  272. });
  273. SIMDHelper._isEnabled = true;
  274. }
  275. }
  276. }