Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
  5. // (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com>
  6. // This program is free software; you can redistribute it and/or
  7. // modify it under the terms of the Do What The Fuck You Want To
  8. // Public License, Version 2, as published by Sam Hocevar. See
  9. // http://www.wtfpl.net/ for more details.
  10. //
  11. #if defined HAVE_CONFIG_H
  12. # include "config.h"
  13. #endif
  14. #include "core.h"
  15. #include "lol/unit.h"
  16. namespace lol
  17. {
  18. LOLUNIT_FIXTURE(CameraTest)
  19. {
  20. Camera tc;
  21. vec3 eye;
  22. vec3 target;
  23. vec3 up;
  24. mat4 m_lookat;
  25. quat q_lookat;
  26. vec3 v_lookat;
  27. float fov;
  28. float screen_size;
  29. float screen_ratio;
  30. float near;
  31. float far;
  32. bool is_shifted;
  33. void SetUp()
  34. {
  35. eye = vec3(0.f, 0.f, 50.f);
  36. target = vec3::zero;
  37. up = vec3::axis_y;
  38. m_lookat = mat4::lookat(eye, target, up);
  39. q_lookat = quat(m_lookat);
  40. v_lookat = vec3::toeuler_zyx(q_lookat);
  41. fov = 90.f;
  42. screen_size = 800.f;
  43. screen_ratio = 1.0f;
  44. near = 1.f;
  45. far = 1000.f;
  46. is_shifted = false;
  47. }
  48. void TearDown() {}
  49. #define TEST_VECTOR(v0, v1) \
  50. LOLUNIT_ASSERT_DOUBLES_EQUAL(v0.x, v1.x, 1.e-5f); \
  51. LOLUNIT_ASSERT_DOUBLES_EQUAL(v0.y, v1.y, 1.e-5f); \
  52. LOLUNIT_ASSERT_DOUBLES_EQUAL(v0.z, v1.z, 1.e-5f);
  53. LOLUNIT_TEST(SetViewTest)
  54. {
  55. tc.SetView(eye, target, up);
  56. TEST_VECTOR(eye, tc.GetPosition());
  57. TEST_VECTOR(target, tc.GetTarget());
  58. TEST_VECTOR(up, tc.GetUp());
  59. tc.SetView(eye, q_lookat);
  60. TEST_VECTOR(eye, tc.GetPosition());
  61. TEST_VECTOR(target, tc.GetTarget());
  62. TEST_VECTOR(up, tc.GetUp());
  63. tc.SetView(eye, v_lookat);
  64. TEST_VECTOR(eye, tc.GetPosition());
  65. TEST_VECTOR(target, tc.GetTarget());
  66. TEST_VECTOR(up, tc.GetUp());
  67. tc.SetView(m_lookat);
  68. TEST_VECTOR(eye, tc.GetPosition());
  69. TEST_VECTOR(target, tc.GetTarget());
  70. TEST_VECTOR(up, tc.GetUp());
  71. tc.UseTarget(false);
  72. TEST_VECTOR(vec3(0.f, 0.f, 49.f), tc.GetTarget());
  73. }
  74. #define TEST_MATRIX(m0, m1) \
  75. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[0][0], m1[0][0], 1.e-5f); \
  76. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[1][0], m1[1][0], 1.e-5f); \
  77. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[2][0], m1[2][0], 1.e-5f); \
  78. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[3][0], m1[3][0], 1.e-5f); \
  79. \
  80. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[0][1], m1[0][1], 1.e-5f); \
  81. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[1][1], m1[1][1], 1.e-5f); \
  82. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[2][1], m1[2][1], 1.e-5f); \
  83. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[3][1], m1[3][1], 1.e-5f); \
  84. \
  85. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[0][2], m1[0][2], 1.e-5f); \
  86. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[1][2], m1[1][2], 1.e-5f); \
  87. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[2][2], m1[2][2], 1.e-5f); \
  88. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[3][2], m1[3][2], 1.e-5f); \
  89. \
  90. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[0][3], m1[0][3], 1.e-5f); \
  91. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[1][3], m1[1][3], 1.e-5f); \
  92. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[2][3], m1[2][3], 1.e-5f); \
  93. LOLUNIT_ASSERT_DOUBLES_EQUAL(m0[3][3], m1[3][3], 1.e-5f);
  94. LOLUNIT_TEST(SetProjectionTest)
  95. {
  96. mat4 refmx = mat4::perspective(fov, screen_size, screen_size * screen_ratio, near, far);
  97. tc.SetProjection(fov, near, far, screen_size, screen_ratio);
  98. TEST_MATRIX(refmx, tc.GetProjection());
  99. LOLUNIT_ASSERT_DOUBLES_EQUAL(fov, tc.GetFov(), 1.e-5f);
  100. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_size, tc.GetScreenSize(), 1.e-5f);
  101. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_ratio, tc.GetScreenRatio(), 1.e-5f);
  102. LOLUNIT_ASSERT_DOUBLES_EQUAL(near, tc.GetNear(), 1.e-5f);
  103. LOLUNIT_ASSERT_DOUBLES_EQUAL(far, tc.GetFar(), 1.e-5f);
  104. LOLUNIT_ASSERT(is_shifted == tc.IsShifted());
  105. tc.SetProjection(fov, near, far);
  106. TEST_MATRIX(refmx, tc.GetProjection());
  107. LOLUNIT_ASSERT_DOUBLES_EQUAL(fov, tc.GetFov(), 1.e-5f);
  108. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_size, tc.GetScreenSize(), 1.e-5f);
  109. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_ratio, tc.GetScreenRatio(), 1.e-5f);
  110. LOLUNIT_ASSERT_DOUBLES_EQUAL(near, tc.GetNear(), 1.e-5f);
  111. LOLUNIT_ASSERT_DOUBLES_EQUAL(far, tc.GetFar(), 1.e-5f);
  112. LOLUNIT_ASSERT(is_shifted == tc.IsShifted());
  113. tc.SetProjection(refmx);
  114. TEST_MATRIX(refmx, tc.GetProjection());
  115. tc.SetFov(fov);
  116. TEST_MATRIX(refmx, tc.GetProjection());
  117. LOLUNIT_ASSERT_DOUBLES_EQUAL(fov, tc.GetFov(), 1.e-5f);
  118. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_size, tc.GetScreenSize(), 1.e-5f);
  119. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_ratio, tc.GetScreenRatio(), 1.e-5f);
  120. LOLUNIT_ASSERT_DOUBLES_EQUAL(near, tc.GetNear(), 1.e-5f);
  121. LOLUNIT_ASSERT_DOUBLES_EQUAL(far, tc.GetFar(), 1.e-5f);
  122. LOLUNIT_ASSERT(is_shifted == tc.IsShifted());
  123. tc.SetScreenInfos(screen_size);
  124. TEST_MATRIX(refmx, tc.GetProjection());
  125. LOLUNIT_ASSERT_DOUBLES_EQUAL(fov, tc.GetFov(), 1.e-5f);
  126. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_size, tc.GetScreenSize(), 1.e-5f);
  127. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_ratio, tc.GetScreenRatio(), 1.e-5f);
  128. LOLUNIT_ASSERT_DOUBLES_EQUAL(near, tc.GetNear(), 1.e-5f);
  129. LOLUNIT_ASSERT_DOUBLES_EQUAL(far, tc.GetFar(), 1.e-5f);
  130. LOLUNIT_ASSERT(is_shifted == tc.IsShifted());
  131. tc.SetScreenInfos(screen_size, screen_ratio);
  132. TEST_MATRIX(refmx, tc.GetProjection());
  133. LOLUNIT_ASSERT_DOUBLES_EQUAL(fov, tc.GetFov(), 1.e-5f);
  134. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_size, tc.GetScreenSize(), 1.e-5f);
  135. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_ratio, tc.GetScreenRatio(), 1.e-5f);
  136. LOLUNIT_ASSERT_DOUBLES_EQUAL(near, tc.GetNear(), 1.e-5f);
  137. LOLUNIT_ASSERT_DOUBLES_EQUAL(far, tc.GetFar(), 1.e-5f);
  138. LOLUNIT_ASSERT(is_shifted == tc.IsShifted());
  139. tc.SetDrawInfos(far);
  140. TEST_MATRIX(refmx, tc.GetProjection());
  141. LOLUNIT_ASSERT_DOUBLES_EQUAL(fov, tc.GetFov(), 1.e-5f);
  142. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_size, tc.GetScreenSize(), 1.e-5f);
  143. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_ratio, tc.GetScreenRatio(), 1.e-5f);
  144. LOLUNIT_ASSERT_DOUBLES_EQUAL(near, tc.GetNear(), 1.e-5f);
  145. LOLUNIT_ASSERT_DOUBLES_EQUAL(far, tc.GetFar(), 1.e-5f);
  146. LOLUNIT_ASSERT(is_shifted == tc.IsShifted());
  147. tc.SetDrawInfos(near, far);
  148. TEST_MATRIX(refmx, tc.GetProjection());
  149. LOLUNIT_ASSERT_DOUBLES_EQUAL(fov, tc.GetFov(), 1.e-5f);
  150. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_size, tc.GetScreenSize(), 1.e-5f);
  151. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_ratio, tc.GetScreenRatio(), 1.e-5f);
  152. LOLUNIT_ASSERT_DOUBLES_EQUAL(near, tc.GetNear(), 1.e-5f);
  153. LOLUNIT_ASSERT_DOUBLES_EQUAL(far, tc.GetFar(), 1.e-5f);
  154. LOLUNIT_ASSERT(is_shifted == tc.IsShifted());
  155. is_shifted = true;
  156. refmx = mat4::shifted_perspective(fov, screen_size, screen_ratio, near, far);
  157. tc.UseShift(is_shifted);
  158. TEST_MATRIX(refmx, tc.GetProjection());
  159. LOLUNIT_ASSERT_DOUBLES_EQUAL(fov, tc.GetFov(), 1.e-5f);
  160. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_size, tc.GetScreenSize(), 1.e-5f);
  161. LOLUNIT_ASSERT_DOUBLES_EQUAL(screen_ratio, tc.GetScreenRatio(), 1.e-5f);
  162. LOLUNIT_ASSERT_DOUBLES_EQUAL(near, tc.GetNear(), 1.e-5f);
  163. LOLUNIT_ASSERT_DOUBLES_EQUAL(far, tc.GetFar(), 1.e-5f);
  164. LOLUNIT_ASSERT(is_shifted == tc.IsShifted());
  165. }
  166. };
  167. } /* namespace lol */