Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

107 řádky
3.5 KiB

  1. //
  2. // Lol Engine — Unit tests for the SQT transform class
  3. //
  4. // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net>
  5. //
  6. // Lol Engine is free software. It comes without any warranty, to
  7. // the extent permitted by applicable law. You can redistribute it
  8. // and/or modify it under the terms of the Do What the Fuck You Want
  9. // to Public License, Version 2, as published by the WTFPL Task Force.
  10. // See http://www.wtfpl.net/ for more details.
  11. //
  12. #include <lol/engine-internal.h>
  13. #include <lol/base/lolunit.h>
  14. namespace lol
  15. {
  16. static sqt const test_sqt_1(1.5f,
  17. quat::rotate(1.1f,
  18. normalize(vec3(1.f, 2.f, 3.f))),
  19. vec3(1.f, -1.f, 0.5f));
  20. static vec4 test_vec4s[] =
  21. {
  22. vec4(1.f, 0.f, 0.f, 1.f),
  23. vec4(0.f, 1.f, 0.f, 1.f),
  24. vec4(0.f, 0.f, 1.f, 1.f),
  25. vec4(1.f, 2.f, 3.f, 1.f),
  26. vec4(-1.f, 50.f, 12.f, 1.f),
  27. vec4(20.f, -10.f, 0.f, 1.f),
  28. vec4(-20.f, 10.f, 8.f, 1.f),
  29. };
  30. lolunit_declare_fixture(sqt_test)
  31. {
  32. lolunit_declare_test(transform_vec3_vec4)
  33. {
  34. /* We check that transforming a vec3 and a vec4 with w==1
  35. * yield the same results. */
  36. for (vec4 v0 : test_vec4s)
  37. {
  38. vec4 v1 = test_sqt_1.transform(v0);
  39. vec3 v2 = test_sqt_1.transform(v0.xyz);
  40. lolunit_assert_doubles_equal(v1.x, v2.x, length(v0.xyz) * 1e-5f);
  41. lolunit_assert_doubles_equal(v1.y, v2.y, length(v0.xyz) * 1e-5f);
  42. lolunit_assert_doubles_equal(v1.z, v2.z, length(v0.xyz) * 1e-5f);
  43. lolunit_assert_doubles_equal(v1.w, 1.0f, 1e-5f);
  44. }
  45. }
  46. lolunit_declare_test(sqt_vs_matrix_vec4)
  47. {
  48. /* We check that transforming a vec4 with an SQT and a
  49. * vec4 with a product of 4×4 matrices yield the same
  50. * results. */
  51. mat4 m = mat4::translate(test_sqt_1.t)
  52. * mat4(test_sqt_1.q)
  53. * mat4::scale(test_sqt_1.s);
  54. for (vec4 v0 : test_vec4s)
  55. {
  56. vec4 v1 = test_sqt_1 * v0;
  57. vec4 v2 = m * v0;
  58. lolunit_assert_doubles_equal(v1.x, v2.x, length(v0.xyz) * 1e-5f);
  59. lolunit_assert_doubles_equal(v1.y, v2.y, length(v0.xyz) * 1e-5f);
  60. lolunit_assert_doubles_equal(v1.z, v2.z, length(v0.xyz) * 1e-5f);
  61. lolunit_assert_doubles_equal(v1.w, v2.w, 1e-5f);
  62. }
  63. }
  64. lolunit_declare_test(sqt_inverse)
  65. {
  66. for (vec4 v0 : test_vec4s)
  67. {
  68. vec4 v1 = inverse(test_sqt_1) * (test_sqt_1 * v0);
  69. lolunit_assert_doubles_equal(v0.x, v1.x, length(v0.xyz) * 1e-5f);
  70. lolunit_assert_doubles_equal(v0.y, v1.y, length(v0.xyz) * 1e-5f);
  71. lolunit_assert_doubles_equal(v0.z, v1.z, length(v0.xyz) * 1e-5f);
  72. lolunit_assert_doubles_equal(v0.w, v1.w, 1e-5f);
  73. }
  74. }
  75. lolunit_declare_test(sqt_composition_vec4)
  76. {
  77. /* We check that transforming a vec4 with an SQT and a
  78. * second SQT yields the same result as transforming a
  79. * vec4 with the product of the two SQTs. */
  80. for (vec4 v0 : test_vec4s)
  81. {
  82. vec4 v1 = (test_sqt_1 * test_sqt_1) * v0;
  83. vec4 v2 = test_sqt_1 * (test_sqt_1 * v0);
  84. lolunit_assert_doubles_equal(v1.x, v2.x, length(v0.xyz) * 1e-5f);
  85. lolunit_assert_doubles_equal(v1.y, v2.y, length(v0.xyz) * 1e-5f);
  86. lolunit_assert_doubles_equal(v1.z, v2.z, length(v0.xyz) * 1e-5f);
  87. lolunit_assert_doubles_equal(v1.w, v2.w, 1e-5f);
  88. }
  89. }
  90. };
  91. } /* namespace lol */