PolyMatrix4.h 5.8 KB

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