Matrix.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "core/Matrix.h"
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include "core/Utility.h"
  5. #define M(m, x, y) ((m)->data[x].data[y])
  6. #define CV40 (&VECTOR4)
  7. Matrix* transposeMatrix(Matrix* m) {
  8. Matrix c = ZERO_MATRIX;
  9. for(size_t x = 0; x < 4; x++) {
  10. for(size_t y = 0; y < 4; y++) {
  11. M(&c, x, y) = M(m, y, x);
  12. }
  13. }
  14. *m = c;
  15. return m;
  16. }
  17. Matrix* mulSetMatrix(Matrix* m, const Matrix* a) {
  18. for(int i = 0; i < 4; i++) {
  19. Vector4 d = VECTOR4;
  20. addSetV4(&d, mulV4F(CV40, a->data + 0, m->data[i].data[0]));
  21. addSetV4(&d, mulV4F(CV40, a->data + 1, m->data[i].data[1]));
  22. addSetV4(&d, mulV4F(CV40, a->data + 2, m->data[i].data[2]));
  23. addSetV4(&d, mulV4F(CV40, a->data + 3, m->data[i].data[3]));
  24. m->data[i] = d;
  25. }
  26. return m;
  27. }
  28. Matrix* mulMatrix(Matrix* m, const Matrix* a, const Matrix* b) {
  29. *m = *a;
  30. mulSetMatrix(m, b);
  31. return m;
  32. }
  33. Vector3* mulMatrixV3(Vector3* v, const Matrix* m, const Vector3* a) {
  34. Vector4 v4 = {{a->data[0], a->data[1], a->data[2], 1.0f}};
  35. v->data[0] = dotV4(m->data + 0, &v4);
  36. v->data[1] = dotV4(m->data + 1, &v4);
  37. v->data[2] = dotV4(m->data + 2, &v4);
  38. mulSetV3F(v, 1.0f / dotV4(m->data + 3, &v4));
  39. return v;
  40. }
  41. Matrix* scaleMatrix(Matrix* m, const Vector3* v) {
  42. mulSetV4F(m->data + 0, v->data[0]);
  43. mulSetV4F(m->data + 1, v->data[1]);
  44. mulSetV4F(m->data + 2, v->data[2]);
  45. return m;
  46. }
  47. Matrix* scaleMatrixF(Matrix* m, float f) {
  48. return scaleMatrix(m, &(Vector3){{f, f, f}});
  49. }
  50. Matrix* translateMatrix(Matrix* m, const Vector3* v) {
  51. translateMatrixX(m, v->data[0]);
  52. translateMatrixY(m, v->data[1]);
  53. translateMatrixZ(m, v->data[2]);
  54. return m;
  55. }
  56. Matrix* translateMatrixX(Matrix* m, float tx) {
  57. addSetV4(m->data + 0, mulV4F(CV40, m->data + 3, tx));
  58. return m;
  59. }
  60. Matrix* translateMatrixY(Matrix* m, float ty) {
  61. addSetV4(m->data + 1, mulV4F(CV40, m->data + 3, ty));
  62. return m;
  63. }
  64. Matrix* translateMatrixZ(Matrix* m, float tz) {
  65. addSetV4(m->data + 2, mulV4F(CV40, m->data + 3, tz));
  66. return m;
  67. }
  68. Matrix* translateMatrixTo(Matrix* m, const Vector3* v) {
  69. m->data[0] = (Vector4){{1.0f, 0.0f, 0.0f, v->data[0]}};
  70. m->data[1] = (Vector4){{0.0f, 1.0f, 0.0f, v->data[1]}};
  71. m->data[2] = (Vector4){{0.0f, 0.0f, 1.0f, v->data[2]}};
  72. m->data[3] = (Vector4){{0.0f, 0.0f, 0.0f, 1.0f}};
  73. return m;
  74. }
  75. static Matrix* rotate(Matrix* m, float degrees, int a, int b) {
  76. degrees = degreeToRadian(degrees);
  77. float sin = sinf(degrees);
  78. float cos = cosf(degrees);
  79. Vector4 v = m->data[a];
  80. subV4(m->data + a, mulV4F(CV40, &v, cos), mulV4F(CV40, m->data + b, sin));
  81. addV4(m->data + b, mulV4F(CV40, &v, sin), mulV4F(CV40, m->data + b, cos));
  82. return m;
  83. }
  84. Matrix* rotateMatrixX(Matrix* m, float degrees) {
  85. return rotate(m, degrees, 1, 2);
  86. }
  87. Matrix* rotateMatrixY(Matrix* m, float degrees) {
  88. return rotate(m, -degrees, 0, 2);
  89. }
  90. Matrix* rotateMatrixZ(Matrix* m, float degrees) {
  91. return rotate(m, degrees, 0, 1);
  92. }
  93. Matrix* rotateMatrix(Matrix* m, const Quaternion* q) {
  94. Vector3 a;
  95. Vector3 b;
  96. Vector3 c;
  97. Vector3 d;
  98. mulQV3(&a, q, &(Vector3){{M(m, 0, 0), M(m, 1, 0), M(m, 2, 0)}});
  99. mulQV3(&b, q, &(Vector3){{M(m, 0, 1), M(m, 1, 1), M(m, 2, 1)}});
  100. mulQV3(&c, q, &(Vector3){{M(m, 0, 2), M(m, 1, 2), M(m, 2, 2)}});
  101. mulQV3(&d, q, &(Vector3){{M(m, 0, 3), M(m, 1, 3), M(m, 2, 3)}});
  102. m->data[0] = (Vector4){{a.data[0], b.data[0], c.data[0], d.data[0]}};
  103. m->data[1] = (Vector4){{a.data[1], b.data[1], c.data[1], d.data[1]}};
  104. m->data[2] = (Vector4){{a.data[2], b.data[2], c.data[2], d.data[2]}};
  105. return m;
  106. }
  107. size_t toStringMatrix(const Matrix* m, char* buffer, size_t n) {
  108. size_t w = 0;
  109. stringAdd(&w, &buffer, &n, toString(buffer, n, "["));
  110. stringAdd(&w, &buffer, &n, toStringV4(m->data + 0, buffer, n));
  111. stringAdd(&w, &buffer, &n, toString(buffer, n, ", "));
  112. stringAdd(&w, &buffer, &n, toStringV4(m->data + 1, buffer, n));
  113. stringAdd(&w, &buffer, &n, toString(buffer, n, ", "));
  114. stringAdd(&w, &buffer, &n, toStringV4(m->data + 2, buffer, n));
  115. stringAdd(&w, &buffer, &n, toString(buffer, n, ", "));
  116. stringAdd(&w, &buffer, &n, toStringV4(m->data + 3, buffer, n));
  117. stringAdd(&w, &buffer, &n, toString(buffer, n, "]"));
  118. return w;
  119. }