QuaternionTests.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "../Tests.h"
  2. #include "core/Quaternion.h"
  3. typedef CoreQuaternion Q;
  4. #define Q(a, b, c, d) (&(Q){{a, b, c}, d})
  5. #define CV3(a, b, c) (&(CoreVector3){{a, b, c}})
  6. #define CV30 CV3(0.0f, 0.0f, 0.0f)
  7. static void testInit() {
  8. Q q = CORE_UNIT_QUATERNION;
  9. char buffer[128];
  10. coreToStringQ(&q, buffer, sizeof(buffer));
  11. CORE_TEST_STRING("(0.000 i + 0.000 j + 0.000 k + 1.000)", buffer);
  12. }
  13. static void testAxisAndDegreesInit() {
  14. Q q = CORE_UNIT_QUATERNION;
  15. coreAxisAngleQ(&q, CV3(1.0f, 2.0f, 3.0f), 142.0f);
  16. char buffer[128];
  17. coreToStringQ(&q, buffer, sizeof(buffer));
  18. CORE_TEST_STRING("(0.253 i + 0.505 j + 0.758 k + 0.326)", buffer);
  19. }
  20. static void testLerp() {
  21. Q q1 = CORE_UNIT_QUATERNION;
  22. coreAxisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 130.0f);
  23. Q q2 = CORE_UNIT_QUATERNION;
  24. coreAxisAngleQ(&q2, CV3(1.0f, 2.0f, 4.0f), 260.0f);
  25. Q q3;
  26. coreLerpQ(&q3, &q1, 0.3f, &q2);
  27. char buffer[128];
  28. coreToStringQ(&q3, buffer, sizeof(buffer));
  29. CORE_TEST_STRING("(0.223 i + 0.529 j + 0.810 k + 0.119)", buffer);
  30. }
  31. static void testMulSet() {
  32. Q q1 = CORE_UNIT_QUATERNION;
  33. coreAxisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 50.0f);
  34. Q q2 = CORE_UNIT_QUATERNION;
  35. coreAxisAngleQ(&q2, CV3(2.0f, 5.0f, 7.0f), 60.0f);
  36. Q q3 = CORE_UNIT_QUATERNION;
  37. coreMulSetQ(&q3, &q1);
  38. char bufferQ1[128];
  39. coreToStringQ(&q1, bufferQ1, sizeof(bufferQ1));
  40. char bufferQ3[128];
  41. coreToStringQ(&q3, bufferQ3, sizeof(bufferQ3));
  42. CORE_TEST_STRING(bufferQ1, bufferQ3);
  43. coreMulSetQ(&q3, &q2);
  44. coreToStringQ(&q3, bufferQ3, sizeof(bufferQ3));
  45. coreAxisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 110.0f);
  46. coreToStringQ(&q1, bufferQ1, sizeof(bufferQ1));
  47. CORE_TEST_STRING(bufferQ1, bufferQ3);
  48. }
  49. static void testMul() {
  50. Q q1 = CORE_UNIT_QUATERNION;
  51. coreAxisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 50.0f);
  52. Q q2 = CORE_UNIT_QUATERNION;
  53. coreAxisAngleQ(&q2, CV3(2.0f, 5.0f, 7.0f), 60.0f);
  54. Q q3 = CORE_UNIT_QUATERNION;
  55. coreMulQ(&q3, &q1, &q2);
  56. char bufferQ3[128];
  57. coreToStringQ(&q3, bufferQ3, sizeof(bufferQ3));
  58. Q q = CORE_UNIT_QUATERNION;
  59. coreAxisAngleQ(&q, CV3(2.0f, 5.0f, 7.0f), 110.0f);
  60. char bufferQ[128];
  61. coreToStringQ(&q, bufferQ, sizeof(bufferQ));
  62. CORE_TEST_STRING(bufferQ, bufferQ3);
  63. }
  64. static void testMulVector() {
  65. Q q1 = CORE_UNIT_QUATERNION;
  66. coreAxisAngleQ(&q1, CV3(1.0f, 0.0f, 0.0f), 90.0f);
  67. Q q2 = CORE_UNIT_QUATERNION;
  68. coreAxisAngleQ(&q2, CV3(0.0f, 1.0f, 0.0f), 90.0f);
  69. Q q3 = CORE_UNIT_QUATERNION;
  70. coreAxisAngleQ(&q3, CV3(0.0f, 0.0f, 1.0f), 90.0f);
  71. CoreVector3 v1 = {{1.0f, 0.0f, 0.0f}};
  72. CoreVector3 v2 = {{0.0f, 1.0f, 0.0f}};
  73. CoreVector3 v3 = {{0.0f, 0.0f, 1.0f}};
  74. CORE_TEST_V3(CV3(1.0f, 0.0f, 0.0f), coreMulQV3(CV30, &q1, &v1));
  75. CORE_TEST_V3(CV3(0.0f, 0.0f, 1.0f), coreMulQV3(CV30, &q1, &v2));
  76. CORE_TEST_V3(CV3(0.0f, -1.0f, 0.0f), coreMulQV3(CV30, &q1, &v3));
  77. CORE_TEST_V3(CV3(0.0f, 0.0f, -1.0f), coreMulQV3(CV30, &q2, &v1));
  78. CORE_TEST_V3(CV3(0.0f, 1.0f, 0.0f), coreMulQV3(CV30, &q2, &v2));
  79. CORE_TEST_V3(CV3(1.0f, 0.0f, 0.0f), coreMulQV3(CV30, &q2, &v3));
  80. CORE_TEST_V3(CV3(0.0f, 1.0f, 0.0f), coreMulQV3(CV30, &q3, &v1));
  81. CORE_TEST_V3(CV3(-1.0f, 0.0f, 0.0f), coreMulQV3(CV30, &q3, &v2));
  82. CORE_TEST_V3(CV3(0.0f, 0.0f, 1.0f), coreMulQV3(CV30, &q3, &v3));
  83. }
  84. void coreTestQuaternion() {
  85. testInit();
  86. testAxisAndDegreesInit();
  87. testLerp();
  88. testMulSet();
  89. testMul();
  90. testMulVector();
  91. }