MatrixTests.c 6.5 KB

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