Matrix3D.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. #include "Matrix3D.h"
  2. #include <cstring>
  3. #include <cmath>
  4. Matrix3D::Matrix3D()
  5. {
  6. setToIdentity();
  7. }
  8. Matrix3D::Matrix3D(const Matrix3D& orig)
  9. {
  10. }
  11. Matrix3D::~Matrix3D()
  12. {
  13. }
  14. void Matrix3D::setToIdentity()
  15. {
  16. data[0] = 1.0f;
  17. data[1] = 0.0f;
  18. data[2] = 0.0f;
  19. data[3] = 0.0f;
  20. data[4] = 0.0f;
  21. data[5] = 1.0f;
  22. data[6] = 0.0f;
  23. data[7] = 0.0f;
  24. data[8] = 0.0f;
  25. data[9] = 0.0f;
  26. data[10] = 1.0f;
  27. data[11] = 0.0f;
  28. data[12] = 0.0f;
  29. data[13] = 0.0f;
  30. data[14] = 0.0f;
  31. data[15] = 1.0f;
  32. }
  33. void Matrix3D::set(const Matrix3D& m)
  34. {
  35. memcpy(data, m.data, sizeof(float) * 16);
  36. }
  37. void Matrix3D::set(int row, int col, float value)
  38. {
  39. data[row + (col << 2)] = value;
  40. }
  41. float Matrix3D::get(int row, int col) const
  42. {
  43. return data[row + (col << 2)];
  44. }
  45. const float* Matrix3D::getValues() const
  46. {
  47. return data;
  48. }
  49. void Matrix3D::mul(const Matrix3D& m)
  50. {
  51. float mNew[16];
  52. mNew[0] = data[0] * m.data[0] + data[4] * m.data[1] + data[8] * m.data[2] + data[12] * m.data[3];
  53. mNew[1] = data[1] * m.data[0] + data[5] * m.data[1] + data[9] * m.data[2] + data[13] * m.data[3];
  54. mNew[2] = data[2] * m.data[0] + data[6] * m.data[1] + data[10] * m.data[2] + data[14] * m.data[3];
  55. mNew[3] = data[3] * m.data[0] + data[7] * m.data[1] + data[11] * m.data[2] + data[15] * m.data[3];
  56. mNew[4] = data[0] * m.data[4] + data[4] * m.data[5] + data[8] * m.data[6] + data[12] * m.data[7];
  57. mNew[5] = data[1] * m.data[4] + data[5] * m.data[5] + data[9] * m.data[6] + data[13] * m.data[7];
  58. mNew[6] = data[2] * m.data[4] + data[6] * m.data[5] + data[10] * m.data[6] + data[14] * m.data[7];
  59. mNew[7] = data[3] * m.data[4] + data[7] * m.data[5] + data[11] * m.data[6] + data[15] * m.data[7];
  60. mNew[8] = data[0] * m.data[8] + data[4] * m.data[9] + data[8] * m.data[10] + data[12] * m.data[11];
  61. mNew[9] = data[1] * m.data[8] + data[5] * m.data[9] + data[9] * m.data[10] + data[13] * m.data[11];
  62. mNew[10] = data[2] * m.data[8] + data[6] * m.data[9] + data[10] * m.data[10] + data[14] * m.data[11];
  63. mNew[11] = data[3] * m.data[8] + data[7] * m.data[9] + data[11] * m.data[10] + data[15] * m.data[11];
  64. mNew[12] = data[0] * m.data[12] + data[4] * m.data[13] + data[8] * m.data[14] + data[12] * m.data[15];
  65. mNew[13] = data[1] * m.data[12] + data[5] * m.data[13] + data[9] * m.data[14] + data[13] * m.data[15];
  66. mNew[14] = data[2] * m.data[12] + data[6] * m.data[13] + data[10] * m.data[14] + data[14] * m.data[15];
  67. mNew[15] = data[3] * m.data[12] + data[7] * m.data[13] + data[11] * m.data[14] + data[15] * m.data[15];
  68. memcpy(data, mNew, sizeof(float) * 16);
  69. }
  70. void Matrix3D::scale(float sx, float sy, float sz)
  71. {
  72. data[0] *= sx;
  73. data[1] *= sx;
  74. data[2] *= sx;
  75. data[3] *= sx;
  76. data[4] *= sy;
  77. data[5] *= sy;
  78. data[6] *= sy;
  79. data[7] *= sy;
  80. data[8] *= sz;
  81. data[9] *= sz;
  82. data[10] *= sz;
  83. data[11] *= sz;
  84. }
  85. void Matrix3D::translate(float tx, float ty, float tz)
  86. {
  87. data[12] += data[0] * tx + data[4] * ty + data[8] * tz;
  88. data[13] += data[1] * tx + data[5] * ty + data[9] * tz;
  89. data[14] += data[2] * tx + data[6] * ty + data[10] * tz;
  90. data[15] += data[3] * tx + data[7] * ty + data[11] * tz;
  91. }
  92. void Matrix3D::translateX(float tx)
  93. {
  94. data[12] += data[0] * tx;
  95. data[13] += data[1] * tx;
  96. data[14] += data[2] * tx;
  97. data[15] += data[3] * tx;
  98. }
  99. void Matrix3D::translateY(float ty)
  100. {
  101. data[12] += data[4] * ty;
  102. data[13] += data[5] * ty;
  103. data[14] += data[6] * ty;
  104. data[15] += data[7] * ty;
  105. }
  106. void Matrix3D::translateZ(float tz)
  107. {
  108. data[12] += data[8] * tz;
  109. data[13] += data[9] * tz;
  110. data[14] += data[10] * tz;
  111. data[15] += data[11] * tz;
  112. }
  113. void Matrix3D::translateTo(float tx, float ty, float tz)
  114. {
  115. data[0] = 1.0f;
  116. data[1] = 0.0f;
  117. data[2] = 0.0f;
  118. data[3] = 0.0f;
  119. data[4] = 0.0f;
  120. data[5] = 1.0f;
  121. data[6] = 0.0f;
  122. data[7] = 0.0f;
  123. data[8] = 0.0f;
  124. data[9] = 0.0f;
  125. data[10] = 1.0f;
  126. data[11] = 0.0f;
  127. data[12] = tx;
  128. data[13] = ty;
  129. data[14] = tz;
  130. data[15] = 1.0f;
  131. }
  132. void Matrix3D::rotate(float xDegrees, float yDegrees, float zDegrees)
  133. {
  134. rotateX(xDegrees);
  135. rotateY(yDegrees);
  136. rotateZ(zDegrees);
  137. }
  138. void Matrix3D::rotateX(float degrees)
  139. {
  140. degrees *= M_PI / 180.0f;
  141. float sin = sinf(degrees);
  142. float cos = cosf(degrees);
  143. float a = data[4];
  144. float b = data[8];
  145. data[4] = a * cos + b * sin;
  146. data[8] = a * -sin + b * cos;
  147. a = data[5];
  148. b = data[9];
  149. data[5] = a * cos + b * sin;
  150. data[9] = a * -sin + b * cos;
  151. a = data[6];
  152. b = data[10];
  153. data[6] = a * cos + b * sin;
  154. data[10] = a * -sin + b * cos;
  155. a = data[7];
  156. b = data[11];
  157. data[7] = a * cos + b * sin;
  158. data[11] = a * -sin + b * cos;
  159. }
  160. void Matrix3D::rotateY(float degrees)
  161. {
  162. degrees *= M_PI / 180.0f;
  163. float sin = sinf(degrees);
  164. float cos = cosf(degrees);
  165. float a = data[0];
  166. float b = data[8];
  167. data[0] = a * cos + b * -sin;
  168. data[8] = a * sin + b * cos;
  169. a = data[1];
  170. b = data[9];
  171. data[1] = a * cos + b * -sin;
  172. data[9] = a * sin + b * cos;
  173. a = data[2];
  174. b = data[10];
  175. data[2] = a * cos + b * -sin;
  176. data[10] = a * sin + b * cos;
  177. a = data[3];
  178. b = data[11];
  179. data[3] = a * cos + b * -sin;
  180. data[11] = a * sin + b * cos;
  181. }
  182. void Matrix3D::rotateZ(float degrees)
  183. {
  184. degrees *= M_PI / 180.0f;
  185. float sin = sinf(degrees);
  186. float cos = cosf(degrees);
  187. float a = data[0];
  188. float b = data[4];
  189. data[0] = a * cos + b * sin;
  190. data[4] = a * -sin + b * cos;
  191. a = data[1];
  192. b = data[5];
  193. data[1] = a * cos + b * sin;
  194. data[5] = a * -sin + b * cos;
  195. a = data[2];
  196. b = data[6];
  197. data[2] = a * cos + b * sin;
  198. data[6] = a * -sin + b * cos;
  199. a = data[3];
  200. b = data[7];
  201. data[3] = a * cos + b * sin;
  202. data[7] = a * -sin + b * cos;
  203. }
  204. std::ostream& operator<<(std::ostream& os, const Matrix3D& m)
  205. {
  206. os << "Matrix3D\n(\n";
  207. os << m.get(0, 0) << ", " << m.get(0, 1) << ", " << m.get(0, 2) << ", " << m.get(0, 3) << "\n";
  208. os << m.get(1, 0) << ", " << m.get(1, 1) << ", " << m.get(1, 2) << ", " << m.get(1, 3) << "\n";
  209. os << m.get(2, 0) << ", " << m.get(2, 1) << ", " << m.get(2, 2) << ", " << m.get(2, 3) << "\n";
  210. os << m.get(3, 0) << ", " << m.get(3, 1) << ", " << m.get(3, 2) << ", " << m.get(3, 3) << "\n";
  211. os << ")";
  212. return os;
  213. }