Matrix3.pkg 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. $#include "Matrix3.h"
  2. /// 3x3 matrix for rotation and scaling.
  3. class Matrix3
  4. {
  5. public:
  6. /// Construct undefined.
  7. Matrix3()
  8. {
  9. }
  10. /// Copy-construct from another matrix.
  11. Matrix3(const Matrix3& matrix) :
  12. m00_(matrix.m00_),
  13. m01_(matrix.m01_),
  14. m02_(matrix.m02_),
  15. m10_(matrix.m10_),
  16. m11_(matrix.m11_),
  17. m12_(matrix.m12_),
  18. m20_(matrix.m20_),
  19. m21_(matrix.m21_),
  20. m22_(matrix.m22_)
  21. {
  22. }
  23. /// Construct from values.
  24. Matrix3(float v00, float v01, float v02,
  25. float v10, float v11, float v12,
  26. float v20, float v21, float v22) :
  27. m00_(v00),
  28. m01_(v01),
  29. m02_(v02),
  30. m10_(v10),
  31. m11_(v11),
  32. m12_(v12),
  33. m20_(v20),
  34. m21_(v21),
  35. m22_(v22)
  36. {
  37. }
  38. /// Test for equality with another matrix without epsilon.
  39. bool operator == (const Matrix3& rhs) const
  40. {
  41. const float* leftData = Data();
  42. const float* rightData = rhs.Data();
  43. for (unsigned i = 0; i < 9; ++i)
  44. {
  45. if (leftData[i] != rightData[i])
  46. return false;
  47. }
  48. return true;
  49. }
  50. /// Multiply a Vector3.
  51. Vector3 operator * (const Vector3& rhs) const
  52. {
  53. return Vector3(
  54. m00_ * rhs.x_ + m01_ * rhs.y_ + m02_ * rhs.z_,
  55. m10_ * rhs.x_ + m11_ * rhs.y_ + m12_ * rhs.z_,
  56. m20_ * rhs.x_ + m21_ * rhs.y_ + m22_ * rhs.z_
  57. );
  58. }
  59. /// Add a matrix.
  60. Matrix3 operator + (const Matrix3& rhs) const
  61. {
  62. return Matrix3(
  63. m00_ + rhs.m00_,
  64. m01_ + rhs.m01_,
  65. m02_ + rhs.m02_,
  66. m10_ + rhs.m10_,
  67. m11_ + rhs.m11_,
  68. m12_ + rhs.m12_,
  69. m20_ + rhs.m20_,
  70. m21_ + rhs.m21_,
  71. m22_ + rhs.m22_
  72. );
  73. }
  74. /// Subtract a matrix.
  75. Matrix3 operator - (const Matrix3& rhs) const
  76. {
  77. return Matrix3(
  78. m00_ - rhs.m00_,
  79. m01_ - rhs.m01_,
  80. m02_ - rhs.m02_,
  81. m10_ - rhs.m10_,
  82. m11_ - rhs.m11_,
  83. m12_ - rhs.m12_,
  84. m20_ - rhs.m20_,
  85. m21_ - rhs.m21_,
  86. m22_ - rhs.m22_
  87. );
  88. }
  89. /// Multiply with a scalar.
  90. Matrix3 operator * (float rhs) const
  91. {
  92. return Matrix3(
  93. m00_ * rhs,
  94. m01_ * rhs,
  95. m02_ * rhs,
  96. m10_ * rhs,
  97. m11_ * rhs,
  98. m12_ * rhs,
  99. m20_ * rhs,
  100. m21_ * rhs,
  101. m22_ * rhs
  102. );
  103. }
  104. /// Multiply a matrix.
  105. Matrix3 operator * (const Matrix3& rhs) const
  106. {
  107. return Matrix3(
  108. m00_ * rhs.m00_ + m01_ * rhs.m10_ + m02_ * rhs.m20_,
  109. m00_ * rhs.m01_ + m01_ * rhs.m11_ + m02_ * rhs.m21_,
  110. m00_ * rhs.m02_ + m01_ * rhs.m12_ + m02_ * rhs.m22_,
  111. m10_ * rhs.m00_ + m11_ * rhs.m10_ + m12_ * rhs.m20_,
  112. m10_ * rhs.m01_ + m11_ * rhs.m11_ + m12_ * rhs.m21_,
  113. m10_ * rhs.m02_ + m11_ * rhs.m12_ + m12_ * rhs.m22_,
  114. m20_ * rhs.m00_ + m21_ * rhs.m10_ + m22_ * rhs.m20_,
  115. m20_ * rhs.m01_ + m21_ * rhs.m11_ + m22_ * rhs.m21_,
  116. m20_ * rhs.m02_ + m21_ * rhs.m12_ + m22_ * rhs.m22_
  117. );
  118. }
  119. /// Set scaling elements.
  120. void SetScale(const Vector3& scale)
  121. {
  122. m00_ = scale.x_;
  123. m11_ = scale.y_;
  124. m22_ = scale.z_;
  125. }
  126. /// Set uniform scaling elements.
  127. void SetScale(float scale)
  128. {
  129. m00_ = scale;
  130. m11_ = scale;
  131. m22_ = scale;
  132. }
  133. /// Return the scaling part.
  134. Vector3 Scale() const
  135. {
  136. return Vector3(
  137. sqrtf(m00_ * m00_ + m10_ * m10_ + m20_ * m20_),
  138. sqrtf(m01_ * m01_ + m11_ * m11_ + m21_ * m21_),
  139. sqrtf(m02_ * m02_ + m12_ * m12_ + m22_ * m22_)
  140. );
  141. }
  142. /// Return transpose.
  143. Matrix3 Transpose() const
  144. {
  145. return Matrix3(
  146. m00_,
  147. m10_,
  148. m20_,
  149. m01_,
  150. m11_,
  151. m21_,
  152. m02_,
  153. m12_,
  154. m22_
  155. );
  156. }
  157. /// Return scaled by a vector.
  158. Matrix3 Scaled(const Vector3& scale) const
  159. {
  160. return Matrix3(
  161. m00_ * scale.x_,
  162. m01_ * scale.y_,
  163. m02_ * scale.z_,
  164. m10_ * scale.x_,
  165. m11_ * scale.y_,
  166. m12_ * scale.z_,
  167. m20_ * scale.x_,
  168. m21_ * scale.y_,
  169. m22_ * scale.z_
  170. );
  171. }
  172. /// Test for equality with another matrix with epsilon.
  173. bool Equals(const Matrix3& rhs) const
  174. {
  175. const float* leftData = Data();
  176. const float* rightData = rhs.Data();
  177. for (unsigned i = 0; i < 9; ++i)
  178. {
  179. if (!Urho3D::Equals(leftData[i], rightData[i]))
  180. return false;
  181. }
  182. return true;
  183. }
  184. /// Return inverse.
  185. Matrix3 Inverse() const;
  186. float m00_ @ m00;
  187. float m01_ @ m01;
  188. float m02_ @ m02;
  189. float m10_ @ m10;
  190. float m11_ @ m11;
  191. float m12_ @ m12;
  192. float m20_ @ m20;
  193. float m21_ @ m21;
  194. float m22_ @ m22;
  195. /// Bulk transpose matrices.
  196. static void BulkTranspose(float* dest, const float* src, unsigned count)
  197. {
  198. for (unsigned i = 0; i < count; ++i)
  199. {
  200. dest[0] = src[0];
  201. dest[1] = src[3];
  202. dest[2] = src[6];
  203. dest[3] = src[1];
  204. dest[4] = src[4];
  205. dest[5] = src[7];
  206. dest[6] = src[2];
  207. dest[7] = src[5];
  208. dest[8] = src[8];
  209. dest += 9;
  210. src += 9;
  211. }
  212. }
  213. /// Zero matrix.
  214. static const Matrix3 ZERO;
  215. /// Identity matrix.
  216. static const Matrix3 IDENTITY;
  217. };