type_mat2x2.inl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. #include "../matrix.hpp"
  2. namespace glm
  3. {
  4. // -- Constructors --
  5. # if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
  6. template<typename T, qualifier Q>
  7. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat()
  8. # if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST
  9. : value{col_type(1, 0), col_type(0, 1)}
  10. # endif
  11. {
  12. # if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION
  13. this->value[0] = col_type(1, 0);
  14. this->value[1] = col_type(0, 1);
  15. # endif
  16. }
  17. # endif
  18. template<typename T, qualifier Q>
  19. template<qualifier P>
  20. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 2, T, P> const& m)
  21. # if GLM_HAS_INITIALIZER_LISTS
  22. : value{m[0], m[1]}
  23. # endif
  24. {
  25. # if !GLM_HAS_INITIALIZER_LISTS
  26. this->value[0] = m[0];
  27. this->value[1] = m[1];
  28. # endif
  29. }
  30. template<typename T, qualifier Q>
  31. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(T scalar)
  32. # if GLM_HAS_INITIALIZER_LISTS
  33. : value{col_type(scalar, 0), col_type(0, scalar)}
  34. # endif
  35. {
  36. # if !GLM_HAS_INITIALIZER_LISTS
  37. this->value[0] = col_type(scalar, 0);
  38. this->value[1] = col_type(0, scalar);
  39. # endif
  40. }
  41. template<typename T, qualifier Q>
  42. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat
  43. (
  44. T const& x0, T const& y0,
  45. T const& x1, T const& y1
  46. )
  47. # if GLM_HAS_INITIALIZER_LISTS
  48. : value{col_type(x0, y0), col_type(x1, y1)}
  49. # endif
  50. {
  51. # if !GLM_HAS_INITIALIZER_LISTS
  52. this->value[0] = col_type(x0, y0);
  53. this->value[1] = col_type(x1, y1);
  54. # endif
  55. }
  56. template<typename T, qualifier Q>
  57. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(col_type const& v0, col_type const& v1)
  58. # if GLM_HAS_INITIALIZER_LISTS
  59. : value{v0, v1}
  60. # endif
  61. {
  62. # if !GLM_HAS_INITIALIZER_LISTS
  63. this->value[0] = v0;
  64. this->value[1] = v1;
  65. # endif
  66. }
  67. // -- Conversion constructors --
  68. template<typename T, qualifier Q>
  69. template<typename X1, typename Y1, typename X2, typename Y2>
  70. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat
  71. (
  72. X1 const& x1, Y1 const& y1,
  73. X2 const& x2, Y2 const& y2
  74. )
  75. # if GLM_HAS_INITIALIZER_LISTS
  76. : value{col_type(static_cast<T>(x1), value_type(y1)), col_type(static_cast<T>(x2), value_type(y2)) }
  77. # endif
  78. {
  79. # if !GLM_HAS_INITIALIZER_LISTS
  80. this->value[0] = col_type(static_cast<T>(x1), value_type(y1));
  81. this->value[1] = col_type(static_cast<T>(x2), value_type(y2));
  82. # endif
  83. }
  84. template<typename T, qualifier Q>
  85. template<typename V1, typename V2>
  86. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2)
  87. # if GLM_HAS_INITIALIZER_LISTS
  88. : value{col_type(v1), col_type(v2)}
  89. # endif
  90. {
  91. # if !GLM_HAS_INITIALIZER_LISTS
  92. this->value[0] = col_type(v1);
  93. this->value[1] = col_type(v2);
  94. # endif
  95. }
  96. // -- mat2x2 matrix conversions --
  97. template<typename T, qualifier Q>
  98. template<typename U, qualifier P>
  99. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 2, U, P> const& m)
  100. # if GLM_HAS_INITIALIZER_LISTS
  101. : value{col_type(m[0]), col_type(m[1])}
  102. # endif
  103. {
  104. # if !GLM_HAS_INITIALIZER_LISTS
  105. this->value[0] = col_type(m[0]);
  106. this->value[1] = col_type(m[1]);
  107. # endif
  108. }
  109. template<typename T, qualifier Q>
  110. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 3, T, Q> const& m)
  111. # if GLM_HAS_INITIALIZER_LISTS
  112. : value{col_type(m[0]), col_type(m[1])}
  113. # endif
  114. {
  115. # if !GLM_HAS_INITIALIZER_LISTS
  116. this->value[0] = col_type(m[0]);
  117. this->value[1] = col_type(m[1]);
  118. # endif
  119. }
  120. template<typename T, qualifier Q>
  121. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 4, T, Q> const& m)
  122. # if GLM_HAS_INITIALIZER_LISTS
  123. : value{col_type(m[0]), col_type(m[1])}
  124. # endif
  125. {
  126. # if !GLM_HAS_INITIALIZER_LISTS
  127. this->value[0] = col_type(m[0]);
  128. this->value[1] = col_type(m[1]);
  129. # endif
  130. }
  131. template<typename T, qualifier Q>
  132. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 3, T, Q> const& m)
  133. # if GLM_HAS_INITIALIZER_LISTS
  134. : value{col_type(m[0]), col_type(m[1])}
  135. # endif
  136. {
  137. # if !GLM_HAS_INITIALIZER_LISTS
  138. this->value[0] = col_type(m[0]);
  139. this->value[1] = col_type(m[1]);
  140. # endif
  141. }
  142. template<typename T, qualifier Q>
  143. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 2, T, Q> const& m)
  144. # if GLM_HAS_INITIALIZER_LISTS
  145. : value{col_type(m[0]), col_type(m[1])}
  146. # endif
  147. {
  148. # if !GLM_HAS_INITIALIZER_LISTS
  149. this->value[0] = col_type(m[0]);
  150. this->value[1] = col_type(m[1]);
  151. # endif
  152. }
  153. template<typename T, qualifier Q>
  154. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 4, T, Q> const& m)
  155. # if GLM_HAS_INITIALIZER_LISTS
  156. : value{col_type(m[0]), col_type(m[1])}
  157. # endif
  158. {
  159. # if !GLM_HAS_INITIALIZER_LISTS
  160. this->value[0] = col_type(m[0]);
  161. this->value[1] = col_type(m[1]);
  162. # endif
  163. }
  164. template<typename T, qualifier Q>
  165. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 2, T, Q> const& m)
  166. # if GLM_HAS_INITIALIZER_LISTS
  167. : value{col_type(m[0]), col_type(m[1])}
  168. # endif
  169. {
  170. # if !GLM_HAS_INITIALIZER_LISTS
  171. this->value[0] = col_type(m[0]);
  172. this->value[1] = col_type(m[1]);
  173. # endif
  174. }
  175. template<typename T, qualifier Q>
  176. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 4, T, Q> const& m)
  177. # if GLM_HAS_INITIALIZER_LISTS
  178. : value{col_type(m[0]), col_type(m[1])}
  179. # endif
  180. {
  181. # if !GLM_HAS_INITIALIZER_LISTS
  182. this->value[0] = col_type(m[0]);
  183. this->value[1] = col_type(m[1]);
  184. # endif
  185. }
  186. template<typename T, qualifier Q>
  187. GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 3, T, Q> const& m)
  188. # if GLM_HAS_INITIALIZER_LISTS
  189. : value{col_type(m[0]), col_type(m[1])}
  190. # endif
  191. {
  192. # if !GLM_HAS_INITIALIZER_LISTS
  193. this->value[0] = col_type(m[0]);
  194. this->value[1] = col_type(m[1]);
  195. # endif
  196. }
  197. // -- Accesses --
  198. template<typename T, qualifier Q>
  199. GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i)
  200. {
  201. assert(i < this->length());
  202. return this->value[i];
  203. }
  204. template<typename T, qualifier Q>
  205. GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::col_type const& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) const
  206. {
  207. assert(i < this->length());
  208. return this->value[i];
  209. }
  210. // -- Unary updatable operators --
  211. template<typename T, qualifier Q>
  212. template<typename U>
  213. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator=(mat<2, 2, U, Q> const& m)
  214. {
  215. this->value[0] = m[0];
  216. this->value[1] = m[1];
  217. return *this;
  218. }
  219. template<typename T, qualifier Q>
  220. template<typename U>
  221. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(U scalar)
  222. {
  223. this->value[0] += scalar;
  224. this->value[1] += scalar;
  225. return *this;
  226. }
  227. template<typename T, qualifier Q>
  228. template<typename U>
  229. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(mat<2, 2, U, Q> const& m)
  230. {
  231. this->value[0] += m[0];
  232. this->value[1] += m[1];
  233. return *this;
  234. }
  235. template<typename T, qualifier Q>
  236. template<typename U>
  237. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(U scalar)
  238. {
  239. this->value[0] -= scalar;
  240. this->value[1] -= scalar;
  241. return *this;
  242. }
  243. template<typename T, qualifier Q>
  244. template<typename U>
  245. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(mat<2, 2, U, Q> const& m)
  246. {
  247. this->value[0] -= m[0];
  248. this->value[1] -= m[1];
  249. return *this;
  250. }
  251. template<typename T, qualifier Q>
  252. template<typename U>
  253. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(U scalar)
  254. {
  255. this->value[0] *= scalar;
  256. this->value[1] *= scalar;
  257. return *this;
  258. }
  259. template<typename T, qualifier Q>
  260. template<typename U>
  261. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(mat<2, 2, U, Q> const& m)
  262. {
  263. return (*this = *this * m);
  264. }
  265. template<typename T, qualifier Q>
  266. template<typename U>
  267. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(U scalar)
  268. {
  269. this->value[0] /= scalar;
  270. this->value[1] /= scalar;
  271. return *this;
  272. }
  273. template<typename T, qualifier Q>
  274. template<typename U>
  275. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(mat<2, 2, U, Q> const& m)
  276. {
  277. return *this *= inverse(m);
  278. }
  279. // -- Increment and decrement operators --
  280. template<typename T, qualifier Q>
  281. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator++()
  282. {
  283. ++this->value[0];
  284. ++this->value[1];
  285. return *this;
  286. }
  287. template<typename T, qualifier Q>
  288. GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator--()
  289. {
  290. --this->value[0];
  291. --this->value[1];
  292. return *this;
  293. }
  294. template<typename T, qualifier Q>
  295. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator++(int)
  296. {
  297. mat<2, 2, T, Q> Result(*this);
  298. ++*this;
  299. return Result;
  300. }
  301. template<typename T, qualifier Q>
  302. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator--(int)
  303. {
  304. mat<2, 2, T, Q> Result(*this);
  305. --*this;
  306. return Result;
  307. }
  308. // -- Unary arithmetic operators --
  309. template<typename T, qualifier Q>
  310. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m)
  311. {
  312. return m;
  313. }
  314. template<typename T, qualifier Q>
  315. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m)
  316. {
  317. return mat<2, 2, T, Q>(
  318. -m[0],
  319. -m[1]);
  320. }
  321. // -- Binary arithmetic operators --
  322. template<typename T, qualifier Q>
  323. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar)
  324. {
  325. return mat<2, 2, T, Q>(
  326. m[0] + scalar,
  327. m[1] + scalar);
  328. }
  329. template<typename T, qualifier Q>
  330. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m)
  331. {
  332. return mat<2, 2, T, Q>(
  333. m[0] + scalar,
  334. m[1] + scalar);
  335. }
  336. template<typename T, qualifier Q>
  337. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
  338. {
  339. return mat<2, 2, T, Q>(
  340. m1[0] + m2[0],
  341. m1[1] + m2[1]);
  342. }
  343. template<typename T, qualifier Q>
  344. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar)
  345. {
  346. return mat<2, 2, T, Q>(
  347. m[0] - scalar,
  348. m[1] - scalar);
  349. }
  350. template<typename T, qualifier Q>
  351. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m)
  352. {
  353. return mat<2, 2, T, Q>(
  354. scalar - m[0],
  355. scalar - m[1]);
  356. }
  357. template<typename T, qualifier Q>
  358. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
  359. {
  360. return mat<2, 2, T, Q>(
  361. m1[0] - m2[0],
  362. m1[1] - m2[1]);
  363. }
  364. template<typename T, qualifier Q>
  365. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar)
  366. {
  367. return mat<2, 2, T, Q>(
  368. m[0] * scalar,
  369. m[1] * scalar);
  370. }
  371. template<typename T, qualifier Q>
  372. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m)
  373. {
  374. return mat<2, 2, T, Q>(
  375. m[0] * scalar,
  376. m[1] * scalar);
  377. }
  378. template<typename T, qualifier Q>
  379. GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator*
  380. (
  381. mat<2, 2, T, Q> const& m,
  382. typename mat<2, 2, T, Q>::row_type const& v
  383. )
  384. {
  385. return vec<2, T, Q>(
  386. m[0][0] * v.x + m[1][0] * v.y,
  387. m[0][1] * v.x + m[1][1] * v.y);
  388. }
  389. template<typename T, qualifier Q>
  390. GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator*
  391. (
  392. typename mat<2, 2, T, Q>::col_type const& v,
  393. mat<2, 2, T, Q> const& m
  394. )
  395. {
  396. return vec<2, T, Q>(
  397. v.x * m[0][0] + v.y * m[0][1],
  398. v.x * m[1][0] + v.y * m[1][1]);
  399. }
  400. template<typename T, qualifier Q>
  401. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
  402. {
  403. return mat<2, 2, T, Q>(
  404. m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
  405. m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
  406. m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
  407. m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]);
  408. }
  409. template<typename T, qualifier Q>
  410. GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2)
  411. {
  412. return mat<3, 2, T, Q>(
  413. m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
  414. m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
  415. m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
  416. m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
  417. m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
  418. m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]);
  419. }
  420. template<typename T, qualifier Q>
  421. GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2)
  422. {
  423. return mat<4, 2, T, Q>(
  424. m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
  425. m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
  426. m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
  427. m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
  428. m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
  429. m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
  430. m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],
  431. m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]);
  432. }
  433. template<typename T, qualifier Q>
  434. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar)
  435. {
  436. return mat<2, 2, T, Q>(
  437. m[0] / scalar,
  438. m[1] / scalar);
  439. }
  440. template<typename T, qualifier Q>
  441. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m)
  442. {
  443. return mat<2, 2, T, Q>(
  444. scalar / m[0],
  445. scalar / m[1]);
  446. }
  447. template<typename T, qualifier Q>
  448. GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v)
  449. {
  450. return inverse(m) * v;
  451. }
  452. template<typename T, qualifier Q>
  453. GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m)
  454. {
  455. return v * inverse(m);
  456. }
  457. template<typename T, qualifier Q>
  458. GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
  459. {
  460. mat<2, 2, T, Q> m1_copy(m1);
  461. return m1_copy /= m2;
  462. }
  463. // -- Boolean operators --
  464. template<typename T, qualifier Q>
  465. GLM_FUNC_QUALIFIER bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
  466. {
  467. return (m1[0] == m2[0]) && (m1[1] == m2[1]);
  468. }
  469. template<typename T, qualifier Q>
  470. GLM_FUNC_QUALIFIER bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
  471. {
  472. return (m1[0] != m2[0]) || (m1[1] != m2[1]);
  473. }
  474. } //namespace glm