mat3.rst 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. .. default-domain:: C
  2. mat3
  3. ====
  4. Header: cglm/mat3.h
  5. Table of contents (click to go):
  6. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. Macros:
  8. 1. GLM_MAT3_IDENTITY_INIT
  9. #. GLM_MAT3_ZERO_INIT
  10. #. GLM_MAT3_IDENTITY
  11. #. GLM_MAT3_ZERO
  12. #. glm_mat3_dup(mat, dest)
  13. Functions:
  14. 1. :c:func:`glm_mat3_make`
  15. #. :c:func:`glm_mat3_copy`
  16. #. :c:func:`glm_mat3_identity`
  17. #. :c:func:`glm_mat3_identity_array`
  18. #. :c:func:`glm_mat3_zero`
  19. #. :c:func:`glm_mat3_mul`
  20. #. :c:func:`glm_mat3_mulv`
  21. #. :c:func:`glm_mat3_transpose_to`
  22. #. :c:func:`glm_mat3_transpose`
  23. #. :c:func:`glm_mat3_scale`
  24. #. :c:func:`glm_mat3_inv`
  25. #. :c:func:`glm_mat3_swap_col`
  26. #. :c:func:`glm_mat3_swap_row`
  27. #. :c:func:`glm_mat3_quat`
  28. #. :c:func:`glm_mat3_textrans`
  29. #. :c:func:`glm_mat3_det`
  30. #. :c:func:`glm_mat3_trace`
  31. #. :c:func:`glm_mat3_rmc`
  32. Represented
  33. ~~~~~~~~~~~
  34. .. csv-table:: mat3x3
  35. :header: "", "column 1", "column 2", "column 3"
  36. "row 1", "m00", "m10", "m20"
  37. "row 2", "m01", "m11", "m21"
  38. "row 3", "m02", "m12", "m22"
  39. Functions documentation
  40. ~~~~~~~~~~~~~~~~~~~~~~~
  41. .. c:function:: void glm_mat3_make(const float * __restrict src, mat3 dest)
  42. Create mat3 (dest) from pointer (src).
  43. .. note:: **@src** must contain at least 9 elements.
  44. Parameters:
  45. | *[in]* **src** pointer to an array of floats (left)
  46. | *[out]* **dest** destination (result, mat3)
  47. .. note:: Mathematical explanation
  48. .. csv-table:: float array (1x9) **(src)**
  49. :header: "", "column 1"
  50. "row 1", "v0"
  51. "row 2", "v1"
  52. "row 3", "v2"
  53. "row 4", "v3"
  54. "row 5", "v4"
  55. "row 6", "v5"
  56. "row 7", "v6"
  57. "row 8", "v7"
  58. "row 9", "v8"
  59. .. csv-table:: mat3 **(dest)**
  60. :header: "", "column 1", "column 2", "column 3"
  61. "row 1", "v0", "v3", "v6"
  62. "row 2", "v1", "v4", "v7"
  63. "row 3", "v2", "v5", "v8"
  64. .. note:: Example
  65. .. code-block:: c
  66. float src[9] = {
  67. 1.00, 5.00, 8.00,
  68. 11.00, 42.00, 33.00,
  69. 95.00, 59.00, 88.00,
  70. };
  71. mat3 dest = GLM_MAT3_ZERO_INIT;
  72. glm_mat3_make(src, dest);
  73. .. csv-table:: float array (1x9) **(src)**
  74. :header: "", "column 1"
  75. "row 1", "1.00"
  76. "row 2", "5.00"
  77. "row 3", "8.00"
  78. "row 4", "11.00"
  79. "row 5", "42.00"
  80. "row 6", "33.00"
  81. "row 7", "95.00"
  82. "row 8", "59.00"
  83. "row 9", "88.00"
  84. .. csv-table:: mat3 **(dest)** Before
  85. :header: "", "column 1", "column 2", "column 3"
  86. "row 1", "0.00", "0.00", "0.00"
  87. "row 2", "0.00", "0.00", "0.00"
  88. "row 3", "0.00", "0.00", "0.00"
  89. .. csv-table:: mat3 **(dest)** After
  90. :header: "", "column 1", "column 2", "column 3"
  91. "row 1", "1.00", "11.00", "95.00"
  92. "row 2", "5.00", "42.00", "59.00"
  93. "row 3", "8.00", "33.00", "88.00"
  94. .. c:function:: void glm_mat3_copy(mat3 mat, mat3 dest)
  95. Copy mat3 (mat) to mat3 (dest).
  96. Parameters:
  97. | *[in]* **mat** mat3 (left, src)
  98. | *[out]* **dest** destination (result, mat3)
  99. .. note:: Mathematical explanation
  100. .. csv-table:: mat3 **(mat)**
  101. :header: "", "column 1", "column 2", "column 3"
  102. "row 1", "m00", "m10", "m20"
  103. "row 2", "m01", "m11", "m21"
  104. "row 3", "m02", "m12", "m22"
  105. .. csv-table:: mat3 **(dest)**
  106. :header: "", "column 1", "column 2", "column 3"
  107. "row 1", "m00", "m10", "m20"
  108. "row 2", "m01", "m11", "m21"
  109. "row 3", "m02", "m12", "m22"
  110. .. note:: Example
  111. .. code-block:: c
  112. mat3 mat = {
  113. {3.00,4.00,5.00},
  114. {7.00,8.00,9.00},
  115. {17.00,18.00,19.00},
  116. };
  117. mat3 dest = GLM_MAT2_ZERO_INIT;
  118. glm_mat3_copy(mat, dest);
  119. .. csv-table:: mat3 **(mat)**
  120. :header: "", "column 1", "column 2", "column 3"
  121. "row 1", "3.00", "4.00", "5.00"
  122. "row 2", "7.00", "8.00", "9.00"
  123. "row 3", "17.00", "18.00", "19.00"
  124. .. csv-table:: mat3 **(dest)** Before
  125. :header: "", "column 1", "column 2", "column 3"
  126. "row 1", "0.00", "0.00", "0.00"
  127. "row 2", "0.00", "0.00", "0.00"
  128. "row 3", "0.00", "0.00", "0.00"
  129. .. csv-table:: mat3 **(dest)** After
  130. :header: "", "column 1", "column 2", "column 3"
  131. "row 1", "3.00", "4.00", "5.00"
  132. "row 2", "7.00", "8.00", "9.00"
  133. "row 3", "17.00", "18.00", "19.00"
  134. .. c:function:: void glm_mat3_identity(mat3 m)
  135. | Copy a mat3 identity to mat3 **(m)**, or makes mat3 **(m)** an identity.
  136. |
  137. | The same thing may be achieved with either of bellow methods,
  138. | but it is more easy to do that with this func especially for members
  139. | e.g. ``glm_mat3_identity(aStruct->aMatrix);``.
  140. .. code-block:: c
  141. glm_mat3_copy(GLM_MAT3_IDENTITY, m);
  142. // or
  143. mat3 mat = GLM_MAT3_IDENTITY_INIT;
  144. Parameters:
  145. | *[in, out]* **m** mat3 (src, dest)
  146. .. note:: Mathematical explanation
  147. .. csv-table:: mat3 **(m)**
  148. :header: "", "column 1", "column 2", "column 3"
  149. "row 1", "m00", "m10", "m20"
  150. "row 2", "m01", "m11", "m21"
  151. "row 3", "m02", "m12", "m22"
  152. .. csv-table:: mat3 **(m)**
  153. :header: "", "column 1", "column 2", "column 3"
  154. "row 1", "1.00", "0.00", "0.00"
  155. "row 2", "0.00", "1.00", "0.00"
  156. "row 3", "0.00", "0.00", "1.00"
  157. .. note:: Example
  158. .. code-block:: c
  159. mat3 m = {
  160. {3.00,4.00,5.00},
  161. {7.00,8.00,9.00},
  162. {17.00,18.00,19.00},
  163. };
  164. glm_mat3_identity(m);
  165. .. csv-table:: mat3 **(m)**
  166. :header: "", "column 1", "column 2", "column 3"
  167. "row 1", "3.00", "4.00", "5.00"
  168. "row 2", "7.00", "8.00", "9.00"
  169. "row 3", "17.00", "18.00", "19.00"
  170. .. csv-table:: mat3 **(m)**
  171. :header: "", "column 1", "column 2", "column 3"
  172. "row 1", "1.00", "0.00", "0.00"
  173. "row 2", "0.00", "1.00", "0.00"
  174. "row 3", "0.00", "0.00", "1.00"
  175. .. c:function:: void glm_mat3_identity_array(mat3 * __restrict mats, size_t count)
  176. Given an array of mat3's **(mats)** make each matrix an identity matrix.
  177. Parameters:
  178. | *[in, out]* **mats** Array of mat3's (must be aligned (16/32) if alignment is not disabled)
  179. | *[in]* **count** Array size of ``mats`` or number of matrices
  180. .. note:: Mathematical explanation
  181. .. csv-table:: mat3 **(mats[index])**
  182. :header: "", "column 1", "column 2", "column 3"
  183. "row 1", "m00", "m10", "m20"
  184. "row 2", "m01", "m11", "m21"
  185. "row 3", "m02", "m12", "m22"
  186. .. csv-table:: mat3 **(mats[index])**
  187. :header: "", "column 1", "column 2", "column 3"
  188. "row 1", "1.00", "0.00", "0.00"
  189. "row 2", "0.00", "1.00", "0.00"
  190. "row 3", "0.00", "0.00", "1.00"
  191. .. note:: Example
  192. .. code-block:: c
  193. size_t count = 3;
  194. mat3 matrices[count] = {
  195. {{1.00,2.00,3.00},{10.00,11.00,12.00},{19.00,20.00,21.00}},
  196. {{4.00,5.00,6.00},{13.00,14.00,15.00},{22.00,23.00,24.00}},
  197. {{7.00,8.00,9.00},{16.00,17.00,18.00},{25.00,26.00,27.00}},
  198. };
  199. glm_mat3_identity_array(matrices, count);
  200. .. csv-table:: mat3 **(mats[0])** Before
  201. :header: "", "column 1", "column 2", "column 3"
  202. "row 1", "1.00", "10.00", "19.00"
  203. "row 2", "2.00", "11.00", "20.00"
  204. "row 3", "3.00", "12.00", "21.00"
  205. .. csv-table:: mat3 **(mats[0])** After
  206. :header: "", "column 1", "column 2", "column 3"
  207. "row 1", "1.00", "0.00", "0.00"
  208. "row 2", "0.00", "1.00", "0.00"
  209. "row 3", "0.00", "0.00", "1.00"
  210. .. csv-table:: mat3 **(mats[1])** Before
  211. :header: "", "column 1", "column 2", "column 3"
  212. "row 1", "4.00", "13.00", "22.00"
  213. "row 2", "5.00", "14.00", "23.00"
  214. "row 3", "6.00", "15.00", "24.00"
  215. .. csv-table:: mat3 **(mats[1])** After
  216. :header: "", "column 1", "column 2", "column 3"
  217. "row 1", "1.00", "0.00", "0.00"
  218. "row 2", "0.00", "1.00", "0.00"
  219. "row 3", "0.00", "0.00", "1.00"
  220. .. csv-table:: mat3 **(mats[2])** Before
  221. :header: "", "column 1", "column 2", "column 3"
  222. "row 1", "7.00", "16.00", "25.00"
  223. "row 2", "8.00", "17.00", "26.00"
  224. "row 3", "9.00", "18.00", "27.00"
  225. .. csv-table:: mat3 **(mats[2])** After
  226. :header: "", "column 1", "column 2", "column 3"
  227. "row 1", "1.00", "0.00", "0.00"
  228. "row 2", "0.00", "1.00", "0.00"
  229. "row 3", "0.00", "0.00", "1.00"
  230. .. c:function:: void glm_mat3_zero(mat3 m)
  231. Zero out the mat3 (m).
  232. Parameters:
  233. | *[in, out]* **m** mat3 (src, dest)
  234. .. note:: Mathematical explanation
  235. .. csv-table:: mat3 **(m)**
  236. :header: "", "column 1", "column 2", "column 3"
  237. "row 1", "m00", "m10", "m20"
  238. "row 2", "m01", "m11", "m21"
  239. "row 3", "m02", "m12", "m22"
  240. .. csv-table:: mat3 **(m)**
  241. :header: "", "column 1", "column 2", "column 3"
  242. "row 1", "0.00", "0.00", "0.00"
  243. "row 2", "0.00", "0.00", "0.00"
  244. "row 3", "0.00", "0.00", "0.00"
  245. .. note:: Example
  246. .. code-block:: c
  247. mat3 m = {
  248. {19.00,5.00,7.00},
  249. {2.00,4.00,6.00},
  250. {12.00,24.00,54.00},
  251. };
  252. glm_mat3_zero(m);
  253. .. csv-table:: mat3 **(m)** Before
  254. :header: "", "column 1", "column 2", "column 3"
  255. "row 1", "19.00", "2.00", "12.00"
  256. "row 2", "5.00", "4.00", "24.00"
  257. "row 3", "7.00", "6.00", "54.00"
  258. .. csv-table:: mat3 **(m)** After
  259. :header: "", "column 1", "column 2", "column 3"
  260. "row 1", "0.00", "0.00", "0.00"
  261. "row 2", "0.00", "0.00", "0.00"
  262. "row 3", "0.00", "0.00", "0.00"
  263. .. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
  264. Multiply mat3 (m1) by mat3 (m2) and store in mat3 (dest).
  265. m1, m2 and dest matrices can be same matrix, it is possible to write this:
  266. .. code-block:: c
  267. mat3 m = GLM_MAT3_IDENTITY_INIT;
  268. glm_mat3_mul(m, m, m);
  269. Parameters:
  270. | *[in]* **m1** mat3 (left)
  271. | *[in]* **m2** mat3 (right)
  272. | *[out]* **dest** destination (result, mat3)
  273. .. note:: Mathematical explanation
  274. .. csv-table:: mat3 **(m1)**
  275. :header: "", "column 1", "column 2", "column 3"
  276. "row 1", "a00", "a10", "a20"
  277. "row 2", "a01", "a11", "a21"
  278. "row 3", "a02", "a12", "a22"
  279. .. csv-table:: mat3 **(m2)**
  280. :header: "", "column 1", "column 2", "column 3"
  281. "row 1", "b00", "b10", "b20"
  282. "row 2", "b01", "b11", "b21"
  283. "row 3", "b02", "b12", "b22"
  284. .. list-table:: mat3 **(dest)**
  285. :header-rows: 1
  286. * -
  287. - column 1
  288. - column 2
  289. - column 3
  290. * - row 1
  291. - a00 * b00 + a10 * b01 + a20 * b02
  292. - a00 * b10 + a10 * b11 + a20 * b12
  293. - a00 * b20 + a10 * b21 + a20 * b22
  294. * - row 2
  295. - a01 * b00 + a11 * b01 + a21 * b02
  296. - a01 * b10 + a11 * b11 + a21 * b12
  297. - a01 * b20 + a11 * b21 + a21 * b22
  298. * - row 3
  299. - a02 * b00 + a12 * b01 + a22 * b02
  300. - a02 * b10 + a12 * b11 + a22 * b12
  301. - a02 * b20 + a12 * b21 + a22 * b22
  302. .. note:: Example
  303. .. code-block:: c
  304. mat3 m = {
  305. {19.00,5.00,6.00},
  306. {2.00,4.00,8.00},
  307. {1.00,3.00,7.00},
  308. };
  309. glm_mat3_mul(m, m, m);
  310. .. csv-table:: mat3 **(m1)**
  311. :header: "", "column 1", "column 2", "column 3"
  312. "row 1", "19.00", "2.00", "1.00"
  313. "row 2", "5.00", "4.00", "3.00"
  314. "row 3", "6.00", "8.00", "7.00"
  315. .. csv-table:: mat3 **(m2)**
  316. :header: "", "column 1", "column 2", "column 3"
  317. "row 1", "19.00", "2.00", "1.00"
  318. "row 2", "5.00", "4.00", "3.00"
  319. "row 3", "6.00", "8.00", "7.00"
  320. .. list-table:: mat3 **(dest)**
  321. :header-rows: 1
  322. * -
  323. - column 1
  324. - column 2
  325. - column 3
  326. * - row 1
  327. - **377.00** = 19.00 * 19.00 + 2.00 * 5.00 + 1.00 * 6.00
  328. - **54.00** = 19.00 * 2.00 + 2.00 * 4.00 + 1.00 * 8.00
  329. - **32.00** = 19.00 * 1.00 + 2.00 * 3.00 + 1.00 * 7.00
  330. * - row 2
  331. - **133.00** = 5.00 * 19.00 + 4.00 * 5.00 + 3.00 * 6.00
  332. - **50.00** = 5.00 * 2.00 + 4.00 * 4.00 + 3.00 * 8.00
  333. - **38.00** = 5.00 * 1.00 + 4.00 * 3.00 + 3.00 * 7.00
  334. * - row 3
  335. - **196.00** = 6.00 * 19.00 + 8.00 * 5.00 + 7.00 * 6.00
  336. - **100.00** = 6.00 * 2.00 + 8.00 * 4.00 + 7.00 * 8.00
  337. - **79.00** = 6.00 * 1.00 + 8.00 * 3.00 + 7.00 * 7.00
  338. .. c:function:: void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest)
  339. Multiply mat3 (m) by vec3 (v) and store in vec3 (dest).
  340. Parameters:
  341. | *[in]* **m** mat3 (left)
  342. | *[in]* **v** vec3 (right, column vector)
  343. | *[out]* **dest** destination (result, column vector)
  344. .. note:: Mathematical explanation
  345. .. csv-table:: mat3 **(m)**
  346. :header: "", "column 1", "column 2", "column 3"
  347. "row 1", "m00", "m10", "m20"
  348. "row 2", "m01", "m11", "m21"
  349. "row 3", "m02", "m12", "m22"
  350. .. csv-table:: column vec3 (1x3) **(v)**
  351. :header: "", "column 1"
  352. "row 1", "v0"
  353. "row 2", "v1"
  354. "row 3", "v2"
  355. .. csv-table:: column vec3 (1x3) **(dest)**
  356. :header: "", "column 1"
  357. "row 1", "m00 * v0 + m10 * v1 + m20 * v2"
  358. "row 2", "m01 * v0 + m11 * v1 + m21 * v2"
  359. "row 3", "m02 * v0 + m12 * v1 + m22 * v2"
  360. .. note:: Example
  361. .. code-block:: c
  362. vec3 dest;
  363. vec3 v = {33.00,55.00,77.00};
  364. mat3 m = {
  365. {1.00,2.00,3.00},
  366. {4.00,5.00,6.00},
  367. {7.00,8.00,9.00},
  368. };
  369. glm_mat3_mulv(m, v, dest);
  370. .. csv-table:: mat3 **(m)**
  371. :header: "", "column 1", "column 2", "column 3"
  372. "row 1", "1.00", "4.00", "7.00"
  373. "row 2", "2.00", "5.00", "8.00"
  374. "row 3", "3.00", "6.00", "9.00"
  375. .. csv-table:: column vec3 **(v)**
  376. :header: "", "column 1"
  377. "row 1", "33.00"
  378. "row 2", "55.00"
  379. "row 3", "77.00"
  380. .. csv-table:: vec2 **(dest)** Result
  381. :header: "", "column 1"
  382. "row 1", "**792.00** = 1.00 * 33.00 + 4.00 * 55.00 + 7.00 * 77.00"
  383. "row 2", "**957.00** = 2.00 * 33.00 + 5.00 * 55.00 + 8.00 * 77.00"
  384. "row 3", "**1122.00** = 3.00 * 33.00 + 6.00 * 55.00 + 9.00 * 77.00"
  385. .. c:function:: void glm_mat3_transpose_to(mat3 mat, mat3 dest)
  386. Transpose mat3 (mat) and store in mat3 (dest).
  387. Parameters:
  388. | *[in]* **mat** mat3 (left,src)
  389. | *[out]* **dest** destination (result, mat3)
  390. .. note:: Mathematical explanation
  391. .. csv-table:: mat3 **(mat)**
  392. :header: "", "column 1", "column 2", "column 3"
  393. "row 1", "m00", "m10", "m20"
  394. "row 2", "m01", "m11", "m21"
  395. "row 3", "m02", "m12", "m22"
  396. .. csv-table:: mat3 **(dest)**
  397. :header: "", "column 1", "column 2", "column 3"
  398. "row 1", "m00", "m01", "m02"
  399. "row 2", "m10", "m11", "m12"
  400. "row 3", "m20", "m21", "m22"
  401. .. note:: Example
  402. .. code-block:: c
  403. mat3 mat = {
  404. {1.00,2.00,3.00},
  405. {4.00,5.00,6.00},
  406. {7.00,8.00,9.00},
  407. };
  408. mat3 dest = GLM_MAT3_ZERO_INIT;
  409. glm_mat3_transpose_to(mat, dest);
  410. .. csv-table:: mat3 **(mat)**
  411. :header: "", "column 1", "column 2", "column 3"
  412. "row 1", "1.00", "4.00", "7.00"
  413. "row 2", "2.00", "5.00", "8.00"
  414. "row 3", "3.00", "6.00", "9.00"
  415. .. csv-table:: mat3 **(dest)** Before
  416. :header: "", "column 1", "column 2", "column 3"
  417. "row 1", "0.00", "0.00", "0.00"
  418. "row 2", "0.00", "0.00", "0.00"
  419. "row 3", "0.00", "0.00", "0.00"
  420. .. csv-table:: mat3 **(dest)** After
  421. :header: "", "column 1", "column 2", "column 3"
  422. "row 1", "1.00", "2.00", "3.00"
  423. "row 2", "4.00", "5.00", "6.00"
  424. "row 2", "7.00", "8.00", "9.00"
  425. .. c:function:: void glm_mat3_transpose(mat3 m)
  426. Transpose mat3 (m) and store result in the same matrix.
  427. Parameters:
  428. | *[in, out]* **m** mat3 (src, dest)
  429. .. note:: Mathematical explanation
  430. .. csv-table:: mat3 **(m)** src
  431. :header: "", "column 1", "column 2", "column 3"
  432. "row 1", "m00", "m10", "m20"
  433. "row 2", "m01", "m11", "m21"
  434. "row 2", "m02", "m12", "m22"
  435. .. csv-table:: mat3 **(m)** dest
  436. :header: "", "column 1", "column 2", "column 3"
  437. "row 1", "m00", "m01", "m02"
  438. "row 2", "m10", "m11", "m12"
  439. "row 3", "m20", "m21", "m22"
  440. .. note:: Example
  441. .. code-block:: c
  442. mat3 mat = {
  443. {1.00,2.00,3.00},
  444. {4.00,5.00,6.00},
  445. {7.00,8.00,9.00},
  446. };
  447. glm_mat3_transpose(m);
  448. .. csv-table:: mat3 **(m)** Before
  449. :header: "", "column 1", "column 2", "column 3"
  450. "row 1", "1.00", "4.00", "7.00"
  451. "row 2", "2.00", "5.00", "8.00"
  452. "row 3", "3.00", "6.00", "9.00"
  453. .. csv-table:: mat3 **(m)** After
  454. :header: "", "column 1", "column 2", "column 3"
  455. "row 1", "1.00", "2.00", "3.00"
  456. "row 2", "4.00", "5.00", "6.00"
  457. "row 2", "7.00", "8.00", "9.00"
  458. .. c:function:: void glm_mat3_scale(mat3 m, float s)
  459. Multiply mat3 (m) by scalar constant (s).
  460. Parameters:
  461. | *[in, out]* **m** mat3 (src, dest)
  462. | *[in]* **s** float (scalar)
  463. .. note:: Mathematical explanation
  464. .. csv-table:: mat3 **(m)**
  465. :header: "", "column 1", "column 2", "column 3"
  466. "row 1", "m00 * s", "m10 * s", "m20 * s"
  467. "row 2", "m01 * s", "m11 * s", "m21 * s"
  468. "row 3", "m02 * s", "m12 * s", "m22 * s"
  469. .. note:: Example
  470. .. code-block:: c
  471. mat3 m = {
  472. {1.00,2.00,3.00},
  473. {4.00,5.00,6.00},
  474. {7.00,8.00,9.00},
  475. };
  476. float s = 3.00f;
  477. glm_mat3_scale(m, s);
  478. .. csv-table:: mat3 **(m)** Before
  479. :header: "", "column 1", "column 2", "column 3"
  480. "row 1", "1.00", "4.00", "7.00"
  481. "row 2", "2.00", "5.00", "8.00"
  482. "row 3", "3.00", "6.00", "9.00"
  483. .. list-table:: mat3 **(m)** After
  484. :header-rows: 1
  485. * -
  486. - column 1
  487. - column 2
  488. - column 3
  489. * - row 1
  490. - **3.00** = 1.00 * 3.00
  491. - **12.00** = 4.00 * 3.00
  492. - **21.00** = 7.00 * 3.00
  493. * - row 2
  494. - **6.00** = 2.00 * 3.00
  495. - **15.00** = 5.00 * 3.00
  496. - **24.00** = 8.00 * 3.00
  497. * - row 3
  498. - **9.00** = 3.00 * 3.00
  499. - **18.00** = 6.00 * 3.00
  500. - **27.00** = 9.00 * 3.00
  501. .. c:function:: void glm_mat3_inv(mat3 mat, mat3 dest)
  502. Inverse mat3 (mat) and store in mat3 (dest).
  503. Parameters:
  504. | *[in]* **mat** mat3 (left, src)
  505. | *[out]* **dest** destination (result, inverse mat3)
  506. .. note:: Mathematical explanation
  507. .. csv-table:: mat3 **(mat)**
  508. :header: "", "column 1", "column 2", "column 3", "", ""
  509. "row 1", "m00", "m10", "m20", "**m00**", "**m10**"
  510. "row 2", "m01", "m11", "m21", "**m01**", "**m11**"
  511. "row 3", "m02", "m12", "m22", "**m02**", "**m12**"
  512. " ", "**m00**", "**m10**", "**m20**", "**m00**", "**m10**"
  513. " ", "**m01**", "**m11**", "**m21**", "**m01**", "**m11**"
  514. | For more information see `How to find the inverse of a 3 by 3 matrix (the fast way)[youtube]`_.
  515. | Remember we are in column major not row major. So, the way the table is populated is slightly different.
  516. | In terms of multiplication priority goes from m00,m01,m02,m11,...,m22.
  517. | May utilize the distributive law to acquire bellow equations
  518. .. math::
  519. (m00 * m11 * m22) - (m00 * m21 * m12) = m00 * (m11 * m22 - m21 * m12)
  520. .. list-table:: mat3 **(dest)**
  521. :header-rows: 1
  522. * -
  523. - column 1
  524. - column 2
  525. - column 3
  526. * - row 1
  527. - | 1.0f / (
  528. | m00 * (m11 * m22 - m12 * m21) -
  529. | m01 * (m10 * m22 - m20 * m12) +
  530. | m02 * (m10 * m21 - m20 * m11)
  531. | ) * (m11 * m22 - m12 * m21)
  532. - | -( 1.0f / (
  533. | m00 * (m11 * m22 - m12 * m21) -
  534. | m01 * (m10 * m22 - m20 * m12) +
  535. | m02 * (m10 * m21 - m20 * m11)
  536. | ) ) * (m10 * m22 - m20 * m12)
  537. - | 1.0f / (
  538. | m00 * (m11 * m22 - m12 * m21) -
  539. | m01 * (m10 * m22 - m20 * m12) +
  540. | m02 * (m10 * m21 - m20 * m11)
  541. | ) * (m10 * m21 - m11 * m20)
  542. * - row 2
  543. - | -( 1.0f / (
  544. | m00 * (m11 * m22 - m12 * m21) -
  545. | m01 * (m10 * m22 - m20 * m12) +
  546. | m02 * (m10 * m21 - m20 * m11)
  547. | ) ) * (m01 * m22 - m21 * m02)
  548. - | 1.0f / (
  549. | m00 * (m11 * m22 - m12 * m21) -
  550. | m01 * (m10 * m22 - m20 * m12) +
  551. | m02 * (m10 * m21 - m20 * m11)
  552. | ) * (m00 * m22 - m20 * m02)
  553. - | -( 1.0f / (
  554. | m00 * (m11 * m22 - m12 * m21) -
  555. | m01 * (m10 * m22 - m20 * m12) +
  556. | m02 * (m10 * m21 - m20 * m11)
  557. | ) ) * (m00 * m21 - m20 * m01)
  558. * - row 3
  559. - | 1.0f / (
  560. | m00 * (m11 * m22 - m12 * m21) -
  561. | m01 * (m10 * m22 - m20 * m12) +
  562. | m02 * (m10 * m21 - m20 * m11)
  563. | ) * (m01 * m12 - m11 * m02)
  564. - | -( 1.0f / (
  565. | m00 * (m11 * m22 - m12 * m21) -
  566. | m01 * (m10 * m22 - m20 * m12) +
  567. | m02 * (m10 * m21 - m20 * m11)
  568. | ) ) * (m00 * m12 - m10 * m02)
  569. - | 1.0f / (
  570. | m00 * (m11 * m22 - m12 * m21) -
  571. | m01 * (m10 * m22 - m20 * m12) +
  572. | m02 * (m10 * m21 - m20 * m11)
  573. | ) * (m00 * m11 - m10 * m01)
  574. .. note:: Example
  575. .. code-block:: c
  576. mat3 mat = {
  577. {8.00,6.00,5.00},
  578. {16.00,31.00,25.00},
  579. {13.00,18.00,7.00},
  580. };
  581. mat3 dest = GLM_MAT3_ZERO_INIT;
  582. glm_mat3_inv(mat, dest);
  583. .. csv-table:: mat3 **(mat)** Before
  584. :header: "", "column 1", "column 2", "column 3", "", ""
  585. "row 1", "8.00", "16.00", "13.00", "**8.00**", "**16.00**"
  586. "row 2", "6.00", "31.00", "18.00", "**6.00**", "**31.00**"
  587. "row 3", "5.00", "25.00", "7.00", "**5.00**", "**25.00**"
  588. " ", "**8.00**", "**16.00**", "**13.00**", "**8.00**", "**16.00**"
  589. " ", "**6.00**", "**31.00**", "**18.00**", "**6.00**", "**31.00**"
  590. .. list-table:: mat3 **(dest)** After
  591. :header-rows: 1
  592. * -
  593. - column 1
  594. - column 2
  595. - column 3
  596. * - row 1
  597. - | **0.200** = 1.0 / (
  598. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  599. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  600. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  601. | ) * (31.00 * 7.00 - 25.00 * 18.00)
  602. - | **-0.184** = -( 1.0 / (
  603. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  604. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  605. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  606. | ) ) * (16.00 * 7.00 - 13.00 * 25.00)
  607. - | **0.099** = 1.0 / (
  608. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  609. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  610. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  611. | ) * (16.00 * 18.00 - 31.00 * 13.00)
  612. * - row 2
  613. - | **-0.041** = -( 1.0 / (
  614. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  615. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  616. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  617. | ) ) * (6.00 * 7.00 - 18.00 * 5.00)
  618. - | **0.007** = 1.0 / (
  619. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  620. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  621. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  622. | ) * (8.00 * 7.00 - 13.00 * 5.00)
  623. - | **-0.056** = -( 1.0 / (
  624. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  625. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  626. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  627. | ) ) * (8.00 * 18.00 - 13.00 * 6.00)
  628. * - row 3
  629. - | **0.004** = 1.0 / (
  630. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  631. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  632. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  633. | ) * (6.00 * 25.00 - 31.00 * 5.00)
  634. - | **0.103** = -( 1.0 / (
  635. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  636. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  637. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  638. | ) ) * (8.00 * 25.00 - 16.00 * 5.00)
  639. - | **-0.130** = 1.0 / (
  640. | 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  641. | 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  642. | 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  643. | ) * (8.00 * 31.00 - 16.00 * 6.00)
  644. .. c:function:: void glm_mat3_swap_col(mat3 mat, int col1, int col2)
  645. Swap two columns in mat3 (mat) and store in same matrix.
  646. Parameters:
  647. | *[in, out]* **mat** mat3 (src, dest)
  648. | *[in]* **col1** Column 1 array index
  649. | *[in]* **col2** Column 2 array index
  650. .. note:: Mathematical explanation
  651. .. csv-table:: mat3 **(mat)** Before
  652. :header: "", "column 1", "column 2", "column 3"
  653. "row 1", "m00", "m10", "m20"
  654. "row 2", "m01", "m11", "m21"
  655. "row 3", "m02", "m12", "m22"
  656. .. code-block:: c
  657. glm_mat3_swap_col(mat, 0, 1);
  658. .. csv-table:: mat3 **(mat)** After
  659. :header: "", "column 1", "column 2", "column 3"
  660. "row 1", "m10", "m00", "m20"
  661. "row 2", "m11", "m01", "m21"
  662. "row 3", "m12", "m02", "m22"
  663. .. note:: Example
  664. .. code-block:: c
  665. mat3 mat = {
  666. {8.00,6.00,5.00},
  667. {16.00,31.00,25.00},
  668. {13.00,18.00,7.00},
  669. };
  670. glm_mat3_swap_col(mat, 0, 1);
  671. .. csv-table:: mat3 **(mat)** Before
  672. :header: "", "column 1", "column 2", "column 3"
  673. "row 1", "8.00", "16.00", "13.00"
  674. "row 2", "6.00", "31.00", "18.00"
  675. "row 3", "5.00", "25.00", "7.00"
  676. .. csv-table:: mat3 **(mat)** After
  677. :header: "", "column 1", "column 2", "column 3"
  678. "row 1", "16.00", "8.00", "13.00"
  679. "row 2", "31.00", "6.00", "18.00"
  680. "row 3", "25.00", "5.00", "7.00"
  681. .. c:function:: void glm_mat3_swap_row(mat3 mat, int row1, int row2)
  682. Swap two rows in mat3 (mat) and store in same matrix.
  683. Parameters:
  684. | *[in, out]* **mat** mat3 (src, dest)
  685. | *[in]* **row1** Row 1 array index
  686. | *[in]* **row2** Row 2 array index
  687. .. note:: Mathematical explanation
  688. .. csv-table:: mat3 **(mat)** Before
  689. :header: "", "column 1", "column 2", "column 3"
  690. "row 1", "m00", "m10", "m20"
  691. "row 2", "m01", "m11", "m21"
  692. "row 3", "m02", "m12", "m22"
  693. .. code-block:: c
  694. glm_mat3_swap_row(mat, 0, 1);
  695. .. csv-table:: mat3 **(mat)** After
  696. :header: "", "column 1", "column 2", "column 3"
  697. "row 1", "m01", "m11", "m21"
  698. "row 2", "m00", "m10", "m20"
  699. "row 3", "m02", "m12", "m22"
  700. .. note:: Example
  701. .. code-block:: c
  702. mat3 mat = {
  703. {8.00,6.00,5.00},
  704. {16.00,31.00,25.00},
  705. {13.00,18.00,7.00},
  706. };
  707. glm_mat3_swap_col(mat, 0, 1);
  708. .. csv-table:: mat3 **(mat)** Before
  709. :header: "", "column 1", "column 2", "column 3"
  710. "row 1", "8.00", "16.00", "13.00"
  711. "row 2", "6.00", "31.00", "18.00"
  712. "row 3", "5.00", "25.00", "7.00"
  713. .. csv-table:: mat3 **(mat)** After
  714. :header: "", "column 1", "column 2", "column 3"
  715. "row 1", "6.00", "31.00", "18.00"
  716. "row 2", "8.00", "16.00", "13.00"
  717. "row 3", "5.00", "25.00", "7.00"
  718. .. c:function:: void glm_mat3_quat(mat3 m, versor dest)
  719. convert mat3 to quaternion
  720. Parameters:
  721. | *[in]* **m** rotation matrix
  722. | *[out]* **dest** destination quaternion
  723. .. c:function:: void glm_mat3_textrans(float sx, float sy, float rot, float tx, float ty, mat3 dest)
  724. Create texture transformation matrix, rotation is in radians CCW/RH
  725. Parameters:
  726. | *[in]* **sx** scale x
  727. | *[in]* **sy** scale y
  728. | *[in]* **rot** rotation in radians CCW/RH
  729. | *[in]* **tx** translation x
  730. | *[in]* **ty** translation y
  731. | *[out]* **dest** destination matrix3x3
  732. .. c:function:: float glm_mat3_det(mat3 m)
  733. Returns mat3 determinant.
  734. Parameters:
  735. | *[in]* **m** mat3 (src)
  736. Returns:
  737. | mat3 determinant (float)
  738. .. note:: Mathematical explanation
  739. .. csv-table:: mat3 **(mat)**
  740. :header: "", "column 1", "column 2", "column 3", "", ""
  741. "row 1", "m00", "m10", "m20", "**m00**", "**m10**"
  742. "row 2", "m01", "m11", "m21", "**m01**", "**m11**"
  743. "row 3", "m02", "m12", "m22", "**m02**", "**m12**"
  744. " ", "**m00**", "**m10**", "**m20**", "**m00**", "**m10**"
  745. " ", "**m01**", "**m11**", "**m21**", "**m01**", "**m11**"
  746. | For more information see first portion of
  747. | `How to find the inverse of a 3 by 3 matrix (the fast way)[youtube]`_.
  748. .. code-block:: c
  749. m00 * (m11 * m22 - m12 * m21) -
  750. m01 * (m10 * m22 - m20 * m12) +
  751. m02 * (m10 * m21 - m20 * m11)
  752. .. note:: Example
  753. .. code-block:: c
  754. mat3 m = {
  755. {8.00,6.00,5.00},
  756. {16.00,31.00,25.00},
  757. {13.00,18.00,7.00},
  758. };
  759. glm_mat3_det(m);
  760. .. csv-table:: mat3 **(m)**
  761. :header: "", "column 1", "column 2", "column 3", "", ""
  762. "row 1", "8.00", "16.00", "13.00", "**8.00**", "**16.00**"
  763. "row 2", "6.00", "31.00", "18.00", "**6.00**", "**31.00**"
  764. "row 3", "5.00", "25.00", "7.00", "**5.00**", "**25.00**"
  765. .. code-block:: c
  766. -1161.00 = 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
  767. 6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
  768. 5.00 * (16.00 * 18.00 - 13.00 * 31.00)
  769. .. c:function:: void glm_mat3_trace(mat3 m)
  770. | Returns trace of matrix. Which is:
  771. |
  772. | The sum of the elements on the main diagonal from
  773. | upper left corner to the bottom right corner.
  774. Parameters:
  775. | *[in]* **m** mat3 (src)
  776. Returns:
  777. | mat3 trace (float)
  778. .. note:: Mathematical explanation
  779. .. csv-table:: mat3 **(m)**
  780. :header: "", "column 1", "column 2", "column 3"
  781. "row 1", "m00", "m10", "m20"
  782. "row 2", "m01", "m11", "m21"
  783. "row 3", "m02", "m12", "m22"
  784. .. code-block:: c
  785. m00 + m11 + m22
  786. .. note:: Example
  787. .. code-block:: c
  788. mat3 m = {
  789. {8.00,6.00,5.00},
  790. {16.00,31.00,25.00},
  791. {13.00,18.00,7.00},
  792. };
  793. glm_mat3_trace(m);
  794. .. csv-table:: mat3 **(m)**
  795. :header: "", "column 1", "column 2", "column 3"
  796. "row 1", "8.00", "16.00", "13.00"
  797. "row 2", "6.00", "31.00", "18.00"
  798. "row 3", "5.00", "25.00", "7.00"
  799. .. code-block:: c
  800. 82.00 = 8.00 + 31.00 + 7.00
  801. .. c:function:: float glm_mat3_rmc(vec3 r, mat3 m, vec3 c)
  802. | Helper for R (row vector) * M (matrix) * C (column vector)
  803. |
  804. | **rmc** stands for **Row** * **Matrix** * **Column**
  805. |
  806. | the result is scalar because M * C = ResC (1x2, column vector),
  807. | then if you take the dot_product(R (3x1), ResC (1x3)) = scalar value.
  808. Parameters:
  809. | *[in]* **r** vec3 (3x1, row vector)
  810. | *[in]* **m** mat3 (2x2, matrix)
  811. | *[in]* **c** vec3 (1x3, column vector)
  812. Returns:
  813. | Scalar value (float, 1x1)
  814. .. note:: Mathematical explanation
  815. .. csv-table:: row vec3 (3x1) **(r)**
  816. :header: "", "column 1", "column 2", "column 3"
  817. "row 1", "a00", "a10", "a20"
  818. .. csv-table:: mat3 **(m)**
  819. :header: "", "column 1", "column 2", "column 3"
  820. "row 1", "b00", "b10", "b20"
  821. "row 2", "b01", "b11", "b21"
  822. "row 3", "b02", "b12", "b22"
  823. .. csv-table:: column vec3 (1x3) **(c)**
  824. :header: "", "column 1"
  825. "row 1", "c00"
  826. "row 2", "c01"
  827. "row 3", "c02"
  828. .. code-block:: c
  829. M * C = C (column vector)
  830. dot_product(R, C)
  831. .. csv-table:: column vec3 (1x3) **(C)**
  832. :header: "", "column 1"
  833. "row 1", "b00 * c00 + b10 * c01 + b20 * c02"
  834. "row 2", "b01 * c00 + b11 * c01 + b21 * c02"
  835. "row 3", "b02 * c00 + b11 * c01 + b22 * c02"
  836. .. list-table:: float **(scalar)**
  837. :header-rows: 1
  838. * -
  839. - column 1
  840. * - row 1
  841. - | a00 * (b00 * c00 + b10 * c01 + b20 * c02) +
  842. | a10 * (b01 * c00 + b11 * c01 + b21 * c02) +
  843. | a20 * (b02 * c00 + b11 * c01 + b22 * c02)
  844. .. note:: Example
  845. .. code-block:: c
  846. vec3 r = {8.00,4.00,13.00};
  847. vec3 c = {7.00,2.00,9.00};
  848. mat3 m = {
  849. {8.00,6.00,5.00},
  850. {16.00,31.00,25.00},
  851. {13.00,18.00,7.00},
  852. };
  853. glm_mat3_rmc(r, m, c);
  854. .. csv-table:: row vec3 (3x1) **(r)**
  855. :header: "", "column 1", "column 2", "column 3"
  856. "row 1", "8.00", "4.00", "13.00"
  857. .. csv-table:: mat3 **(m)**
  858. :header: "", "column 1", "column 2", "column 3"
  859. "row 1", "8.00", "16.00", "13.00"
  860. "row 2", "6.00", "31.00", "18.00"
  861. "row 3", "5.00", "25.00", "7.00"
  862. .. csv-table:: column vec3 (1x3) **(c)**
  863. :header: "", "column 1"
  864. "row 1", "7.00"
  865. "row 2", "2.00"
  866. "row 3", "9.00"
  867. .. csv-table:: column vec3 (1x3) **(C)**
  868. :header: "", "column 1"
  869. "row 1", "**205.00** = 8.00 * 7.00 + 16.00 * 2.00 + 13.00 * 9.00"
  870. "row 2", "**266.00** = 6.00 * 7.00 + 31.00 * 2.00 + 18.00 * 9.00"
  871. "row 3", "**148.00** = 5.00 * 7.00 + 25.00 * 2.00 + 7.00 * 9.00"
  872. .. csv-table:: float (1x1) **(scalar)**
  873. :header: "", "column 1"
  874. "row 1", "**4628.00** = 8.00 * 205.00 + 4.00 * 266.00 + 13.00 * 148.00"
  875. .. _How to find the inverse of a 3 by 3 matrix (the fast way)[youtube]: https://www.youtube.com/watch?v=p8VnTCfJHAo