gtc_matrix_transform.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include <glm/gtc/matrix_transform.hpp>
  2. #include <glm/gtc/constants.hpp>
  3. #include <glm/ext/matrix_relational.hpp>
  4. #include <glm/ext/scalar_relational.hpp>
  5. static int test_perspective()
  6. {
  7. int Error = 0;
  8. const float Near = 0.1f;
  9. const float Far = 100.0f;
  10. const float Eps = glm::epsilon<float>();
  11. glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near, Far);
  12. Projection = glm::perspectiveLH_ZO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near, Far);
  13. {
  14. glm::vec4 N = Projection * glm::vec4(0.f, 0.f, Near, 1.f);
  15. glm::vec4 F = Projection * glm::vec4(0.f, 0.f, Far, 1.f);
  16. N /= N.w;
  17. F /= F.w;
  18. Error += glm::notEqual(N.z, 0.f, Eps);
  19. Error += glm::notEqual(F.z, 1.f, Eps);
  20. }
  21. Projection = glm::perspectiveLH_NO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near, Far);
  22. {
  23. glm::vec4 N = Projection * glm::vec4(0.f, 0.f, Near, 1.f);
  24. glm::vec4 F = Projection * glm::vec4(0.f, 0.f, Far, 1.f);
  25. N /= N.w;
  26. F /= F.w;
  27. Error += glm::notEqual(N.z, -1.f, Eps);
  28. Error += glm::notEqual(F.z, 1.f, Eps);
  29. }
  30. Projection = glm::perspectiveRH_ZO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near, Far);
  31. {
  32. glm::vec4 N = Projection * glm::vec4(0.f, 0.f, -Near, 1.f);
  33. glm::vec4 F = Projection * glm::vec4(0.f, 0.f, -Far, 1.f);
  34. N /= N.w;
  35. F /= F.w;
  36. Error += glm::notEqual(N.z, 0.f, Eps);
  37. Error += glm::notEqual(F.z, 1.f, Eps);
  38. }
  39. Projection = glm::perspectiveRH_NO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near, Far);
  40. {
  41. glm::vec4 N = Projection * glm::vec4(0.f, 0.f, -Near, 1.f);
  42. glm::vec4 F = Projection * glm::vec4(0.f, 0.f, -Far, 1.f);
  43. N /= N.w;
  44. F /= F.w;
  45. Error += glm::notEqual(N.z, -1.f, Eps);
  46. Error += glm::notEqual(F.z, 1.f, Eps);
  47. }
  48. return Error;
  49. }
  50. static int test_infinitePerspective()
  51. {
  52. int Error = 0;
  53. const float Near = 0.1f;
  54. const float Inf = 1.0e+10f;
  55. const float Eps = glm::epsilon<float>();
  56. glm::mat4 Projection = glm::infinitePerspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near);
  57. Projection = glm::infinitePerspectiveLH_ZO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near);
  58. {
  59. glm::vec4 N = Projection * glm::vec4(0.f, 0.f, Near, 1.f);
  60. glm::vec4 F = Projection * glm::vec4(0.f, 0.f, Inf, 1.f);
  61. N /= N.w;
  62. F /= F.w;
  63. Error += glm::notEqual(N.z, 0.f, Eps);
  64. Error += glm::notEqual(F.z, 1.f, Eps);
  65. }
  66. Projection = glm::infinitePerspectiveLH_NO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near);
  67. {
  68. glm::vec4 N = Projection * glm::vec4(0.f, 0.f, Near, 1.f);
  69. glm::vec4 F = Projection * glm::vec4(0.f, 0.f, Inf, 1.f);
  70. N /= N.w;
  71. F /= F.w;
  72. Error += glm::notEqual(N.z, -1.f, Eps);
  73. Error += glm::notEqual(F.z, 1.f, Eps);
  74. }
  75. Projection = glm::infinitePerspectiveRH_ZO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near);
  76. {
  77. glm::vec4 N = Projection * glm::vec4(0.f, 0.f, -Near, 1.f);
  78. glm::vec4 F = Projection * glm::vec4(0.f, 0.f, -Inf, 1.f);
  79. N /= N.w;
  80. F /= F.w;
  81. Error += glm::notEqual(N.z, 0.f, Eps);
  82. Error += glm::notEqual(F.z, 1.f, Eps);
  83. }
  84. Projection = glm::infinitePerspectiveRH_NO(glm::pi<float>() * 0.25f, 4.0f / 3.0f, Near);
  85. {
  86. glm::vec4 N = Projection * glm::vec4(0.f, 0.f, -Near, 1.f);
  87. glm::vec4 F = Projection * glm::vec4(0.f, 0.f, -Inf, 1.f);
  88. N /= N.w;
  89. F /= F.w;
  90. Error += glm::notEqual(N.z, -1.f, Eps);
  91. Error += glm::notEqual(F.z, 1.f, Eps);
  92. }
  93. return Error;
  94. }
  95. static int test_pick()
  96. {
  97. int Error = 0;
  98. glm::mat4 Pick = glm::pickMatrix(glm::vec2(1, 2), glm::vec2(3, 4), glm::ivec4(0, 0, 320, 240));
  99. Error += !glm::all(glm::notEqual(Pick, glm::mat4(2.0), 0.001f));
  100. return Error;
  101. }
  102. static int test_tweakedInfinitePerspective()
  103. {
  104. int Error = 0;
  105. glm::mat4 ProjectionA = glm::tweakedInfinitePerspective(45.f, 640.f/480.f, 1.0f);
  106. glm::mat4 ProjectionB = glm::tweakedInfinitePerspective(45.f, 640.f/480.f, 1.0f, 0.001f);
  107. Error += !glm::all(glm::notEqual(ProjectionA, glm::mat4(1.0), 0.001f));
  108. Error += !glm::all(glm::notEqual(ProjectionB, glm::mat4(1.0), 0.001f));
  109. return Error;
  110. }
  111. static int test_translate()
  112. {
  113. int Error = 0;
  114. glm::lowp_vec3 v(1.0);
  115. glm::lowp_mat4 m(0);
  116. glm::lowp_mat4 t = glm::translate(m, v);
  117. glm::bvec4 b = glm::notEqual(t, glm::lowp_mat4(1.0), 0.001f);
  118. Error += !glm::all(b);
  119. return Error;
  120. }
  121. int main()
  122. {
  123. int Error = 0;
  124. Error += test_translate();
  125. Error += test_tweakedInfinitePerspective();
  126. Error += test_pick();
  127. Error += test_perspective();
  128. Error += test_infinitePerspective();
  129. return Error;
  130. }