type_mat2x3.inl 13 KB

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