core_func_common.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////
  4. // Created : 2011-01-15
  5. // Updated : 2011-09-13
  6. // Licence : This source is under MIT licence
  7. // File : test/core/func_common.cpp
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////
  9. #include <glm/glm.hpp>
  10. #include <glm/gtx/epsilon.hpp>
  11. int test_modf()
  12. {
  13. int Error(0);
  14. {
  15. float X(1.5f);
  16. float I(0.0f);
  17. float A = glm::modf(X, I);
  18. Error += I == 1.0f ? 0 : 1;
  19. Error += A == 0.5f ? 0 : 1;
  20. }
  21. {
  22. glm::vec4 X(1.1f, 1.2f, 1.5f, 1.7f);
  23. glm::vec4 I(0.0f);
  24. glm::vec4 A = glm::modf(X, I);
  25. Error += I == glm::vec4(1.0f) ? 0 : 1;
  26. Error += glm::all(glm::equalEpsilon(A, glm::vec4(0.1f, 0.2f, 0.5f, 0.7f), 0.00001f)) ? 0 : 1;
  27. }
  28. {
  29. glm::dvec4 X(1.1, 1.2, 1.5, 1.7);
  30. glm::dvec4 I(0.0);
  31. glm::dvec4 A = glm::modf(X, I);
  32. Error += I == glm::dvec4(1.0) ? 0 : 1;
  33. Error += glm::all(glm::equalEpsilon(A, glm::dvec4(0.1, 0.2, 0.5, 0.7), 0.000000001)) ? 0 : 1;
  34. }
  35. {
  36. double X(1.5);
  37. double I(0.0);
  38. double A = glm::modf(X, I);
  39. Error += I == 1.0 ? 0 : 1;
  40. Error += A == 0.5 ? 0 : 1;
  41. }
  42. return Error;
  43. }
  44. int test_floatBitsToInt()
  45. {
  46. int Error = 0;
  47. {
  48. float A = 1.0f;
  49. int B = glm::floatBitsToInt(A);
  50. float C = glm::intBitsToFloat(B);
  51. int D = *(int*)&A;
  52. Error += B == D ? 0 : 1;
  53. Error += A == C ? 0 : 1;
  54. }
  55. {
  56. glm::vec2 A(1.0f, 2.0f);
  57. glm::ivec2 B = glm::floatBitsToInt(A);
  58. glm::vec2 C = glm::intBitsToFloat(B);
  59. Error += B.x == *(int*)&(A.x) ? 0 : 1;
  60. Error += B.y == *(int*)&(A.y) ? 0 : 1;
  61. Error += A == C? 0 : 1;
  62. }
  63. {
  64. glm::vec3 A(1.0f, 2.0f, 3.0f);
  65. glm::ivec3 B = glm::floatBitsToInt(A);
  66. glm::vec3 C = glm::intBitsToFloat(B);
  67. Error += B.x == *(int*)&(A.x) ? 0 : 1;
  68. Error += B.y == *(int*)&(A.y) ? 0 : 1;
  69. Error += B.z == *(int*)&(A.z) ? 0 : 1;
  70. Error += A == C? 0 : 1;
  71. }
  72. {
  73. glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
  74. glm::ivec4 B = glm::floatBitsToInt(A);
  75. glm::vec4 C = glm::intBitsToFloat(B);
  76. Error += B.x == *(int*)&(A.x) ? 0 : 1;
  77. Error += B.y == *(int*)&(A.y) ? 0 : 1;
  78. Error += B.z == *(int*)&(A.z) ? 0 : 1;
  79. Error += B.w == *(int*)&(A.w) ? 0 : 1;
  80. Error += A == C? 0 : 1;
  81. }
  82. return Error;
  83. }
  84. int test_floatBitsToUint()
  85. {
  86. int Error = 0;
  87. {
  88. float A = 1.0f;
  89. glm::uint B = glm::floatBitsToUint(A);
  90. float C = glm::intBitsToFloat(B);
  91. Error += B == *(glm::uint*)&A ? 0 : 1;
  92. Error += A == C? 0 : 1;
  93. }
  94. {
  95. glm::vec2 A(1.0f, 2.0f);
  96. glm::uvec2 B = glm::floatBitsToUint(A);
  97. glm::vec2 C = glm::uintBitsToFloat(B);
  98. Error += B.x == *(glm::uint*)&(A.x) ? 0 : 1;
  99. Error += B.y == *(glm::uint*)&(A.y) ? 0 : 1;
  100. Error += A == C ? 0 : 1;
  101. }
  102. {
  103. glm::vec3 A(1.0f, 2.0f, 3.0f);
  104. glm::uvec3 B = glm::floatBitsToUint(A);
  105. glm::vec3 C = glm::uintBitsToFloat(B);
  106. Error += B.x == *(glm::uint*)&(A.x) ? 0 : 1;
  107. Error += B.y == *(glm::uint*)&(A.y) ? 0 : 1;
  108. Error += B.z == *(glm::uint*)&(A.z) ? 0 : 1;
  109. Error += A == C? 0 : 1;
  110. }
  111. {
  112. glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
  113. glm::uvec4 B = glm::floatBitsToUint(A);
  114. glm::vec4 C = glm::uintBitsToFloat(B);
  115. Error += B.x == *(glm::uint*)&(A.x) ? 0 : 1;
  116. Error += B.y == *(glm::uint*)&(A.y) ? 0 : 1;
  117. Error += B.z == *(glm::uint*)&(A.z) ? 0 : 1;
  118. Error += B.w == *(glm::uint*)&(A.w) ? 0 : 1;
  119. Error += A == C? 0 : 1;
  120. }
  121. return Error;
  122. }
  123. int test_mix()
  124. {
  125. int Error = 0;
  126. {
  127. float A = glm::mix(0.f, 1.f, true);
  128. Error += A == 1.f ? 0 : 1;
  129. float B = glm::mix(0.f, 1.f, false);
  130. Error += B == 0.f ? 0 : 1;
  131. }
  132. {
  133. float A = glm::mix(0.f, 1.f, 1.f);
  134. Error += A == 1.f ? 0 : 1;
  135. float B = glm::mix(0.f, 1.f, 0.f);
  136. Error += B == 0.f ? 0 : 1;
  137. }
  138. return Error;
  139. }
  140. int test_round()
  141. {
  142. int Error = 0;
  143. {
  144. float A = glm::round(0.0f);
  145. Error += A == 0.0f ? 0 : 1;
  146. float B = glm::round(0.5f);
  147. Error += B == 1.0f ? 0 : 1;
  148. float C = glm::round(1.0f);
  149. Error += C == 1.0f ? 0 : 1;
  150. float D = glm::round(0.1f);
  151. Error += D == 0.0f ? 0 : 1;
  152. float E = glm::round(0.9f);
  153. Error += E == 1.0f ? 0 : 1;
  154. float F = glm::round(1.5f);
  155. Error += F == 2.0f ? 0 : 1;
  156. float G = glm::round(1.9f);
  157. Error += G == 2.0f ? 0 : 1;
  158. }
  159. {
  160. float A = glm::round(-0.0f);
  161. Error += A == 0.0f ? 0 : 1;
  162. float B = glm::round(-0.5f);
  163. Error += B == -1.0f ? 0 : 1;
  164. float C = glm::round(-1.0f);
  165. Error += C == -1.0f ? 0 : 1;
  166. float D = glm::round(-0.1f);
  167. Error += D == 0.0f ? 0 : 1;
  168. float E = glm::round(-0.9f);
  169. Error += E == -1.0f ? 0 : 1;
  170. float F = glm::round(-1.5f);
  171. Error += F == -2.0f ? 0 : 1;
  172. float G = glm::round(-1.9f);
  173. Error += G == -2.0f ? 0 : 1;
  174. }
  175. return Error;
  176. }
  177. int test_roundEven()
  178. {
  179. int Error = 0;
  180. {
  181. float A = glm::roundEven(-1.5f);
  182. Error += A == -2.0f ? 0 : 1;
  183. Error += 0;
  184. }
  185. {
  186. float A = glm::roundEven(0.0f);
  187. Error += A == 0.0f ? 0 : 1;
  188. float B = glm::roundEven(0.5f);
  189. Error += B == 0.0f ? 0 : 1;
  190. float C = glm::roundEven(1.0f);
  191. Error += C == 1.0f ? 0 : 1;
  192. float D = glm::roundEven(0.1f);
  193. Error += D == 0.0f ? 0 : 1;
  194. float E = glm::roundEven(0.9f);
  195. Error += E == 1.0f ? 0 : 1;
  196. float F = glm::roundEven(1.5f);
  197. Error += F == 2.0f ? 0 : 1;
  198. float G = glm::roundEven(1.9f);
  199. Error += G == 2.0f ? 0 : 1;
  200. }
  201. {
  202. float A = glm::roundEven(-0.0f);
  203. Error += A == 0.0f ? 0 : 1;
  204. float B = glm::roundEven(-0.5f);
  205. Error += B == -0.0f ? 0 : 1;
  206. float C = glm::roundEven(-1.0f);
  207. Error += C == -1.0f ? 0 : 1;
  208. float D = glm::roundEven(-0.1f);
  209. Error += D == 0.0f ? 0 : 1;
  210. float E = glm::roundEven(-0.9f);
  211. Error += E == -1.0f ? 0 : 1;
  212. float F = glm::roundEven(-1.5f);
  213. Error += F == -2.0f ? 0 : 1;
  214. float G = glm::roundEven(-1.9f);
  215. Error += G == -2.0f ? 0 : 1;
  216. }
  217. {
  218. float A = glm::roundEven(1.5f);
  219. Error += A == 2.0f ? 0 : 1;
  220. float B = glm::roundEven(2.5f);
  221. Error += B == 2.0f ? 0 : 1;
  222. float C = glm::roundEven(3.5f);
  223. Error += C == 4.0f ? 0 : 1;
  224. float D = glm::roundEven(4.5f);
  225. Error += D == 4.0f ? 0 : 1;
  226. float E = glm::roundEven(5.5f);
  227. Error += E == 6.0f ? 0 : 1;
  228. float F = glm::roundEven(6.5f);
  229. Error += F == 6.0f ? 0 : 1;
  230. float G = glm::roundEven(7.5f);
  231. Error += G == 8.0f ? 0 : 1;
  232. }
  233. {
  234. float A = glm::roundEven(-1.5f);
  235. Error += A == -2.0f ? 0 : 1;
  236. float B = glm::roundEven(-2.5f);
  237. Error += B == -2.0f ? 0 : 1;
  238. float C = glm::roundEven(-3.5f);
  239. Error += C == -4.0f ? 0 : 1;
  240. float D = glm::roundEven(-4.5f);
  241. Error += D == -4.0f ? 0 : 1;
  242. float E = glm::roundEven(-5.5f);
  243. Error += E == -6.0f ? 0 : 1;
  244. float F = glm::roundEven(-6.5f);
  245. Error += F == -6.0f ? 0 : 1;
  246. float G = glm::roundEven(-7.5f);
  247. Error += G == -8.0f ? 0 : 1;
  248. }
  249. return Error;
  250. }
  251. int main()
  252. {
  253. int Error(0);
  254. Error += test_modf();
  255. Error += test_floatBitsToInt();
  256. Error += test_floatBitsToUint();
  257. Error += test_mix();
  258. Error += test_round();
  259. //Error += test_roundEven();
  260. return Error;
  261. }