PolyMatrix4.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * PolyMatrix4.h
  3. * TAU
  4. *
  5. * Created by Ivan Safrin on 3/26/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. // @package Math
  10. #pragma once
  11. #include "PolyGlobals.h"
  12. #include "PolyVector3.h"
  13. #include <string.h>
  14. namespace Polycode {
  15. class Vector3;
  16. class _PolyExport Matrix4 {
  17. public:
  18. Matrix4();
  19. inline Matrix4(
  20. float m00, float m01, float m02, float m03,
  21. float m10, float m11, float m12, float m13,
  22. float m20, float m21, float m22, float m23,
  23. float m30, float m31, float m32, float m33 )
  24. {
  25. m[0][0] = m00;
  26. m[0][1] = m01;
  27. m[0][2] = m02;
  28. m[0][3] = m03;
  29. m[1][0] = m10;
  30. m[1][1] = m11;
  31. m[1][2] = m12;
  32. m[1][3] = m13;
  33. m[2][0] = m20;
  34. m[2][1] = m21;
  35. m[2][2] = m22;
  36. m[2][3] = m23;
  37. m[3][0] = m30;
  38. m[3][1] = m31;
  39. m[3][2] = m32;
  40. m[3][3] = m33;
  41. }
  42. Matrix4(float *m);
  43. ~Matrix4();
  44. void init();
  45. union {
  46. float m[4][4];
  47. float ml[16];
  48. };
  49. inline void identity() {
  50. memset(ml, 0, sizeof(float)*16);
  51. ml[0] = 1;
  52. ml[5] = 1;
  53. ml[10] = 1;
  54. ml[15] = 1;
  55. }
  56. inline Vector3 rotateVector(const Vector3 &v2) {
  57. return Vector3(v2.x*m[0][0] + v2.y*m[1][0] + v2.z*m[2][0],
  58. v2.x*m[0][1] + v2.y*m[1][1] + v2.z*m[2][1],
  59. v2.x*m[0][2] + v2.y*m[1][2] + v2.z*m[2][2]);
  60. }
  61. inline Vector3 getPosition() {
  62. Vector3 pos;
  63. pos.x = m[3][0];
  64. pos.y = m[3][1];
  65. pos.z = m[3][2];
  66. return pos;
  67. }
  68. /*
  69. void setTransform(Vector3 pos, Vector3 scale, Quaternion rot) {
  70. }
  71. */
  72. inline Vector3 operator * ( const Vector3 &v2 ) const
  73. {
  74. return Vector3(v2.x*m[0][0] + v2.y*m[1][0] + v2.z*m[2][0] + m[3][0],
  75. v2.x*m[0][1] + v2.y*m[1][1] + v2.z*m[2][1] + m[3][1],
  76. v2.x*m[0][2] + v2.y*m[1][2] + v2.z*m[2][2] + m[3][2]);
  77. }
  78. inline float* operator [] ( int row ) { return m[row];}
  79. inline void setPosition(float x, float y, float z) {
  80. m[3][0] = x;
  81. m[3][1] = y;
  82. m[3][2] = z;
  83. }
  84. inline void getEulerAngles(float *ax, float *ay, float *az) {
  85. float angle_x, angle_y, angle_z,tr_x,tr_y,C;
  86. angle_y = asin(m[0][2]);
  87. C = cosf(angle_y);
  88. angle_y *= TODEGREES;
  89. if(fabsf(C) > 0.005) {
  90. tr_x = m[2][2] / C; // 10
  91. tr_y = -m[1][2] / C; // 6
  92. angle_x = atan2f( tr_y, tr_x ) * TODEGREES;
  93. tr_x = m[0][0] / C; // 0
  94. tr_y = -m[0][1] / C; // 1
  95. angle_z = atan2f( tr_y, tr_x ) * TODEGREES;
  96. } else {
  97. angle_x = 0;
  98. tr_x = m[1][1];
  99. tr_y = m[1][0];
  100. angle_z = atan2f( tr_y, tr_x ) * TODEGREES;
  101. }
  102. if (angle_x < 0) angle_x += 360;
  103. if (angle_y < 0) angle_y += 360;
  104. if (angle_z < 0) angle_z += 360;
  105. *ax = -fabs(angle_x);
  106. *ay = fabs(angle_y);
  107. *az = fabs(angle_z);
  108. }
  109. inline Matrix4 operator + ( const Matrix4 &m2 ) const {
  110. Matrix4 r;
  111. r.m[0][0] = m[0][0] + m2.m[0][0];
  112. r.m[0][1] = m[0][1] + m2.m[0][1];
  113. r.m[0][2] = m[0][2] + m2.m[0][2];
  114. r.m[0][3] = m[0][3] + m2.m[0][3];
  115. r.m[1][0] = m[1][0] + m2.m[1][0];
  116. r.m[1][1] = m[1][1] + m2.m[1][1];
  117. r.m[1][2] = m[1][2] + m2.m[1][2];
  118. r.m[1][3] = m[1][3] + m2.m[1][3];
  119. r.m[2][0] = m[2][0] + m2.m[2][0];
  120. r.m[2][1] = m[2][1] + m2.m[2][1];
  121. r.m[2][2] = m[2][2] + m2.m[2][2];
  122. r.m[2][3] = m[2][3] + m2.m[2][3];
  123. r.m[3][0] = m[3][0] + m2.m[3][0];
  124. r.m[3][1] = m[3][1] + m2.m[3][1];
  125. r.m[3][2] = m[3][2] + m2.m[3][2];
  126. r.m[3][3] = m[3][3] + m2.m[3][3];
  127. return r;
  128. }
  129. Matrix4 inverse();
  130. Matrix4 inverseAffine();
  131. inline Matrix4 operator * (const Matrix4 &m2) const {
  132. Matrix4 r;
  133. r.m[0][0] = m[0][0] * m2.m[0][0] + m[0][1] * m2.m[1][0] + m[0][2] * m2.m[2][0] + m[0][3] * m2.m[3][0];
  134. r.m[0][1] = m[0][0] * m2.m[0][1] + m[0][1] * m2.m[1][1] + m[0][2] * m2.m[2][1] + m[0][3] * m2.m[3][1];
  135. r.m[0][2] = m[0][0] * m2.m[0][2] + m[0][1] * m2.m[1][2] + m[0][2] * m2.m[2][2] + m[0][3] * m2.m[3][2];
  136. r.m[0][3] = m[0][0] * m2.m[0][3] + m[0][1] * m2.m[1][3] + m[0][2] * m2.m[2][3] + m[0][3] * m2.m[3][3];
  137. r.m[1][0] = m[1][0] * m2.m[0][0] + m[1][1] * m2.m[1][0] + m[1][2] * m2.m[2][0] + m[1][3] * m2.m[3][0];
  138. r.m[1][1] = m[1][0] * m2.m[0][1] + m[1][1] * m2.m[1][1] + m[1][2] * m2.m[2][1] + m[1][3] * m2.m[3][1];
  139. r.m[1][2] = m[1][0] * m2.m[0][2] + m[1][1] * m2.m[1][2] + m[1][2] * m2.m[2][2] + m[1][3] * m2.m[3][2];
  140. r.m[1][3] = m[1][0] * m2.m[0][3] + m[1][1] * m2.m[1][3] + m[1][2] * m2.m[2][3] + m[1][3] * m2.m[3][3];
  141. r.m[2][0] = m[2][0] * m2.m[0][0] + m[2][1] * m2.m[1][0] + m[2][2] * m2.m[2][0] + m[2][3] * m2.m[3][0];
  142. r.m[2][1] = m[2][0] * m2.m[0][1] + m[2][1] * m2.m[1][1] + m[2][2] * m2.m[2][1] + m[2][3] * m2.m[3][1];
  143. r.m[2][2] = m[2][0] * m2.m[0][2] + m[2][1] * m2.m[1][2] + m[2][2] * m2.m[2][2] + m[2][3] * m2.m[3][2];
  144. r.m[2][3] = m[2][0] * m2.m[0][3] + m[2][1] * m2.m[1][3] + m[2][2] * m2.m[2][3] + m[2][3] * m2.m[3][3];
  145. r.m[3][0] = m[3][0] * m2.m[0][0] + m[3][1] * m2.m[1][0] + m[3][2] * m2.m[2][0] + m[3][3] * m2.m[3][0];
  146. r.m[3][1] = m[3][0] * m2.m[0][1] + m[3][1] * m2.m[1][1] + m[3][2] * m2.m[2][1] + m[3][3] * m2.m[3][1];
  147. r.m[3][2] = m[3][0] * m2.m[0][2] + m[3][1] * m2.m[1][2] + m[3][2] * m2.m[2][2] + m[3][3] * m2.m[3][2];
  148. r.m[3][3] = m[3][0] * m2.m[0][3] + m[3][1] * m2.m[1][3] + m[3][2] * m2.m[2][3] + m[3][3] * m2.m[3][3];
  149. return r;
  150. }
  151. protected:
  152. };
  153. }