Matrix3.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2012 Lasse Oorni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #pragma once
  24. #include "Vector3.h"
  25. namespace Urho3D
  26. {
  27. /// 3x3 matrix for rotation and scaling.
  28. class Matrix3
  29. {
  30. public:
  31. /// Construct undefined.
  32. Matrix3()
  33. {
  34. }
  35. /// Copy-construct from another matrix.
  36. Matrix3(const Matrix3& matrix) :
  37. m00_(matrix.m00_),
  38. m01_(matrix.m01_),
  39. m02_(matrix.m02_),
  40. m10_(matrix.m10_),
  41. m11_(matrix.m11_),
  42. m12_(matrix.m12_),
  43. m20_(matrix.m20_),
  44. m21_(matrix.m21_),
  45. m22_(matrix.m22_)
  46. {
  47. }
  48. /// Construct from values.
  49. Matrix3(float v00, float v01, float v02,
  50. float v10, float v11, float v12,
  51. float v20, float v21, float v22) :
  52. m00_(v00),
  53. m01_(v01),
  54. m02_(v02),
  55. m10_(v10),
  56. m11_(v11),
  57. m12_(v12),
  58. m20_(v20),
  59. m21_(v21),
  60. m22_(v22)
  61. {
  62. }
  63. /// Construct from a float array.
  64. Matrix3(const float* data) :
  65. m00_(data[0]),
  66. m01_(data[1]),
  67. m02_(data[2]),
  68. m10_(data[3]),
  69. m11_(data[4]),
  70. m12_(data[5]),
  71. m20_(data[6]),
  72. m21_(data[7]),
  73. m22_(data[8])
  74. {
  75. }
  76. /// Assign from another matrix.
  77. Matrix3& operator = (const Matrix3& rhs)
  78. {
  79. m00_ = rhs.m00_;
  80. m01_ = rhs.m01_;
  81. m02_ = rhs.m02_;
  82. m10_ = rhs.m10_;
  83. m11_ = rhs.m11_;
  84. m12_ = rhs.m12_;
  85. m20_ = rhs.m20_;
  86. m21_ = rhs.m21_;
  87. m22_ = rhs.m22_;
  88. return *this;
  89. }
  90. /// Multiply a Vector3.
  91. Vector3 operator * (const Vector3& rhs) const
  92. {
  93. return Vector3(
  94. m00_ * rhs.x_ + m01_ * rhs.y_ + m02_ * rhs.z_,
  95. m10_ * rhs.x_ + m11_ * rhs.y_ + m12_ * rhs.z_,
  96. m20_ * rhs.x_ + m21_ * rhs.y_ + m22_ * rhs.z_
  97. );
  98. }
  99. /// Add a matrix.
  100. Matrix3 operator + (const Matrix3& rhs) const
  101. {
  102. return Matrix3(
  103. m00_ + rhs.m00_,
  104. m01_ + rhs.m01_,
  105. m02_ + rhs.m02_,
  106. m10_ + rhs.m10_,
  107. m11_ + rhs.m11_,
  108. m12_ + rhs.m12_,
  109. m20_ + rhs.m20_,
  110. m21_ + rhs.m21_,
  111. m22_ + rhs.m22_
  112. );
  113. }
  114. /// Subtract a matrix.
  115. Matrix3 operator - (const Matrix3& rhs) const
  116. {
  117. return Matrix3(
  118. m00_ - rhs.m00_,
  119. m01_ - rhs.m01_,
  120. m02_ - rhs.m02_,
  121. m10_ - rhs.m10_,
  122. m11_ - rhs.m11_,
  123. m12_ - rhs.m12_,
  124. m20_ - rhs.m20_,
  125. m21_ - rhs.m21_,
  126. m22_ - rhs.m22_
  127. );
  128. }
  129. /// Multiply with a scalar.
  130. Matrix3 operator * (float rhs) const
  131. {
  132. return Matrix3(
  133. m00_ * rhs,
  134. m01_ * rhs,
  135. m02_ * rhs,
  136. m10_ * rhs,
  137. m11_ * rhs,
  138. m12_ * rhs,
  139. m20_ * rhs,
  140. m21_ * rhs,
  141. m22_ * rhs
  142. );
  143. }
  144. /// Multiply a matrix.
  145. Matrix3 operator * (const Matrix3& rhs) const
  146. {
  147. return Matrix3(
  148. m00_ * rhs.m00_ + m01_ * rhs.m10_ + m02_ * rhs.m20_,
  149. m00_ * rhs.m01_ + m01_ * rhs.m11_ + m02_ * rhs.m21_,
  150. m00_ * rhs.m02_ + m01_ * rhs.m12_ + m02_ * rhs.m22_,
  151. m10_ * rhs.m00_ + m11_ * rhs.m10_ + m12_ * rhs.m20_,
  152. m10_ * rhs.m01_ + m11_ * rhs.m11_ + m12_ * rhs.m21_,
  153. m10_ * rhs.m02_ + m11_ * rhs.m12_ + m12_ * rhs.m22_,
  154. m20_ * rhs.m00_ + m21_ * rhs.m10_ + m22_ * rhs.m20_,
  155. m20_ * rhs.m01_ + m21_ * rhs.m11_ + m22_ * rhs.m21_,
  156. m20_ * rhs.m02_ + m21_ * rhs.m12_ + m22_ * rhs.m22_
  157. );
  158. }
  159. /// Set scaling elements.
  160. void SetScale(const Vector3& scale)
  161. {
  162. m00_ = scale.x_;
  163. m11_ = scale.y_;
  164. m22_ = scale.z_;
  165. }
  166. /// Set uniform scaling elements.
  167. void SetScale(float scale)
  168. {
  169. m00_ = scale;
  170. m11_ = scale;
  171. m22_ = scale;
  172. }
  173. /// Return the scaling part.
  174. Vector3 Scale() const
  175. {
  176. return Vector3(
  177. sqrtf(m00_ * m00_ + m10_ * m10_ + m20_ * m20_),
  178. sqrtf(m01_ * m01_ + m11_ * m11_ + m21_ * m21_),
  179. sqrtf(m02_ * m02_ + m12_ * m12_ + m22_ * m22_)
  180. );
  181. }
  182. /// Return transpose.
  183. Matrix3 Transpose() const
  184. {
  185. return Matrix3(
  186. m00_,
  187. m10_,
  188. m20_,
  189. m01_,
  190. m11_,
  191. m21_,
  192. m02_,
  193. m12_,
  194. m22_
  195. );
  196. }
  197. /// Return scaled by a vector.
  198. Matrix3 Scaled(const Vector3& scale) const
  199. {
  200. return Matrix3(
  201. m00_ * scale.x_,
  202. m01_ * scale.y_,
  203. m02_ * scale.z_,
  204. m10_ * scale.x_,
  205. m11_ * scale.y_,
  206. m12_ * scale.z_,
  207. m20_ * scale.x_,
  208. m21_ * scale.y_,
  209. m22_ * scale.z_
  210. );
  211. }
  212. /// Return inverse.
  213. Matrix3 Inverse() const;
  214. /// Return float data.
  215. const float* Data() const { return &m00_; }
  216. float m00_;
  217. float m01_;
  218. float m02_;
  219. float m10_;
  220. float m11_;
  221. float m12_;
  222. float m20_;
  223. float m21_;
  224. float m22_;
  225. /// Bulk transpose matrices.
  226. static void BulkTranspose(float* dest, const float* src, unsigned count)
  227. {
  228. for (unsigned i = 0; i < count; ++i)
  229. {
  230. dest[0] = src[0];
  231. dest[1] = src[3];
  232. dest[2] = src[6];
  233. dest[3] = src[1];
  234. dest[4] = src[4];
  235. dest[5] = src[7];
  236. dest[6] = src[2];
  237. dest[7] = src[5];
  238. dest[8] = src[8];
  239. dest += 9;
  240. src += 9;
  241. }
  242. }
  243. /// Zero matrix.
  244. static const Matrix3 ZERO;
  245. /// Identity matrix.
  246. static const Matrix3 IDENTITY;
  247. };
  248. /// Multiply a 3x3 matrix with a scalar.
  249. inline Matrix3 operator * (float lhs, const Matrix3& rhs) { return rhs * lhs; }
  250. }