MatrixTests.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "../Tests.h"
  2. #include "core/Matrix.h"
  3. typedef CoreMatrix Matrix;
  4. typedef CoreVector3 V3;
  5. #define CV3(a, b, c) (&(V3){{a, b, c}})
  6. #define CV30 CV3(0.0f, 0.0f, 0.0f)
  7. static void testInit() {
  8. Matrix m = CORE_UNIT_MATRIX;
  9. const float* data = (float*)&m;
  10. for(int i = 0; i < 16; i++) {
  11. int x = i % 4;
  12. int y = i / 4;
  13. CORE_TEST_FLOAT(x == y, data[i], 0.0f);
  14. }
  15. }
  16. static void testTranspose() {
  17. Matrix m;
  18. float* data = (float*)&m;
  19. for(int i = 0; i < 16; i++) {
  20. data[i] = (float)(i + 1);
  21. }
  22. Matrix t = m;
  23. coreTransposeMatrix(&t);
  24. Matrix m2 = t;
  25. coreTransposeMatrix(&m2);
  26. const float* mp = (float*)&m;
  27. const float* tp = (float*)&t;
  28. for(int x = 0; x < 4; x++) {
  29. for(int y = 0; y < 4; y++) {
  30. CORE_TEST_FLOAT(mp[y * 4 + x], tp[x * 4 + y], 0.0f);
  31. }
  32. }
  33. const float* mp2 = (float*)&m2;
  34. for(int i = 0; i < 16; i++) {
  35. CORE_TEST_FLOAT(mp[i], mp2[i], 0.0f);
  36. }
  37. }
  38. static void testScale() {
  39. Matrix m = CORE_UNIT_MATRIX;
  40. coreScaleMatrix(&m, CV3(2.0f, 3.0f, 4.0f));
  41. CORE_TEST_V3(CV3(-8.0f, 18.0f, 28.0f),
  42. coreMulMatrixV3(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
  43. }
  44. static void testUniformScale() {
  45. Matrix m = CORE_UNIT_MATRIX;
  46. coreScaleMatrixF(&m, 2.0f);
  47. CORE_TEST_V3(CV3(-8.0f, 12.0f, 14.0f),
  48. coreMulMatrixV3(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
  49. }
  50. static void testTranslateX() {
  51. Matrix m = CORE_UNIT_MATRIX;
  52. coreTranslateMatrixX(&m, 5.0f);
  53. CORE_TEST_V3(CV3(1.0f, 6.0f, 7.0f),
  54. coreMulMatrixV3(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
  55. }
  56. static void testTranslateY() {
  57. Matrix m = CORE_UNIT_MATRIX;
  58. coreTranslateMatrixY(&m, 6.0f);
  59. CORE_TEST_V3(CV3(-4.0f, 12.0f, 7.0f),
  60. coreMulMatrixV3(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
  61. }
  62. static void testTranslateZ() {
  63. Matrix m = CORE_UNIT_MATRIX;
  64. coreTranslateMatrixZ(&m, 7.0f);
  65. CORE_TEST_V3(CV3(-4.0f, 6.0f, 14.0f),
  66. coreMulMatrixV3(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
  67. }
  68. static void testTranslate() {
  69. Matrix m = CORE_UNIT_MATRIX;
  70. coreTranslateMatrix(&m, CV3(1.0f, 2.0f, 3.0f));
  71. CORE_TEST_V3(CV3(-3.0f, 8.0f, 10.0f),
  72. coreMulMatrixV3(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
  73. }
  74. static void testTranslateTo() {
  75. char buffer[1024];
  76. Matrix m;
  77. for(int i = 0; i < 16; i++) {
  78. ((float*)&m)[i] = (float)i + 1.0f;
  79. }
  80. coreTranslateMatrixTo(&m, CV3(6.0f, 8.0f, 9.0f));
  81. coreToStringMatrix(&m, buffer, sizeof(buffer));
  82. CORE_TEST_STRING(
  83. "[[1.000, 0.000, 0.000, 6.000], [0.000, 1.000, 0.000, 8.000], "
  84. "[0.000, 0.000, 1.000, 9.000], [0.000, 0.000, 0.000, 1.000]]",
  85. buffer);
  86. }
  87. static void testCombination() {
  88. Matrix m = CORE_UNIT_MATRIX;
  89. coreScaleMatrixF(&m, 2.0f);
  90. coreTranslateMatrixX(&m, 1.0f);
  91. coreTranslateMatrixY(&m, 2.0f);
  92. coreTranslateMatrixZ(&m, 3.0f);
  93. coreTranslateMatrix(&m, CV3(-4.0f, 2.0f, 3.0f));
  94. coreScaleMatrix(&m, CV3(2.0f, 3.0f, 4.0f));
  95. coreScaleMatrixF(&m, 0.5f);
  96. CORE_TEST_V3(CV3(-1.0f, 9.0f, 16.0f),
  97. coreMulMatrixV3(CV30, &m, CV3(1.0f, 1.0f, 1.0f)));
  98. }
  99. static void testMatrixCombination() {
  100. Matrix a = CORE_UNIT_MATRIX;
  101. coreScaleMatrixF(&a, 2.0f);
  102. coreTranslateMatrix(&a, CV3(1.0f, 2.0f, 3.0f));
  103. Matrix b = CORE_UNIT_MATRIX;
  104. coreScaleMatrixF(&b, 3.0f);
  105. coreTranslateMatrix(&b, CV3(1.0f, 1.0f, 1.0f));
  106. Matrix c = CORE_UNIT_MATRIX;
  107. coreTranslateMatrix(&c, CV3(-1.0f, -2.0f, -3.0f));
  108. coreMulSetMatrix(&c, coreMulMatrix(&CORE_ZERO_MATRIX, &b, &a));
  109. CORE_TEST_V3(CV3(9.0f, 11.0f, 13.0f),
  110. coreMulMatrixV3(CV30, &c, CV3(1.0f, 1.0f, 1.0f)));
  111. }
  112. static void testRotateX() {
  113. Matrix m = CORE_UNIT_MATRIX;
  114. coreRotateMatrixX(&m, 90.0f);
  115. CORE_TEST_V3(CV3(1.0f, 0.0f, 0.0f),
  116. coreMulMatrixV3(CV30, &m, CV3(1.0f, 0.0f, 0.0f)));
  117. CORE_TEST_V3(CV3(0.0f, 0.0f, 1.0f),
  118. coreMulMatrixV3(CV30, &m, CV3(0.0f, 1.0f, 0.0f)));
  119. CORE_TEST_V3(CV3(0.0f, -1.0f, 0.0f),
  120. coreMulMatrixV3(CV30, &m, CV3(0.0f, 0.0f, 1.0f)));
  121. }
  122. static void testRotateY() {
  123. Matrix m = CORE_UNIT_MATRIX;
  124. coreRotateMatrixY(&m, 90.0f);
  125. CORE_TEST_V3(CV3(0.0f, 0.0f, -1.0f),
  126. coreMulMatrixV3(CV30, &m, CV3(1.0f, 0.0f, 0.0f)));
  127. CORE_TEST_V3(CV3(0.0f, 1.0f, 0.0f),
  128. coreMulMatrixV3(CV30, &m, CV3(0.0f, 1.0f, 0.0f)));
  129. CORE_TEST_V3(CV3(1.0f, 0.0f, 0.0f),
  130. coreMulMatrixV3(CV30, &m, CV3(0.0f, 0.0f, 1.0f)));
  131. }
  132. static void testRotateZ() {
  133. Matrix m = CORE_UNIT_MATRIX;
  134. coreRotateMatrixZ(&m, 90.0f);
  135. CORE_TEST_V3(CV3(0.0f, 1.0f, 0.0f),
  136. coreMulMatrixV3(CV30, &m, CV3(1.0f, 0.0f, 0.0f)));
  137. CORE_TEST_V3(CV3(-1.0f, 0.0f, 0.0f),
  138. coreMulMatrixV3(CV30, &m, CV3(0.0f, 1.0f, 0.0f)));
  139. CORE_TEST_V3(CV3(0.0f, 0.0f, 1.0f),
  140. coreMulMatrixV3(CV30, &m, CV3(0.0f, 0.0f, 1.0f)));
  141. }
  142. static void testQuaternionMatrix() {
  143. CoreQuaternion q1 = CORE_UNIT_QUATERNION;
  144. coreAxisAngleQ(&q1, CV3(1.0f, 0.0f, 0.0f), 48.0f);
  145. CoreQuaternion q2 = CORE_UNIT_QUATERNION;
  146. coreAxisAngleQ(&q2, CV3(0.0f, 1.0f, 0.0f), 52.0f);
  147. CoreQuaternion q3 = CORE_UNIT_QUATERNION;
  148. coreAxisAngleQ(&q3, CV3(0.0f, 0.0f, 1.0f), 60.0f);
  149. Matrix m = CORE_UNIT_MATRIX;
  150. coreTranslateMatrix(&m, CV3(1.0f, 2.0f, 3.0f));
  151. coreRotateMatrix(&m, &q1);
  152. coreRotateMatrix(&m, &q2);
  153. coreRotateMatrix(&m, &q3);
  154. coreTranslateMatrix(&m, CV3(1.0f, 2.0f, 3.0f));
  155. Matrix check = CORE_UNIT_MATRIX;
  156. coreTranslateMatrix(&check, CV3(1.0f, 2.0f, 3.0f));
  157. coreRotateMatrixX(&check, 48.0f);
  158. coreRotateMatrixY(&check, 52.0f);
  159. coreRotateMatrixZ(&check, 60.0f);
  160. coreTranslateMatrix(&check, CV3(1.0f, 2.0f, 3.0f));
  161. for(int i = 0; i < 16; i++) {
  162. CORE_TEST_FLOAT(((float*)&check)[i], ((float*)&m)[i], 0.0001f);
  163. }
  164. }
  165. static void testToString() {
  166. Matrix m;
  167. for(int i = 0; i < 16; i++) {
  168. ((float*)&m)[i] = (float)i + 1.0f;
  169. }
  170. char buffer[1024];
  171. size_t n = coreToStringMatrix(&m, buffer, sizeof(buffer));
  172. CORE_TEST_SIZE(127, n);
  173. CORE_TEST_STRING(
  174. "[[1.000, 2.000, 3.000, 4.000], [5.000, 6.000, 7.000, 8.000], "
  175. "[9.000, 10.000, 11.000, 12.000], [13.000, 14.000, 15.000, 16.000]]",
  176. buffer);
  177. n = coreToStringMatrix(&m, buffer, 20);
  178. CORE_TEST_SIZE(127, n);
  179. CORE_TEST_STRING("[[1.000, 2.000, 3.0", buffer);
  180. }
  181. void coreTestMatrix() {
  182. testInit();
  183. testTranspose();
  184. testScale();
  185. testUniformScale();
  186. testTranslateX();
  187. testTranslateY();
  188. testTranslateZ();
  189. testTranslate();
  190. testTranslateTo();
  191. testCombination();
  192. testMatrixCombination();
  193. testRotateX();
  194. testRotateY();
  195. testRotateZ();
  196. testQuaternionMatrix();
  197. testToString();
  198. }