gtc_random.cpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. #include <glm/gtc/random.hpp>
  2. #include <glm/gtc/epsilon.hpp>
  3. #if GLM_LANG & GLM_LANG_CXX0X_FLAG
  4. # include <array>
  5. #endif
  6. std::size_t const TestSamples = 10000;
  7. int test_linearRand()
  8. {
  9. int Error = 0;
  10. glm::int32 const Min = 16;
  11. glm::int32 const Max = 32;
  12. {
  13. glm::u8vec2 AMin(std::numeric_limits<glm::u8>::max());
  14. glm::u8vec2 AMax(std::numeric_limits<glm::u8>::min());
  15. {
  16. for(std::size_t i = 0; i < TestSamples; ++i)
  17. {
  18. glm::u8vec2 A = glm::linearRand(glm::u8vec2(Min), glm::u8vec2(Max));
  19. AMin = glm::min(AMin, A);
  20. AMax = glm::max(AMax, A);
  21. if(!glm::all(glm::lessThanEqual(A, glm::u8vec2(Max))))
  22. ++Error;
  23. if(!glm::all(glm::greaterThanEqual(A, glm::u8vec2(Min))))
  24. ++Error;
  25. assert(!Error);
  26. }
  27. Error += glm::all(glm::equal(AMin, glm::u8vec2(Min))) ? 0 : 1;
  28. Error += glm::all(glm::equal(AMax, glm::u8vec2(Max))) ? 0 : 1;
  29. assert(!Error);
  30. }
  31. glm::u16vec2 BMin(std::numeric_limits<glm::u16>::max());
  32. glm::u16vec2 BMax(std::numeric_limits<glm::u16>::min());
  33. {
  34. for(std::size_t i = 0; i < TestSamples; ++i)
  35. {
  36. glm::u16vec2 B = glm::linearRand(glm::u16vec2(Min), glm::u16vec2(Max));
  37. BMin = glm::min(BMin, B);
  38. BMax = glm::max(BMax, B);
  39. if(!glm::all(glm::lessThanEqual(B, glm::u16vec2(Max))))
  40. ++Error;
  41. if(!glm::all(glm::greaterThanEqual(B, glm::u16vec2(Min))))
  42. ++Error;
  43. assert(!Error);
  44. }
  45. Error += glm::all(glm::equal(BMin, glm::u16vec2(Min))) ? 0 : 1;
  46. Error += glm::all(glm::equal(BMax, glm::u16vec2(Max))) ? 0 : 1;
  47. assert(!Error);
  48. }
  49. glm::u32vec2 CMin(std::numeric_limits<glm::u32>::max());
  50. glm::u32vec2 CMax(std::numeric_limits<glm::u32>::min());
  51. {
  52. for(std::size_t i = 0; i < TestSamples; ++i)
  53. {
  54. glm::u32vec2 C = glm::linearRand(glm::u32vec2(Min), glm::u32vec2(Max));
  55. CMin = glm::min(CMin, C);
  56. CMax = glm::max(CMax, C);
  57. if(!glm::all(glm::lessThanEqual(C, glm::u32vec2(Max))))
  58. ++Error;
  59. if(!glm::all(glm::greaterThanEqual(C, glm::u32vec2(Min))))
  60. ++Error;
  61. assert(!Error);
  62. }
  63. Error += glm::all(glm::equal(CMin, glm::u32vec2(Min))) ? 0 : 1;
  64. Error += glm::all(glm::equal(CMax, glm::u32vec2(Max))) ? 0 : 1;
  65. assert(!Error);
  66. }
  67. glm::u64vec2 DMin(std::numeric_limits<glm::u64>::max());
  68. glm::u64vec2 DMax(std::numeric_limits<glm::u64>::min());
  69. {
  70. for(std::size_t i = 0; i < TestSamples; ++i)
  71. {
  72. glm::u64vec2 D = glm::linearRand(glm::u64vec2(Min), glm::u64vec2(Max));
  73. DMin = glm::min(DMin, D);
  74. DMax = glm::max(DMax, D);
  75. if(!glm::all(glm::lessThanEqual(D, glm::u64vec2(Max))))
  76. ++Error;
  77. if(!glm::all(glm::greaterThanEqual(D, glm::u64vec2(Min))))
  78. ++Error;
  79. assert(!Error);
  80. }
  81. Error += glm::all(glm::equal(DMin, glm::u64vec2(Min))) ? 0 : 1;
  82. Error += glm::all(glm::equal(DMax, glm::u64vec2(Max))) ? 0 : 1;
  83. assert(!Error);
  84. }
  85. }
  86. {
  87. glm::i8vec2 AMin(std::numeric_limits<glm::i8>::max());
  88. glm::i8vec2 AMax(std::numeric_limits<glm::i8>::min());
  89. {
  90. for(std::size_t i = 0; i < TestSamples; ++i)
  91. {
  92. glm::i8vec2 A = glm::linearRand(glm::i8vec2(Min), glm::i8vec2(Max));
  93. AMin = glm::min(AMin, A);
  94. AMax = glm::max(AMax, A);
  95. if(!glm::all(glm::lessThanEqual(A, glm::i8vec2(Max))))
  96. ++Error;
  97. if(!glm::all(glm::greaterThanEqual(A, glm::i8vec2(Min))))
  98. ++Error;
  99. assert(!Error);
  100. }
  101. Error += glm::all(glm::equal(AMin, glm::i8vec2(Min))) ? 0 : 1;
  102. Error += glm::all(glm::equal(AMax, glm::i8vec2(Max))) ? 0 : 1;
  103. assert(!Error);
  104. }
  105. glm::i16vec2 BMin(std::numeric_limits<glm::i16>::max());
  106. glm::i16vec2 BMax(std::numeric_limits<glm::i16>::min());
  107. {
  108. for(std::size_t i = 0; i < TestSamples; ++i)
  109. {
  110. glm::i16vec2 B = glm::linearRand(glm::i16vec2(Min), glm::i16vec2(Max));
  111. BMin = glm::min(BMin, B);
  112. BMax = glm::max(BMax, B);
  113. if(!glm::all(glm::lessThanEqual(B, glm::i16vec2(Max))))
  114. ++Error;
  115. if(!glm::all(glm::greaterThanEqual(B, glm::i16vec2(Min))))
  116. ++Error;
  117. assert(!Error);
  118. }
  119. Error += glm::all(glm::equal(BMin, glm::i16vec2(Min))) ? 0 : 1;
  120. Error += glm::all(glm::equal(BMax, glm::i16vec2(Max))) ? 0 : 1;
  121. assert(!Error);
  122. }
  123. glm::i32vec2 CMin(std::numeric_limits<glm::i32>::max());
  124. glm::i32vec2 CMax(std::numeric_limits<glm::i32>::min());
  125. {
  126. for(std::size_t i = 0; i < TestSamples; ++i)
  127. {
  128. glm::i32vec2 C = glm::linearRand(glm::i32vec2(Min), glm::i32vec2(Max));
  129. CMin = glm::min(CMin, C);
  130. CMax = glm::max(CMax, C);
  131. if(!glm::all(glm::lessThanEqual(C, glm::i32vec2(Max))))
  132. ++Error;
  133. if(!glm::all(glm::greaterThanEqual(C, glm::i32vec2(Min))))
  134. ++Error;
  135. assert(!Error);
  136. }
  137. Error += glm::all(glm::equal(CMin, glm::i32vec2(Min))) ? 0 : 1;
  138. Error += glm::all(glm::equal(CMax, glm::i32vec2(Max))) ? 0 : 1;
  139. assert(!Error);
  140. }
  141. glm::i64vec2 DMin(std::numeric_limits<glm::i64>::max());
  142. glm::i64vec2 DMax(std::numeric_limits<glm::i64>::min());
  143. {
  144. for(std::size_t i = 0; i < TestSamples; ++i)
  145. {
  146. glm::i64vec2 D = glm::linearRand(glm::i64vec2(Min), glm::i64vec2(Max));
  147. DMin = glm::min(DMin, D);
  148. DMax = glm::max(DMax, D);
  149. if(!glm::all(glm::lessThanEqual(D, glm::i64vec2(Max))))
  150. ++Error;
  151. if(!glm::all(glm::greaterThanEqual(D, glm::i64vec2(Min))))
  152. ++Error;
  153. assert(!Error);
  154. }
  155. Error += glm::all(glm::equal(DMin, glm::i64vec2(Min))) ? 0 : 1;
  156. Error += glm::all(glm::equal(DMax, glm::i64vec2(Max))) ? 0 : 1;
  157. assert(!Error);
  158. }
  159. }
  160. for(std::size_t i = 0; i < TestSamples; ++i)
  161. {
  162. glm::f32vec2 const A(glm::linearRand(glm::f32vec2(static_cast<float>(Min)), glm::f32vec2(static_cast<float>(Max))));
  163. if(!glm::all(glm::lessThanEqual(A, glm::f32vec2(static_cast<float>(Max)))))
  164. ++Error;
  165. if(!glm::all(glm::greaterThanEqual(A, glm::f32vec2(static_cast<float>(Min)))))
  166. ++Error;
  167. glm::f64vec2 const B(glm::linearRand(glm::f64vec2(Min), glm::f64vec2(Max)));
  168. if(!glm::all(glm::lessThanEqual(B, glm::f64vec2(Max))))
  169. ++Error;
  170. if(!glm::all(glm::greaterThanEqual(B, glm::f64vec2(Min))))
  171. ++Error;
  172. assert(!Error);
  173. }
  174. {
  175. float ResultFloat = 0.0f;
  176. double ResultDouble = 0.0f;
  177. for(std::size_t i = 0; i < TestSamples; ++i)
  178. {
  179. ResultFloat += glm::linearRand(-1.0f, 1.0f);
  180. ResultDouble += glm::linearRand(-1.0, 1.0);
  181. }
  182. Error += glm::epsilonEqual(ResultFloat, 0.0f, 0.0001f);
  183. Error += glm::epsilonEqual(ResultDouble, 0.0, 0.0001);
  184. assert(!Error);
  185. }
  186. return Error;
  187. }
  188. int test_circularRand()
  189. {
  190. int Error = 0;
  191. {
  192. std::size_t Max = TestSamples;
  193. float ResultFloat = 0.0f;
  194. double ResultDouble = 0.0f;
  195. double Radius = 2.0f;
  196. for(std::size_t i = 0; i < Max; ++i)
  197. {
  198. ResultFloat += glm::length(glm::circularRand(1.0f));
  199. ResultDouble += glm::length(glm::circularRand(Radius));
  200. }
  201. Error += glm::epsilonEqual(ResultFloat, float(Max), 0.01f) ? 0 : 1;
  202. Error += glm::epsilonEqual(ResultDouble, double(Max) * double(Radius), 0.01) ? 0 : 1;
  203. assert(!Error);
  204. }
  205. return Error;
  206. }
  207. int test_sphericalRand()
  208. {
  209. int Error = 0;
  210. {
  211. std::size_t Max = TestSamples;
  212. float ResultFloatA = 0.0f;
  213. float ResultFloatB = 0.0f;
  214. float ResultFloatC = 0.0f;
  215. double ResultDoubleA = 0.0f;
  216. double ResultDoubleB = 0.0f;
  217. double ResultDoubleC = 0.0f;
  218. for(std::size_t i = 0; i < Max; ++i)
  219. {
  220. ResultFloatA += glm::length(glm::sphericalRand(1.0f));
  221. ResultDoubleA += glm::length(glm::sphericalRand(1.0));
  222. ResultFloatB += glm::length(glm::sphericalRand(2.0f));
  223. ResultDoubleB += glm::length(glm::sphericalRand(2.0));
  224. ResultFloatC += glm::length(glm::sphericalRand(3.0f));
  225. ResultDoubleC += glm::length(glm::sphericalRand(3.0));
  226. }
  227. Error += glm::epsilonEqual(ResultFloatA, float(Max), 0.01f) ? 0 : 1;
  228. Error += glm::epsilonEqual(ResultDoubleA, double(Max), 0.0001) ? 0 : 1;
  229. Error += glm::epsilonEqual(ResultFloatB, float(Max * 2), 0.01f) ? 0 : 1;
  230. Error += glm::epsilonEqual(ResultDoubleB, double(Max * 2), 0.0001) ? 0 : 1;
  231. Error += glm::epsilonEqual(ResultFloatC, float(Max * 3), 0.01f) ? 0 : 1;
  232. Error += glm::epsilonEqual(ResultDoubleC, double(Max * 3), 0.01) ? 0 : 1;
  233. assert(!Error);
  234. }
  235. return Error;
  236. }
  237. int test_diskRand()
  238. {
  239. int Error = 0;
  240. {
  241. float ResultFloat = 0.0f;
  242. double ResultDouble = 0.0f;
  243. for(std::size_t i = 0; i < TestSamples; ++i)
  244. {
  245. ResultFloat += glm::length(glm::diskRand(2.0f));
  246. ResultDouble += glm::length(glm::diskRand(2.0));
  247. }
  248. Error += ResultFloat < float(TestSamples) * 2.f ? 0 : 1;
  249. Error += ResultDouble < double(TestSamples) * 2.0 ? 0 : 1;
  250. assert(!Error);
  251. }
  252. return Error;
  253. }
  254. int test_ballRand()
  255. {
  256. int Error = 0;
  257. {
  258. float ResultFloat = 0.0f;
  259. double ResultDouble = 0.0f;
  260. for(std::size_t i = 0; i < TestSamples; ++i)
  261. {
  262. ResultFloat += glm::length(glm::ballRand(2.0f));
  263. ResultDouble += glm::length(glm::ballRand(2.0));
  264. }
  265. Error += ResultFloat < float(TestSamples) * 2.f ? 0 : 1;
  266. Error += ResultDouble < double(TestSamples) * 2.0 ? 0 : 1;
  267. assert(!Error);
  268. }
  269. return Error;
  270. }
  271. /*
  272. #if(GLM_LANG & GLM_LANG_CXX0X_FLAG)
  273. int test_grid()
  274. {
  275. int Error = 0;
  276. typedef std::array<int, 8> colors;
  277. typedef std::array<int, 8 * 8> grid;
  278. grid Grid;
  279. colors Colors;
  280. grid GridBest;
  281. colors ColorsBest;
  282. while(true)
  283. {
  284. for(std::size_t i = 0; i < Grid.size(); ++i)
  285. Grid[i] = int(glm::linearRand(0.0, 8.0 * 8.0 * 8.0 - 1.0) / 64.0);
  286. for(std::size_t i = 0; i < Grid.size(); ++i)
  287. ++Colors[Grid[i]];
  288. bool Exit = true;
  289. for(std::size_t i = 0; i < Colors.size(); ++i)
  290. {
  291. if(Colors[i] == 8)
  292. continue;
  293. Exit = false;
  294. break;
  295. }
  296. if(Exit == true)
  297. break;
  298. }
  299. return Error;
  300. }
  301. #endif
  302. */
  303. int main()
  304. {
  305. int Error = 0;
  306. Error += test_linearRand();
  307. Error += test_circularRand();
  308. Error += test_sphericalRand();
  309. Error += test_diskRand();
  310. Error += test_ballRand();
  311. /*
  312. #if(GLM_LANG & GLM_LANG_CXX0X_FLAG)
  313. Error += test_grid();
  314. #endif
  315. */
  316. return Error;
  317. }