type_mat3x3.inl 17 KB

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