Matrix.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. /*
  2. h k modulu s maticema
  3. */
  4. #ifndef __MATRIX_H
  5. #define __MATRIX_H
  6. // vynuluje matici
  7. inline GLMATRIX * zero_matrix(GLMATRIX * m)
  8. {
  9. memset(m, 0, sizeof(*m));
  10. return (m);
  11. }
  12. // Standartni kody na praci s maticemi
  13. // Nastavi matici na jednotkovou
  14. inline GLMATRIX * init_matrix(GLMATRIX * m)
  15. {
  16. m->_11 = m->_22 = m->_33 = m->_44 = 1;
  17. m->_12 = m->_13 = m->_14 = m->_41 = 0;
  18. m->_21 = m->_23 = m->_24 = m->_42 = 0;
  19. m->_31 = m->_32 = m->_34 = m->_43 = 0;
  20. return (m);
  21. }
  22. // Nasobeni matic 'a' a 'b' do matice 'r'
  23. // Alespon doufam po me konverzi :-)
  24. inline GLMATRIX * mat_mult(GLMATRIX * a, GLMATRIX * b, GLMATRIX * r)
  25. {
  26. GLMATRIX tmp;
  27. tmp._11 =
  28. a->_11 * b->_11 + a->_12 * b->_21 + a->_13 * b->_31 + a->_14 * b->_41;
  29. tmp._21 =
  30. a->_21 * b->_11 + a->_22 * b->_21 + a->_23 * b->_31 + a->_24 * b->_41;
  31. tmp._31 =
  32. a->_31 * b->_11 + a->_32 * b->_21 + a->_33 * b->_31 + a->_34 * b->_41;
  33. tmp._41 =
  34. a->_41 * b->_11 + a->_42 * b->_21 + a->_43 * b->_31 + a->_44 * b->_41;
  35. tmp._12 =
  36. a->_11 * b->_12 + a->_12 * b->_22 + a->_13 * b->_32 + a->_14 * b->_42;
  37. tmp._22 =
  38. a->_21 * b->_12 + a->_22 * b->_22 + a->_23 * b->_32 + a->_24 * b->_42;
  39. tmp._32 =
  40. a->_31 * b->_12 + a->_32 * b->_22 + a->_33 * b->_32 + a->_34 * b->_42;
  41. tmp._42 =
  42. a->_41 * b->_12 + a->_42 * b->_22 + a->_43 * b->_32 + a->_44 * b->_42;
  43. tmp._13 =
  44. a->_11 * b->_13 + a->_12 * b->_23 + a->_13 * b->_33 + a->_14 * b->_43;
  45. tmp._23 =
  46. a->_21 * b->_13 + a->_22 * b->_23 + a->_23 * b->_33 + a->_24 * b->_43;
  47. tmp._33 =
  48. a->_31 * b->_13 + a->_32 * b->_23 + a->_33 * b->_33 + a->_34 * b->_43;
  49. tmp._43 =
  50. a->_41 * b->_13 + a->_42 * b->_23 + a->_43 * b->_33 + a->_44 * b->_43;
  51. tmp._14 =
  52. a->_11 * b->_14 + a->_12 * b->_24 + a->_13 * b->_34 + a->_14 * b->_44;
  53. tmp._24 =
  54. a->_21 * b->_14 + a->_22 * b->_24 + a->_23 * b->_34 + a->_24 * b->_44;
  55. tmp._34 =
  56. a->_31 * b->_14 + a->_32 * b->_24 + a->_33 * b->_34 + a->_34 * b->_44;
  57. tmp._44 =
  58. a->_41 * b->_14 + a->_42 * b->_24 + a->_43 * b->_34 + a->_44 * b->_44;
  59. memcpy(r, &tmp, sizeof(GLMATRIX));
  60. return (r);
  61. }
  62. inline GLMATRIX * mat_add(GLMATRIX * a, GLMATRIX * b, GLMATRIX * r)
  63. {
  64. r->_11 = a->_11 + b->_11;
  65. r->_12 = a->_12 + b->_12;
  66. r->_13 = a->_13 + b->_13;
  67. r->_14 = a->_14 + b->_14;
  68. r->_21 = a->_21 + b->_21;
  69. r->_22 = a->_22 + b->_22;
  70. r->_23 = a->_23 + b->_23;
  71. r->_24 = a->_24 + b->_24;
  72. r->_31 = a->_31 + b->_31;
  73. r->_32 = a->_32 + b->_32;
  74. r->_33 = a->_33 + b->_33;
  75. r->_34 = a->_34 + b->_34;
  76. r->_41 = a->_41 + b->_41;
  77. r->_42 = a->_42 + b->_42;
  78. r->_43 = a->_43 + b->_43;
  79. r->_44 = a->_44 + b->_44;
  80. return (r);
  81. }
  82. inline GLMATRIX * mat_mult_skalar(GLMATRIX * r, float scale)
  83. {
  84. r->_11 *= scale;
  85. r->_12 *= scale;
  86. r->_13 *= scale;
  87. r->_14 *= scale;
  88. r->_21 *= scale;
  89. r->_22 *= scale;
  90. r->_23 *= scale;
  91. r->_24 *= scale;
  92. r->_31 *= scale;
  93. r->_32 *= scale;
  94. r->_33 *= scale;
  95. r->_34 *= scale;
  96. r->_41 *= scale;
  97. r->_42 *= scale;
  98. r->_43 *= scale;
  99. r->_44 *= scale;
  100. return (r);
  101. }
  102. inline int mat_porovnej(GLMATRIX * r, GLMATRIX * a)
  103. {
  104. if (r->_11 != a->_11)
  105. return (FALSE);
  106. if (r->_12 != a->_12)
  107. return (FALSE);
  108. if (r->_13 != a->_13)
  109. return (FALSE);
  110. if (r->_14 != a->_14)
  111. return (FALSE);
  112. if (r->_21 != a->_21)
  113. return (FALSE);
  114. if (r->_22 != a->_22)
  115. return (FALSE);
  116. if (r->_23 != a->_23)
  117. return (FALSE);
  118. if (r->_24 != a->_24)
  119. return (FALSE);
  120. if (r->_31 != a->_31)
  121. return (FALSE);
  122. if (r->_32 != a->_32)
  123. return (FALSE);
  124. if (r->_33 != a->_33)
  125. return (FALSE);
  126. if (r->_34 != a->_34)
  127. return (FALSE);
  128. if (r->_41 != a->_41)
  129. return (FALSE);
  130. if (r->_42 != a->_42)
  131. return (FALSE);
  132. if (r->_43 != a->_43)
  133. return (FALSE);
  134. if (r->_44 != a->_44)
  135. return (FALSE);
  136. return (TRUE);
  137. }
  138. inline GLMATRIX * mat_copy(GLMATRIX * d, GLMATRIX * s)
  139. {
  140. return ((GLMATRIX *) memcpy(d, s, sizeof(*d)));
  141. }
  142. inline GLMATRIX * mat_mult_dir(GLMATRIX * a, GLMATRIX * b, GLMATRIX * r)
  143. {
  144. r->_11 =
  145. a->_11 * b->_11 + a->_12 * b->_21 + a->_13 * b->_31 + a->_14 * b->_41;
  146. r->_21 =
  147. a->_21 * b->_11 + a->_22 * b->_21 + a->_23 * b->_31 + a->_24 * b->_41;
  148. r->_31 =
  149. a->_31 * b->_11 + a->_32 * b->_21 + a->_33 * b->_31 + a->_34 * b->_41;
  150. r->_41 =
  151. a->_41 * b->_11 + a->_42 * b->_21 + a->_43 * b->_31 + a->_44 * b->_41;
  152. r->_12 =
  153. a->_11 * b->_12 + a->_12 * b->_22 + a->_13 * b->_32 + a->_14 * b->_42;
  154. r->_22 =
  155. a->_21 * b->_12 + a->_22 * b->_22 + a->_23 * b->_32 + a->_24 * b->_42;
  156. r->_32 =
  157. a->_31 * b->_12 + a->_32 * b->_22 + a->_33 * b->_32 + a->_34 * b->_42;
  158. r->_42 =
  159. a->_41 * b->_12 + a->_42 * b->_22 + a->_43 * b->_32 + a->_44 * b->_42;
  160. r->_13 =
  161. a->_11 * b->_13 + a->_12 * b->_23 + a->_13 * b->_33 + a->_14 * b->_43;
  162. r->_23 =
  163. a->_21 * b->_13 + a->_22 * b->_23 + a->_23 * b->_33 + a->_24 * b->_43;
  164. r->_33 =
  165. a->_31 * b->_13 + a->_32 * b->_23 + a->_33 * b->_33 + a->_34 * b->_43;
  166. r->_43 =
  167. a->_41 * b->_13 + a->_42 * b->_23 + a->_43 * b->_33 + a->_44 * b->_43;
  168. r->_14 =
  169. a->_11 * b->_14 + a->_12 * b->_24 + a->_13 * b->_34 + a->_14 * b->_44;
  170. r->_24 =
  171. a->_21 * b->_14 + a->_22 * b->_24 + a->_23 * b->_34 + a->_24 * b->_44;
  172. r->_34 =
  173. a->_31 * b->_14 + a->_32 * b->_24 + a->_33 * b->_34 + a->_34 * b->_44;
  174. r->_44 =
  175. a->_41 * b->_14 + a->_42 * b->_24 + a->_43 * b->_34 + a->_44 * b->_44;
  176. return (r);
  177. }
  178. // Rotace kolem osy x o uhel angle
  179. inline GLMATRIX * rotate_matrix_x(GLMATRIX * m, float angle)
  180. {
  181. GLMATRIX r;
  182. float ssin = (float) sin(angle);
  183. float ccos = (float) cos(angle);
  184. // a = rotate matrix
  185. // b = m
  186. r._11 = m->_11;
  187. r._21 = ccos * m->_21 + ssin * m->_31;
  188. r._31 = -ssin * m->_21 + ccos * m->_31;
  189. r._41 = m->_41;
  190. r._12 = m->_12;
  191. r._22 = ccos * m->_22 + ssin * m->_32;
  192. r._32 = -ssin * m->_22 + ccos * m->_32;
  193. r._42 = m->_42;
  194. r._13 = m->_13;
  195. r._23 = ccos * m->_23 + ssin * m->_33;
  196. r._33 = -ssin * m->_23 + ccos * m->_33;
  197. r._43 = m->_43;
  198. r._14 = m->_14;
  199. r._24 = ccos * m->_24 + ssin * m->_34;
  200. r._34 = -ssin * m->_24 + ccos * m->_34;
  201. r._44 = m->_44;
  202. *m = r;
  203. return (m);
  204. }
  205. // Rotace kolem osy y o uhel angle
  206. inline GLMATRIX * rotate_matrix_y(GLMATRIX * m, float angle)
  207. {
  208. GLMATRIX r;
  209. float ssin = (float) sin(angle);
  210. float ccos = (float) cos(angle);
  211. // a = temp
  212. // b = m
  213. r._11 = ccos * m->_11 + ssin * m->_31;
  214. r._21 = m->_21;
  215. r._31 = -ssin * m->_11 + ccos * m->_31;
  216. r._41 = m->_41;
  217. r._12 = ccos * m->_12 + ssin * m->_32;
  218. r._22 = m->_22;
  219. r._32 = -ssin * m->_12 + ccos * m->_32;
  220. r._42 = m->_42;
  221. r._13 = ccos * m->_13 + ssin * m->_33;
  222. r._23 = m->_23;
  223. r._33 = -ssin * m->_13 + ccos * m->_33;
  224. r._43 = m->_43;
  225. r._14 = ccos * m->_14 + ssin * m->_34;
  226. r._24 = m->_24;
  227. r._34 = -ssin * m->_14 + ccos * m->_34;
  228. r._44 = m->_44;
  229. *m = r;
  230. return (m);
  231. }
  232. // Rotace kolem osy z o uhel angle
  233. inline GLMATRIX * rotate_matrix_z(GLMATRIX * m, float angle)
  234. {
  235. GLMATRIX r;
  236. float ssin = (float) sin(angle);
  237. float ccos = (float) cos(angle);
  238. r._11 = ccos * m->_11 + ssin * m->_21;
  239. r._21 = -ssin * m->_11 + ccos * m->_21;
  240. r._31 = m->_31;
  241. r._41 = m->_41;
  242. r._12 = ccos * m->_12 + ssin * m->_22;
  243. r._22 = -ssin * m->_12 + ccos * m->_22;
  244. r._32 = m->_32;
  245. r._42 = m->_42;
  246. r._13 = ccos * m->_13 + ssin * m->_23;
  247. r._23 = -ssin * m->_13 + ccos * m->_23;
  248. r._33 = m->_33;
  249. r._43 = m->_43;
  250. r._14 = ccos * m->_14 + ssin * m->_24;
  251. r._24 = -ssin * m->_14 + ccos * m->_24;
  252. r._34 = m->_34;
  253. r._44 = m->_44;
  254. *m = r;
  255. return (m);
  256. }
  257. inline GLMATRIX * rotation_matrix_z(GLMATRIX * p_m, float angle)
  258. {
  259. float sinus = (float) sin(angle);
  260. float cosinus = (float) cos(angle);
  261. init_matrix(p_m);
  262. p_m->_11 = cosinus;
  263. p_m->_12 = sinus;
  264. p_m->_22 = cosinus;
  265. p_m->_21 = -sinus;
  266. return (p_m);
  267. }
  268. // Posunuti matice m o dx,dy,dz
  269. inline GLMATRIX * translate_matrix(GLMATRIX * m, float px, float py,
  270. float pz)
  271. {
  272. m->_41 += px * m->_11 + py * m->_21 + pz * m->_31;
  273. m->_42 += px * m->_12 + py * m->_22 + pz * m->_32;
  274. m->_43 += px * m->_13 + py * m->_23 + pz * m->_33;
  275. m->_44 += px * m->_14 + py * m->_24 + pz * m->_34;
  276. return (m);
  277. }
  278. inline GLMATRIX * translate_matrix2(GLMATRIX * m, BOD * p_pos)
  279. {
  280. float px = p_pos->x;
  281. float py = p_pos->y;
  282. float pz = p_pos->z;
  283. m->_41 += px * m->_11 + py * m->_21 + pz * m->_31;
  284. m->_42 += px * m->_12 + py * m->_22 + pz * m->_32;
  285. m->_43 += px * m->_13 + py * m->_23 + pz * m->_33;
  286. m->_44 += px * m->_14 + py * m->_24 + pz * m->_34;
  287. return (m);
  288. }
  289. inline GLMATRIX * translate_matrix_set(GLMATRIX * m, BOD * p_pos)
  290. {
  291. m->_41 = p_pos->x;
  292. m->_42 = p_pos->y;
  293. m->_43 = p_pos->z;
  294. return (m);
  295. }
  296. // scale matice m o dx,dy,dz
  297. inline GLMATRIX * scale_matrix(GLMATRIX * m, float x, float y, float z)
  298. {
  299. m->_11 *= x;
  300. m->_21 *= x;
  301. m->_31 *= x;
  302. m->_12 *= y;
  303. m->_22 *= y;
  304. m->_32 *= y;
  305. m->_13 *= z;
  306. m->_23 *= z;
  307. m->_33 *= z;
  308. return (m);
  309. }
  310. // vypocet inverzni matice k src
  311. // Spocita inverzni matici k *src a ulozi ji do *inv
  312. inline GLMATRIX * invert_matrix(GLMATRIX * src, GLMATRIX * inv)
  313. {
  314. float det;
  315. inv->_11 = src->_22 * src->_33 - src->_23 * src->_32;
  316. inv->_12 = -src->_12 * src->_33 + src->_13 * src->_32;
  317. inv->_13 = src->_12 * src->_23 - src->_13 * src->_22;
  318. det = inv->_11 * src->_11 + inv->_12 * src->_21 + inv->_13 * src->_31;
  319. if (det == 0.0f)
  320. {
  321. //assert(0);
  322. return (NULL);
  323. }
  324. inv->_21 = -src->_21 * src->_33 + src->_23 * src->_31;
  325. inv->_22 = src->_11 * src->_33 - src->_13 * src->_31;
  326. inv->_23 = -src->_11 * src->_23 + src->_13 * src->_21;
  327. inv->_31 = src->_21 * src->_32 - src->_22 * src->_31;
  328. inv->_32 = -src->_11 * src->_32 + src->_12 * src->_31;
  329. inv->_33 = src->_11 * src->_22 - src->_12 * src->_21;
  330. inv->_11 /= det;
  331. inv->_12 /= det;
  332. inv->_13 /= det;
  333. inv->_21 /= det;
  334. inv->_22 /= det;
  335. inv->_23 /= det;
  336. inv->_31 /= det;
  337. inv->_32 /= det;
  338. inv->_33 /= det;
  339. inv->_41 =
  340. -src->_41 * inv->_11 - src->_42 * inv->_21 - src->_43 * inv->_31;
  341. inv->_42 =
  342. -src->_41 * inv->_12 - src->_42 * inv->_22 - src->_43 * inv->_32;
  343. inv->_43 =
  344. -src->_41 * inv->_13 - src->_42 * inv->_23 - src->_43 * inv->_33;
  345. inv->_14 = 0;
  346. inv->_24 = 0;
  347. inv->_34 = 0;
  348. inv->_44 = 1;
  349. return (inv);
  350. }
  351. inline int matrix_det(GLMATRIX * p_mat)
  352. {
  353. float m1 = p_mat->_22 * p_mat->_33 - p_mat->_23 * p_mat->_32;
  354. float m2 = -p_mat->_12 * p_mat->_33 + p_mat->_13 * p_mat->_32;
  355. float m3 = p_mat->_12 * p_mat->_23 - p_mat->_13 * p_mat->_22;
  356. return ((m1 * p_mat->_11 + m2 * p_mat->_21 + m3 * p_mat->_31) != 0.0);
  357. }
  358. inline GLMATRIX * invert_matrix_copy(GLMATRIX * src, GLMATRIX * inv)
  359. {
  360. GLMATRIX m;
  361. float det;
  362. m._11 = src->_22 * src->_33 - src->_23 * src->_32;
  363. m._12 = -src->_12 * src->_33 + src->_13 * src->_32;
  364. m._13 = src->_12 * src->_23 - src->_13 * src->_22;
  365. det = m._11 * src->_11 + m._12 * src->_21 + m._13 * src->_31;
  366. if (det == 0)
  367. {
  368. //assert(0);
  369. return (NULL);
  370. }
  371. m._21 = -src->_21 * src->_33 + src->_23 * src->_31;
  372. m._22 = src->_11 * src->_33 - src->_13 * src->_31;
  373. m._23 = -src->_11 * src->_23 + src->_13 * src->_21;
  374. m._31 = src->_21 * src->_32 - src->_22 * src->_31;
  375. m._32 = -src->_11 * src->_32 + src->_12 * src->_31;
  376. m._33 = src->_11 * src->_22 - src->_12 * src->_21;
  377. m._11 /= det;
  378. m._12 /= det;
  379. m._13 /= det;
  380. m._21 /= det;
  381. m._22 /= det;
  382. m._23 /= det;
  383. m._31 /= det;
  384. m._32 /= det;
  385. m._33 /= det;
  386. m._41 = -src->_41 * m._11 - src->_42 * m._21 - src->_43 * m._31;
  387. m._42 = -src->_41 * m._12 - src->_42 * m._22 - src->_43 * m._32;
  388. m._43 = -src->_41 * m._13 - src->_42 * m._23 - src->_43 * m._33;
  389. m._14 = 0;
  390. m._24 = 0;
  391. m._34 = 0;
  392. m._44 = 1;
  393. *inv = m;
  394. return (inv);
  395. }
  396. inline GLMATRIX * mat_rot(GLMATRIX * p_mat, BOD * p_vx, BOD * p_vy,
  397. BOD * p_vz)
  398. {
  399. p_mat->_11 = p_vx->x;
  400. p_mat->_21 = p_vx->y;
  401. p_mat->_31 = p_vx->z;
  402. p_mat->_12 = p_vy->x;
  403. p_mat->_22 = p_vy->y;
  404. p_mat->_32 = p_vy->z;
  405. p_mat->_13 = p_vz->x;
  406. p_mat->_23 = p_vz->y;
  407. p_mat->_33 = p_vz->z;
  408. p_mat->_14 = p_mat->_24 = p_mat->_34 = 0.0f;
  409. p_mat->_41 = p_mat->_42 = p_mat->_43 = 0.0f;
  410. p_mat->_44 = 1.0f;
  411. return (p_mat);
  412. }
  413. inline GLMATRIX * mat_rot_2(GLMATRIX * p_mat, BOD * p_vx, BOD * p_vy,
  414. BOD * p_vz, BOD * p_pos)
  415. {
  416. p_mat->_11 = p_vx->x;
  417. p_mat->_21 = p_vx->y;
  418. p_mat->_31 = p_vx->z;
  419. p_mat->_12 = p_vy->x;
  420. p_mat->_22 = p_vy->y;
  421. p_mat->_32 = p_vy->z;
  422. p_mat->_13 = p_vz->x;
  423. p_mat->_23 = p_vz->y;
  424. p_mat->_33 = p_vz->z;
  425. p_mat->_14 = p_mat->_24 = p_mat->_34 = 0.0f;
  426. p_mat->_41 = p_pos->x;
  427. p_mat->_42 = p_pos->y;
  428. p_mat->_43 = p_pos->z;
  429. p_mat->_44 = 1.0f;
  430. return (p_mat);
  431. }
  432. inline GLMATRIX * mat_rot_inv(GLMATRIX * p_mat, BOD * p_vx, BOD * p_vy,
  433. BOD * p_vz)
  434. {
  435. return (invert_matrix_copy(mat_rot(p_mat, p_vx, p_vy, p_vz), p_mat));
  436. }
  437. inline GLMATRIX * mat_rot_2_inv(GLMATRIX * p_mat, BOD * p_vx, BOD * p_vy,
  438. BOD * p_vz, BOD * p_pos)
  439. {
  440. return (invert_matrix_copy(mat_rot_2(p_mat, p_vx, p_vy, p_vz, p_pos),
  441. p_mat));
  442. }
  443. inline GLMATRIX * buildFrustumMatrix(GLMATRIX * m, float l, float r,
  444. float b, float t, float n, float f)
  445. {
  446. m->_11 = (2.0f * n) / (r - l);
  447. m->_12 = 0.0f;
  448. m->_13 = 0.0f;
  449. m->_14 = 0.0f;
  450. m->_21 = 0.0f;
  451. m->_22 = (2.0f * n) / (t - b);
  452. m->_23 = 0.0f;
  453. m->_24 = 0.0f;
  454. m->_31 = (r + l) / (r - l);
  455. m->_32 = (t + b) / (t - b);
  456. m->_33 = (f + n) / (f - n);
  457. m->_34 = 1.0f;
  458. m->_41 = 0.0f;
  459. m->_42 = 0.0f;
  460. m->_43 = -(2.0f * f * n) / (f - n);
  461. m->_44 = 0.0f;
  462. return (m);
  463. }
  464. #ifndef PI
  465. #define PI 3.14159265358979323846f
  466. #endif /* */
  467. #ifndef RAD2DEG
  468. #define RAD2DEG(fi) (((fi)/PI)*180.0f)
  469. #endif /* */
  470. #define MAX_VZDAL_Z 50.0f
  471. #define MIN_VZDAL_Z 1.0f
  472. inline GLMATRIX * projection_matrix(GLMATRIX * p_mat, float fovy,
  473. float aspect, float zNear, float zFar)
  474. {
  475. float xmin, xmax, ymin, ymax;
  476. ymax = zNear * (float) tan(fovy);
  477. ymin = -ymax;
  478. xmin = ymin * aspect;
  479. xmax = ymax * aspect;
  480. return (buildFrustumMatrix(p_mat, xmin, xmax, ymin, ymax, zNear, zFar));
  481. }
  482. //inline GLMATRIX * mat_mult(GLMATRIX * a, GLMATRIX * b, GLMATRIX * r)
  483. inline GLMATRIX * float_to_matrix(GLMATRIX * p_mat, float uhel,
  484. BOD * p_pivot)
  485. {
  486. GLMATRIX m2;
  487. float cosa = (float) cos(uhel);
  488. float sina = (float) sin(uhel);
  489. float px, py;
  490. if (!p_pivot) {
  491. p_mat->_11 = cosa;
  492. p_mat->_22 = cosa;
  493. p_mat->_21 = sina;
  494. p_mat->_12 = -sina;
  495. }
  496. else {
  497. px = -p_pivot->x;
  498. py = -p_pivot->y;
  499. /*
  500. posun matice a*b -> tmp
  501. a = pos matrix
  502. b = rot matrix
  503. */
  504. m2._11 = cosa;
  505. m2._21 = sina;
  506. m2._41 = px * cosa + py * sina + p_mat->_41;
  507. m2._12 = -sina;
  508. m2._22 = cosa;
  509. m2._42 = px * (-sina) + py * cosa + p_mat->_42;
  510. /*
  511. a = rot
  512. b = pos - 1
  513. */
  514. p_mat->_11 = m2._11;
  515. p_mat->_21 = m2._21;
  516. p_mat->_41 = m2._41 + p_mat->_44 * (-px);
  517. p_mat->_12 = m2._12;
  518. p_mat->_22 = m2._22;
  519. p_mat->_42 = m2._42 + p_mat->_44 * (-py);
  520. }
  521. return (p_mat);
  522. }
  523. inline GLMATRIX * pivotuj_matrix(GLMATRIX * p_mat, BOD * p_pivot)
  524. {
  525. float px = -p_pivot->x, py = -p_pivot->y, pz = -p_pivot->z;
  526. float m14, m24, m34, m41, m42, m43, m44;
  527. if (px == 0.0f && py == 0.0f && pz == 0.0f)
  528. return (p_mat);
  529. // a = translate
  530. // b = p_mat
  531. m41 = px * p_mat->_11 + py * p_mat->_21 + pz * p_mat->_31 + p_mat->_41;
  532. m42 = px * p_mat->_12 + py * p_mat->_22 + pz * p_mat->_32 + p_mat->_42;
  533. m43 = px * p_mat->_13 + py * p_mat->_23 + pz * p_mat->_33 + p_mat->_43;
  534. m44 = px * p_mat->_14 + py * p_mat->_24 + pz * p_mat->_34 + p_mat->_44;
  535. m14 = p_mat->_14;
  536. m24 = p_mat->_24;
  537. m34 = p_mat->_34;
  538. // posun zpet
  539. // a = mat
  540. // b = translate -
  541. px = -px;
  542. py = -py;
  543. pz = -pz;
  544. p_mat->_11 += m14 * (px);
  545. p_mat->_21 += m24 * (px);
  546. p_mat->_31 += m34 * (px);
  547. p_mat->_41 = m41 + m44 * (px);
  548. p_mat->_12 += m14 * (py);
  549. p_mat->_22 += m24 * (py);
  550. p_mat->_32 += m34 * (py);
  551. p_mat->_42 = m42 + m44 * (py);
  552. p_mat->_13 += m14 * (pz);
  553. p_mat->_23 += m24 * (pz);
  554. p_mat->_33 += m34 * (pz);
  555. p_mat->_43 = m43 + m44 * (pz);
  556. p_mat->_44 = m44;
  557. return (p_mat);
  558. }
  559. inline GLMATRIX * pivotuj_matrix_tam(BOD * p_pivot, GLMATRIX * p_mat)
  560. {
  561. float px = -p_pivot->x, py = -p_pivot->y, pz = -p_pivot->z;
  562. if (px == 0.0f && py == 0.0f && pz == 0.0f)
  563. return (p_mat);
  564. else {
  565. // a = translate
  566. // b = p_mat
  567. p_mat->_41 += px * p_mat->_11 + py * p_mat->_21 + pz * p_mat->_31;
  568. p_mat->_42 += px * p_mat->_12 + py * p_mat->_22 + pz * p_mat->_32;
  569. p_mat->_43 += px * p_mat->_13 + py * p_mat->_23 + pz * p_mat->_33;
  570. p_mat->_44 += px * p_mat->_14 + py * p_mat->_24 + pz * p_mat->_34;
  571. return (p_mat);
  572. }
  573. }
  574. GLfloat * glu_invert_matrix(GLfloat * m, GLfloat * out);
  575. inline GLMATRIX * rovina_to_matrix(ROVINA * p_r, GLMATRIX * p_mat,
  576. float scale)
  577. {
  578. p_mat->_11 = p_r->x * p_r->x * scale;
  579. p_mat->_21 = p_r->x * p_r->y * scale;
  580. p_mat->_31 = p_r->x * p_r->z * scale;
  581. p_mat->_41 = p_r->x * p_r->e * scale;
  582. p_mat->_12 = p_r->y * p_r->x * scale;
  583. p_mat->_22 = p_r->y * p_r->y * scale;
  584. p_mat->_32 = p_r->y * p_r->z * scale;
  585. p_mat->_42 = p_r->y * p_r->e * scale;
  586. p_mat->_13 = p_r->z * p_r->x * scale;
  587. p_mat->_23 = p_r->z * p_r->y * scale;
  588. p_mat->_33 = p_r->z * p_r->z * scale;
  589. p_mat->_43 = p_r->z * p_r->e * scale;
  590. p_mat->_14 = p_r->e * p_r->x * scale;
  591. p_mat->_24 = p_r->e * p_r->y * scale;
  592. p_mat->_34 = p_r->e * p_r->z * scale;
  593. p_mat->_44 = p_r->e * p_r->e * scale;
  594. return (p_mat);
  595. }
  596. inline void matrix_to_rovina(GLMATRIX * p_mat, ROVINA * p_r)
  597. {
  598. p_r->x = (float) sqrt(p_mat->_11);
  599. p_r->y = (float) sqrt(p_mat->_22);
  600. p_r->z = (float) sqrt(p_mat->_33);
  601. p_r->e = (float) sqrt(p_mat->_44);
  602. } GLMATRIX * matrix_all(GLMATRIX * m, BOD * p_pos, QUAT * p_rot,
  603. BOD * p_scs);
  604. #endif