| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488 |
- #ifndef GIM_LINEAR_H_INCLUDED
- #define GIM_LINEAR_H_INCLUDED
- /*! \file gim_linear_math.h
- *\author Francisco Leon Najera
- Type Independant Vector and matrix operations.
- */
- /*
- -----------------------------------------------------------------------------
- This source file is part of GIMPACT Library.
- For the latest info, see http://gimpact.sourceforge.net/
- Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
- email: [email protected]
- This library is free software; you can redistribute it and/or
- modify it under the terms of EITHER:
- (1) The GNU Lesser General Public License as published by the Free
- Software Foundation; either version 2.1 of the License, or (at
- your option) any later version. The text of the GNU Lesser
- General Public License is included with this library in the
- file GIMPACT-LICENSE-LGPL.TXT.
- (2) The BSD-style license that is included with this library in
- the file GIMPACT-LICENSE-BSD.TXT.
- (3) The zlib/libpng license that is included with this library in
- the file GIMPACT-LICENSE-ZLIB.TXT.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
- GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
- -----------------------------------------------------------------------------
- */
- #include "gim_math.h"
- #include "gim_geom_types.h"
- //! Zero out a 2D vector
- #define VEC_ZERO_2(a) \
- { \
- (a)[0] = (a)[1] = 0.0f; \
- }
- //! Zero out a 3D vector
- #define VEC_ZERO(a) \
- { \
- (a)[0] = (a)[1] = (a)[2] = 0.0f; \
- }
- /// Zero out a 4D vector
- #define VEC_ZERO_4(a) \
- { \
- (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f; \
- }
- /// Vector copy
- #define VEC_COPY_2(b, a) \
- { \
- (b)[0] = (a)[0]; \
- (b)[1] = (a)[1]; \
- }
- /// Copy 3D vector
- #define VEC_COPY(b, a) \
- { \
- (b)[0] = (a)[0]; \
- (b)[1] = (a)[1]; \
- (b)[2] = (a)[2]; \
- }
- /// Copy 4D vector
- #define VEC_COPY_4(b, a) \
- { \
- (b)[0] = (a)[0]; \
- (b)[1] = (a)[1]; \
- (b)[2] = (a)[2]; \
- (b)[3] = (a)[3]; \
- }
- /// VECTOR SWAP
- #define VEC_SWAP(b, a) \
- { \
- GIM_SWAP_NUMBERS((b)[0], (a)[0]); \
- GIM_SWAP_NUMBERS((b)[1], (a)[1]); \
- GIM_SWAP_NUMBERS((b)[2], (a)[2]); \
- }
- /// Vector difference
- #define VEC_DIFF_2(v21, v2, v1) \
- { \
- (v21)[0] = (v2)[0] - (v1)[0]; \
- (v21)[1] = (v2)[1] - (v1)[1]; \
- }
- /// Vector difference
- #define VEC_DIFF(v21, v2, v1) \
- { \
- (v21)[0] = (v2)[0] - (v1)[0]; \
- (v21)[1] = (v2)[1] - (v1)[1]; \
- (v21)[2] = (v2)[2] - (v1)[2]; \
- }
- /// Vector difference
- #define VEC_DIFF_4(v21, v2, v1) \
- { \
- (v21)[0] = (v2)[0] - (v1)[0]; \
- (v21)[1] = (v2)[1] - (v1)[1]; \
- (v21)[2] = (v2)[2] - (v1)[2]; \
- (v21)[3] = (v2)[3] - (v1)[3]; \
- }
- /// Vector sum
- #define VEC_SUM_2(v21, v2, v1) \
- { \
- (v21)[0] = (v2)[0] + (v1)[0]; \
- (v21)[1] = (v2)[1] + (v1)[1]; \
- }
- /// Vector sum
- #define VEC_SUM(v21, v2, v1) \
- { \
- (v21)[0] = (v2)[0] + (v1)[0]; \
- (v21)[1] = (v2)[1] + (v1)[1]; \
- (v21)[2] = (v2)[2] + (v1)[2]; \
- }
- /// Vector sum
- #define VEC_SUM_4(v21, v2, v1) \
- { \
- (v21)[0] = (v2)[0] + (v1)[0]; \
- (v21)[1] = (v2)[1] + (v1)[1]; \
- (v21)[2] = (v2)[2] + (v1)[2]; \
- (v21)[3] = (v2)[3] + (v1)[3]; \
- }
- /// scalar times vector
- #define VEC_SCALE_2(c, a, b) \
- { \
- (c)[0] = (a) * (b)[0]; \
- (c)[1] = (a) * (b)[1]; \
- }
- /// scalar times vector
- #define VEC_SCALE(c, a, b) \
- { \
- (c)[0] = (a) * (b)[0]; \
- (c)[1] = (a) * (b)[1]; \
- (c)[2] = (a) * (b)[2]; \
- }
- /// scalar times vector
- #define VEC_SCALE_4(c, a, b) \
- { \
- (c)[0] = (a) * (b)[0]; \
- (c)[1] = (a) * (b)[1]; \
- (c)[2] = (a) * (b)[2]; \
- (c)[3] = (a) * (b)[3]; \
- }
- /// accumulate scaled vector
- #define VEC_ACCUM_2(c, a, b) \
- { \
- (c)[0] += (a) * (b)[0]; \
- (c)[1] += (a) * (b)[1]; \
- }
- /// accumulate scaled vector
- #define VEC_ACCUM(c, a, b) \
- { \
- (c)[0] += (a) * (b)[0]; \
- (c)[1] += (a) * (b)[1]; \
- (c)[2] += (a) * (b)[2]; \
- }
- /// accumulate scaled vector
- #define VEC_ACCUM_4(c, a, b) \
- { \
- (c)[0] += (a) * (b)[0]; \
- (c)[1] += (a) * (b)[1]; \
- (c)[2] += (a) * (b)[2]; \
- (c)[3] += (a) * (b)[3]; \
- }
- /// Vector dot product
- #define VEC_DOT_2(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1])
- /// Vector dot product
- #define VEC_DOT(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1] + (a)[2] * (b)[2])
- /// Vector dot product
- #define VEC_DOT_4(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1] + (a)[2] * (b)[2] + (a)[3] * (b)[3])
- /// vector impact parameter (squared)
- #define VEC_IMPACT_SQ(bsq, direction, position) \
- { \
- GREAL _llel_ = VEC_DOT(direction, position); \
- bsq = VEC_DOT(position, position) - _llel_ * _llel_; \
- }
- /// vector impact parameter
- #define VEC_IMPACT(bsq, direction, position) \
- { \
- VEC_IMPACT_SQ(bsq, direction, position); \
- GIM_SQRT(bsq, bsq); \
- }
- /// Vector length
- #define VEC_LENGTH_2(a, l) \
- { \
- GREAL _pp = VEC_DOT_2(a, a); \
- GIM_SQRT(_pp, l); \
- }
- /// Vector length
- #define VEC_LENGTH(a, l) \
- { \
- GREAL _pp = VEC_DOT(a, a); \
- GIM_SQRT(_pp, l); \
- }
- /// Vector length
- #define VEC_LENGTH_4(a, l) \
- { \
- GREAL _pp = VEC_DOT_4(a, a); \
- GIM_SQRT(_pp, l); \
- }
- /// Vector inv length
- #define VEC_INV_LENGTH_2(a, l) \
- { \
- GREAL _pp = VEC_DOT_2(a, a); \
- GIM_INV_SQRT(_pp, l); \
- }
- /// Vector inv length
- #define VEC_INV_LENGTH(a, l) \
- { \
- GREAL _pp = VEC_DOT(a, a); \
- GIM_INV_SQRT(_pp, l); \
- }
- /// Vector inv length
- #define VEC_INV_LENGTH_4(a, l) \
- { \
- GREAL _pp = VEC_DOT_4(a, a); \
- GIM_INV_SQRT(_pp, l); \
- }
- /// distance between two points
- #define VEC_DISTANCE(_len, _va, _vb) \
- { \
- vec3f _tmp_; \
- VEC_DIFF(_tmp_, _vb, _va); \
- VEC_LENGTH(_tmp_, _len); \
- }
- /// Vector length
- #define VEC_CONJUGATE_LENGTH(a, l) \
- { \
- GREAL _pp = 1.0 - a[0] * a[0] - a[1] * a[1] - a[2] * a[2]; \
- GIM_SQRT(_pp, l); \
- }
- /// Vector length
- #define VEC_NORMALIZE(a) \
- { \
- GREAL len; \
- VEC_INV_LENGTH(a, len); \
- if (len < G_REAL_INFINITY) \
- { \
- a[0] *= len; \
- a[1] *= len; \
- a[2] *= len; \
- } \
- }
- /// Set Vector size
- #define VEC_RENORMALIZE(a, newlen) \
- { \
- GREAL len; \
- VEC_INV_LENGTH(a, len); \
- if (len < G_REAL_INFINITY) \
- { \
- len *= newlen; \
- a[0] *= len; \
- a[1] *= len; \
- a[2] *= len; \
- } \
- }
- /// Vector cross
- #define VEC_CROSS(c, a, b) \
- { \
- c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1]; \
- c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2]; \
- c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0]; \
- }
- /*! Vector perp -- assumes that n is of unit length
- * accepts vector v, subtracts out any component parallel to n */
- #define VEC_PERPENDICULAR(vp, v, n) \
- { \
- GREAL dot = VEC_DOT(v, n); \
- vp[0] = (v)[0] - dot * (n)[0]; \
- vp[1] = (v)[1] - dot * (n)[1]; \
- vp[2] = (v)[2] - dot * (n)[2]; \
- }
- /*! Vector parallel -- assumes that n is of unit length */
- #define VEC_PARALLEL(vp, v, n) \
- { \
- GREAL dot = VEC_DOT(v, n); \
- vp[0] = (dot) * (n)[0]; \
- vp[1] = (dot) * (n)[1]; \
- vp[2] = (dot) * (n)[2]; \
- }
- /*! Same as Vector parallel -- n can have any length
- * accepts vector v, subtracts out any component perpendicular to n */
- #define VEC_PROJECT(vp, v, n) \
- { \
- GREAL scalar = VEC_DOT(v, n); \
- scalar /= VEC_DOT(n, n); \
- vp[0] = (scalar) * (n)[0]; \
- vp[1] = (scalar) * (n)[1]; \
- vp[2] = (scalar) * (n)[2]; \
- }
- /*! accepts vector v*/
- #define VEC_UNPROJECT(vp, v, n) \
- { \
- GREAL scalar = VEC_DOT(v, n); \
- scalar = VEC_DOT(n, n) / scalar; \
- vp[0] = (scalar) * (n)[0]; \
- vp[1] = (scalar) * (n)[1]; \
- vp[2] = (scalar) * (n)[2]; \
- }
- /*! Vector reflection -- assumes n is of unit length
- Takes vector v, reflects it against reflector n, and returns vr */
- #define VEC_REFLECT(vr, v, n) \
- { \
- GREAL dot = VEC_DOT(v, n); \
- vr[0] = (v)[0] - 2.0 * (dot) * (n)[0]; \
- vr[1] = (v)[1] - 2.0 * (dot) * (n)[1]; \
- vr[2] = (v)[2] - 2.0 * (dot) * (n)[2]; \
- }
- /*! Vector blending
- Takes two vectors a, b, blends them together with two scalars */
- #define VEC_BLEND_AB(vr, sa, a, sb, b) \
- { \
- vr[0] = (sa) * (a)[0] + (sb) * (b)[0]; \
- vr[1] = (sa) * (a)[1] + (sb) * (b)[1]; \
- vr[2] = (sa) * (a)[2] + (sb) * (b)[2]; \
- }
- /*! Vector blending
- Takes two vectors a, b, blends them together with s <=1 */
- #define VEC_BLEND(vr, a, b, s) VEC_BLEND_AB(vr, (1 - s), a, s, b)
- #define VEC_SET3(a, b, op, c) \
- a[0] = b[0] op c[0]; \
- a[1] = b[1] op c[1]; \
- a[2] = b[2] op c[2];
- //! Finds the bigger cartesian coordinate from a vector
- #define VEC_MAYOR_COORD(vec, maxc) \
- { \
- GREAL A[] = {fabs(vec[0]), fabs(vec[1]), fabs(vec[2])}; \
- maxc = A[0] > A[1] ? (A[0] > A[2] ? 0 : 2) : (A[1] > A[2] ? 1 : 2); \
- }
- //! Finds the 2 smallest cartesian coordinates from a vector
- #define VEC_MINOR_AXES(vec, i0, i1) \
- { \
- VEC_MAYOR_COORD(vec, i0); \
- i0 = (i0 + 1) % 3; \
- i1 = (i0 + 1) % 3; \
- }
- #define VEC_EQUAL(v1, v2) (v1[0] == v2[0] && v1[1] == v2[1] && v1[2] == v2[2])
- #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]))
- /// Vector cross
- #define X_AXIS_CROSS_VEC(dst, src) \
- { \
- dst[0] = 0.0f; \
- dst[1] = -src[2]; \
- dst[2] = src[1]; \
- }
- #define Y_AXIS_CROSS_VEC(dst, src) \
- { \
- dst[0] = src[2]; \
- dst[1] = 0.0f; \
- dst[2] = -src[0]; \
- }
- #define Z_AXIS_CROSS_VEC(dst, src) \
- { \
- dst[0] = -src[1]; \
- dst[1] = src[0]; \
- dst[2] = 0.0f; \
- }
- /// initialize matrix
- #define IDENTIFY_MATRIX_3X3(m) \
- { \
- m[0][0] = 1.0; \
- m[0][1] = 0.0; \
- m[0][2] = 0.0; \
- \
- m[1][0] = 0.0; \
- m[1][1] = 1.0; \
- m[1][2] = 0.0; \
- \
- m[2][0] = 0.0; \
- m[2][1] = 0.0; \
- m[2][2] = 1.0; \
- }
- /*! initialize matrix */
- #define IDENTIFY_MATRIX_4X4(m) \
- { \
- m[0][0] = 1.0; \
- m[0][1] = 0.0; \
- m[0][2] = 0.0; \
- m[0][3] = 0.0; \
- \
- m[1][0] = 0.0; \
- m[1][1] = 1.0; \
- m[1][2] = 0.0; \
- m[1][3] = 0.0; \
- \
- m[2][0] = 0.0; \
- m[2][1] = 0.0; \
- m[2][2] = 1.0; \
- m[2][3] = 0.0; \
- \
- m[3][0] = 0.0; \
- m[3][1] = 0.0; \
- m[3][2] = 0.0; \
- m[3][3] = 1.0; \
- }
- /*! initialize matrix */
- #define ZERO_MATRIX_4X4(m) \
- { \
- m[0][0] = 0.0; \
- m[0][1] = 0.0; \
- m[0][2] = 0.0; \
- m[0][3] = 0.0; \
- \
- m[1][0] = 0.0; \
- m[1][1] = 0.0; \
- m[1][2] = 0.0; \
- m[1][3] = 0.0; \
- \
- m[2][0] = 0.0; \
- m[2][1] = 0.0; \
- m[2][2] = 0.0; \
- m[2][3] = 0.0; \
- \
- m[3][0] = 0.0; \
- m[3][1] = 0.0; \
- m[3][2] = 0.0; \
- m[3][3] = 0.0; \
- }
- /*! matrix rotation X */
- #define ROTX_CS(m, cosine, sine) \
- { \
- /* rotation about the x-axis */ \
- \
- m[0][0] = 1.0; \
- m[0][1] = 0.0; \
- m[0][2] = 0.0; \
- m[0][3] = 0.0; \
- \
- m[1][0] = 0.0; \
- m[1][1] = (cosine); \
- m[1][2] = (sine); \
- m[1][3] = 0.0; \
- \
- m[2][0] = 0.0; \
- m[2][1] = -(sine); \
- m[2][2] = (cosine); \
- m[2][3] = 0.0; \
- \
- m[3][0] = 0.0; \
- m[3][1] = 0.0; \
- m[3][2] = 0.0; \
- m[3][3] = 1.0; \
- }
- /*! matrix rotation Y */
- #define ROTY_CS(m, cosine, sine) \
- { \
- /* rotation about the y-axis */ \
- \
- m[0][0] = (cosine); \
- m[0][1] = 0.0; \
- m[0][2] = -(sine); \
- m[0][3] = 0.0; \
- \
- m[1][0] = 0.0; \
- m[1][1] = 1.0; \
- m[1][2] = 0.0; \
- m[1][3] = 0.0; \
- \
- m[2][0] = (sine); \
- m[2][1] = 0.0; \
- m[2][2] = (cosine); \
- m[2][3] = 0.0; \
- \
- m[3][0] = 0.0; \
- m[3][1] = 0.0; \
- m[3][2] = 0.0; \
- m[3][3] = 1.0; \
- }
- /*! matrix rotation Z */
- #define ROTZ_CS(m, cosine, sine) \
- { \
- /* rotation about the z-axis */ \
- \
- m[0][0] = (cosine); \
- m[0][1] = (sine); \
- m[0][2] = 0.0; \
- m[0][3] = 0.0; \
- \
- m[1][0] = -(sine); \
- m[1][1] = (cosine); \
- m[1][2] = 0.0; \
- m[1][3] = 0.0; \
- \
- m[2][0] = 0.0; \
- m[2][1] = 0.0; \
- m[2][2] = 1.0; \
- m[2][3] = 0.0; \
- \
- m[3][0] = 0.0; \
- m[3][1] = 0.0; \
- m[3][2] = 0.0; \
- m[3][3] = 1.0; \
- }
- /*! matrix copy */
- #define COPY_MATRIX_2X2(b, a) \
- { \
- b[0][0] = a[0][0]; \
- b[0][1] = a[0][1]; \
- \
- b[1][0] = a[1][0]; \
- b[1][1] = a[1][1]; \
- }
- /*! matrix copy */
- #define COPY_MATRIX_2X3(b, a) \
- { \
- b[0][0] = a[0][0]; \
- b[0][1] = a[0][1]; \
- b[0][2] = a[0][2]; \
- \
- b[1][0] = a[1][0]; \
- b[1][1] = a[1][1]; \
- b[1][2] = a[1][2]; \
- }
- /*! matrix copy */
- #define COPY_MATRIX_3X3(b, a) \
- { \
- b[0][0] = a[0][0]; \
- b[0][1] = a[0][1]; \
- b[0][2] = a[0][2]; \
- \
- b[1][0] = a[1][0]; \
- b[1][1] = a[1][1]; \
- b[1][2] = a[1][2]; \
- \
- b[2][0] = a[2][0]; \
- b[2][1] = a[2][1]; \
- b[2][2] = a[2][2]; \
- }
- /*! matrix copy */
- #define COPY_MATRIX_4X4(b, a) \
- { \
- b[0][0] = a[0][0]; \
- b[0][1] = a[0][1]; \
- b[0][2] = a[0][2]; \
- b[0][3] = a[0][3]; \
- \
- b[1][0] = a[1][0]; \
- b[1][1] = a[1][1]; \
- b[1][2] = a[1][2]; \
- b[1][3] = a[1][3]; \
- \
- b[2][0] = a[2][0]; \
- b[2][1] = a[2][1]; \
- b[2][2] = a[2][2]; \
- b[2][3] = a[2][3]; \
- \
- b[3][0] = a[3][0]; \
- b[3][1] = a[3][1]; \
- b[3][2] = a[3][2]; \
- b[3][3] = a[3][3]; \
- }
- /*! matrix transpose */
- #define TRANSPOSE_MATRIX_2X2(b, a) \
- { \
- b[0][0] = a[0][0]; \
- b[0][1] = a[1][0]; \
- \
- b[1][0] = a[0][1]; \
- b[1][1] = a[1][1]; \
- }
- /*! matrix transpose */
- #define TRANSPOSE_MATRIX_3X3(b, a) \
- { \
- b[0][0] = a[0][0]; \
- b[0][1] = a[1][0]; \
- b[0][2] = a[2][0]; \
- \
- b[1][0] = a[0][1]; \
- b[1][1] = a[1][1]; \
- b[1][2] = a[2][1]; \
- \
- b[2][0] = a[0][2]; \
- b[2][1] = a[1][2]; \
- b[2][2] = a[2][2]; \
- }
- /*! matrix transpose */
- #define TRANSPOSE_MATRIX_4X4(b, a) \
- { \
- b[0][0] = a[0][0]; \
- b[0][1] = a[1][0]; \
- b[0][2] = a[2][0]; \
- b[0][3] = a[3][0]; \
- \
- b[1][0] = a[0][1]; \
- b[1][1] = a[1][1]; \
- b[1][2] = a[2][1]; \
- b[1][3] = a[3][1]; \
- \
- b[2][0] = a[0][2]; \
- b[2][1] = a[1][2]; \
- b[2][2] = a[2][2]; \
- b[2][3] = a[3][2]; \
- \
- b[3][0] = a[0][3]; \
- b[3][1] = a[1][3]; \
- b[3][2] = a[2][3]; \
- b[3][3] = a[3][3]; \
- }
- /*! multiply matrix by scalar */
- #define SCALE_MATRIX_2X2(b, s, a) \
- { \
- b[0][0] = (s)*a[0][0]; \
- b[0][1] = (s)*a[0][1]; \
- \
- b[1][0] = (s)*a[1][0]; \
- b[1][1] = (s)*a[1][1]; \
- }
- /*! multiply matrix by scalar */
- #define SCALE_MATRIX_3X3(b, s, a) \
- { \
- b[0][0] = (s)*a[0][0]; \
- b[0][1] = (s)*a[0][1]; \
- b[0][2] = (s)*a[0][2]; \
- \
- b[1][0] = (s)*a[1][0]; \
- b[1][1] = (s)*a[1][1]; \
- b[1][2] = (s)*a[1][2]; \
- \
- b[2][0] = (s)*a[2][0]; \
- b[2][1] = (s)*a[2][1]; \
- b[2][2] = (s)*a[2][2]; \
- }
- /*! multiply matrix by scalar */
- #define SCALE_MATRIX_4X4(b, s, a) \
- { \
- b[0][0] = (s)*a[0][0]; \
- b[0][1] = (s)*a[0][1]; \
- b[0][2] = (s)*a[0][2]; \
- b[0][3] = (s)*a[0][3]; \
- \
- b[1][0] = (s)*a[1][0]; \
- b[1][1] = (s)*a[1][1]; \
- b[1][2] = (s)*a[1][2]; \
- b[1][3] = (s)*a[1][3]; \
- \
- b[2][0] = (s)*a[2][0]; \
- b[2][1] = (s)*a[2][1]; \
- b[2][2] = (s)*a[2][2]; \
- b[2][3] = (s)*a[2][3]; \
- \
- b[3][0] = s * a[3][0]; \
- b[3][1] = s * a[3][1]; \
- b[3][2] = s * a[3][2]; \
- b[3][3] = s * a[3][3]; \
- }
- /*! multiply matrix by scalar */
- #define SCALE_VEC_MATRIX_2X2(b, svec, a) \
- { \
- b[0][0] = svec[0] * a[0][0]; \
- b[1][0] = svec[0] * a[1][0]; \
- \
- b[0][1] = svec[1] * a[0][1]; \
- b[1][1] = svec[1] * a[1][1]; \
- }
- /*! multiply matrix by scalar. Each columns is scaled by each scalar vector component */
- #define SCALE_VEC_MATRIX_3X3(b, svec, a) \
- { \
- b[0][0] = svec[0] * a[0][0]; \
- b[1][0] = svec[0] * a[1][0]; \
- b[2][0] = svec[0] * a[2][0]; \
- \
- b[0][1] = svec[1] * a[0][1]; \
- b[1][1] = svec[1] * a[1][1]; \
- b[2][1] = svec[1] * a[2][1]; \
- \
- b[0][2] = svec[2] * a[0][2]; \
- b[1][2] = svec[2] * a[1][2]; \
- b[2][2] = svec[2] * a[2][2]; \
- }
- /*! multiply matrix by scalar */
- #define SCALE_VEC_MATRIX_4X4(b, svec, a) \
- { \
- b[0][0] = svec[0] * a[0][0]; \
- b[1][0] = svec[0] * a[1][0]; \
- b[2][0] = svec[0] * a[2][0]; \
- b[3][0] = svec[0] * a[3][0]; \
- \
- b[0][1] = svec[1] * a[0][1]; \
- b[1][1] = svec[1] * a[1][1]; \
- b[2][1] = svec[1] * a[2][1]; \
- b[3][1] = svec[1] * a[3][1]; \
- \
- b[0][2] = svec[2] * a[0][2]; \
- b[1][2] = svec[2] * a[1][2]; \
- b[2][2] = svec[2] * a[2][2]; \
- b[3][2] = svec[2] * a[3][2]; \
- \
- b[0][3] = svec[3] * a[0][3]; \
- b[1][3] = svec[3] * a[1][3]; \
- b[2][3] = svec[3] * a[2][3]; \
- b[3][3] = svec[3] * a[3][3]; \
- }
- /*! multiply matrix by scalar */
- #define ACCUM_SCALE_MATRIX_2X2(b, s, a) \
- { \
- b[0][0] += (s)*a[0][0]; \
- b[0][1] += (s)*a[0][1]; \
- \
- b[1][0] += (s)*a[1][0]; \
- b[1][1] += (s)*a[1][1]; \
- }
- /*! multiply matrix by scalar */
- #define ACCUM_SCALE_MATRIX_3X3(b, s, a) \
- { \
- b[0][0] += (s)*a[0][0]; \
- b[0][1] += (s)*a[0][1]; \
- b[0][2] += (s)*a[0][2]; \
- \
- b[1][0] += (s)*a[1][0]; \
- b[1][1] += (s)*a[1][1]; \
- b[1][2] += (s)*a[1][2]; \
- \
- b[2][0] += (s)*a[2][0]; \
- b[2][1] += (s)*a[2][1]; \
- b[2][2] += (s)*a[2][2]; \
- }
- /*! multiply matrix by scalar */
- #define ACCUM_SCALE_MATRIX_4X4(b, s, a) \
- { \
- b[0][0] += (s)*a[0][0]; \
- b[0][1] += (s)*a[0][1]; \
- b[0][2] += (s)*a[0][2]; \
- b[0][3] += (s)*a[0][3]; \
- \
- b[1][0] += (s)*a[1][0]; \
- b[1][1] += (s)*a[1][1]; \
- b[1][2] += (s)*a[1][2]; \
- b[1][3] += (s)*a[1][3]; \
- \
- b[2][0] += (s)*a[2][0]; \
- b[2][1] += (s)*a[2][1]; \
- b[2][2] += (s)*a[2][2]; \
- b[2][3] += (s)*a[2][3]; \
- \
- b[3][0] += (s)*a[3][0]; \
- b[3][1] += (s)*a[3][1]; \
- b[3][2] += (s)*a[3][2]; \
- b[3][3] += (s)*a[3][3]; \
- }
- /*! matrix product */
- /*! 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];*/
- #define MATRIX_PRODUCT_2X2(c, a, b) \
- { \
- c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0]; \
- c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1]; \
- \
- c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0]; \
- c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1]; \
- }
- /*! matrix product */
- /*! 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];*/
- #define MATRIX_PRODUCT_3X3(c, a, b) \
- { \
- c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]; \
- c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]; \
- c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2]; \
- \
- c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0]; \
- c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1]; \
- c[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2]; \
- \
- c[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0]; \
- c[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1]; \
- c[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2]; \
- }
- /*! matrix product */
- /*! 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];*/
- #define MATRIX_PRODUCT_4X4(c, a, b) \
- { \
- 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]; \
- 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]; \
- 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]; \
- 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]; \
- \
- 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]; \
- 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]; \
- 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]; \
- 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]; \
- \
- 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]; \
- 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]; \
- 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]; \
- 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]; \
- \
- 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]; \
- 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]; \
- 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]; \
- 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]; \
- }
- /*! matrix times vector */
- #define MAT_DOT_VEC_2X2(p, m, v) \
- { \
- p[0] = m[0][0] * v[0] + m[0][1] * v[1]; \
- p[1] = m[1][0] * v[0] + m[1][1] * v[1]; \
- }
- /*! matrix times vector */
- #define MAT_DOT_VEC_3X3(p, m, v) \
- { \
- p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2]; \
- p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2]; \
- p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2]; \
- }
- /*! matrix times vector
- v is a vec4f
- */
- #define MAT_DOT_VEC_4X4(p, m, v) \
- { \
- p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3]; \
- p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3]; \
- p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3]; \
- p[3] = m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]; \
- }
- /*! matrix times vector
- v is a vec3f
- and m is a mat4f<br>
- Last column is added as the position
- */
- #define MAT_DOT_VEC_3X4(p, m, v) \
- { \
- p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3]; \
- p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3]; \
- p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3]; \
- }
- /*! vector transpose times matrix */
- /*! p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
- #define VEC_DOT_MAT_3X3(p, v, m) \
- { \
- p[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0]; \
- p[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1]; \
- p[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2]; \
- }
- /*! affine matrix times vector */
- /** The matrix is assumed to be an affine matrix, with last two
- * entries representing a translation */
- #define MAT_DOT_VEC_2X3(p, m, v) \
- { \
- p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2]; \
- p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2]; \
- }
- //! Transform a plane
- #define MAT_TRANSFORM_PLANE_4X4(pout, m, plane) \
- { \
- pout[0] = m[0][0] * plane[0] + m[0][1] * plane[1] + m[0][2] * plane[2]; \
- pout[1] = m[1][0] * plane[0] + m[1][1] * plane[1] + m[1][2] * plane[2]; \
- pout[2] = m[2][0] * plane[0] + m[2][1] * plane[1] + m[2][2] * plane[2]; \
- pout[3] = m[0][3] * pout[0] + m[1][3] * pout[1] + m[2][3] * pout[2] + plane[3]; \
- }
- /** inverse transpose of matrix times vector
- *
- * This macro computes inverse transpose of matrix m,
- * and multiplies vector v into it, to yeild vector p
- *
- * DANGER !!! Do Not use this on normal vectors!!!
- * It will leave normals the wrong length !!!
- * See macro below for use on normals.
- */
- #define INV_TRANSP_MAT_DOT_VEC_2X2(p, m, v) \
- { \
- GREAL det; \
- \
- det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \
- p[0] = m[1][1] * v[0] - m[1][0] * v[1]; \
- p[1] = -m[0][1] * v[0] + m[0][0] * v[1]; \
- \
- /* if matrix not singular, and not orthonormal, then renormalize */ \
- if ((det != 1.0f) && (det != 0.0f)) \
- { \
- det = 1.0f / det; \
- p[0] *= det; \
- p[1] *= det; \
- } \
- }
- /** transform normal vector by inverse transpose of matrix
- * and then renormalize the vector
- *
- * This macro computes inverse transpose of matrix m,
- * and multiplies vector v into it, to yeild vector p
- * Vector p is then normalized.
- */
- #define NORM_XFORM_2X2(p, m, v) \
- { \
- GREAL len; \
- \
- /* do nothing if off-diagonals are zero and diagonals are \
- * equal */ \
- if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) \
- { \
- p[0] = m[1][1] * v[0] - m[1][0] * v[1]; \
- p[1] = -m[0][1] * v[0] + m[0][0] * v[1]; \
- \
- len = p[0] * p[0] + p[1] * p[1]; \
- GIM_INV_SQRT(len, len); \
- p[0] *= len; \
- p[1] *= len; \
- } \
- else \
- { \
- VEC_COPY_2(p, v); \
- } \
- }
- /** outer product of vector times vector transpose
- *
- * The outer product of vector v and vector transpose t yeilds
- * dyadic matrix m.
- */
- #define OUTER_PRODUCT_2X2(m, v, t) \
- { \
- m[0][0] = v[0] * t[0]; \
- m[0][1] = v[0] * t[1]; \
- \
- m[1][0] = v[1] * t[0]; \
- m[1][1] = v[1] * t[1]; \
- }
- /** outer product of vector times vector transpose
- *
- * The outer product of vector v and vector transpose t yeilds
- * dyadic matrix m.
- */
- #define OUTER_PRODUCT_3X3(m, v, t) \
- { \
- m[0][0] = v[0] * t[0]; \
- m[0][1] = v[0] * t[1]; \
- m[0][2] = v[0] * t[2]; \
- \
- m[1][0] = v[1] * t[0]; \
- m[1][1] = v[1] * t[1]; \
- m[1][2] = v[1] * t[2]; \
- \
- m[2][0] = v[2] * t[0]; \
- m[2][1] = v[2] * t[1]; \
- m[2][2] = v[2] * t[2]; \
- }
- /** outer product of vector times vector transpose
- *
- * The outer product of vector v and vector transpose t yeilds
- * dyadic matrix m.
- */
- #define OUTER_PRODUCT_4X4(m, v, t) \
- { \
- m[0][0] = v[0] * t[0]; \
- m[0][1] = v[0] * t[1]; \
- m[0][2] = v[0] * t[2]; \
- m[0][3] = v[0] * t[3]; \
- \
- m[1][0] = v[1] * t[0]; \
- m[1][1] = v[1] * t[1]; \
- m[1][2] = v[1] * t[2]; \
- m[1][3] = v[1] * t[3]; \
- \
- m[2][0] = v[2] * t[0]; \
- m[2][1] = v[2] * t[1]; \
- m[2][2] = v[2] * t[2]; \
- m[2][3] = v[2] * t[3]; \
- \
- m[3][0] = v[3] * t[0]; \
- m[3][1] = v[3] * t[1]; \
- m[3][2] = v[3] * t[2]; \
- m[3][3] = v[3] * t[3]; \
- }
- /** outer product of vector times vector transpose
- *
- * The outer product of vector v and vector transpose t yeilds
- * dyadic matrix m.
- */
- #define ACCUM_OUTER_PRODUCT_2X2(m, v, t) \
- { \
- m[0][0] += v[0] * t[0]; \
- m[0][1] += v[0] * t[1]; \
- \
- m[1][0] += v[1] * t[0]; \
- m[1][1] += v[1] * t[1]; \
- }
- /** outer product of vector times vector transpose
- *
- * The outer product of vector v and vector transpose t yeilds
- * dyadic matrix m.
- */
- #define ACCUM_OUTER_PRODUCT_3X3(m, v, t) \
- { \
- m[0][0] += v[0] * t[0]; \
- m[0][1] += v[0] * t[1]; \
- m[0][2] += v[0] * t[2]; \
- \
- m[1][0] += v[1] * t[0]; \
- m[1][1] += v[1] * t[1]; \
- m[1][2] += v[1] * t[2]; \
- \
- m[2][0] += v[2] * t[0]; \
- m[2][1] += v[2] * t[1]; \
- m[2][2] += v[2] * t[2]; \
- }
- /** outer product of vector times vector transpose
- *
- * The outer product of vector v and vector transpose t yeilds
- * dyadic matrix m.
- */
- #define ACCUM_OUTER_PRODUCT_4X4(m, v, t) \
- { \
- m[0][0] += v[0] * t[0]; \
- m[0][1] += v[0] * t[1]; \
- m[0][2] += v[0] * t[2]; \
- m[0][3] += v[0] * t[3]; \
- \
- m[1][0] += v[1] * t[0]; \
- m[1][1] += v[1] * t[1]; \
- m[1][2] += v[1] * t[2]; \
- m[1][3] += v[1] * t[3]; \
- \
- m[2][0] += v[2] * t[0]; \
- m[2][1] += v[2] * t[1]; \
- m[2][2] += v[2] * t[2]; \
- m[2][3] += v[2] * t[3]; \
- \
- m[3][0] += v[3] * t[0]; \
- m[3][1] += v[3] * t[1]; \
- m[3][2] += v[3] * t[2]; \
- m[3][3] += v[3] * t[3]; \
- }
- /** determinant of matrix
- *
- * Computes determinant of matrix m, returning d
- */
- #define DETERMINANT_2X2(d, m) \
- { \
- d = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \
- }
- /** determinant of matrix
- *
- * Computes determinant of matrix m, returning d
- */
- #define DETERMINANT_3X3(d, m) \
- { \
- d = m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
- d -= m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]); \
- d += m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
- }
- /** i,j,th cofactor of a 4x4 matrix
- *
- */
- #define COFACTOR_4X4_IJ(fac, m, i, j) \
- { \
- GUINT __ii[4], __jj[4], __k; \
- \
- for (__k = 0; __k < i; __k++) __ii[__k] = __k; \
- for (__k = i; __k < 3; __k++) __ii[__k] = __k + 1; \
- for (__k = 0; __k < j; __k++) __jj[__k] = __k; \
- for (__k = j; __k < 3; __k++) __jj[__k] = __k + 1; \
- \
- (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]]); \
- (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]]); \
- (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]]); \
- \
- __k = i + j; \
- if (__k != (__k / 2) * 2) \
- { \
- (fac) = -(fac); \
- } \
- }
- /** determinant of matrix
- *
- * Computes determinant of matrix m, returning d
- */
- #define DETERMINANT_4X4(d, m) \
- { \
- GREAL cofac; \
- COFACTOR_4X4_IJ(cofac, m, 0, 0); \
- d = m[0][0] * cofac; \
- COFACTOR_4X4_IJ(cofac, m, 0, 1); \
- d += m[0][1] * cofac; \
- COFACTOR_4X4_IJ(cofac, m, 0, 2); \
- d += m[0][2] * cofac; \
- COFACTOR_4X4_IJ(cofac, m, 0, 3); \
- d += m[0][3] * cofac; \
- }
- /** cofactor of matrix
- *
- * Computes cofactor of matrix m, returning a
- */
- #define COFACTOR_2X2(a, m) \
- { \
- a[0][0] = (m)[1][1]; \
- a[0][1] = -(m)[1][0]; \
- a[1][0] = -(m)[0][1]; \
- a[1][1] = (m)[0][0]; \
- }
- /** cofactor of matrix
- *
- * Computes cofactor of matrix m, returning a
- */
- #define COFACTOR_3X3(a, m) \
- { \
- a[0][0] = m[1][1] * m[2][2] - m[1][2] * m[2][1]; \
- a[0][1] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]); \
- a[0][2] = m[1][0] * m[2][1] - m[1][1] * m[2][0]; \
- a[1][0] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]); \
- a[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0]; \
- a[1][2] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]); \
- a[2][0] = m[0][1] * m[1][2] - m[0][2] * m[1][1]; \
- a[2][1] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]); \
- a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \
- }
- /** cofactor of matrix
- *
- * Computes cofactor of matrix m, returning a
- */
- #define COFACTOR_4X4(a, m) \
- { \
- int i, j; \
- \
- for (i = 0; i < 4; i++) \
- { \
- for (j = 0; j < 4; j++) \
- { \
- COFACTOR_4X4_IJ(a[i][j], m, i, j); \
- } \
- } \
- }
- /** adjoint of matrix
- *
- * Computes adjoint of matrix m, returning a
- * (Note that adjoint is just the transpose of the cofactor matrix)
- */
- #define ADJOINT_2X2(a, m) \
- { \
- a[0][0] = (m)[1][1]; \
- a[1][0] = -(m)[1][0]; \
- a[0][1] = -(m)[0][1]; \
- a[1][1] = (m)[0][0]; \
- }
- /** adjoint of matrix
- *
- * Computes adjoint of matrix m, returning a
- * (Note that adjoint is just the transpose of the cofactor matrix)
- */
- #define ADJOINT_3X3(a, m) \
- { \
- a[0][0] = m[1][1] * m[2][2] - m[1][2] * m[2][1]; \
- a[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]); \
- a[2][0] = m[1][0] * m[2][1] - m[1][1] * m[2][0]; \
- a[0][1] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]); \
- a[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0]; \
- a[2][1] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]); \
- a[0][2] = m[0][1] * m[1][2] - m[0][2] * m[1][1]; \
- a[1][2] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]); \
- a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \
- }
- /** adjoint of matrix
- *
- * Computes adjoint of matrix m, returning a
- * (Note that adjoint is just the transpose of the cofactor matrix)
- */
- #define ADJOINT_4X4(a, m) \
- { \
- char _i_, _j_; \
- \
- for (_i_ = 0; _i_ < 4; _i_++) \
- { \
- for (_j_ = 0; _j_ < 4; _j_++) \
- { \
- COFACTOR_4X4_IJ(a[_j_][_i_], m, _i_, _j_); \
- } \
- } \
- }
- /** compute adjoint of matrix and scale
- *
- * Computes adjoint of matrix m, scales it by s, returning a
- */
- #define SCALE_ADJOINT_2X2(a, s, m) \
- { \
- a[0][0] = (s)*m[1][1]; \
- a[1][0] = -(s)*m[1][0]; \
- a[0][1] = -(s)*m[0][1]; \
- a[1][1] = (s)*m[0][0]; \
- }
- /** compute adjoint of matrix and scale
- *
- * Computes adjoint of matrix m, scales it by s, returning a
- */
- #define SCALE_ADJOINT_3X3(a, s, m) \
- { \
- a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
- a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]); \
- a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
- \
- a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]); \
- a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]); \
- a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]); \
- \
- a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]); \
- a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]); \
- a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]); \
- }
- /** compute adjoint of matrix and scale
- *
- * Computes adjoint of matrix m, scales it by s, returning a
- */
- #define SCALE_ADJOINT_4X4(a, s, m) \
- { \
- char _i_, _j_; \
- for (_i_ = 0; _i_ < 4; _i_++) \
- { \
- for (_j_ = 0; _j_ < 4; _j_++) \
- { \
- COFACTOR_4X4_IJ(a[_j_][_i_], m, _i_, _j_); \
- a[_j_][_i_] *= s; \
- } \
- } \
- }
- /** inverse of matrix
- *
- * Compute inverse of matrix a, returning determinant m and
- * inverse b
- */
- #define INVERT_2X2(b, det, a) \
- { \
- GREAL _tmp_; \
- DETERMINANT_2X2(det, a); \
- _tmp_ = 1.0 / (det); \
- SCALE_ADJOINT_2X2(b, _tmp_, a); \
- }
- /** inverse of matrix
- *
- * Compute inverse of matrix a, returning determinant m and
- * inverse b
- */
- #define INVERT_3X3(b, det, a) \
- { \
- GREAL _tmp_; \
- DETERMINANT_3X3(det, a); \
- _tmp_ = 1.0 / (det); \
- SCALE_ADJOINT_3X3(b, _tmp_, a); \
- }
- /** inverse of matrix
- *
- * Compute inverse of matrix a, returning determinant m and
- * inverse b
- */
- #define INVERT_4X4(b, det, a) \
- { \
- GREAL _tmp_; \
- DETERMINANT_4X4(det, a); \
- _tmp_ = 1.0 / (det); \
- SCALE_ADJOINT_4X4(b, _tmp_, a); \
- }
- //! Get the triple(3) row of a transform matrix
- #define MAT_GET_ROW(mat, vec3, rowindex) \
- { \
- vec3[0] = mat[rowindex][0]; \
- vec3[1] = mat[rowindex][1]; \
- vec3[2] = mat[rowindex][2]; \
- }
- //! Get the tuple(2) row of a transform matrix
- #define MAT_GET_ROW2(mat, vec2, rowindex) \
- { \
- vec2[0] = mat[rowindex][0]; \
- vec2[1] = mat[rowindex][1]; \
- }
- //! Get the quad (4) row of a transform matrix
- #define MAT_GET_ROW4(mat, vec4, rowindex) \
- { \
- vec4[0] = mat[rowindex][0]; \
- vec4[1] = mat[rowindex][1]; \
- vec4[2] = mat[rowindex][2]; \
- vec4[3] = mat[rowindex][3]; \
- }
- //! Get the triple(3) col of a transform matrix
- #define MAT_GET_COL(mat, vec3, colindex) \
- { \
- vec3[0] = mat[0][colindex]; \
- vec3[1] = mat[1][colindex]; \
- vec3[2] = mat[2][colindex]; \
- }
- //! Get the tuple(2) col of a transform matrix
- #define MAT_GET_COL2(mat, vec2, colindex) \
- { \
- vec2[0] = mat[0][colindex]; \
- vec2[1] = mat[1][colindex]; \
- }
- //! Get the quad (4) col of a transform matrix
- #define MAT_GET_COL4(mat, vec4, colindex) \
- { \
- vec4[0] = mat[0][colindex]; \
- vec4[1] = mat[1][colindex]; \
- vec4[2] = mat[2][colindex]; \
- vec4[3] = mat[3][colindex]; \
- }
- //! Get the triple(3) col of a transform matrix
- #define MAT_GET_X(mat, vec3) \
- { \
- MAT_GET_COL(mat, vec3, 0); \
- }
- //! Get the triple(3) col of a transform matrix
- #define MAT_GET_Y(mat, vec3) \
- { \
- MAT_GET_COL(mat, vec3, 1); \
- }
- //! Get the triple(3) col of a transform matrix
- #define MAT_GET_Z(mat, vec3) \
- { \
- MAT_GET_COL(mat, vec3, 2); \
- }
- //! Get the triple(3) col of a transform matrix
- #define MAT_SET_X(mat, vec3) \
- { \
- mat[0][0] = vec3[0]; \
- mat[1][0] = vec3[1]; \
- mat[2][0] = vec3[2]; \
- }
- //! Get the triple(3) col of a transform matrix
- #define MAT_SET_Y(mat, vec3) \
- { \
- mat[0][1] = vec3[0]; \
- mat[1][1] = vec3[1]; \
- mat[2][1] = vec3[2]; \
- }
- //! Get the triple(3) col of a transform matrix
- #define MAT_SET_Z(mat, vec3) \
- { \
- mat[0][2] = vec3[0]; \
- mat[1][2] = vec3[1]; \
- mat[2][2] = vec3[2]; \
- }
- //! Get the triple(3) col of a transform matrix
- #define MAT_GET_TRANSLATION(mat, vec3) \
- { \
- vec3[0] = mat[0][3]; \
- vec3[1] = mat[1][3]; \
- vec3[2] = mat[2][3]; \
- }
- //! Set the triple(3) col of a transform matrix
- #define MAT_SET_TRANSLATION(mat, vec3) \
- { \
- mat[0][3] = vec3[0]; \
- mat[1][3] = vec3[1]; \
- mat[2][3] = vec3[2]; \
- }
- //! Returns the dot product between a vec3f and the row of a matrix
- #define MAT_DOT_ROW(mat, vec3, rowindex) (vec3[0] * mat[rowindex][0] + vec3[1] * mat[rowindex][1] + vec3[2] * mat[rowindex][2])
- //! Returns the dot product between a vec2f and the row of a matrix
- #define MAT_DOT_ROW2(mat, vec2, rowindex) (vec2[0] * mat[rowindex][0] + vec2[1] * mat[rowindex][1])
- //! Returns the dot product between a vec4f and the row of a matrix
- #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])
- //! Returns the dot product between a vec3f and the col of a matrix
- #define MAT_DOT_COL(mat, vec3, colindex) (vec3[0] * mat[0][colindex] + vec3[1] * mat[1][colindex] + vec3[2] * mat[2][colindex])
- //! Returns the dot product between a vec2f and the col of a matrix
- #define MAT_DOT_COL2(mat, vec2, colindex) (vec2[0] * mat[0][colindex] + vec2[1] * mat[1][colindex])
- //! Returns the dot product between a vec4f and the col of a matrix
- #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])
- /*!Transpose matrix times vector
- v is a vec3f
- and m is a mat4f<br>
- */
- #define INV_MAT_DOT_VEC_3X3(p, m, v) \
- { \
- p[0] = MAT_DOT_COL(m, v, 0); \
- p[1] = MAT_DOT_COL(m, v, 1); \
- p[2] = MAT_DOT_COL(m, v, 2); \
- }
- #endif // GIM_VECTOR_H_INCLUDED
|