mat.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // --- mat.h ---
  4. //
  5. //////////////////////////////////////////////////////////////////////////////
  6. #ifndef __ANGEL_MAT_H__
  7. #define __ANGEL_MAT_H__
  8. #include "vec.h"
  9. #include <cstdio>
  10. namespace Angel {
  11. //----------------------------------------------------------------------------
  12. //
  13. // mat2 - 2D square matrix
  14. //
  15. class mat2 {
  16. vec2 _m[2];
  17. public:
  18. //
  19. // --- Constructors and Destructors ---
  20. //
  21. mat2( const GLfloat d = GLfloat(1.0) ) // Create a diagional matrix
  22. { _m[0].x = d; _m[1].y = d; }
  23. mat2( const vec2& a, const vec2& b )
  24. { _m[0] = a; _m[1] = b; }
  25. mat2( GLfloat m00, GLfloat m10, GLfloat m01, GLfloat m11 )
  26. { _m[0] = vec2( m00, m10 ); _m[1] = vec2( m01, m11 ); }
  27. // old version
  28. // { _m[0] = vec2( m00, m01 ); _m[1] = vec2( m10, m11 ); }
  29. mat2( const mat2& m ) {
  30. if ( *this != m ) {
  31. _m[0] = m._m[0];
  32. _m[1] = m._m[1];
  33. }
  34. }
  35. //
  36. // --- Indexing Operator ---
  37. //
  38. vec2& operator [] ( int i ) { return _m[i]; }
  39. const vec2& operator [] ( int i ) const { return _m[i]; }
  40. //
  41. // --- (non-modifying) Arithmatic Operators ---
  42. //
  43. mat2 operator + ( const mat2& m ) const
  44. { return mat2( _m[0]+m[0], _m[1]+m[1] ); }
  45. mat2 operator - ( const mat2& m ) const
  46. { return mat2( _m[0]-m[0], _m[1]-m[1] ); }
  47. mat2 operator * ( const GLfloat s ) const
  48. { return mat2( s*_m[0], s*_m[1] ); }
  49. mat2 operator / ( const GLfloat s ) const {
  50. #ifdef DEBUG
  51. if ( std::fabs(s) < DivideByZeroTolerance ) {
  52. std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
  53. << "Division by zero" << std::endl;
  54. return mat2();
  55. }
  56. #endif // DEBUG
  57. GLfloat r = GLfloat(1.0) / s;
  58. return *this * r;
  59. }
  60. friend mat2 operator * ( const GLfloat s, const mat2& m )
  61. { return m * s; }
  62. mat2 operator * ( const mat2& m ) const {
  63. mat2 a( 0.0 );
  64. for ( int i = 0; i < 2; ++i ) {
  65. for ( int j = 0; j < 2; ++j ) {
  66. for ( int k = 0; k < 2; ++k ) {
  67. a[i][j] += _m[i][k] * m[k][j];
  68. }
  69. }
  70. }
  71. return a;
  72. }
  73. //
  74. // --- (modifying) Arithmetic Operators ---
  75. //
  76. mat2& operator += ( const mat2& m ) {
  77. _m[0] += m[0]; _m[1] += m[1];
  78. return *this;
  79. }
  80. mat2& operator -= ( const mat2& m ) {
  81. _m[0] -= m[0]; _m[1] -= m[1];
  82. return *this;
  83. }
  84. mat2& operator *= ( const GLfloat s ) {
  85. _m[0] *= s; _m[1] *= s;
  86. return *this;
  87. }
  88. mat2& operator *= ( const mat2& m ) {
  89. mat2 a( 0.0 );
  90. for ( int i = 0; i < 2; ++i ) {
  91. for ( int j = 0; j < 2; ++j ) {
  92. for ( int k = 0; k < 2; ++k ) {
  93. a[i][j] += _m[i][k] * m[k][j];
  94. }
  95. }
  96. }
  97. return *this = a;
  98. }
  99. mat2& operator /= ( const GLfloat s ) {
  100. #ifdef DEBUG
  101. if ( std::fabs(s) < DivideByZeroTolerance ) {
  102. std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
  103. << "Division by zero" << std::endl;
  104. return mat2();
  105. }
  106. #endif // DEBUG
  107. GLfloat r = GLfloat(1.0) / s;
  108. return *this *= r;
  109. }
  110. //
  111. // --- Matrix / Vector operators ---
  112. //
  113. vec2 operator * ( const vec2& v ) const { // m * v
  114. return vec2( _m[0][0]*v.x + _m[0][1]*v.y,
  115. _m[1][0]*v.x + _m[1][1]*v.y );
  116. }
  117. //
  118. // --- Insertion and Extraction Operators ---
  119. //
  120. friend std::ostream& operator << ( std::ostream& os, const mat2& m )
  121. { return os << std::endl << m[0] << std::endl << m[1] << std::endl; }
  122. friend std::istream& operator >> ( std::istream& is, mat2& m )
  123. { return is >> m._m[0] >> m._m[1] ; }
  124. //
  125. // --- Conversion Operators ---
  126. //
  127. operator const GLfloat* () const
  128. { return static_cast<const GLfloat*>( &_m[0].x ); }
  129. operator GLfloat* ()
  130. { return static_cast<GLfloat*>( &_m[0].x ); }
  131. };
  132. //
  133. // --- Non-class mat2 Methods ---
  134. //
  135. inline
  136. mat2 matrixCompMult( const mat2& A, const mat2& B ) {
  137. return mat2( A[0][0]*B[0][0], A[0][1]*B[0][1],
  138. A[1][0]*B[1][0], A[1][1]*B[1][1] );
  139. }
  140. inline
  141. mat2 transpose( const mat2& A ) {
  142. return mat2( A[0][0], A[1][0],
  143. A[0][1], A[1][1] );
  144. }
  145. //----------------------------------------------------------------------------
  146. //
  147. // mat3 - 3D square matrix
  148. //
  149. class mat3 {
  150. vec3 _m[3];
  151. public:
  152. //
  153. // --- Constructors and Destructors ---
  154. //
  155. mat3( const GLfloat d = GLfloat(1.0) ) // Create a diagional matrix
  156. { _m[0].x = d; _m[1].y = d; _m[2].z = d; }
  157. mat3( const vec3& a, const vec3& b, const vec3& c )
  158. { _m[0] = a; _m[1] = b; _m[2] = c; }
  159. mat3( GLfloat m00, GLfloat m10, GLfloat m20,
  160. GLfloat m01, GLfloat m11, GLfloat m21,
  161. GLfloat m02, GLfloat m12, GLfloat m22 )
  162. {
  163. _m[0] = vec3( m00, m10, m20 );
  164. _m[1] = vec3( m01, m11, m21 );
  165. _m[2] = vec3( m02, m12, m22 );
  166. // _m[0] = vec3( m00, m01, m02 );
  167. // _m[1] = vec3( m10, m11, m12 );
  168. // _m[2] = vec3( m20, m21, m22 );
  169. }
  170. mat3( const mat3& m )
  171. {
  172. if ( *this != m ) {
  173. _m[0] = m._m[0];
  174. _m[1] = m._m[1];
  175. _m[2] = m._m[2];
  176. }
  177. }
  178. //
  179. // --- Indexing Operator ---
  180. //
  181. vec3& operator [] ( int i ) { return _m[i]; }
  182. const vec3& operator [] ( int i ) const { return _m[i]; }
  183. //
  184. // --- (non-modifying) Arithmatic Operators ---
  185. //
  186. mat3 operator + ( const mat3& m ) const
  187. { return mat3( _m[0]+m[0], _m[1]+m[1], _m[2]+m[2] ); }
  188. mat3 operator - ( const mat3& m ) const
  189. { return mat3( _m[0]-m[0], _m[1]-m[1], _m[2]-m[2] ); }
  190. mat3 operator * ( const GLfloat s ) const
  191. { return mat3( s*_m[0], s*_m[1], s*_m[2] ); }
  192. mat3 operator / ( const GLfloat s ) const {
  193. #ifdef DEBUG
  194. if ( std::fabs(s) < DivideByZeroTolerance ) {
  195. std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
  196. << "Division by zero" << std::endl;
  197. return mat3();
  198. }
  199. #endif // DEBUG
  200. GLfloat r = GLfloat(1.0) / s;
  201. return *this * r;
  202. }
  203. friend mat3 operator * ( const GLfloat s, const mat3& m )
  204. { return m * s; }
  205. mat3 operator * ( const mat3& m ) const {
  206. mat3 a( 0.0 );
  207. for ( int i = 0; i < 3; ++i ) {
  208. for ( int j = 0; j < 3; ++j ) {
  209. for ( int k = 0; k < 3; ++k ) {
  210. a[i][j] += _m[i][k] * m[k][j];
  211. }
  212. }
  213. }
  214. return a;
  215. }
  216. //
  217. // --- (modifying) Arithmetic Operators ---
  218. //
  219. mat3& operator += ( const mat3& m ) {
  220. _m[0] += m[0]; _m[1] += m[1]; _m[2] += m[2];
  221. return *this;
  222. }
  223. mat3& operator -= ( const mat3& m ) {
  224. _m[0] -= m[0]; _m[1] -= m[1]; _m[2] -= m[2];
  225. return *this;
  226. }
  227. mat3& operator *= ( const GLfloat s ) {
  228. _m[0] *= s; _m[1] *= s; _m[2] *= s;
  229. return *this;
  230. }
  231. mat3& operator *= ( const mat3& m ) {
  232. mat3 a( 0.0 );
  233. for ( int i = 0; i < 3; ++i ) {
  234. for ( int j = 0; j < 3; ++j ) {
  235. for ( int k = 0; k < 3; ++k ) {
  236. a[i][j] += _m[i][k] * m[k][j];
  237. }
  238. }
  239. }
  240. return *this = a;
  241. }
  242. mat3& operator /= ( const GLfloat s ) {
  243. #ifdef DEBUG
  244. if ( std::fabs(s) < DivideByZeroTolerance ) {
  245. std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
  246. << "Division by zero" << std::endl;
  247. return mat3();
  248. }
  249. #endif // DEBUG
  250. GLfloat r = GLfloat(1.0) / s;
  251. return *this *= r;
  252. }
  253. //
  254. // --- Matrix / Vector operators ---
  255. //
  256. vec3 operator * ( const vec3& v ) const { // m * v
  257. return vec3( _m[0][0]*v.x + _m[0][1]*v.y + _m[0][2]*v.z,
  258. _m[1][0]*v.x + _m[1][1]*v.y + _m[1][2]*v.z,
  259. _m[2][0]*v.x + _m[2][1]*v.y + _m[2][2]*v.z );
  260. }
  261. //
  262. // --- Insertion and Extraction Operators ---
  263. //
  264. friend std::ostream& operator << ( std::ostream& os, const mat3& m ) {
  265. return os << std::endl
  266. << m[0] << std::endl
  267. << m[1] << std::endl
  268. << m[2] << std::endl;
  269. }
  270. friend std::istream& operator >> ( std::istream& is, mat3& m )
  271. { return is >> m._m[0] >> m._m[1] >> m._m[2] ; }
  272. //
  273. // --- Conversion Operators ---
  274. //
  275. operator const GLfloat* () const
  276. { return static_cast<const GLfloat*>( &_m[0].x ); }
  277. operator GLfloat* ()
  278. { return static_cast<GLfloat*>( &_m[0].x ); }
  279. };
  280. //
  281. // --- Non-class mat3 Methods ---
  282. //
  283. inline
  284. mat3 matrixCompMult( const mat3& A, const mat3& B ) {
  285. return mat3( A[0][0]*B[0][0], A[0][1]*B[0][1], A[0][2]*B[0][2],
  286. A[1][0]*B[1][0], A[1][1]*B[1][1], A[1][2]*B[1][2],
  287. A[2][0]*B[2][0], A[2][1]*B[2][1], A[2][2]*B[2][2] );
  288. }
  289. inline
  290. mat3 transpose( const mat3& A ) {
  291. return mat3( A[0][0], A[1][0], A[2][0],
  292. A[0][1], A[1][1], A[2][1],
  293. A[0][2], A[1][2], A[2][2] );
  294. }
  295. //----------------------------------------------------------------------------
  296. //
  297. // mat4.h - 4D square matrix
  298. //
  299. class mat4 {
  300. vec4 _m[4];
  301. public:
  302. //
  303. // --- Constructors and Destructors ---
  304. //
  305. mat4( const GLfloat d = GLfloat(1.0) ) // Create a diagional matrix
  306. { _m[0].x = d; _m[1].y = d; _m[2].z = d; _m[3].w = d; }
  307. mat4( const vec4& a, const vec4& b, const vec4& c, const vec4& d )
  308. { _m[0] = a; _m[1] = b; _m[2] = c; _m[3] = d; }
  309. mat4( GLfloat m00, GLfloat m10, GLfloat m20, GLfloat m30,
  310. GLfloat m01, GLfloat m11, GLfloat m21, GLfloat m31,
  311. GLfloat m02, GLfloat m12, GLfloat m22, GLfloat m32,
  312. GLfloat m03, GLfloat m13, GLfloat m23, GLfloat m33 )
  313. {
  314. _m[0] = vec4( m00, m10, m20, m30 );
  315. _m[1] = vec4( m01, m11, m21, m31 );
  316. _m[2] = vec4( m02, m12, m22, m32 );
  317. _m[3] = vec4( m03, m13, m23, m33 );
  318. // _m[0] = vec4( m00, m01, m02, m03 );
  319. // _m[1] = vec4( m10, m11, m12, m13 );
  320. // _m[2] = vec4( m20, m21, m22, m23 );
  321. // _m[3] = vec4( m30, m31, m32, m33 );
  322. }
  323. mat4( const mat4& m )
  324. {
  325. if ( *this != m ) {
  326. _m[0] = m._m[0];
  327. _m[1] = m._m[1];
  328. _m[2] = m._m[2];
  329. _m[3] = m._m[3];
  330. }
  331. }
  332. //
  333. // --- Indexing Operator ---
  334. //
  335. vec4& operator [] ( int i ) { return _m[i]; }
  336. const vec4& operator [] ( int i ) const { return _m[i]; }
  337. //
  338. // --- (non-modifying) Arithematic Operators ---
  339. //
  340. mat4 operator + ( const mat4& m ) const
  341. { return mat4( _m[0]+m[0], _m[1]+m[1], _m[2]+m[2], _m[3]+m[3] ); }
  342. mat4 operator - ( const mat4& m ) const
  343. { return mat4( _m[0]-m[0], _m[1]-m[1], _m[2]-m[2], _m[3]-m[3] ); }
  344. mat4 operator * ( const GLfloat s ) const
  345. { return mat4( s*_m[0], s*_m[1], s*_m[2], s*_m[3] ); }
  346. mat4 operator / ( const GLfloat s ) const {
  347. #ifdef DEBUG
  348. if ( std::fabs(s) < DivideByZeroTolerance ) {
  349. std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
  350. << "Division by zero" << std::endl;
  351. return mat4();
  352. }
  353. #endif // DEBUG
  354. GLfloat r = GLfloat(1.0) / s;
  355. return *this * r;
  356. }
  357. friend mat4 operator * ( const GLfloat s, const mat4& m )
  358. { return m * s; }
  359. mat4 operator * ( const mat4& m ) const {
  360. mat4 a( 0.0 );
  361. for ( int i = 0; i < 4; ++i ) {
  362. for ( int j = 0; j < 4; ++j ) {
  363. for ( int k = 0; k < 4; ++k ) {
  364. a[i][j] += _m[i][k] * m[k][j];
  365. }
  366. }
  367. }
  368. return a;
  369. }
  370. //
  371. // --- (modifying) Arithematic Operators ---
  372. //
  373. mat4& operator += ( const mat4& m ) {
  374. _m[0] += m[0]; _m[1] += m[1]; _m[2] += m[2]; _m[3] += m[3];
  375. return *this;
  376. }
  377. mat4& operator -= ( const mat4& m ) {
  378. _m[0] -= m[0]; _m[1] -= m[1]; _m[2] -= m[2]; _m[3] -= m[3];
  379. return *this;
  380. }
  381. mat4& operator *= ( const GLfloat s ) {
  382. _m[0] *= s; _m[1] *= s; _m[2] *= s; _m[3] *= s;
  383. return *this;
  384. }
  385. mat4& operator *= ( const mat4& m ) {
  386. mat4 a( 0.0 );
  387. for ( int i = 0; i < 4; ++i ) {
  388. for ( int j = 0; j < 4; ++j ) {
  389. for ( int k = 0; k < 4; ++k ) {
  390. a[i][j] += _m[i][k] * m[k][j];
  391. }
  392. }
  393. }
  394. return *this = a;
  395. }
  396. mat4& operator /= ( const GLfloat s ) {
  397. #ifdef DEBUG
  398. if ( std::fabs(s) < DivideByZeroTolerance ) {
  399. std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
  400. << "Division by zero" << std::endl;
  401. return mat4();
  402. }
  403. #endif // DEBUG
  404. GLfloat r = GLfloat(1.0) / s;
  405. return *this *= r;
  406. }
  407. //
  408. // --- Matrix / Vector operators ---
  409. //
  410. vec4 operator * ( const vec4& v ) const { // m * v
  411. return vec4( _m[0][0]*v.x + _m[0][1]*v.y + _m[0][2]*v.z + _m[0][3]*v.w,
  412. _m[1][0]*v.x + _m[1][1]*v.y + _m[1][2]*v.z + _m[1][3]*v.w,
  413. _m[2][0]*v.x + _m[2][1]*v.y + _m[2][2]*v.z + _m[2][3]*v.w,
  414. _m[3][0]*v.x + _m[3][1]*v.y + _m[3][2]*v.z + _m[3][3]*v.w
  415. );
  416. }
  417. //
  418. // --- Insertion and Extraction Operators ---
  419. //
  420. friend std::ostream& operator << ( std::ostream& os, const mat4& m ) {
  421. return os << std::endl
  422. << m[0] << std::endl
  423. << m[1] << std::endl
  424. << m[2] << std::endl
  425. << m[3] << std::endl;
  426. }
  427. friend std::istream& operator >> ( std::istream& is, mat4& m )
  428. { return is >> m._m[0] >> m._m[1] >> m._m[2] >> m._m[3]; }
  429. //
  430. // --- Conversion Operators ---
  431. //
  432. operator const GLfloat* () const
  433. { return static_cast<const GLfloat*>( &_m[0].x ); }
  434. operator GLfloat* ()
  435. { return static_cast<GLfloat*>( &_m[0].x ); }
  436. };
  437. //
  438. // --- Non-class mat4 Methods ---
  439. //
  440. inline
  441. mat4 matrixCompMult( const mat4& A, const mat4& B ) {
  442. return mat4(
  443. A[0][0]*B[0][0], A[0][1]*B[0][1], A[0][2]*B[0][2], A[0][3]*B[0][3],
  444. A[1][0]*B[1][0], A[1][1]*B[1][1], A[1][2]*B[1][2], A[1][3]*B[1][3],
  445. A[2][0]*B[2][0], A[2][1]*B[2][1], A[2][2]*B[2][2], A[2][3]*B[2][3],
  446. A[3][0]*B[3][0], A[3][1]*B[3][1], A[3][2]*B[3][2], A[3][3]*B[3][3] );
  447. }
  448. inline
  449. mat4 transpose( const mat4& A ) {
  450. return mat4( A[0][0], A[1][0], A[2][0], A[3][0],
  451. A[0][1], A[1][1], A[2][1], A[3][1],
  452. A[0][2], A[1][2], A[2][2], A[3][2],
  453. A[0][3], A[1][3], A[2][3], A[3][3] );
  454. }
  455. //////////////////////////////////////////////////////////////////////////////
  456. //
  457. // Helpful Matrix Methods
  458. //
  459. //////////////////////////////////////////////////////////////////////////////
  460. #define Error( str ) do { std::cerr << "[" __FILE__ ":" << __LINE__ << "] " \
  461. << str << std::endl; } while(0)
  462. inline
  463. vec4 mvmult( const mat4& a, const vec4& b )
  464. {
  465. Error( "replace with vector matrix multiplcation operator" );
  466. vec4 c;
  467. int i, j;
  468. for(i=0; i<4; i++) {
  469. c[i] =0.0;
  470. for(j=0;j<4;j++) c[i]+=a[i][j]*b[j];
  471. }
  472. return c;
  473. }
  474. //----------------------------------------------------------------------------
  475. //
  476. // Rotation matrix generators
  477. //
  478. inline
  479. mat4 RotateX( const GLfloat theta )
  480. {
  481. GLfloat angle = DegreesToRadians * theta;
  482. mat4 c;
  483. c[2][2] = c[1][1] = cos(angle);
  484. c[2][1] = sin(angle);
  485. c[1][2] = -c[2][1];
  486. return c;
  487. }
  488. inline
  489. mat4 RotateY( const GLfloat theta )
  490. {
  491. GLfloat angle = DegreesToRadians * theta;
  492. mat4 c;
  493. c[2][2] = c[0][0] = cos(angle);
  494. c[0][2] = sin(angle);
  495. c[2][0] = -c[0][2];
  496. return c;
  497. }
  498. inline
  499. mat4 RotateZ( const GLfloat theta )
  500. {
  501. GLfloat angle = DegreesToRadians * theta;
  502. mat4 c;
  503. c[0][0] = c[1][1] = cos(angle);
  504. c[1][0] = sin(angle);
  505. c[0][1] = -c[1][0];
  506. return c;
  507. }
  508. //----------------------------------------------------------------------------
  509. //
  510. // Translation matrix generators
  511. //
  512. inline
  513. mat4 Translate( const GLfloat x, const GLfloat y, const GLfloat z )
  514. {
  515. mat4 c;
  516. c[0][3] = x;
  517. c[1][3] = y;
  518. c[2][3] = z;
  519. return c;
  520. }
  521. inline
  522. mat4 Translate( const vec3& v )
  523. {
  524. return Translate( v.x, v.y, v.z );
  525. }
  526. inline
  527. mat4 Translate( const vec4& v )
  528. {
  529. return Translate( v.x, v.y, v.z );
  530. }
  531. //----------------------------------------------------------------------------
  532. //
  533. // Scale matrix generators
  534. //
  535. inline
  536. mat4 Scale( const GLfloat x, const GLfloat y, const GLfloat z )
  537. {
  538. mat4 c;
  539. c[0][0] = x;
  540. c[1][1] = y;
  541. c[2][2] = z;
  542. return c;
  543. }
  544. inline
  545. mat4 Scale( const vec3& v )
  546. {
  547. return Scale( v.x, v.y, v.z );
  548. }
  549. //----------------------------------------------------------------------------
  550. //
  551. // Projection transformation matrix geneartors
  552. //
  553. // Note: Microsoft Windows (r) defines the keyword "far" in C/C++. In
  554. // order to avoid any name conflicts, we use the variable names
  555. // "zNear" to reprsent "near", and "zFar" to reprsent "far".
  556. //
  557. inline
  558. mat4 Ortho( const GLfloat left, const GLfloat right,
  559. const GLfloat bottom, const GLfloat top,
  560. const GLfloat zNear, const GLfloat zFar )
  561. {
  562. mat4 c;
  563. c[0][0] = 2.0/(right - left);
  564. c[1][1] = 2.0/(top - bottom);
  565. c[2][2] = 2.0/(zNear - zFar);
  566. c[3][3] = 1.0;
  567. c[0][3] = -(right + left)/(right - left);
  568. c[1][3] = -(top + bottom)/(top - bottom);
  569. c[2][3] = -(zFar + zNear)/(zFar - zNear);
  570. return c;
  571. }
  572. inline
  573. mat4 Ortho2D( const GLfloat left, const GLfloat right,
  574. const GLfloat bottom, const GLfloat top )
  575. {
  576. return Ortho( left, right, bottom, top, -1.0, 1.0 );
  577. }
  578. inline
  579. mat4 Frustum( const GLfloat left, const GLfloat right,
  580. const GLfloat bottom, const GLfloat top,
  581. const GLfloat zNear, const GLfloat zFar )
  582. {
  583. mat4 c;
  584. c[0][0] = 2.0*zNear/(right - left);
  585. c[0][2] = (right + left)/(right - left);
  586. c[1][1] = 2.0*zNear/(top - bottom);
  587. c[1][2] = (top + bottom)/(top - bottom);
  588. c[2][2] = -(zFar + zNear)/(zFar - zNear);
  589. c[2][3] = -2.0*zFar*zNear/(zFar - zNear);
  590. c[3][2] = -1.0;
  591. c[3][3] = 0.0;
  592. return c;
  593. }
  594. inline
  595. mat4 Perspective( const GLfloat fovy, const GLfloat aspect,
  596. const GLfloat zNear, const GLfloat zFar)
  597. {
  598. GLfloat top = tan(fovy*DegreesToRadians/2) * zNear;
  599. GLfloat right = top * aspect;
  600. mat4 c;
  601. c[0][0] = zNear/right;
  602. c[1][1] = zNear/top;
  603. c[2][2] = -(zFar + zNear)/(zFar - zNear);
  604. c[2][3] = -2.0*zFar*zNear/(zFar - zNear);
  605. c[3][2] = -1.0;
  606. c[3][3] = 0.0;
  607. return c;
  608. }
  609. //----------------------------------------------------------------------------
  610. //
  611. // Viewing transformation matrix generation
  612. //
  613. inline
  614. mat4 LookAt( const vec4& eye, const vec4& at, const vec4& up )
  615. {
  616. vec4 n = normalize(eye - at);
  617. // vec4 u = normalize(cross(up,n));
  618. // vec4 v = normalize(cross(n,u));
  619. vec4 u = normalize(vec4(cross(up,n), 0)); // Modified by HZJ@ustc
  620. vec4 v = normalize(vec4(cross(n,u), 0)); // Modified by HZJ@ustc
  621. vec4 t = vec4(0.0, 0.0, 0.0, 1.0);
  622. mat4 c = mat4(u, v, n, t);
  623. return c * Translate( -eye );
  624. }
  625. //----------------------------------------------------------------------------
  626. //
  627. // Generates a Normal Matrix
  628. //
  629. inline
  630. mat3 Normal( const mat4& c)
  631. {
  632. mat3 d;
  633. GLfloat det;
  634. det = c[0][0]*c[1][1]*c[2][2]+c[0][1]*c[1][2]*c[2][1]
  635. -c[2][0]*c[1][1]*c[0][2]-c[1][0]*c[0][1]*c[2][2]-c[0][0]*c[1][2]*c[2][1];
  636. d[0][0] = (c[1][1]*c[2][2]-c[1][2]*c[2][1])/det;
  637. d[0][1] = -(c[0][1]*c[2][2]-c[0][2]*c[2][1])/det;
  638. d[0][2] = (c[0][1]*c[2][0]-c[2][1]*c[2][2])/det;
  639. d[1][0] = -(c[0][1]*c[2][2]-c[0][2]*c[2][1])/det;
  640. d[1][1] = (c[0][0]*c[2][2]-c[0][2]*c[2][0])/det;
  641. d[1][2] = -(c[0][0]*c[2][1]-c[2][0]*c[0][1])/det;
  642. d[2][0] = (c[0][1]*c[1][2]-c[1][1]*c[0][2])/det;
  643. d[2][1] = -(c[0][0]*c[1][2]-c[0][2]*c[1][0])/det;
  644. d[2][2] = (c[0][0]*c[1][1]-c[1][0]*c[0][1])/det;
  645. return d;
  646. }
  647. //----------------------------------------------------------------------------
  648. inline
  649. vec4 minus(const vec4& a, const vec4& b )
  650. {
  651. Error( "replace with vector subtraction" );
  652. return vec4(a[0]-b[0], a[1]-b[1], a[2]-b[2], 0.0);
  653. }
  654. inline
  655. void printv(const vec4& a )
  656. {
  657. Error( "replace with vector insertion operator" );
  658. printf("%f %f %f %f \n\n", a[0], a[1], a[2], a[3]);
  659. }
  660. inline
  661. void printm(const mat4 a)
  662. {
  663. Error( "replace with matrix insertion operator" );
  664. for(int i=0; i<4; i++) printf("%f %f %f %f \n", a[i][0], a[i][1], a[i][2], a[i][3]);
  665. printf("\n");
  666. }
  667. inline
  668. mat4 identity()
  669. {
  670. Error( "replace with either a matrix constructor or identity method" );
  671. mat4 c;
  672. for(int i=0; i<4; i++) for(int j=0; j<4; j++) c[i][j]=0.0;
  673. for(int i=0; i<4; i++) c[i][i] = 1.0;
  674. return c;
  675. }
  676. } // namespace Angel
  677. #endif // __ANGEL_MAT_H__