Matrix.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "core/Matrix.h"
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include "core/Utility.h"
  5. Matrix* transposeMatrix(Matrix* m) {
  6. Matrix c = CORE_ZERO_MATRIX;
  7. for(size_t x = 0; x < 4; x++) {
  8. for(size_t y = 0; y < 4; y++) {
  9. c.data[x].data[y] = m->data[y].data[x];
  10. }
  11. }
  12. *m = c;
  13. return m;
  14. }
  15. #define CV40 (&CORE_VECTOR4)
  16. Matrix* mulSetMatrix(Matrix* m, const Matrix* a) {
  17. for(int i = 0; i < 4; i++) {
  18. CoreVector4 d = CORE_VECTOR4;
  19. coreAddSetV4(&d, coreMulV4F(CV40, a->data + 0, m->data[i].data[0]));
  20. coreAddSetV4(&d, coreMulV4F(CV40, a->data + 1, m->data[i].data[1]));
  21. coreAddSetV4(&d, coreMulV4F(CV40, a->data + 2, m->data[i].data[2]));
  22. coreAddSetV4(&d, coreMulV4F(CV40, a->data + 3, m->data[i].data[3]));
  23. m->data[i] = d;
  24. }
  25. return m;
  26. }
  27. Matrix* mulMatrix(Matrix* m, const Matrix* a, const Matrix* b) {
  28. *m = *a;
  29. mulSetMatrix(m, b);
  30. return m;
  31. }
  32. CoreVector3* mulMatrixV3(CoreVector3* v, const Matrix* m,
  33. const CoreVector3* a) {
  34. CoreVector4 v4 = {{a->data[0], a->data[1], a->data[2], 1.0f}};
  35. v->data[0] = coreDotV4(m->data + 0, &v4);
  36. v->data[1] = coreDotV4(m->data + 1, &v4);
  37. v->data[2] = coreDotV4(m->data + 2, &v4);
  38. coreMulSetV3F(v, 1.0f / coreDotV4(m->data + 3, &v4));
  39. return v;
  40. }
  41. Matrix* scaleMatrix(Matrix* m, const CoreVector3* v) {
  42. coreMulSetV4F(m->data + 0, v->data[0]);
  43. coreMulSetV4F(m->data + 1, v->data[1]);
  44. coreMulSetV4F(m->data + 2, v->data[2]);
  45. return m;
  46. }
  47. Matrix* scaleMatrixF(Matrix* m, float f) {
  48. return scaleMatrix(m, &(CoreVector3){{f, f, f}});
  49. }
  50. Matrix* translateMatrix(Matrix* m, const CoreVector3* 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. coreAddSetV4(m->data + 0, coreMulV4F(CV40, m->data + 3, tx));
  58. return m;
  59. }
  60. Matrix* translateMatrixY(Matrix* m, float ty) {
  61. coreAddSetV4(m->data + 1, coreMulV4F(CV40, m->data + 3, ty));
  62. return m;
  63. }
  64. Matrix* translateMatrixZ(Matrix* m, float tz) {
  65. coreAddSetV4(m->data + 2, coreMulV4F(CV40, m->data + 3, tz));
  66. return m;
  67. }
  68. Matrix* translateMatrixTo(Matrix* m, const CoreVector3* v) {
  69. m->data[0] = (CoreVector4){{1.0f, 0.0f, 0.0f, v->data[0]}};
  70. m->data[1] = (CoreVector4){{0.0f, 1.0f, 0.0f, v->data[1]}};
  71. m->data[2] = (CoreVector4){{0.0f, 0.0f, 1.0f, v->data[2]}};
  72. m->data[3] = (CoreVector4){{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 = coreDegreeToRadian(degrees);
  77. float sin = sinf(degrees);
  78. float cos = cosf(degrees);
  79. CoreVector4 v = m->data[a];
  80. coreSubV4(m->data + a, coreMulV4F(CV40, &v, cos),
  81. coreMulV4F(CV40, m->data + b, sin));
  82. coreAddV4(m->data + b, coreMulV4F(CV40, &v, sin),
  83. coreMulV4F(CV40, m->data + b, cos));
  84. return m;
  85. }
  86. Matrix* rotateMatrixX(Matrix* m, float degrees) {
  87. return rotate(m, degrees, 1, 2);
  88. }
  89. Matrix* rotateMatrixY(Matrix* m, float degrees) {
  90. return rotate(m, -degrees, 0, 2);
  91. }
  92. Matrix* rotateMatrixZ(Matrix* m, float degrees) {
  93. return rotate(m, degrees, 0, 1);
  94. }
  95. Matrix* rotateMatrix(Matrix* m, const CoreQuaternion* q) {
  96. CoreVector3 a;
  97. CoreVector3 b;
  98. CoreVector3 c;
  99. CoreVector3 d;
  100. coreMulQV3(&a, q,
  101. &(CoreVector3){{m->data[0].data[0], m->data[1].data[0],
  102. m->data[2].data[0]}});
  103. coreMulQV3(&b, q,
  104. &(CoreVector3){{m->data[0].data[1], m->data[1].data[1],
  105. m->data[2].data[1]}});
  106. coreMulQV3(&c, q,
  107. &(CoreVector3){{m->data[0].data[2], m->data[1].data[2],
  108. m->data[2].data[2]}});
  109. coreMulQV3(&d, q,
  110. &(CoreVector3){{m->data[0].data[3], m->data[1].data[3],
  111. m->data[2].data[3]}});
  112. m->data[0] = (CoreVector4){{a.data[0], b.data[0], c.data[0], d.data[0]}};
  113. m->data[1] = (CoreVector4){{a.data[1], b.data[1], c.data[1], d.data[1]}};
  114. m->data[2] = (CoreVector4){{a.data[2], b.data[2], c.data[2], d.data[2]}};
  115. return m;
  116. }
  117. size_t toStringMatrix(const Matrix* m, char* buffer, size_t n) {
  118. size_t w = 0;
  119. coreStringAdd(&w, &buffer, &n, coreToString(buffer, n, "["));
  120. coreStringAdd(&w, &buffer, &n, coreToStringV4(m->data + 0, buffer, n));
  121. coreStringAdd(&w, &buffer, &n, coreToString(buffer, n, ", "));
  122. coreStringAdd(&w, &buffer, &n, coreToStringV4(m->data + 1, buffer, n));
  123. coreStringAdd(&w, &buffer, &n, coreToString(buffer, n, ", "));
  124. coreStringAdd(&w, &buffer, &n, coreToStringV4(m->data + 2, buffer, n));
  125. coreStringAdd(&w, &buffer, &n, coreToString(buffer, n, ", "));
  126. coreStringAdd(&w, &buffer, &n, coreToStringV4(m->data + 3, buffer, n));
  127. coreStringAdd(&w, &buffer, &n, coreToString(buffer, n, "]"));
  128. return w;
  129. }