Matrix.cpp 6.3 KB

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