/RaytracerProject/glm/glm/gtx/simd_mat4.inl

https://gitlab.com/Nissun93/Raytracer · C++ Header · 577 lines · 500 code · 65 blank · 12 comment · 1 complexity · 5419a5550030a2efe532e4e115757218 MD5 · raw file

  1. /// @ref gtx_simd_mat4
  2. /// @file glm/gtx/simd_mat4.inl
  3. namespace glm{
  4. namespace detail{
  5. GLM_FUNC_QUALIFIER length_t fmat4x4SIMD::length() const
  6. {
  7. return 4;
  8. }
  9. //////////////////////////////////////
  10. // Accesses
  11. GLM_FUNC_QUALIFIER fvec4SIMD & fmat4x4SIMD::operator[]
  12. (
  13. length_t i
  14. )
  15. {
  16. assert(i < this->length());
  17. return this->Data[i];
  18. }
  19. GLM_FUNC_QUALIFIER fvec4SIMD const & fmat4x4SIMD::operator[]
  20. (
  21. length_t i
  22. ) const
  23. {
  24. assert(i < this->length());
  25. return this->Data[i];
  26. }
  27. //////////////////////////////////////////////////////////////
  28. // Constructors
  29. #if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT)
  30. GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD()
  31. {
  32. # ifndef GLM_FORCE_NO_CTOR_INIT
  33. this->Data[0] = fvec4SIMD(1, 0, 0, 0);
  34. this->Data[1] = fvec4SIMD(0, 1, 0, 0);
  35. this->Data[2] = fvec4SIMD(0, 0, 1, 0);
  36. this->Data[3] = fvec4SIMD(0, 0, 0, 1);
  37. # endif
  38. }
  39. # endif//!GLM_HAS_DEFAULTED_FUNCTIONS
  40. GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(float const & s)
  41. {
  42. this->Data[0] = fvec4SIMD(s, 0, 0, 0);
  43. this->Data[1] = fvec4SIMD(0, s, 0, 0);
  44. this->Data[2] = fvec4SIMD(0, 0, s, 0);
  45. this->Data[3] = fvec4SIMD(0, 0, 0, s);
  46. }
  47. GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
  48. (
  49. float const & x0, float const & y0, float const & z0, float const & w0,
  50. float const & x1, float const & y1, float const & z1, float const & w1,
  51. float const & x2, float const & y2, float const & z2, float const & w2,
  52. float const & x3, float const & y3, float const & z3, float const & w3
  53. )
  54. {
  55. this->Data[0] = fvec4SIMD(x0, y0, z0, w0);
  56. this->Data[1] = fvec4SIMD(x1, y1, z1, w1);
  57. this->Data[2] = fvec4SIMD(x2, y2, z2, w2);
  58. this->Data[3] = fvec4SIMD(x3, y3, z3, w3);
  59. }
  60. GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
  61. (
  62. fvec4SIMD const & v0,
  63. fvec4SIMD const & v1,
  64. fvec4SIMD const & v2,
  65. fvec4SIMD const & v3
  66. )
  67. {
  68. this->Data[0] = v0;
  69. this->Data[1] = v1;
  70. this->Data[2] = v2;
  71. this->Data[3] = v3;
  72. }
  73. GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
  74. (
  75. mat4 const & m
  76. )
  77. {
  78. this->Data[0] = fvec4SIMD(m[0]);
  79. this->Data[1] = fvec4SIMD(m[1]);
  80. this->Data[2] = fvec4SIMD(m[2]);
  81. this->Data[3] = fvec4SIMD(m[3]);
  82. }
  83. GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
  84. (
  85. __m128 const in[4]
  86. )
  87. {
  88. this->Data[0] = in[0];
  89. this->Data[1] = in[1];
  90. this->Data[2] = in[2];
  91. this->Data[3] = in[3];
  92. }
  93. //////////////////////////////////////////////////////////////
  94. // mat4 operators
  95. #if !GLM_HAS_DEFAULTED_FUNCTIONS
  96. GLM_FUNC_QUALIFIER fmat4x4SIMD& fmat4x4SIMD::operator=
  97. (
  98. fmat4x4SIMD const & m
  99. )
  100. {
  101. this->Data[0] = m[0];
  102. this->Data[1] = m[1];
  103. this->Data[2] = m[2];
  104. this->Data[3] = m[3];
  105. return *this;
  106. }
  107. #endif//!GLM_HAS_DEFAULTED_FUNCTIONS
  108. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+=
  109. (
  110. fmat4x4SIMD const & m
  111. )
  112. {
  113. this->Data[0].Data = _mm_add_ps(this->Data[0].Data, m[0].Data);
  114. this->Data[1].Data = _mm_add_ps(this->Data[1].Data, m[1].Data);
  115. this->Data[2].Data = _mm_add_ps(this->Data[2].Data, m[2].Data);
  116. this->Data[3].Data = _mm_add_ps(this->Data[3].Data, m[3].Data);
  117. return *this;
  118. }
  119. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-=
  120. (
  121. fmat4x4SIMD const & m
  122. )
  123. {
  124. this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, m[0].Data);
  125. this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, m[1].Data);
  126. this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, m[2].Data);
  127. this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, m[3].Data);
  128. return *this;
  129. }
  130. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*=
  131. (
  132. fmat4x4SIMD const & m
  133. )
  134. {
  135. sse_mul_ps(&this->Data[0].Data, &m.Data[0].Data, &this->Data[0].Data);
  136. return *this;
  137. }
  138. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/=
  139. (
  140. fmat4x4SIMD const & m
  141. )
  142. {
  143. __m128 Inv[4];
  144. sse_inverse_ps(&m.Data[0].Data, Inv);
  145. sse_mul_ps(&this->Data[0].Data, Inv, &this->Data[0].Data);
  146. return *this;
  147. }
  148. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+=
  149. (
  150. float const & s
  151. )
  152. {
  153. __m128 Operand = _mm_set_ps1(s);
  154. this->Data[0].Data = _mm_add_ps(this->Data[0].Data, Operand);
  155. this->Data[1].Data = _mm_add_ps(this->Data[1].Data, Operand);
  156. this->Data[2].Data = _mm_add_ps(this->Data[2].Data, Operand);
  157. this->Data[3].Data = _mm_add_ps(this->Data[3].Data, Operand);
  158. return *this;
  159. }
  160. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-=
  161. (
  162. float const & s
  163. )
  164. {
  165. __m128 Operand = _mm_set_ps1(s);
  166. this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, Operand);
  167. this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, Operand);
  168. this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, Operand);
  169. this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, Operand);
  170. return *this;
  171. }
  172. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*=
  173. (
  174. float const & s
  175. )
  176. {
  177. __m128 Operand = _mm_set_ps1(s);
  178. this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand);
  179. this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand);
  180. this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand);
  181. this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand);
  182. return *this;
  183. }
  184. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/=
  185. (
  186. float const & s
  187. )
  188. {
  189. __m128 Operand = _mm_div_ps(one, _mm_set_ps1(s));
  190. this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand);
  191. this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand);
  192. this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand);
  193. this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand);
  194. return *this;
  195. }
  196. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator++ ()
  197. {
  198. this->Data[0].Data = _mm_add_ps(this->Data[0].Data, one);
  199. this->Data[1].Data = _mm_add_ps(this->Data[1].Data, one);
  200. this->Data[2].Data = _mm_add_ps(this->Data[2].Data, one);
  201. this->Data[3].Data = _mm_add_ps(this->Data[3].Data, one);
  202. return *this;
  203. }
  204. GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-- ()
  205. {
  206. this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, one);
  207. this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, one);
  208. this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, one);
  209. this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, one);
  210. return *this;
  211. }
  212. //////////////////////////////////////////////////////////////
  213. // Binary operators
  214. GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
  215. (
  216. const fmat4x4SIMD &m,
  217. float const & s
  218. )
  219. {
  220. return detail::fmat4x4SIMD
  221. (
  222. m[0] + s,
  223. m[1] + s,
  224. m[2] + s,
  225. m[3] + s
  226. );
  227. }
  228. GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
  229. (
  230. float const & s,
  231. const fmat4x4SIMD &m
  232. )
  233. {
  234. return detail::fmat4x4SIMD
  235. (
  236. m[0] + s,
  237. m[1] + s,
  238. m[2] + s,
  239. m[3] + s
  240. );
  241. }
  242. GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
  243. (
  244. const fmat4x4SIMD &m1,
  245. const fmat4x4SIMD &m2
  246. )
  247. {
  248. return detail::fmat4x4SIMD
  249. (
  250. m1[0] + m2[0],
  251. m1[1] + m2[1],
  252. m1[2] + m2[2],
  253. m1[3] + m2[3]
  254. );
  255. }
  256. GLM_FUNC_QUALIFIER fmat4x4SIMD operator-
  257. (
  258. const fmat4x4SIMD &m,
  259. float const & s
  260. )
  261. {
  262. return detail::fmat4x4SIMD
  263. (
  264. m[0] - s,
  265. m[1] - s,
  266. m[2] - s,
  267. m[3] - s
  268. );
  269. }
  270. GLM_FUNC_QUALIFIER fmat4x4SIMD operator-
  271. (
  272. float const & s,
  273. const fmat4x4SIMD &m
  274. )
  275. {
  276. return detail::fmat4x4SIMD
  277. (
  278. s - m[0],
  279. s - m[1],
  280. s - m[2],
  281. s - m[3]
  282. );
  283. }
  284. GLM_FUNC_QUALIFIER fmat4x4SIMD operator-
  285. (
  286. const fmat4x4SIMD &m1,
  287. const fmat4x4SIMD &m2
  288. )
  289. {
  290. return detail::fmat4x4SIMD
  291. (
  292. m1[0] - m2[0],
  293. m1[1] - m2[1],
  294. m1[2] - m2[2],
  295. m1[3] - m2[3]
  296. );
  297. }
  298. GLM_FUNC_QUALIFIER fmat4x4SIMD operator*
  299. (
  300. const fmat4x4SIMD &m,
  301. float const & s
  302. )
  303. {
  304. return detail::fmat4x4SIMD
  305. (
  306. m[0] * s,
  307. m[1] * s,
  308. m[2] * s,
  309. m[3] * s
  310. );
  311. }
  312. GLM_FUNC_QUALIFIER fmat4x4SIMD operator*
  313. (
  314. float const & s,
  315. const fmat4x4SIMD &m
  316. )
  317. {
  318. return detail::fmat4x4SIMD
  319. (
  320. m[0] * s,
  321. m[1] * s,
  322. m[2] * s,
  323. m[3] * s
  324. );
  325. }
  326. GLM_FUNC_QUALIFIER fvec4SIMD operator*
  327. (
  328. const fmat4x4SIMD &m,
  329. fvec4SIMD const & v
  330. )
  331. {
  332. return sse_mul_ps(&m.Data[0].Data, v.Data);
  333. }
  334. GLM_FUNC_QUALIFIER fvec4SIMD operator*
  335. (
  336. fvec4SIMD const & v,
  337. const fmat4x4SIMD &m
  338. )
  339. {
  340. return sse_mul_ps(v.Data, &m.Data[0].Data);
  341. }
  342. GLM_FUNC_QUALIFIER fmat4x4SIMD operator*
  343. (
  344. const fmat4x4SIMD &m1,
  345. const fmat4x4SIMD &m2
  346. )
  347. {
  348. fmat4x4SIMD result;
  349. sse_mul_ps(&m1.Data[0].Data, &m2.Data[0].Data, &result.Data[0].Data);
  350. return result;
  351. }
  352. GLM_FUNC_QUALIFIER fmat4x4SIMD operator/
  353. (
  354. const fmat4x4SIMD &m,
  355. float const & s
  356. )
  357. {
  358. return detail::fmat4x4SIMD
  359. (
  360. m[0] / s,
  361. m[1] / s,
  362. m[2] / s,
  363. m[3] / s
  364. );
  365. }
  366. GLM_FUNC_QUALIFIER fmat4x4SIMD operator/
  367. (
  368. float const & s,
  369. const fmat4x4SIMD &m
  370. )
  371. {
  372. return detail::fmat4x4SIMD
  373. (
  374. s / m[0],
  375. s / m[1],
  376. s / m[2],
  377. s / m[3]
  378. );
  379. }
  380. GLM_FUNC_QUALIFIER detail::fmat4x4SIMD inverse(detail::fmat4x4SIMD const & m)
  381. {
  382. detail::fmat4x4SIMD result;
  383. detail::sse_inverse_ps(&m[0].Data, &result[0].Data);
  384. return result;
  385. }
  386. GLM_FUNC_QUALIFIER fvec4SIMD operator/
  387. (
  388. const fmat4x4SIMD & m,
  389. fvec4SIMD const & v
  390. )
  391. {
  392. return inverse(m) * v;
  393. }
  394. GLM_FUNC_QUALIFIER fvec4SIMD operator/
  395. (
  396. fvec4SIMD const & v,
  397. const fmat4x4SIMD &m
  398. )
  399. {
  400. return v * inverse(m);
  401. }
  402. GLM_FUNC_QUALIFIER fmat4x4SIMD operator/
  403. (
  404. const fmat4x4SIMD &m1,
  405. const fmat4x4SIMD &m2
  406. )
  407. {
  408. __m128 result[4];
  409. __m128 inv[4];
  410. sse_inverse_ps(&m2.Data[0].Data, inv);
  411. sse_mul_ps(&m1.Data[0].Data, inv, result);
  412. return fmat4x4SIMD(result);
  413. }
  414. //////////////////////////////////////////////////////////////
  415. // Unary constant operators
  416. GLM_FUNC_QUALIFIER fmat4x4SIMD const operator-
  417. (
  418. fmat4x4SIMD const & m
  419. )
  420. {
  421. return detail::fmat4x4SIMD
  422. (
  423. -m[0],
  424. -m[1],
  425. -m[2],
  426. -m[3]
  427. );
  428. }
  429. GLM_FUNC_QUALIFIER fmat4x4SIMD const operator--
  430. (
  431. fmat4x4SIMD const & m,
  432. int
  433. )
  434. {
  435. return detail::fmat4x4SIMD
  436. (
  437. m[0] - 1.0f,
  438. m[1] - 1.0f,
  439. m[2] - 1.0f,
  440. m[3] - 1.0f
  441. );
  442. }
  443. GLM_FUNC_QUALIFIER fmat4x4SIMD const operator++
  444. (
  445. fmat4x4SIMD const & m,
  446. int
  447. )
  448. {
  449. return detail::fmat4x4SIMD
  450. (
  451. m[0] + 1.0f,
  452. m[1] + 1.0f,
  453. m[2] + 1.0f,
  454. m[3] + 1.0f
  455. );
  456. }
  457. }//namespace detail
  458. GLM_FUNC_QUALIFIER mat4 mat4_cast
  459. (
  460. detail::fmat4x4SIMD const & x
  461. )
  462. {
  463. GLM_ALIGN(16) mat4 Result;
  464. _mm_store_ps(&Result[0][0], x.Data[0].Data);
  465. _mm_store_ps(&Result[1][0], x.Data[1].Data);
  466. _mm_store_ps(&Result[2][0], x.Data[2].Data);
  467. _mm_store_ps(&Result[3][0], x.Data[3].Data);
  468. return Result;
  469. }
  470. GLM_FUNC_QUALIFIER detail::fmat4x4SIMD matrixCompMult
  471. (
  472. detail::fmat4x4SIMD const & x,
  473. detail::fmat4x4SIMD const & y
  474. )
  475. {
  476. detail::fmat4x4SIMD result;
  477. result[0] = x[0] * y[0];
  478. result[1] = x[1] * y[1];
  479. result[2] = x[2] * y[2];
  480. result[3] = x[3] * y[3];
  481. return result;
  482. }
  483. GLM_FUNC_QUALIFIER detail::fmat4x4SIMD outerProduct
  484. (
  485. detail::fvec4SIMD const & c,
  486. detail::fvec4SIMD const & r
  487. )
  488. {
  489. __m128 Shu0 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(0, 0, 0, 0));
  490. __m128 Shu1 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(1, 1, 1, 1));
  491. __m128 Shu2 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(2, 2, 2, 2));
  492. __m128 Shu3 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(3, 3, 3, 3));
  493. detail::fmat4x4SIMD result(uninitialize);
  494. result[0].Data = _mm_mul_ps(c.Data, Shu0);
  495. result[1].Data = _mm_mul_ps(c.Data, Shu1);
  496. result[2].Data = _mm_mul_ps(c.Data, Shu2);
  497. result[3].Data = _mm_mul_ps(c.Data, Shu3);
  498. return result;
  499. }
  500. GLM_FUNC_QUALIFIER detail::fmat4x4SIMD transpose(detail::fmat4x4SIMD const & m)
  501. {
  502. detail::fmat4x4SIMD result;
  503. glm_mat4_transpose(&m[0].Data, &result[0].Data);
  504. return result;
  505. }
  506. GLM_FUNC_QUALIFIER float determinant(detail::fmat4x4SIMD const & m)
  507. {
  508. float Result;
  509. _mm_store_ss(&Result, glm_mat4_determinant(&m[0].Data));
  510. return Result;
  511. }
  512. }//namespace glm