type_mat3x2.inl 14 KB

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