type_mat3x4.inl 17 KB

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