mat.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. #include "mat.h"
  2. #include <math.h>
  3. /**
  4. * sr_math.c
  5. * --------
  6. * provides an internal matrix representation (mat4)
  7. * and associated operations for the sr lib
  8. *
  9. */
  10. /*********************************************************************
  11. * *
  12. * matrices *
  13. * *
  14. *********************************************************************/
  15. /**********
  16. * matmul *
  17. **********/
  18. /* multiplies two 4x4 matrices, 'a' and 'b', stores the result in 'a' */
  19. void
  20. matmul(struct mat4* a, struct mat4* b)
  21. {
  22. struct mat4 tmp;
  23. tmp.e00 = a->e00 * b->e00 + a->e01 * b->e10 + a->e02 * b->e20 + a->e03 * b->e30;
  24. tmp.e01 = a->e00 * b->e01 + a->e01 * b->e11 + a->e02 * b->e21 + a->e03 * b->e31;
  25. tmp.e02 = a->e00 * b->e02 + a->e01 * b->e12 + a->e02 * b->e22 + a->e03 * b->e32;
  26. tmp.e03 = a->e00 * b->e03 + a->e01 * b->e13 + a->e02 * b->e23 + a->e03 * b->e33;
  27. tmp.e10 = a->e10 * b->e00 + a->e11 * b->e10 + a->e12 * b->e20 + a->e13 * b->e30;
  28. tmp.e11 = a->e10 * b->e01 + a->e11 * b->e11 + a->e12 * b->e21 + a->e13 * b->e31;
  29. tmp.e12 = a->e10 * b->e02 + a->e11 * b->e12 + a->e12 * b->e22 + a->e13 * b->e32;
  30. tmp.e13 = a->e10 * b->e03 + a->e11 * b->e13 + a->e12 * b->e23 + a->e13 * b->e33;
  31. tmp.e20 = a->e20 * b->e00 + a->e21 * b->e10 + a->e22 * b->e20 + a->e23 * b->e30;
  32. tmp.e21 = a->e20 * b->e01 + a->e21 * b->e11 + a->e22 * b->e21 + a->e23 * b->e31;
  33. tmp.e22 = a->e20 * b->e02 + a->e21 * b->e12 + a->e22 * b->e22 + a->e23 * b->e32;
  34. tmp.e23 = a->e20 * b->e03 + a->e21 * b->e13 + a->e22 * b->e23 + a->e23 * b->e33;
  35. tmp.e30 = a->e30 * b->e00 + a->e31 * b->e10 + a->e32 * b->e20 + a->e33 * b->e30;
  36. tmp.e31 = a->e30 * b->e01 + a->e31 * b->e11 + a->e32 * b->e21 + a->e33 * b->e31;
  37. tmp.e32 = a->e30 * b->e02 + a->e31 * b->e12 + a->e32 * b->e22 + a->e33 * b->e32;
  38. tmp.e33 = a->e30 * b->e03 + a->e31 * b->e13 + a->e32 * b->e23 + a->e33 * b->e33;
  39. *a = tmp;
  40. };
  41. /**********
  42. * invert *
  43. **********/
  44. /* inverts a 4x4 matrix, returns 0 if non invertible */
  45. int
  46. invert(struct mat4* a)
  47. {
  48. struct mat4 tmp;
  49. tmp.e00 = a->e11 * a->e22 * a->e33 -
  50. a->e11 * a->e23 * a->e32 -
  51. a->e21 * a->e12 * a->e33 +
  52. a->e21 * a->e13 * a->e32 +
  53. a->e31 * a->e12 * a->e23 -
  54. a->e31 * a->e13 * a->e22;
  55. tmp.e10 = -a->e10 * a->e22 * a->e33 +
  56. a->e10 * a->e23 * a->e32 +
  57. a->e20 * a->e12 * a->e33 -
  58. a->e20 * a->e13 * a->e32 -
  59. a->e30 * a->e12 * a->e23 +
  60. a->e30 * a->e13 * a->e22;
  61. tmp.e20 = a->e10 * a->e21 * a->e33 -
  62. a->e10 * a->e23 * a->e31 -
  63. a->e20 * a->e11 * a->e33 +
  64. a->e20 * a->e13 * a->e31 +
  65. a->e30 * a->e11 * a->e23 -
  66. a->e30 * a->e13 * a->e21;
  67. tmp.e30 = -a->e10 * a->e21 * a->e32 +
  68. a->e10 * a->e22 * a->e31 +
  69. a->e20 * a->e11 * a->e32 -
  70. a->e20 * a->e12 * a->e31 -
  71. a->e30 * a->e11 * a->e22 +
  72. a->e30 * a->e12 * a->e21;
  73. tmp.e01 = -a->e01 * a->e22 * a->e33 +
  74. a->e01 * a->e23 * a->e32 +
  75. a->e21 * a->e02 * a->e33 -
  76. a->e21 * a->e03 * a->e32 -
  77. a->e31 * a->e02 * a->e23 +
  78. a->e31 * a->e03 * a->e22;
  79. tmp.e11 = a->e00 * a->e22 * a->e33 -
  80. a->e00 * a->e23 * a->e32 -
  81. a->e20 * a->e02 * a->e33 +
  82. a->e20 * a->e03 * a->e32 +
  83. a->e30 * a->e02 * a->e23 -
  84. a->e30 * a->e03 * a->e22;
  85. tmp.e21 = -a->e00 * a->e21 * a->e33 +
  86. a->e00 * a->e23 * a->e31 +
  87. a->e20 * a->e01 * a->e33 -
  88. a->e20 * a->e03 * a->e31 -
  89. a->e30 * a->e01 * a->e23 +
  90. a->e30 * a->e03 * a->e21;
  91. tmp.e31 = a->e00 * a->e21 * a->e32 -
  92. a->e00 * a->e22 * a->e31 -
  93. a->e20 * a->e01 * a->e32 +
  94. a->e20 * a->e02 * a->e31 +
  95. a->e30 * a->e01 * a->e22 -
  96. a->e30 * a->e02 * a->e21;
  97. tmp.e02 = a->e01 * a->e12 * a->e33 -
  98. a->e01 * a->e13 * a->e32 -
  99. a->e11 * a->e02 * a->e33 +
  100. a->e11 * a->e03 * a->e32 +
  101. a->e31 * a->e02 * a->e13 -
  102. a->e31 * a->e03 * a->e12;
  103. tmp.e12 = -a->e00 * a->e12 * a->e33 +
  104. a->e00 * a->e13 * a->e32 +
  105. a->e10 * a->e02 * a->e33 -
  106. a->e10 * a->e03 * a->e32 -
  107. a->e30 * a->e02 * a->e13 +
  108. a->e30 * a->e03 * a->e12;
  109. tmp.e22 = a->e00 * a->e11 * a->e33 -
  110. a->e00 * a->e13 * a->e31 -
  111. a->e10 * a->e01 * a->e33 +
  112. a->e10 * a->e03 * a->e31 +
  113. a->e30 * a->e01 * a->e13 -
  114. a->e30 * a->e03 * a->e11;
  115. tmp.e32 = -a->e00 * a->e11 * a->e32 +
  116. a->e00 * a->e12 * a->e31 +
  117. a->e10 * a->e01 * a->e32 -
  118. a->e10 * a->e02 * a->e31 -
  119. a->e30 * a->e01 * a->e12 +
  120. a->e30 * a->e02 * a->e11;
  121. tmp.e03 = -a->e01 * a->e12 * a->e23 +
  122. a->e01 * a->e13 * a->e22 +
  123. a->e11 * a->e02 * a->e23 -
  124. a->e11 * a->e03 * a->e22 -
  125. a->e21 * a->e02 * a->e13 +
  126. a->e21 * a->e03 * a->e12;
  127. tmp.e13 = a->e00 * a->e12 * a->e23 -
  128. a->e00 * a->e13 * a->e22 -
  129. a->e10 * a->e02 * a->e23 +
  130. a->e10 * a->e03 * a->e22 +
  131. a->e20 * a->e02 * a->e13 -
  132. a->e20 * a->e03 * a->e12;
  133. tmp.e23 = -a->e00 * a->e11 * a->e23 +
  134. a->e00 * a->e13 * a->e21 +
  135. a->e10 * a->e01 * a->e23 -
  136. a->e10 * a->e03 * a->e21 -
  137. a->e20 * a->e01 * a->e13 +
  138. a->e20 * a->e03 * a->e11;
  139. tmp.e33 = a->e00 * a->e11 * a->e22 -
  140. a->e00 * a->e12 * a->e21 -
  141. a->e10 * a->e01 * a->e22 +
  142. a->e10 * a->e02 * a->e21 +
  143. a->e20 * a->e01 * a->e12 -
  144. a->e20 * a->e02 * a->e11;
  145. float det = a->e00 * tmp.e00 + a->e01 * tmp.e10 +
  146. a->e02 * tmp.e20 + a->e03 * tmp.e30;
  147. if (det == 0)
  148. return 0;
  149. det = 1.0 / det;
  150. tmp.e00 *= det;
  151. tmp.e01 *= det;
  152. tmp.e02 *= det;
  153. tmp.e03 *= det;
  154. tmp.e10 *= det;
  155. tmp.e11 *= det;
  156. tmp.e12 *= det;
  157. tmp.e13 *= det;
  158. tmp.e20 *= det;
  159. tmp.e21 *= det;
  160. tmp.e22 *= det;
  161. tmp.e23 *= det;
  162. tmp.e30 *= det;
  163. tmp.e31 *= det;
  164. tmp.e32 *= det;
  165. tmp.e33 *= det;
  166. *a = tmp;
  167. return 1;
  168. }
  169. /*************
  170. * transpose *
  171. *************/
  172. /* transpose of a 4x4 matrix */
  173. void
  174. transpose(struct mat4* a) {
  175. struct mat4 tmp;
  176. tmp.e00 = a->e00;
  177. tmp.e01 = a->e10;
  178. tmp.e02 = a->e20;
  179. tmp.e03 = a->e30;
  180. tmp.e10 = a->e01;
  181. tmp.e11 = a->e11;
  182. tmp.e12 = a->e21;
  183. tmp.e13 = a->e31;
  184. tmp.e20 = a->e02;
  185. tmp.e21 = a->e12;
  186. tmp.e22 = a->e22;
  187. tmp.e23 = a->e32;
  188. tmp.e30 = a->e03;
  189. tmp.e31 = a->e13;
  190. tmp.e32 = a->e23;
  191. tmp.e33 = a->e33;
  192. *a = tmp;
  193. }
  194. /*************
  195. * upper_3x3 *
  196. *************/
  197. /* converts 4x4 matrix to its upper 3x3 matrix by filling 0s */
  198. void
  199. upper_3x3(struct mat4* a) {
  200. a->e03 = 0;
  201. a->e13 = 0;
  202. a->e23 = 0;
  203. a->e30 = 0;
  204. a->e31 = 0;
  205. a->e32 = 0;
  206. a->e33 = 1;
  207. }
  208. /*********************************************************************
  209. * *
  210. * vec4 operations *
  211. * *
  212. *********************************************************************/
  213. /***************
  214. * vec4_matmul *
  215. ***************/
  216. /* applys the matrix 'b' to vector 'c', stores result in vector 'a' */
  217. void
  218. vec4_matmul(float* a, struct mat4* b, float* c)
  219. {
  220. a[0] = c[0] * b->e00 + c[1] * b->e01 + c[2] * b->e02 + c[3] * b->e03;
  221. a[1] = c[0] * b->e10 + c[1] * b->e11 + c[2] * b->e12 + c[3] * b->e13;
  222. a[2] = c[0] * b->e20 + c[1] * b->e21 + c[2] * b->e22 + c[3] * b->e23;
  223. a[3] = c[0] * b->e30 + c[1] * b->e31 + c[2] * b->e32 + c[3] * b->e33;
  224. }
  225. /************
  226. * vec4_mul *
  227. ************/
  228. /* multiplies vec4 'b' and 'c' componentwise, result in 'a' */
  229. void
  230. vec4_mul(float* a, float* b, float* c)
  231. {
  232. a[0] = b[0] * c[0];
  233. a[1] = b[1] * c[1];
  234. a[2] = b[2] * c[2];
  235. a[3] = b[3] * c[3];
  236. }
  237. /************
  238. * vec4_add *
  239. ***********/
  240. /* adds vec4 'b' to 'c' and stores result in 'a' */
  241. void
  242. vec4_add(float* a, float* b, float* c)
  243. {
  244. a[0] = b[0] + c[0];
  245. a[1] = b[1] + c[1];
  246. a[2] = b[2] + c[2];
  247. a[3] = b[3] + c[3];
  248. }
  249. /**************
  250. * vec4_scale *
  251. **************/
  252. /* multiplies vec4 'b' by scalar 'c' and stores result in 'a' */
  253. void
  254. vec4_scale(float* a, float* b, float c)
  255. {
  256. a[0] = b[0] * c;
  257. a[1] = b[1] * c;
  258. a[2] = b[2] * c;
  259. a[3] = b[3] * c;
  260. }
  261. /*************
  262. * vec4_lerp *
  263. *************/
  264. /* linear interpolation for vec4s, result in 'a' */
  265. void
  266. lerp(float* a, float* b, float* c, float alpha)
  267. {
  268. a[0] = b[0] + (c[0] - b[0]) * alpha;
  269. a[1] = b[1] + (c[1] - b[1]) * alpha;
  270. a[2] = b[2] + (c[2] - b[2]) * alpha;
  271. a[3] = b[3] + (c[3] - b[3]) * alpha;
  272. }
  273. /*********************************************************************
  274. * *
  275. * vec3 operations *
  276. * *
  277. *********************************************************************/
  278. /************
  279. * vec3_sub *
  280. ************/
  281. /* subtracts vec3 'c' from 'b' and stores result in 'a' */
  282. void
  283. vec3_sub(float* a, float* b, float* c)
  284. {
  285. a[0] = b[0] - c[0];
  286. a[1] = b[1] - c[1];
  287. a[2] = b[2] - c[2];
  288. }
  289. /************
  290. * vec3_add *
  291. ***********/
  292. /* adds vec3 'b' to 'c' and stores result in 'a' */
  293. void
  294. vec3_add(float* a, float* b, float* c)
  295. {
  296. a[0] = b[0] + c[0];
  297. a[1] = b[1] + c[1];
  298. a[2] = b[2] + c[2];
  299. }
  300. /**************
  301. * vec3_scale *
  302. **************/
  303. /* multiplies vec3 'b' by scalar 'c' and stores result in 'a' */
  304. void
  305. vec3_scale(float* a, float* b, float c)
  306. {
  307. a[0] = b[0] * c;
  308. a[1] = b[1] * c;
  309. a[2] = b[2] * c;
  310. }
  311. /*********************************************************************
  312. * *
  313. * geometry *
  314. * *
  315. *********************************************************************/
  316. /***********
  317. * reflect *
  318. ***********/
  319. /* reflects a vec3 'l' across a normal 'n', result in 'r' */
  320. void
  321. reflect(float* r, float* l, float* n)
  322. {
  323. float tmp[3];
  324. vec3_scale(tmp, n, 2 * dot(l, n));
  325. vec3_sub(r, tmp, l);
  326. }
  327. /*******
  328. * dot *
  329. *******/
  330. /* dot product of two vec3s */
  331. float
  332. dot(float* a, float* b)
  333. {
  334. return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
  335. }
  336. /*********
  337. * cross *
  338. *********/
  339. /* applys the cross product 'b' x 'c', stores result in 'a' */
  340. void
  341. cross(float* a, float* b, float* c)
  342. {
  343. a[0] = (b[1] * c[2]) - (b[2] * c[1]);
  344. a[1] = (b[2] * c[0]) - (b[0] * c[2]);
  345. a[2] = (b[0] * c[1]) - (b[1] * c[0]);
  346. }
  347. /*************
  348. * magnitude *
  349. *************/
  350. /* returns the magnitude of a vec3 */
  351. float
  352. magnitude(float* a)
  353. {
  354. return sqrt(pow(a[0], 2) + pow(a[1], 2) + pow(a[2], 2));
  355. }
  356. /*************
  357. * normalize *
  358. *************/
  359. /* normalizes vec3 in place */
  360. void
  361. normalize(float* a)
  362. {
  363. float m = magnitude(a);
  364. a[0] = a[0] / m;
  365. a[1] = a[1] / m;
  366. a[2] = a[2] / m;
  367. }
  368. /*********************************************************************
  369. * *
  370. * misc *
  371. * *
  372. *********************************************************************/
  373. /***********
  374. * radians *
  375. ***********/
  376. /* converts degrees to radians */
  377. float
  378. radians(float deg)
  379. {
  380. return deg * (M_PI / 180);
  381. }