Matrix.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. module Core.Matrix;
  2. import Core.ToString;
  3. import Core.Std;
  4. Core::Matrix::Matrix() {
  5. unit();
  6. }
  7. Core::Matrix& Core::Matrix::unit() {
  8. return translateTo(Vector3(0.0f, 0.0f, 0.0f));
  9. }
  10. Core::Matrix& Core::Matrix::set(size_t index, const Vector4& v) {
  11. data[index] = v;
  12. return *this;
  13. }
  14. Core::Matrix Core::Matrix::transpose() const {
  15. Matrix m;
  16. for(size_t x = 0; x < 4; x++) {
  17. for(size_t y = 0; y < 4; y++) {
  18. m.data[x][y] = data[y][x];
  19. }
  20. }
  21. return m;
  22. }
  23. const float* Core::Matrix::getValues() const {
  24. return &(data[0][0]);
  25. }
  26. Core::Matrix& Core::Matrix::operator*=(const Matrix& m) {
  27. data[0] = data[0][0] * m.data[0] + data[0][1] * m.data[1] +
  28. data[0][2] * m.data[2] + data[0][3] * m.data[3];
  29. data[1] = data[1][0] * m.data[0] + data[1][1] * m.data[1] +
  30. data[1][2] * m.data[2] + data[1][3] * m.data[3];
  31. data[2] = data[2][0] * m.data[0] + data[2][1] * m.data[1] +
  32. data[2][2] * m.data[2] + data[2][3] * m.data[3];
  33. data[3] = data[3][0] * m.data[0] + data[3][1] * m.data[1] +
  34. data[3][2] * m.data[2] + data[3][3] * m.data[3];
  35. return *this;
  36. }
  37. Core::Matrix Core::Matrix::operator*(const Matrix& other) const {
  38. Matrix m = *this;
  39. m *= other;
  40. return m;
  41. }
  42. Core::Vector3 Core::Matrix::operator*(const Vector3& v) const {
  43. Vector4 v4(v[0], v[1], v[2], 1.0f);
  44. return Vector3(data[0].dot(v4), data[1].dot(v4), data[2].dot(v4)) *
  45. (1.0f / data[3].dot(v4));
  46. }
  47. Core::Matrix& Core::Matrix::scale(const Vector3& v) {
  48. data[0] *= v[0];
  49. data[1] *= v[1];
  50. data[2] *= v[2];
  51. return *this;
  52. }
  53. Core::Matrix& Core::Matrix::scale(float s) {
  54. return scale(Vector3(s, s, s));
  55. }
  56. Core::Matrix& Core::Matrix::translate(const Vector3& v) {
  57. return translateX(v[0]).translateY(v[1]).translateZ(v[2]);
  58. }
  59. Core::Matrix& Core::Matrix::translateX(float tx) {
  60. data[0] += data[3] * tx;
  61. return *this;
  62. }
  63. Core::Matrix& Core::Matrix::translateY(float ty) {
  64. data[1] += data[3] * ty;
  65. return *this;
  66. }
  67. Core::Matrix& Core::Matrix::translateZ(float tz) {
  68. data[2] += data[3] * tz;
  69. return *this;
  70. }
  71. Core::Matrix& Core::Matrix::translateTo(const Vector3& v) {
  72. data[0] = Vector4(1.0f, 0.0f, 0.0f, v[0]);
  73. data[1] = Vector4(0.0f, 1.0f, 0.0f, v[1]);
  74. data[2] = Vector4(0.0f, 0.0f, 1.0f, v[2]);
  75. data[3] = Vector4(0.0f, 0.0f, 0.0f, 1.0f);
  76. return *this;
  77. }
  78. Core::Matrix& Core::Matrix::rotate(float radians, int a, int b) {
  79. float sin = 0.0f;
  80. float cos = 0.0f;
  81. sincosf(radians, &sin, &cos);
  82. Vector4 v = data[a];
  83. data[a] = cos * v - sin * data[b];
  84. data[b] = sin * v + cos * data[b];
  85. return *this;
  86. }
  87. Core::Matrix& Core::Matrix::rotateX(float degrees) {
  88. return rotate(degrees, 1, 2);
  89. }
  90. Core::Matrix& Core::Matrix::rotateY(float degrees) {
  91. return rotate(-degrees, 0, 2);
  92. }
  93. Core::Matrix& Core::Matrix::rotateZ(float degrees) {
  94. return rotate(degrees, 0, 1);
  95. }
  96. Core::Matrix& Core::Matrix::rotate(const Quaternion& q) {
  97. Vector3 a = q * Vector3(data[0][0], data[1][0], data[2][0]);
  98. Vector3 b = q * Vector3(data[0][1], data[1][1], data[2][1]);
  99. Vector3 c = q * Vector3(data[0][2], data[1][2], data[2][2]);
  100. Vector3 d = q * Vector3(data[0][3], data[1][3], data[2][3]);
  101. set(0, Vector4(a[0], b[0], c[0], d[0]));
  102. set(1, Vector4(a[1], b[1], c[1], d[1]));
  103. set(2, Vector4(a[2], b[2], c[2], d[2]));
  104. return *this;
  105. }
  106. size_t Core::Matrix::toString(char* s, size_t n) const {
  107. size_t total = 0;
  108. addString("[", s, n, total);
  109. addString(data[0], s, n, total);
  110. addString(", ", s, n, total);
  111. addString(data[1], s, n, total);
  112. addString(", ", s, n, total);
  113. addString(data[2], s, n, total);
  114. addString(", ", s, n, total);
  115. addString(data[3], s, n, total);
  116. addString("]", s, n, total);
  117. return total;
  118. }