Matrix.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "core/Matrix.h"
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include "core/Utility.h"
  5. CoreMatrix* coreTransposeMatrix(CoreMatrix* m) {
  6. CoreMatrix c = {0};
  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 (&(CoreVector4){0})
  16. CoreMatrix* coreMulSetMatrix(CoreMatrix* m, const CoreMatrix* a) {
  17. for(int i = 0; i < 4; i++) {
  18. CoreVector4 d = {0};
  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. CoreMatrix* coreMulMatrix(CoreMatrix* m, const CoreMatrix* a,
  28. const CoreMatrix* b) {
  29. *m = *a;
  30. coreMulSetMatrix(m, b);
  31. return m;
  32. }
  33. CoreVector3* coreMulMatrixV3(CoreVector3* v, const CoreMatrix* m,
  34. const CoreVector3* a) {
  35. CoreVector4 v4 = {{a->data[0], a->data[1], a->data[2], 1.0f}};
  36. v->data[0] = coreDotV4(m->data + 0, &v4);
  37. v->data[1] = coreDotV4(m->data + 1, &v4);
  38. v->data[2] = coreDotV4(m->data + 2, &v4);
  39. coreMulSetV3F(v, 1.0f / coreDotV4(m->data + 3, &v4));
  40. return v;
  41. }
  42. CoreMatrix* coreScaleMatrix(CoreMatrix* m, const CoreVector3* v) {
  43. coreMulSetV4F(m->data + 0, v->data[0]);
  44. coreMulSetV4F(m->data + 1, v->data[1]);
  45. coreMulSetV4F(m->data + 2, v->data[2]);
  46. return m;
  47. }
  48. CoreMatrix* coreScaleMatrixF(CoreMatrix* m, float f) {
  49. return coreScaleMatrix(m, &(CoreVector3){{f, f, f}});
  50. }
  51. CoreMatrix* coreTranslateMatrix(CoreMatrix* m, const CoreVector3* v) {
  52. coreTranslateMatrixX(m, v->data[0]);
  53. coreTranslateMatrixY(m, v->data[1]);
  54. coreTranslateMatrixZ(m, v->data[2]);
  55. return m;
  56. }
  57. CoreMatrix* coreTranslateMatrixX(CoreMatrix* m, float tx) {
  58. coreAddSetV4(m->data + 0, coreMulV4F(CV40, m->data + 3, tx));
  59. return m;
  60. }
  61. CoreMatrix* coreTranslateMatrixY(CoreMatrix* m, float ty) {
  62. coreAddSetV4(m->data + 1, coreMulV4F(CV40, m->data + 3, ty));
  63. return m;
  64. }
  65. CoreMatrix* coreTranslateMatrixZ(CoreMatrix* m, float tz) {
  66. coreAddSetV4(m->data + 2, coreMulV4F(CV40, m->data + 3, tz));
  67. return m;
  68. }
  69. CoreMatrix* coreTranslateMatrixTo(CoreMatrix* m, const CoreVector3* v) {
  70. m->data[0] = (CoreVector4){{1.0f, 0.0f, 0.0f, v->data[0]}};
  71. m->data[1] = (CoreVector4){{0.0f, 1.0f, 0.0f, v->data[1]}};
  72. m->data[2] = (CoreVector4){{0.0f, 0.0f, 1.0f, v->data[2]}};
  73. m->data[3] = (CoreVector4){{0.0f, 0.0f, 0.0f, 1.0f}};
  74. return m;
  75. }
  76. static CoreMatrix* rotate(CoreMatrix* m, float degrees, int a, int b) {
  77. degrees = coreDegreeToRadian(degrees);
  78. float sin = sinf(degrees);
  79. float cos = cosf(degrees);
  80. CoreVector4 v = m->data[a];
  81. coreSubV4(m->data + a, coreMulV4F(CV40, &v, cos),
  82. coreMulV4F(CV40, m->data + b, sin));
  83. coreAddV4(m->data + b, coreMulV4F(CV40, &v, sin),
  84. coreMulV4F(CV40, m->data + b, cos));
  85. return m;
  86. }
  87. CoreMatrix* coreRotateMatrixX(CoreMatrix* m, float degrees) {
  88. return rotate(m, degrees, 1, 2);
  89. }
  90. CoreMatrix* coreRotateMatrixY(CoreMatrix* m, float degrees) {
  91. return rotate(m, -degrees, 0, 2);
  92. }
  93. CoreMatrix* coreRotateMatrixZ(CoreMatrix* m, float degrees) {
  94. return rotate(m, degrees, 0, 1);
  95. }
  96. CoreMatrix* coreRotateMatrix(CoreMatrix* m, const CoreQuaternion* q) {
  97. CoreVector3 a;
  98. CoreVector3 b;
  99. CoreVector3 c;
  100. CoreVector3 d;
  101. coreMulQV3(&a, q,
  102. &(CoreVector3){{m->data[0].data[0], m->data[1].data[0],
  103. m->data[2].data[0]}});
  104. coreMulQV3(&b, q,
  105. &(CoreVector3){{m->data[0].data[1], m->data[1].data[1],
  106. m->data[2].data[1]}});
  107. coreMulQV3(&c, q,
  108. &(CoreVector3){{m->data[0].data[2], m->data[1].data[2],
  109. m->data[2].data[2]}});
  110. coreMulQV3(&d, q,
  111. &(CoreVector3){{m->data[0].data[3], m->data[1].data[3],
  112. m->data[2].data[3]}});
  113. m->data[0] = (CoreVector4){{a.data[0], b.data[0], c.data[0], d.data[0]}};
  114. m->data[1] = (CoreVector4){{a.data[1], b.data[1], c.data[1], d.data[1]}};
  115. m->data[2] = (CoreVector4){{a.data[2], b.data[2], c.data[2], d.data[2]}};
  116. // Vector3 a = q * Vector3(data[0][0], data[1][0], data[2][0]);
  117. // Vector3 b = q * Vector3(data[0][1], data[1][1], data[2][1]);
  118. // Vector3 c = q * Vector3(data[0][2], data[1][2], data[2][2]);
  119. // Vector3 d = q * Vector3(data[0][3], data[1][3], data[2][3]);
  120. // set(0, Vector4(a[0], b[0], c[0], d[0]));
  121. // set(1, Vector4(a[1], b[1], c[1], d[1]));
  122. // set(2, Vector4(a[2], b[2], c[2], d[2]));
  123. return m;
  124. }
  125. static void add(size_t* w, char** buffer, size_t* n, size_t shift) {
  126. *w += shift;
  127. if(*n > shift) {
  128. *buffer += shift;
  129. *n -= shift;
  130. } else {
  131. *n = 0;
  132. }
  133. }
  134. static void addI(size_t* w, char** buffer, size_t* n, int shift) {
  135. add(w, buffer, n, shift < 0 ? 0 : (size_t)shift);
  136. }
  137. size_t coreToStringMatrix(const CoreMatrix* m, char* buffer, size_t n) {
  138. size_t w = 0;
  139. addI(&w, &buffer, &n, snprintf(buffer, n, "["));
  140. add(&w, &buffer, &n, coreToStringV4(m->data + 0, buffer, n));
  141. addI(&w, &buffer, &n, snprintf(buffer, n, ", "));
  142. add(&w, &buffer, &n, coreToStringV4(m->data + 1, buffer, n));
  143. addI(&w, &buffer, &n, snprintf(buffer, n, ", "));
  144. add(&w, &buffer, &n, coreToStringV4(m->data + 2, buffer, n));
  145. addI(&w, &buffer, &n, snprintf(buffer, n, ", "));
  146. add(&w, &buffer, &n, coreToStringV4(m->data + 3, buffer, n));
  147. addI(&w, &buffer, &n, snprintf(buffer, n, "]"));
  148. return w;
  149. }