gim_linear_math.h 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488
  1. #ifndef GIM_LINEAR_H_INCLUDED
  2. #define GIM_LINEAR_H_INCLUDED
  3. /*! \file gim_linear_math.h
  4. *\author Francisco Leon Najera
  5. Type Independant Vector and matrix operations.
  6. */
  7. /*
  8. -----------------------------------------------------------------------------
  9. This source file is part of GIMPACT Library.
  10. For the latest info, see http://gimpact.sourceforge.net/
  11. Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
  12. email: [email protected]
  13. This library is free software; you can redistribute it and/or
  14. modify it under the terms of EITHER:
  15. (1) The GNU Lesser General Public License as published by the Free
  16. Software Foundation; either version 2.1 of the License, or (at
  17. your option) any later version. The text of the GNU Lesser
  18. General Public License is included with this library in the
  19. file GIMPACT-LICENSE-LGPL.TXT.
  20. (2) The BSD-style license that is included with this library in
  21. the file GIMPACT-LICENSE-BSD.TXT.
  22. (3) The zlib/libpng license that is included with this library in
  23. the file GIMPACT-LICENSE-ZLIB.TXT.
  24. This library is distributed in the hope that it will be useful,
  25. but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
  27. GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
  28. -----------------------------------------------------------------------------
  29. */
  30. #include "gim_math.h"
  31. #include "gim_geom_types.h"
  32. //! Zero out a 2D vector
  33. #define VEC_ZERO_2(a) \
  34. { \
  35. (a)[0] = (a)[1] = 0.0f; \
  36. }
  37. //! Zero out a 3D vector
  38. #define VEC_ZERO(a) \
  39. { \
  40. (a)[0] = (a)[1] = (a)[2] = 0.0f; \
  41. }
  42. /// Zero out a 4D vector
  43. #define VEC_ZERO_4(a) \
  44. { \
  45. (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f; \
  46. }
  47. /// Vector copy
  48. #define VEC_COPY_2(b, a) \
  49. { \
  50. (b)[0] = (a)[0]; \
  51. (b)[1] = (a)[1]; \
  52. }
  53. /// Copy 3D vector
  54. #define VEC_COPY(b, a) \
  55. { \
  56. (b)[0] = (a)[0]; \
  57. (b)[1] = (a)[1]; \
  58. (b)[2] = (a)[2]; \
  59. }
  60. /// Copy 4D vector
  61. #define VEC_COPY_4(b, a) \
  62. { \
  63. (b)[0] = (a)[0]; \
  64. (b)[1] = (a)[1]; \
  65. (b)[2] = (a)[2]; \
  66. (b)[3] = (a)[3]; \
  67. }
  68. /// VECTOR SWAP
  69. #define VEC_SWAP(b, a) \
  70. { \
  71. GIM_SWAP_NUMBERS((b)[0], (a)[0]); \
  72. GIM_SWAP_NUMBERS((b)[1], (a)[1]); \
  73. GIM_SWAP_NUMBERS((b)[2], (a)[2]); \
  74. }
  75. /// Vector difference
  76. #define VEC_DIFF_2(v21, v2, v1) \
  77. { \
  78. (v21)[0] = (v2)[0] - (v1)[0]; \
  79. (v21)[1] = (v2)[1] - (v1)[1]; \
  80. }
  81. /// Vector difference
  82. #define VEC_DIFF(v21, v2, v1) \
  83. { \
  84. (v21)[0] = (v2)[0] - (v1)[0]; \
  85. (v21)[1] = (v2)[1] - (v1)[1]; \
  86. (v21)[2] = (v2)[2] - (v1)[2]; \
  87. }
  88. /// Vector difference
  89. #define VEC_DIFF_4(v21, v2, v1) \
  90. { \
  91. (v21)[0] = (v2)[0] - (v1)[0]; \
  92. (v21)[1] = (v2)[1] - (v1)[1]; \
  93. (v21)[2] = (v2)[2] - (v1)[2]; \
  94. (v21)[3] = (v2)[3] - (v1)[3]; \
  95. }
  96. /// Vector sum
  97. #define VEC_SUM_2(v21, v2, v1) \
  98. { \
  99. (v21)[0] = (v2)[0] + (v1)[0]; \
  100. (v21)[1] = (v2)[1] + (v1)[1]; \
  101. }
  102. /// Vector sum
  103. #define VEC_SUM(v21, v2, v1) \
  104. { \
  105. (v21)[0] = (v2)[0] + (v1)[0]; \
  106. (v21)[1] = (v2)[1] + (v1)[1]; \
  107. (v21)[2] = (v2)[2] + (v1)[2]; \
  108. }
  109. /// Vector sum
  110. #define VEC_SUM_4(v21, v2, v1) \
  111. { \
  112. (v21)[0] = (v2)[0] + (v1)[0]; \
  113. (v21)[1] = (v2)[1] + (v1)[1]; \
  114. (v21)[2] = (v2)[2] + (v1)[2]; \
  115. (v21)[3] = (v2)[3] + (v1)[3]; \
  116. }
  117. /// scalar times vector
  118. #define VEC_SCALE_2(c, a, b) \
  119. { \
  120. (c)[0] = (a) * (b)[0]; \
  121. (c)[1] = (a) * (b)[1]; \
  122. }
  123. /// scalar times vector
  124. #define VEC_SCALE(c, a, b) \
  125. { \
  126. (c)[0] = (a) * (b)[0]; \
  127. (c)[1] = (a) * (b)[1]; \
  128. (c)[2] = (a) * (b)[2]; \
  129. }
  130. /// scalar times vector
  131. #define VEC_SCALE_4(c, a, b) \
  132. { \
  133. (c)[0] = (a) * (b)[0]; \
  134. (c)[1] = (a) * (b)[1]; \
  135. (c)[2] = (a) * (b)[2]; \
  136. (c)[3] = (a) * (b)[3]; \
  137. }
  138. /// accumulate scaled vector
  139. #define VEC_ACCUM_2(c, a, b) \
  140. { \
  141. (c)[0] += (a) * (b)[0]; \
  142. (c)[1] += (a) * (b)[1]; \
  143. }
  144. /// accumulate scaled vector
  145. #define VEC_ACCUM(c, a, b) \
  146. { \
  147. (c)[0] += (a) * (b)[0]; \
  148. (c)[1] += (a) * (b)[1]; \
  149. (c)[2] += (a) * (b)[2]; \
  150. }
  151. /// accumulate scaled vector
  152. #define VEC_ACCUM_4(c, a, b) \
  153. { \
  154. (c)[0] += (a) * (b)[0]; \
  155. (c)[1] += (a) * (b)[1]; \
  156. (c)[2] += (a) * (b)[2]; \
  157. (c)[3] += (a) * (b)[3]; \
  158. }
  159. /// Vector dot product
  160. #define VEC_DOT_2(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1])
  161. /// Vector dot product
  162. #define VEC_DOT(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1] + (a)[2] * (b)[2])
  163. /// Vector dot product
  164. #define VEC_DOT_4(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1] + (a)[2] * (b)[2] + (a)[3] * (b)[3])
  165. /// vector impact parameter (squared)
  166. #define VEC_IMPACT_SQ(bsq, direction, position) \
  167. { \
  168. GREAL _llel_ = VEC_DOT(direction, position); \
  169. bsq = VEC_DOT(position, position) - _llel_ * _llel_; \
  170. }
  171. /// vector impact parameter
  172. #define VEC_IMPACT(bsq, direction, position) \
  173. { \
  174. VEC_IMPACT_SQ(bsq, direction, position); \
  175. GIM_SQRT(bsq, bsq); \
  176. }
  177. /// Vector length
  178. #define VEC_LENGTH_2(a, l) \
  179. { \
  180. GREAL _pp = VEC_DOT_2(a, a); \
  181. GIM_SQRT(_pp, l); \
  182. }
  183. /// Vector length
  184. #define VEC_LENGTH(a, l) \
  185. { \
  186. GREAL _pp = VEC_DOT(a, a); \
  187. GIM_SQRT(_pp, l); \
  188. }
  189. /// Vector length
  190. #define VEC_LENGTH_4(a, l) \
  191. { \
  192. GREAL _pp = VEC_DOT_4(a, a); \
  193. GIM_SQRT(_pp, l); \
  194. }
  195. /// Vector inv length
  196. #define VEC_INV_LENGTH_2(a, l) \
  197. { \
  198. GREAL _pp = VEC_DOT_2(a, a); \
  199. GIM_INV_SQRT(_pp, l); \
  200. }
  201. /// Vector inv length
  202. #define VEC_INV_LENGTH(a, l) \
  203. { \
  204. GREAL _pp = VEC_DOT(a, a); \
  205. GIM_INV_SQRT(_pp, l); \
  206. }
  207. /// Vector inv length
  208. #define VEC_INV_LENGTH_4(a, l) \
  209. { \
  210. GREAL _pp = VEC_DOT_4(a, a); \
  211. GIM_INV_SQRT(_pp, l); \
  212. }
  213. /// distance between two points
  214. #define VEC_DISTANCE(_len, _va, _vb) \
  215. { \
  216. vec3f _tmp_; \
  217. VEC_DIFF(_tmp_, _vb, _va); \
  218. VEC_LENGTH(_tmp_, _len); \
  219. }
  220. /// Vector length
  221. #define VEC_CONJUGATE_LENGTH(a, l) \
  222. { \
  223. GREAL _pp = 1.0 - a[0] * a[0] - a[1] * a[1] - a[2] * a[2]; \
  224. GIM_SQRT(_pp, l); \
  225. }
  226. /// Vector length
  227. #define VEC_NORMALIZE(a) \
  228. { \
  229. GREAL len; \
  230. VEC_INV_LENGTH(a, len); \
  231. if (len < G_REAL_INFINITY) \
  232. { \
  233. a[0] *= len; \
  234. a[1] *= len; \
  235. a[2] *= len; \
  236. } \
  237. }
  238. /// Set Vector size
  239. #define VEC_RENORMALIZE(a, newlen) \
  240. { \
  241. GREAL len; \
  242. VEC_INV_LENGTH(a, len); \
  243. if (len < G_REAL_INFINITY) \
  244. { \
  245. len *= newlen; \
  246. a[0] *= len; \
  247. a[1] *= len; \
  248. a[2] *= len; \
  249. } \
  250. }
  251. /// Vector cross
  252. #define VEC_CROSS(c, a, b) \
  253. { \
  254. c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1]; \
  255. c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2]; \
  256. c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0]; \
  257. }
  258. /*! Vector perp -- assumes that n is of unit length
  259. * accepts vector v, subtracts out any component parallel to n */
  260. #define VEC_PERPENDICULAR(vp, v, n) \
  261. { \
  262. GREAL dot = VEC_DOT(v, n); \
  263. vp[0] = (v)[0] - dot * (n)[0]; \
  264. vp[1] = (v)[1] - dot * (n)[1]; \
  265. vp[2] = (v)[2] - dot * (n)[2]; \
  266. }
  267. /*! Vector parallel -- assumes that n is of unit length */
  268. #define VEC_PARALLEL(vp, v, n) \
  269. { \
  270. GREAL dot = VEC_DOT(v, n); \
  271. vp[0] = (dot) * (n)[0]; \
  272. vp[1] = (dot) * (n)[1]; \
  273. vp[2] = (dot) * (n)[2]; \
  274. }
  275. /*! Same as Vector parallel -- n can have any length
  276. * accepts vector v, subtracts out any component perpendicular to n */
  277. #define VEC_PROJECT(vp, v, n) \
  278. { \
  279. GREAL scalar = VEC_DOT(v, n); \
  280. scalar /= VEC_DOT(n, n); \
  281. vp[0] = (scalar) * (n)[0]; \
  282. vp[1] = (scalar) * (n)[1]; \
  283. vp[2] = (scalar) * (n)[2]; \
  284. }
  285. /*! accepts vector v*/
  286. #define VEC_UNPROJECT(vp, v, n) \
  287. { \
  288. GREAL scalar = VEC_DOT(v, n); \
  289. scalar = VEC_DOT(n, n) / scalar; \
  290. vp[0] = (scalar) * (n)[0]; \
  291. vp[1] = (scalar) * (n)[1]; \
  292. vp[2] = (scalar) * (n)[2]; \
  293. }
  294. /*! Vector reflection -- assumes n is of unit length
  295. Takes vector v, reflects it against reflector n, and returns vr */
  296. #define VEC_REFLECT(vr, v, n) \
  297. { \
  298. GREAL dot = VEC_DOT(v, n); \
  299. vr[0] = (v)[0] - 2.0 * (dot) * (n)[0]; \
  300. vr[1] = (v)[1] - 2.0 * (dot) * (n)[1]; \
  301. vr[2] = (v)[2] - 2.0 * (dot) * (n)[2]; \
  302. }
  303. /*! Vector blending
  304. Takes two vectors a, b, blends them together with two scalars */
  305. #define VEC_BLEND_AB(vr, sa, a, sb, b) \
  306. { \
  307. vr[0] = (sa) * (a)[0] + (sb) * (b)[0]; \
  308. vr[1] = (sa) * (a)[1] + (sb) * (b)[1]; \
  309. vr[2] = (sa) * (a)[2] + (sb) * (b)[2]; \
  310. }
  311. /*! Vector blending
  312. Takes two vectors a, b, blends them together with s <=1 */
  313. #define VEC_BLEND(vr, a, b, s) VEC_BLEND_AB(vr, (1 - s), a, s, b)
  314. #define VEC_SET3(a, b, op, c) \
  315. a[0] = b[0] op c[0]; \
  316. a[1] = b[1] op c[1]; \
  317. a[2] = b[2] op c[2];
  318. //! Finds the bigger cartesian coordinate from a vector
  319. #define VEC_MAYOR_COORD(vec, maxc) \
  320. { \
  321. GREAL A[] = {fabs(vec[0]), fabs(vec[1]), fabs(vec[2])}; \
  322. maxc = A[0] > A[1] ? (A[0] > A[2] ? 0 : 2) : (A[1] > A[2] ? 1 : 2); \
  323. }
  324. //! Finds the 2 smallest cartesian coordinates from a vector
  325. #define VEC_MINOR_AXES(vec, i0, i1) \
  326. { \
  327. VEC_MAYOR_COORD(vec, i0); \
  328. i0 = (i0 + 1) % 3; \
  329. i1 = (i0 + 1) % 3; \
  330. }
  331. #define VEC_EQUAL(v1, v2) (v1[0] == v2[0] && v1[1] == v2[1] && v1[2] == v2[2])
  332. #define VEC_NEAR_EQUAL(v1, v2) (GIM_NEAR_EQUAL(v1[0], v2[0]) && GIM_NEAR_EQUAL(v1[1], v2[1]) && GIM_NEAR_EQUAL(v1[2], v2[2]))
  333. /// Vector cross
  334. #define X_AXIS_CROSS_VEC(dst, src) \
  335. { \
  336. dst[0] = 0.0f; \
  337. dst[1] = -src[2]; \
  338. dst[2] = src[1]; \
  339. }
  340. #define Y_AXIS_CROSS_VEC(dst, src) \
  341. { \
  342. dst[0] = src[2]; \
  343. dst[1] = 0.0f; \
  344. dst[2] = -src[0]; \
  345. }
  346. #define Z_AXIS_CROSS_VEC(dst, src) \
  347. { \
  348. dst[0] = -src[1]; \
  349. dst[1] = src[0]; \
  350. dst[2] = 0.0f; \
  351. }
  352. /// initialize matrix
  353. #define IDENTIFY_MATRIX_3X3(m) \
  354. { \
  355. m[0][0] = 1.0; \
  356. m[0][1] = 0.0; \
  357. m[0][2] = 0.0; \
  358. \
  359. m[1][0] = 0.0; \
  360. m[1][1] = 1.0; \
  361. m[1][2] = 0.0; \
  362. \
  363. m[2][0] = 0.0; \
  364. m[2][1] = 0.0; \
  365. m[2][2] = 1.0; \
  366. }
  367. /*! initialize matrix */
  368. #define IDENTIFY_MATRIX_4X4(m) \
  369. { \
  370. m[0][0] = 1.0; \
  371. m[0][1] = 0.0; \
  372. m[0][2] = 0.0; \
  373. m[0][3] = 0.0; \
  374. \
  375. m[1][0] = 0.0; \
  376. m[1][1] = 1.0; \
  377. m[1][2] = 0.0; \
  378. m[1][3] = 0.0; \
  379. \
  380. m[2][0] = 0.0; \
  381. m[2][1] = 0.0; \
  382. m[2][2] = 1.0; \
  383. m[2][3] = 0.0; \
  384. \
  385. m[3][0] = 0.0; \
  386. m[3][1] = 0.0; \
  387. m[3][2] = 0.0; \
  388. m[3][3] = 1.0; \
  389. }
  390. /*! initialize matrix */
  391. #define ZERO_MATRIX_4X4(m) \
  392. { \
  393. m[0][0] = 0.0; \
  394. m[0][1] = 0.0; \
  395. m[0][2] = 0.0; \
  396. m[0][3] = 0.0; \
  397. \
  398. m[1][0] = 0.0; \
  399. m[1][1] = 0.0; \
  400. m[1][2] = 0.0; \
  401. m[1][3] = 0.0; \
  402. \
  403. m[2][0] = 0.0; \
  404. m[2][1] = 0.0; \
  405. m[2][2] = 0.0; \
  406. m[2][3] = 0.0; \
  407. \
  408. m[3][0] = 0.0; \
  409. m[3][1] = 0.0; \
  410. m[3][2] = 0.0; \
  411. m[3][3] = 0.0; \
  412. }
  413. /*! matrix rotation X */
  414. #define ROTX_CS(m, cosine, sine) \
  415. { \
  416. /* rotation about the x-axis */ \
  417. \
  418. m[0][0] = 1.0; \
  419. m[0][1] = 0.0; \
  420. m[0][2] = 0.0; \
  421. m[0][3] = 0.0; \
  422. \
  423. m[1][0] = 0.0; \
  424. m[1][1] = (cosine); \
  425. m[1][2] = (sine); \
  426. m[1][3] = 0.0; \
  427. \
  428. m[2][0] = 0.0; \
  429. m[2][1] = -(sine); \
  430. m[2][2] = (cosine); \
  431. m[2][3] = 0.0; \
  432. \
  433. m[3][0] = 0.0; \
  434. m[3][1] = 0.0; \
  435. m[3][2] = 0.0; \
  436. m[3][3] = 1.0; \
  437. }
  438. /*! matrix rotation Y */
  439. #define ROTY_CS(m, cosine, sine) \
  440. { \
  441. /* rotation about the y-axis */ \
  442. \
  443. m[0][0] = (cosine); \
  444. m[0][1] = 0.0; \
  445. m[0][2] = -(sine); \
  446. m[0][3] = 0.0; \
  447. \
  448. m[1][0] = 0.0; \
  449. m[1][1] = 1.0; \
  450. m[1][2] = 0.0; \
  451. m[1][3] = 0.0; \
  452. \
  453. m[2][0] = (sine); \
  454. m[2][1] = 0.0; \
  455. m[2][2] = (cosine); \
  456. m[2][3] = 0.0; \
  457. \
  458. m[3][0] = 0.0; \
  459. m[3][1] = 0.0; \
  460. m[3][2] = 0.0; \
  461. m[3][3] = 1.0; \
  462. }
  463. /*! matrix rotation Z */
  464. #define ROTZ_CS(m, cosine, sine) \
  465. { \
  466. /* rotation about the z-axis */ \
  467. \
  468. m[0][0] = (cosine); \
  469. m[0][1] = (sine); \
  470. m[0][2] = 0.0; \
  471. m[0][3] = 0.0; \
  472. \
  473. m[1][0] = -(sine); \
  474. m[1][1] = (cosine); \
  475. m[1][2] = 0.0; \
  476. m[1][3] = 0.0; \
  477. \
  478. m[2][0] = 0.0; \
  479. m[2][1] = 0.0; \
  480. m[2][2] = 1.0; \
  481. m[2][3] = 0.0; \
  482. \
  483. m[3][0] = 0.0; \
  484. m[3][1] = 0.0; \
  485. m[3][2] = 0.0; \
  486. m[3][3] = 1.0; \
  487. }
  488. /*! matrix copy */
  489. #define COPY_MATRIX_2X2(b, a) \
  490. { \
  491. b[0][0] = a[0][0]; \
  492. b[0][1] = a[0][1]; \
  493. \
  494. b[1][0] = a[1][0]; \
  495. b[1][1] = a[1][1]; \
  496. }
  497. /*! matrix copy */
  498. #define COPY_MATRIX_2X3(b, a) \
  499. { \
  500. b[0][0] = a[0][0]; \
  501. b[0][1] = a[0][1]; \
  502. b[0][2] = a[0][2]; \
  503. \
  504. b[1][0] = a[1][0]; \
  505. b[1][1] = a[1][1]; \
  506. b[1][2] = a[1][2]; \
  507. }
  508. /*! matrix copy */
  509. #define COPY_MATRIX_3X3(b, a) \
  510. { \
  511. b[0][0] = a[0][0]; \
  512. b[0][1] = a[0][1]; \
  513. b[0][2] = a[0][2]; \
  514. \
  515. b[1][0] = a[1][0]; \
  516. b[1][1] = a[1][1]; \
  517. b[1][2] = a[1][2]; \
  518. \
  519. b[2][0] = a[2][0]; \
  520. b[2][1] = a[2][1]; \
  521. b[2][2] = a[2][2]; \
  522. }
  523. /*! matrix copy */
  524. #define COPY_MATRIX_4X4(b, a) \
  525. { \
  526. b[0][0] = a[0][0]; \
  527. b[0][1] = a[0][1]; \
  528. b[0][2] = a[0][2]; \
  529. b[0][3] = a[0][3]; \
  530. \
  531. b[1][0] = a[1][0]; \
  532. b[1][1] = a[1][1]; \
  533. b[1][2] = a[1][2]; \
  534. b[1][3] = a[1][3]; \
  535. \
  536. b[2][0] = a[2][0]; \
  537. b[2][1] = a[2][1]; \
  538. b[2][2] = a[2][2]; \
  539. b[2][3] = a[2][3]; \
  540. \
  541. b[3][0] = a[3][0]; \
  542. b[3][1] = a[3][1]; \
  543. b[3][2] = a[3][2]; \
  544. b[3][3] = a[3][3]; \
  545. }
  546. /*! matrix transpose */
  547. #define TRANSPOSE_MATRIX_2X2(b, a) \
  548. { \
  549. b[0][0] = a[0][0]; \
  550. b[0][1] = a[1][0]; \
  551. \
  552. b[1][0] = a[0][1]; \
  553. b[1][1] = a[1][1]; \
  554. }
  555. /*! matrix transpose */
  556. #define TRANSPOSE_MATRIX_3X3(b, a) \
  557. { \
  558. b[0][0] = a[0][0]; \
  559. b[0][1] = a[1][0]; \
  560. b[0][2] = a[2][0]; \
  561. \
  562. b[1][0] = a[0][1]; \
  563. b[1][1] = a[1][1]; \
  564. b[1][2] = a[2][1]; \
  565. \
  566. b[2][0] = a[0][2]; \
  567. b[2][1] = a[1][2]; \
  568. b[2][2] = a[2][2]; \
  569. }
  570. /*! matrix transpose */
  571. #define TRANSPOSE_MATRIX_4X4(b, a) \
  572. { \
  573. b[0][0] = a[0][0]; \
  574. b[0][1] = a[1][0]; \
  575. b[0][2] = a[2][0]; \
  576. b[0][3] = a[3][0]; \
  577. \
  578. b[1][0] = a[0][1]; \
  579. b[1][1] = a[1][1]; \
  580. b[1][2] = a[2][1]; \
  581. b[1][3] = a[3][1]; \
  582. \
  583. b[2][0] = a[0][2]; \
  584. b[2][1] = a[1][2]; \
  585. b[2][2] = a[2][2]; \
  586. b[2][3] = a[3][2]; \
  587. \
  588. b[3][0] = a[0][3]; \
  589. b[3][1] = a[1][3]; \
  590. b[3][2] = a[2][3]; \
  591. b[3][3] = a[3][3]; \
  592. }
  593. /*! multiply matrix by scalar */
  594. #define SCALE_MATRIX_2X2(b, s, a) \
  595. { \
  596. b[0][0] = (s)*a[0][0]; \
  597. b[0][1] = (s)*a[0][1]; \
  598. \
  599. b[1][0] = (s)*a[1][0]; \
  600. b[1][1] = (s)*a[1][1]; \
  601. }
  602. /*! multiply matrix by scalar */
  603. #define SCALE_MATRIX_3X3(b, s, a) \
  604. { \
  605. b[0][0] = (s)*a[0][0]; \
  606. b[0][1] = (s)*a[0][1]; \
  607. b[0][2] = (s)*a[0][2]; \
  608. \
  609. b[1][0] = (s)*a[1][0]; \
  610. b[1][1] = (s)*a[1][1]; \
  611. b[1][2] = (s)*a[1][2]; \
  612. \
  613. b[2][0] = (s)*a[2][0]; \
  614. b[2][1] = (s)*a[2][1]; \
  615. b[2][2] = (s)*a[2][2]; \
  616. }
  617. /*! multiply matrix by scalar */
  618. #define SCALE_MATRIX_4X4(b, s, a) \
  619. { \
  620. b[0][0] = (s)*a[0][0]; \
  621. b[0][1] = (s)*a[0][1]; \
  622. b[0][2] = (s)*a[0][2]; \
  623. b[0][3] = (s)*a[0][3]; \
  624. \
  625. b[1][0] = (s)*a[1][0]; \
  626. b[1][1] = (s)*a[1][1]; \
  627. b[1][2] = (s)*a[1][2]; \
  628. b[1][3] = (s)*a[1][3]; \
  629. \
  630. b[2][0] = (s)*a[2][0]; \
  631. b[2][1] = (s)*a[2][1]; \
  632. b[2][2] = (s)*a[2][2]; \
  633. b[2][3] = (s)*a[2][3]; \
  634. \
  635. b[3][0] = s * a[3][0]; \
  636. b[3][1] = s * a[3][1]; \
  637. b[3][2] = s * a[3][2]; \
  638. b[3][3] = s * a[3][3]; \
  639. }
  640. /*! multiply matrix by scalar */
  641. #define SCALE_VEC_MATRIX_2X2(b, svec, a) \
  642. { \
  643. b[0][0] = svec[0] * a[0][0]; \
  644. b[1][0] = svec[0] * a[1][0]; \
  645. \
  646. b[0][1] = svec[1] * a[0][1]; \
  647. b[1][1] = svec[1] * a[1][1]; \
  648. }
  649. /*! multiply matrix by scalar. Each columns is scaled by each scalar vector component */
  650. #define SCALE_VEC_MATRIX_3X3(b, svec, a) \
  651. { \
  652. b[0][0] = svec[0] * a[0][0]; \
  653. b[1][0] = svec[0] * a[1][0]; \
  654. b[2][0] = svec[0] * a[2][0]; \
  655. \
  656. b[0][1] = svec[1] * a[0][1]; \
  657. b[1][1] = svec[1] * a[1][1]; \
  658. b[2][1] = svec[1] * a[2][1]; \
  659. \
  660. b[0][2] = svec[2] * a[0][2]; \
  661. b[1][2] = svec[2] * a[1][2]; \
  662. b[2][2] = svec[2] * a[2][2]; \
  663. }
  664. /*! multiply matrix by scalar */
  665. #define SCALE_VEC_MATRIX_4X4(b, svec, a) \
  666. { \
  667. b[0][0] = svec[0] * a[0][0]; \
  668. b[1][0] = svec[0] * a[1][0]; \
  669. b[2][0] = svec[0] * a[2][0]; \
  670. b[3][0] = svec[0] * a[3][0]; \
  671. \
  672. b[0][1] = svec[1] * a[0][1]; \
  673. b[1][1] = svec[1] * a[1][1]; \
  674. b[2][1] = svec[1] * a[2][1]; \
  675. b[3][1] = svec[1] * a[3][1]; \
  676. \
  677. b[0][2] = svec[2] * a[0][2]; \
  678. b[1][2] = svec[2] * a[1][2]; \
  679. b[2][2] = svec[2] * a[2][2]; \
  680. b[3][2] = svec[2] * a[3][2]; \
  681. \
  682. b[0][3] = svec[3] * a[0][3]; \
  683. b[1][3] = svec[3] * a[1][3]; \
  684. b[2][3] = svec[3] * a[2][3]; \
  685. b[3][3] = svec[3] * a[3][3]; \
  686. }
  687. /*! multiply matrix by scalar */
  688. #define ACCUM_SCALE_MATRIX_2X2(b, s, a) \
  689. { \
  690. b[0][0] += (s)*a[0][0]; \
  691. b[0][1] += (s)*a[0][1]; \
  692. \
  693. b[1][0] += (s)*a[1][0]; \
  694. b[1][1] += (s)*a[1][1]; \
  695. }
  696. /*! multiply matrix by scalar */
  697. #define ACCUM_SCALE_MATRIX_3X3(b, s, a) \
  698. { \
  699. b[0][0] += (s)*a[0][0]; \
  700. b[0][1] += (s)*a[0][1]; \
  701. b[0][2] += (s)*a[0][2]; \
  702. \
  703. b[1][0] += (s)*a[1][0]; \
  704. b[1][1] += (s)*a[1][1]; \
  705. b[1][2] += (s)*a[1][2]; \
  706. \
  707. b[2][0] += (s)*a[2][0]; \
  708. b[2][1] += (s)*a[2][1]; \
  709. b[2][2] += (s)*a[2][2]; \
  710. }
  711. /*! multiply matrix by scalar */
  712. #define ACCUM_SCALE_MATRIX_4X4(b, s, a) \
  713. { \
  714. b[0][0] += (s)*a[0][0]; \
  715. b[0][1] += (s)*a[0][1]; \
  716. b[0][2] += (s)*a[0][2]; \
  717. b[0][3] += (s)*a[0][3]; \
  718. \
  719. b[1][0] += (s)*a[1][0]; \
  720. b[1][1] += (s)*a[1][1]; \
  721. b[1][2] += (s)*a[1][2]; \
  722. b[1][3] += (s)*a[1][3]; \
  723. \
  724. b[2][0] += (s)*a[2][0]; \
  725. b[2][1] += (s)*a[2][1]; \
  726. b[2][2] += (s)*a[2][2]; \
  727. b[2][3] += (s)*a[2][3]; \
  728. \
  729. b[3][0] += (s)*a[3][0]; \
  730. b[3][1] += (s)*a[3][1]; \
  731. b[3][2] += (s)*a[3][2]; \
  732. b[3][3] += (s)*a[3][3]; \
  733. }
  734. /*! matrix product */
  735. /*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
  736. #define MATRIX_PRODUCT_2X2(c, a, b) \
  737. { \
  738. c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0]; \
  739. c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1]; \
  740. \
  741. c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0]; \
  742. c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1]; \
  743. }
  744. /*! matrix product */
  745. /*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
  746. #define MATRIX_PRODUCT_3X3(c, a, b) \
  747. { \
  748. c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]; \
  749. c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]; \
  750. c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2]; \
  751. \
  752. c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0]; \
  753. c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1]; \
  754. c[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2]; \
  755. \
  756. c[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0]; \
  757. c[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1]; \
  758. c[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2]; \
  759. }
  760. /*! matrix product */
  761. /*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
  762. #define MATRIX_PRODUCT_4X4(c, a, b) \
  763. { \
  764. c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0] + a[0][3] * b[3][0]; \
  765. c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1] + a[0][3] * b[3][1]; \
  766. c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2] + a[0][3] * b[3][2]; \
  767. c[0][3] = a[0][0] * b[0][3] + a[0][1] * b[1][3] + a[0][2] * b[2][3] + a[0][3] * b[3][3]; \
  768. \
  769. c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0] + a[1][3] * b[3][0]; \
  770. c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1] + a[1][3] * b[3][1]; \
  771. c[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2] + a[1][3] * b[3][2]; \
  772. c[1][3] = a[1][0] * b[0][3] + a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3] * b[3][3]; \
  773. \
  774. c[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0] + a[2][3] * b[3][0]; \
  775. c[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1] + a[2][3] * b[3][1]; \
  776. c[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2] + a[2][3] * b[3][2]; \
  777. c[2][3] = a[2][0] * b[0][3] + a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3] * b[3][3]; \
  778. \
  779. c[3][0] = a[3][0] * b[0][0] + a[3][1] * b[1][0] + a[3][2] * b[2][0] + a[3][3] * b[3][0]; \
  780. c[3][1] = a[3][0] * b[0][1] + a[3][1] * b[1][1] + a[3][2] * b[2][1] + a[3][3] * b[3][1]; \
  781. c[3][2] = a[3][0] * b[0][2] + a[3][1] * b[1][2] + a[3][2] * b[2][2] + a[3][3] * b[3][2]; \
  782. c[3][3] = a[3][0] * b[0][3] + a[3][1] * b[1][3] + a[3][2] * b[2][3] + a[3][3] * b[3][3]; \
  783. }
  784. /*! matrix times vector */
  785. #define MAT_DOT_VEC_2X2(p, m, v) \
  786. { \
  787. p[0] = m[0][0] * v[0] + m[0][1] * v[1]; \
  788. p[1] = m[1][0] * v[0] + m[1][1] * v[1]; \
  789. }
  790. /*! matrix times vector */
  791. #define MAT_DOT_VEC_3X3(p, m, v) \
  792. { \
  793. p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2]; \
  794. p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2]; \
  795. p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2]; \
  796. }
  797. /*! matrix times vector
  798. v is a vec4f
  799. */
  800. #define MAT_DOT_VEC_4X4(p, m, v) \
  801. { \
  802. p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3]; \
  803. p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3]; \
  804. p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3]; \
  805. p[3] = m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]; \
  806. }
  807. /*! matrix times vector
  808. v is a vec3f
  809. and m is a mat4f<br>
  810. Last column is added as the position
  811. */
  812. #define MAT_DOT_VEC_3X4(p, m, v) \
  813. { \
  814. p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3]; \
  815. p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3]; \
  816. p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3]; \
  817. }
  818. /*! vector transpose times matrix */
  819. /*! p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
  820. #define VEC_DOT_MAT_3X3(p, v, m) \
  821. { \
  822. p[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0]; \
  823. p[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1]; \
  824. p[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2]; \
  825. }
  826. /*! affine matrix times vector */
  827. /** The matrix is assumed to be an affine matrix, with last two
  828. * entries representing a translation */
  829. #define MAT_DOT_VEC_2X3(p, m, v) \
  830. { \
  831. p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2]; \
  832. p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2]; \
  833. }
  834. //! Transform a plane
  835. #define MAT_TRANSFORM_PLANE_4X4(pout, m, plane) \
  836. { \
  837. pout[0] = m[0][0] * plane[0] + m[0][1] * plane[1] + m[0][2] * plane[2]; \
  838. pout[1] = m[1][0] * plane[0] + m[1][1] * plane[1] + m[1][2] * plane[2]; \
  839. pout[2] = m[2][0] * plane[0] + m[2][1] * plane[1] + m[2][2] * plane[2]; \
  840. pout[3] = m[0][3] * pout[0] + m[1][3] * pout[1] + m[2][3] * pout[2] + plane[3]; \
  841. }
  842. /** inverse transpose of matrix times vector
  843. *
  844. * This macro computes inverse transpose of matrix m,
  845. * and multiplies vector v into it, to yeild vector p
  846. *
  847. * DANGER !!! Do Not use this on normal vectors!!!
  848. * It will leave normals the wrong length !!!
  849. * See macro below for use on normals.
  850. */
  851. #define INV_TRANSP_MAT_DOT_VEC_2X2(p, m, v) \
  852. { \
  853. GREAL det; \
  854. \
  855. det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \
  856. p[0] = m[1][1] * v[0] - m[1][0] * v[1]; \
  857. p[1] = -m[0][1] * v[0] + m[0][0] * v[1]; \
  858. \
  859. /* if matrix not singular, and not orthonormal, then renormalize */ \
  860. if ((det != 1.0f) && (det != 0.0f)) \
  861. { \
  862. det = 1.0f / det; \
  863. p[0] *= det; \
  864. p[1] *= det; \
  865. } \
  866. }
  867. /** transform normal vector by inverse transpose of matrix
  868. * and then renormalize the vector
  869. *
  870. * This macro computes inverse transpose of matrix m,
  871. * and multiplies vector v into it, to yeild vector p
  872. * Vector p is then normalized.
  873. */
  874. #define NORM_XFORM_2X2(p, m, v) \
  875. { \
  876. GREAL len; \
  877. \
  878. /* do nothing if off-diagonals are zero and diagonals are \
  879. * equal */ \
  880. if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) \
  881. { \
  882. p[0] = m[1][1] * v[0] - m[1][0] * v[1]; \
  883. p[1] = -m[0][1] * v[0] + m[0][0] * v[1]; \
  884. \
  885. len = p[0] * p[0] + p[1] * p[1]; \
  886. GIM_INV_SQRT(len, len); \
  887. p[0] *= len; \
  888. p[1] *= len; \
  889. } \
  890. else \
  891. { \
  892. VEC_COPY_2(p, v); \
  893. } \
  894. }
  895. /** outer product of vector times vector transpose
  896. *
  897. * The outer product of vector v and vector transpose t yeilds
  898. * dyadic matrix m.
  899. */
  900. #define OUTER_PRODUCT_2X2(m, v, t) \
  901. { \
  902. m[0][0] = v[0] * t[0]; \
  903. m[0][1] = v[0] * t[1]; \
  904. \
  905. m[1][0] = v[1] * t[0]; \
  906. m[1][1] = v[1] * t[1]; \
  907. }
  908. /** outer product of vector times vector transpose
  909. *
  910. * The outer product of vector v and vector transpose t yeilds
  911. * dyadic matrix m.
  912. */
  913. #define OUTER_PRODUCT_3X3(m, v, t) \
  914. { \
  915. m[0][0] = v[0] * t[0]; \
  916. m[0][1] = v[0] * t[1]; \
  917. m[0][2] = v[0] * t[2]; \
  918. \
  919. m[1][0] = v[1] * t[0]; \
  920. m[1][1] = v[1] * t[1]; \
  921. m[1][2] = v[1] * t[2]; \
  922. \
  923. m[2][0] = v[2] * t[0]; \
  924. m[2][1] = v[2] * t[1]; \
  925. m[2][2] = v[2] * t[2]; \
  926. }
  927. /** outer product of vector times vector transpose
  928. *
  929. * The outer product of vector v and vector transpose t yeilds
  930. * dyadic matrix m.
  931. */
  932. #define OUTER_PRODUCT_4X4(m, v, t) \
  933. { \
  934. m[0][0] = v[0] * t[0]; \
  935. m[0][1] = v[0] * t[1]; \
  936. m[0][2] = v[0] * t[2]; \
  937. m[0][3] = v[0] * t[3]; \
  938. \
  939. m[1][0] = v[1] * t[0]; \
  940. m[1][1] = v[1] * t[1]; \
  941. m[1][2] = v[1] * t[2]; \
  942. m[1][3] = v[1] * t[3]; \
  943. \
  944. m[2][0] = v[2] * t[0]; \
  945. m[2][1] = v[2] * t[1]; \
  946. m[2][2] = v[2] * t[2]; \
  947. m[2][3] = v[2] * t[3]; \
  948. \
  949. m[3][0] = v[3] * t[0]; \
  950. m[3][1] = v[3] * t[1]; \
  951. m[3][2] = v[3] * t[2]; \
  952. m[3][3] = v[3] * t[3]; \
  953. }
  954. /** outer product of vector times vector transpose
  955. *
  956. * The outer product of vector v and vector transpose t yeilds
  957. * dyadic matrix m.
  958. */
  959. #define ACCUM_OUTER_PRODUCT_2X2(m, v, t) \
  960. { \
  961. m[0][0] += v[0] * t[0]; \
  962. m[0][1] += v[0] * t[1]; \
  963. \
  964. m[1][0] += v[1] * t[0]; \
  965. m[1][1] += v[1] * t[1]; \
  966. }
  967. /** outer product of vector times vector transpose
  968. *
  969. * The outer product of vector v and vector transpose t yeilds
  970. * dyadic matrix m.
  971. */
  972. #define ACCUM_OUTER_PRODUCT_3X3(m, v, t) \
  973. { \
  974. m[0][0] += v[0] * t[0]; \
  975. m[0][1] += v[0] * t[1]; \
  976. m[0][2] += v[0] * t[2]; \
  977. \
  978. m[1][0] += v[1] * t[0]; \
  979. m[1][1] += v[1] * t[1]; \
  980. m[1][2] += v[1] * t[2]; \
  981. \
  982. m[2][0] += v[2] * t[0]; \
  983. m[2][1] += v[2] * t[1]; \
  984. m[2][2] += v[2] * t[2]; \
  985. }
  986. /** outer product of vector times vector transpose
  987. *
  988. * The outer product of vector v and vector transpose t yeilds
  989. * dyadic matrix m.
  990. */
  991. #define ACCUM_OUTER_PRODUCT_4X4(m, v, t) \
  992. { \
  993. m[0][0] += v[0] * t[0]; \
  994. m[0][1] += v[0] * t[1]; \
  995. m[0][2] += v[0] * t[2]; \
  996. m[0][3] += v[0] * t[3]; \
  997. \
  998. m[1][0] += v[1] * t[0]; \
  999. m[1][1] += v[1] * t[1]; \
  1000. m[1][2] += v[1] * t[2]; \
  1001. m[1][3] += v[1] * t[3]; \
  1002. \
  1003. m[2][0] += v[2] * t[0]; \
  1004. m[2][1] += v[2] * t[1]; \
  1005. m[2][2] += v[2] * t[2]; \
  1006. m[2][3] += v[2] * t[3]; \
  1007. \
  1008. m[3][0] += v[3] * t[0]; \
  1009. m[3][1] += v[3] * t[1]; \
  1010. m[3][2] += v[3] * t[2]; \
  1011. m[3][3] += v[3] * t[3]; \
  1012. }
  1013. /** determinant of matrix
  1014. *
  1015. * Computes determinant of matrix m, returning d
  1016. */
  1017. #define DETERMINANT_2X2(d, m) \
  1018. { \
  1019. d = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \
  1020. }
  1021. /** determinant of matrix
  1022. *
  1023. * Computes determinant of matrix m, returning d
  1024. */
  1025. #define DETERMINANT_3X3(d, m) \
  1026. { \
  1027. d = m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
  1028. d -= m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]); \
  1029. d += m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
  1030. }
  1031. /** i,j,th cofactor of a 4x4 matrix
  1032. *
  1033. */
  1034. #define COFACTOR_4X4_IJ(fac, m, i, j) \
  1035. { \
  1036. GUINT __ii[4], __jj[4], __k; \
  1037. \
  1038. for (__k = 0; __k < i; __k++) __ii[__k] = __k; \
  1039. for (__k = i; __k < 3; __k++) __ii[__k] = __k + 1; \
  1040. for (__k = 0; __k < j; __k++) __jj[__k] = __k; \
  1041. for (__k = j; __k < 3; __k++) __jj[__k] = __k + 1; \
  1042. \
  1043. (fac) = m[__ii[0]][__jj[0]] * (m[__ii[1]][__jj[1]] * m[__ii[2]][__jj[2]] - m[__ii[1]][__jj[2]] * m[__ii[2]][__jj[1]]); \
  1044. (fac) -= m[__ii[0]][__jj[1]] * (m[__ii[1]][__jj[0]] * m[__ii[2]][__jj[2]] - m[__ii[1]][__jj[2]] * m[__ii[2]][__jj[0]]); \
  1045. (fac) += m[__ii[0]][__jj[2]] * (m[__ii[1]][__jj[0]] * m[__ii[2]][__jj[1]] - m[__ii[1]][__jj[1]] * m[__ii[2]][__jj[0]]); \
  1046. \
  1047. __k = i + j; \
  1048. if (__k != (__k / 2) * 2) \
  1049. { \
  1050. (fac) = -(fac); \
  1051. } \
  1052. }
  1053. /** determinant of matrix
  1054. *
  1055. * Computes determinant of matrix m, returning d
  1056. */
  1057. #define DETERMINANT_4X4(d, m) \
  1058. { \
  1059. GREAL cofac; \
  1060. COFACTOR_4X4_IJ(cofac, m, 0, 0); \
  1061. d = m[0][0] * cofac; \
  1062. COFACTOR_4X4_IJ(cofac, m, 0, 1); \
  1063. d += m[0][1] * cofac; \
  1064. COFACTOR_4X4_IJ(cofac, m, 0, 2); \
  1065. d += m[0][2] * cofac; \
  1066. COFACTOR_4X4_IJ(cofac, m, 0, 3); \
  1067. d += m[0][3] * cofac; \
  1068. }
  1069. /** cofactor of matrix
  1070. *
  1071. * Computes cofactor of matrix m, returning a
  1072. */
  1073. #define COFACTOR_2X2(a, m) \
  1074. { \
  1075. a[0][0] = (m)[1][1]; \
  1076. a[0][1] = -(m)[1][0]; \
  1077. a[1][0] = -(m)[0][1]; \
  1078. a[1][1] = (m)[0][0]; \
  1079. }
  1080. /** cofactor of matrix
  1081. *
  1082. * Computes cofactor of matrix m, returning a
  1083. */
  1084. #define COFACTOR_3X3(a, m) \
  1085. { \
  1086. a[0][0] = m[1][1] * m[2][2] - m[1][2] * m[2][1]; \
  1087. a[0][1] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]); \
  1088. a[0][2] = m[1][0] * m[2][1] - m[1][1] * m[2][0]; \
  1089. a[1][0] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]); \
  1090. a[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0]; \
  1091. a[1][2] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]); \
  1092. a[2][0] = m[0][1] * m[1][2] - m[0][2] * m[1][1]; \
  1093. a[2][1] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]); \
  1094. a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \
  1095. }
  1096. /** cofactor of matrix
  1097. *
  1098. * Computes cofactor of matrix m, returning a
  1099. */
  1100. #define COFACTOR_4X4(a, m) \
  1101. { \
  1102. int i, j; \
  1103. \
  1104. for (i = 0; i < 4; i++) \
  1105. { \
  1106. for (j = 0; j < 4; j++) \
  1107. { \
  1108. COFACTOR_4X4_IJ(a[i][j], m, i, j); \
  1109. } \
  1110. } \
  1111. }
  1112. /** adjoint of matrix
  1113. *
  1114. * Computes adjoint of matrix m, returning a
  1115. * (Note that adjoint is just the transpose of the cofactor matrix)
  1116. */
  1117. #define ADJOINT_2X2(a, m) \
  1118. { \
  1119. a[0][0] = (m)[1][1]; \
  1120. a[1][0] = -(m)[1][0]; \
  1121. a[0][1] = -(m)[0][1]; \
  1122. a[1][1] = (m)[0][0]; \
  1123. }
  1124. /** adjoint of matrix
  1125. *
  1126. * Computes adjoint of matrix m, returning a
  1127. * (Note that adjoint is just the transpose of the cofactor matrix)
  1128. */
  1129. #define ADJOINT_3X3(a, m) \
  1130. { \
  1131. a[0][0] = m[1][1] * m[2][2] - m[1][2] * m[2][1]; \
  1132. a[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]); \
  1133. a[2][0] = m[1][0] * m[2][1] - m[1][1] * m[2][0]; \
  1134. a[0][1] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]); \
  1135. a[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0]; \
  1136. a[2][1] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]); \
  1137. a[0][2] = m[0][1] * m[1][2] - m[0][2] * m[1][1]; \
  1138. a[1][2] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]); \
  1139. a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \
  1140. }
  1141. /** adjoint of matrix
  1142. *
  1143. * Computes adjoint of matrix m, returning a
  1144. * (Note that adjoint is just the transpose of the cofactor matrix)
  1145. */
  1146. #define ADJOINT_4X4(a, m) \
  1147. { \
  1148. char _i_, _j_; \
  1149. \
  1150. for (_i_ = 0; _i_ < 4; _i_++) \
  1151. { \
  1152. for (_j_ = 0; _j_ < 4; _j_++) \
  1153. { \
  1154. COFACTOR_4X4_IJ(a[_j_][_i_], m, _i_, _j_); \
  1155. } \
  1156. } \
  1157. }
  1158. /** compute adjoint of matrix and scale
  1159. *
  1160. * Computes adjoint of matrix m, scales it by s, returning a
  1161. */
  1162. #define SCALE_ADJOINT_2X2(a, s, m) \
  1163. { \
  1164. a[0][0] = (s)*m[1][1]; \
  1165. a[1][0] = -(s)*m[1][0]; \
  1166. a[0][1] = -(s)*m[0][1]; \
  1167. a[1][1] = (s)*m[0][0]; \
  1168. }
  1169. /** compute adjoint of matrix and scale
  1170. *
  1171. * Computes adjoint of matrix m, scales it by s, returning a
  1172. */
  1173. #define SCALE_ADJOINT_3X3(a, s, m) \
  1174. { \
  1175. a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
  1176. a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]); \
  1177. a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
  1178. \
  1179. a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]); \
  1180. a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]); \
  1181. a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]); \
  1182. \
  1183. a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]); \
  1184. a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]); \
  1185. a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]); \
  1186. }
  1187. /** compute adjoint of matrix and scale
  1188. *
  1189. * Computes adjoint of matrix m, scales it by s, returning a
  1190. */
  1191. #define SCALE_ADJOINT_4X4(a, s, m) \
  1192. { \
  1193. char _i_, _j_; \
  1194. for (_i_ = 0; _i_ < 4; _i_++) \
  1195. { \
  1196. for (_j_ = 0; _j_ < 4; _j_++) \
  1197. { \
  1198. COFACTOR_4X4_IJ(a[_j_][_i_], m, _i_, _j_); \
  1199. a[_j_][_i_] *= s; \
  1200. } \
  1201. } \
  1202. }
  1203. /** inverse of matrix
  1204. *
  1205. * Compute inverse of matrix a, returning determinant m and
  1206. * inverse b
  1207. */
  1208. #define INVERT_2X2(b, det, a) \
  1209. { \
  1210. GREAL _tmp_; \
  1211. DETERMINANT_2X2(det, a); \
  1212. _tmp_ = 1.0 / (det); \
  1213. SCALE_ADJOINT_2X2(b, _tmp_, a); \
  1214. }
  1215. /** inverse of matrix
  1216. *
  1217. * Compute inverse of matrix a, returning determinant m and
  1218. * inverse b
  1219. */
  1220. #define INVERT_3X3(b, det, a) \
  1221. { \
  1222. GREAL _tmp_; \
  1223. DETERMINANT_3X3(det, a); \
  1224. _tmp_ = 1.0 / (det); \
  1225. SCALE_ADJOINT_3X3(b, _tmp_, a); \
  1226. }
  1227. /** inverse of matrix
  1228. *
  1229. * Compute inverse of matrix a, returning determinant m and
  1230. * inverse b
  1231. */
  1232. #define INVERT_4X4(b, det, a) \
  1233. { \
  1234. GREAL _tmp_; \
  1235. DETERMINANT_4X4(det, a); \
  1236. _tmp_ = 1.0 / (det); \
  1237. SCALE_ADJOINT_4X4(b, _tmp_, a); \
  1238. }
  1239. //! Get the triple(3) row of a transform matrix
  1240. #define MAT_GET_ROW(mat, vec3, rowindex) \
  1241. { \
  1242. vec3[0] = mat[rowindex][0]; \
  1243. vec3[1] = mat[rowindex][1]; \
  1244. vec3[2] = mat[rowindex][2]; \
  1245. }
  1246. //! Get the tuple(2) row of a transform matrix
  1247. #define MAT_GET_ROW2(mat, vec2, rowindex) \
  1248. { \
  1249. vec2[0] = mat[rowindex][0]; \
  1250. vec2[1] = mat[rowindex][1]; \
  1251. }
  1252. //! Get the quad (4) row of a transform matrix
  1253. #define MAT_GET_ROW4(mat, vec4, rowindex) \
  1254. { \
  1255. vec4[0] = mat[rowindex][0]; \
  1256. vec4[1] = mat[rowindex][1]; \
  1257. vec4[2] = mat[rowindex][2]; \
  1258. vec4[3] = mat[rowindex][3]; \
  1259. }
  1260. //! Get the triple(3) col of a transform matrix
  1261. #define MAT_GET_COL(mat, vec3, colindex) \
  1262. { \
  1263. vec3[0] = mat[0][colindex]; \
  1264. vec3[1] = mat[1][colindex]; \
  1265. vec3[2] = mat[2][colindex]; \
  1266. }
  1267. //! Get the tuple(2) col of a transform matrix
  1268. #define MAT_GET_COL2(mat, vec2, colindex) \
  1269. { \
  1270. vec2[0] = mat[0][colindex]; \
  1271. vec2[1] = mat[1][colindex]; \
  1272. }
  1273. //! Get the quad (4) col of a transform matrix
  1274. #define MAT_GET_COL4(mat, vec4, colindex) \
  1275. { \
  1276. vec4[0] = mat[0][colindex]; \
  1277. vec4[1] = mat[1][colindex]; \
  1278. vec4[2] = mat[2][colindex]; \
  1279. vec4[3] = mat[3][colindex]; \
  1280. }
  1281. //! Get the triple(3) col of a transform matrix
  1282. #define MAT_GET_X(mat, vec3) \
  1283. { \
  1284. MAT_GET_COL(mat, vec3, 0); \
  1285. }
  1286. //! Get the triple(3) col of a transform matrix
  1287. #define MAT_GET_Y(mat, vec3) \
  1288. { \
  1289. MAT_GET_COL(mat, vec3, 1); \
  1290. }
  1291. //! Get the triple(3) col of a transform matrix
  1292. #define MAT_GET_Z(mat, vec3) \
  1293. { \
  1294. MAT_GET_COL(mat, vec3, 2); \
  1295. }
  1296. //! Get the triple(3) col of a transform matrix
  1297. #define MAT_SET_X(mat, vec3) \
  1298. { \
  1299. mat[0][0] = vec3[0]; \
  1300. mat[1][0] = vec3[1]; \
  1301. mat[2][0] = vec3[2]; \
  1302. }
  1303. //! Get the triple(3) col of a transform matrix
  1304. #define MAT_SET_Y(mat, vec3) \
  1305. { \
  1306. mat[0][1] = vec3[0]; \
  1307. mat[1][1] = vec3[1]; \
  1308. mat[2][1] = vec3[2]; \
  1309. }
  1310. //! Get the triple(3) col of a transform matrix
  1311. #define MAT_SET_Z(mat, vec3) \
  1312. { \
  1313. mat[0][2] = vec3[0]; \
  1314. mat[1][2] = vec3[1]; \
  1315. mat[2][2] = vec3[2]; \
  1316. }
  1317. //! Get the triple(3) col of a transform matrix
  1318. #define MAT_GET_TRANSLATION(mat, vec3) \
  1319. { \
  1320. vec3[0] = mat[0][3]; \
  1321. vec3[1] = mat[1][3]; \
  1322. vec3[2] = mat[2][3]; \
  1323. }
  1324. //! Set the triple(3) col of a transform matrix
  1325. #define MAT_SET_TRANSLATION(mat, vec3) \
  1326. { \
  1327. mat[0][3] = vec3[0]; \
  1328. mat[1][3] = vec3[1]; \
  1329. mat[2][3] = vec3[2]; \
  1330. }
  1331. //! Returns the dot product between a vec3f and the row of a matrix
  1332. #define MAT_DOT_ROW(mat, vec3, rowindex) (vec3[0] * mat[rowindex][0] + vec3[1] * mat[rowindex][1] + vec3[2] * mat[rowindex][2])
  1333. //! Returns the dot product between a vec2f and the row of a matrix
  1334. #define MAT_DOT_ROW2(mat, vec2, rowindex) (vec2[0] * mat[rowindex][0] + vec2[1] * mat[rowindex][1])
  1335. //! Returns the dot product between a vec4f and the row of a matrix
  1336. #define MAT_DOT_ROW4(mat, vec4, rowindex) (vec4[0] * mat[rowindex][0] + vec4[1] * mat[rowindex][1] + vec4[2] * mat[rowindex][2] + vec4[3] * mat[rowindex][3])
  1337. //! Returns the dot product between a vec3f and the col of a matrix
  1338. #define MAT_DOT_COL(mat, vec3, colindex) (vec3[0] * mat[0][colindex] + vec3[1] * mat[1][colindex] + vec3[2] * mat[2][colindex])
  1339. //! Returns the dot product between a vec2f and the col of a matrix
  1340. #define MAT_DOT_COL2(mat, vec2, colindex) (vec2[0] * mat[0][colindex] + vec2[1] * mat[1][colindex])
  1341. //! Returns the dot product between a vec4f and the col of a matrix
  1342. #define MAT_DOT_COL4(mat, vec4, colindex) (vec4[0] * mat[0][colindex] + vec4[1] * mat[1][colindex] + vec4[2] * mat[2][colindex] + vec4[3] * mat[3][colindex])
  1343. /*!Transpose matrix times vector
  1344. v is a vec3f
  1345. and m is a mat4f<br>
  1346. */
  1347. #define INV_MAT_DOT_VEC_3X3(p, m, v) \
  1348. { \
  1349. p[0] = MAT_DOT_COL(m, v, 0); \
  1350. p[1] = MAT_DOT_COL(m, v, 1); \
  1351. p[2] = MAT_DOT_COL(m, v, 2); \
  1352. }
  1353. #endif // GIM_VECTOR_H_INCLUDED