unit-octree.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include <catch2/catch.hpp>
  2. #include <iostream>
  3. #include <thread>
  4. #include <mutex>
  5. #include <atomic>
  6. #include <shared_mutex>
  7. #include <condition_variable>
  8. #include <gul/math/Octree.h>
  9. #include <gul/math/frustum.h>
  10. #include <glm/matrix.hpp>
  11. #include <glm/gtc/matrix_transform.hpp>
  12. #include <gul/math/Transform.h>
  13. #include <random>
  14. SCENARIO("TEST")
  15. {
  16. gul::Octree<uint32_t> Node( {0,0,0}, std::pow(2.f,20.f));
  17. Node.insert( 3, {{10,10,10},{20,20,20}});
  18. size_t count=0;
  19. gul::bb3f BBB{{0,0,0}, {1,1,1}};
  20. Node.query<gul::bb3f>(BBB, [&](auto & node)
  21. {
  22. count++;
  23. (void)node;
  24. });
  25. REQUIRE( Node.size() == 1);
  26. REQUIRE(count==0);
  27. count=0;
  28. Node.query<gul::bb3f>(gul::bb3f{{0,0,0}, {50,50,50}}, [&](auto & node)
  29. {
  30. count++;
  31. (void)node;
  32. });
  33. REQUIRE(count==1);
  34. Node.erase(3);
  35. REQUIRE(Node.size()==0);
  36. count=0;
  37. Node.query<gul::bb3f>(gul::bb3f{{0,0,0}, {50,50,50}}, [&](auto & node)
  38. {
  39. count++;
  40. (void)node;
  41. });
  42. REQUIRE(count==0);
  43. }
  44. SCENARIO("TEST2")
  45. {
  46. gul::Octree<uint32_t> Node( {0,0,0}, std::pow(2.f,20.f));
  47. gul::bb3f objSize( glm::vec3{-0.5f}, glm::vec3{0.5f});
  48. std::random_device rd;
  49. std::mt19937 gen(rd());
  50. std::uniform_real_distribution<> dist(-500, 500);
  51. for(uint32_t i=0;i<10000;i++)
  52. {
  53. auto pos = objSize;
  54. pos.translate( {dist(gen), dist(gen),dist(gen)});
  55. Node.insert( i, pos);
  56. }
  57. REQUIRE(Node.size() == 10000);
  58. size_t count=0;
  59. Node.query<gul::bb3f>(gul::bb3f{{-600,-600,-600}, {600,600,600}}, [&](auto & node)
  60. {
  61. count++;
  62. (void)node;
  63. });
  64. REQUIRE( count == 10000);
  65. auto P = glm::perspective( glm::radians(90.0f), 4.0f/3.0f, 0.1f, 1000.f);
  66. gul::frustum F(P);
  67. count=0;
  68. Node.query<gul::frustum>(F, [&](auto & node)
  69. {
  70. count++;
  71. (void)node;
  72. });
  73. REQUIRE( count > 0);
  74. REQUIRE( count < 10000);
  75. }
  76. SCENARIO("TEST3")
  77. {
  78. gul::Octree<uint32_t> Node( {0,0,0}, std::pow(2.f,20.f));
  79. gul::bb3f objSize( glm::vec3{-0.5f}, glm::vec3{0.5f});
  80. glm::vec3 nodePos = glm::vec3(0, 0, -10);
  81. {
  82. auto pos = objSize;
  83. pos.translate( nodePos);
  84. Node.insert( 0, pos);
  85. }
  86. THEN("Frustum looking down the - z axis")
  87. {
  88. gul::Transform T;
  89. gul::frustum F(glm::perspective( glm::radians(90.0f), 4.0f/3.0f, 0.1f, 100.f));
  90. F.transform(T.getMatrix());
  91. size_t count=0;
  92. Node.query<gul::frustum>(F, [&](auto & node)
  93. {
  94. count++;
  95. (void)node;
  96. });
  97. REQUIRE( count == 1);
  98. }
  99. THEN("Frustum looking down the +z axis")
  100. {
  101. gul::frustum F(glm::perspective( glm::radians(90.0f), 4.0f/3.0f, 0.1f, 100.f));
  102. gul::Transform T = gul::Transform::R180y();
  103. F.transform(T.getMatrix());
  104. size_t count=0;
  105. Node.query<gul::frustum>(F, [&](auto & node)
  106. {
  107. count++;
  108. (void)node;
  109. });
  110. REQUIRE( count == 0);
  111. }
  112. THEN("Frustum looking down the +z axis")
  113. {
  114. gul::frustum F(glm::perspective( glm::radians(90.0f), 4.0f/3.0f, 0.1f, 100.f));
  115. gul::Transform T = gul::Transform::R180y();
  116. T.position = {0,0,-20};
  117. F.transform(T.getMatrix());
  118. size_t count=0;
  119. Node.query<gul::frustum>(F, [&](auto & node)
  120. {
  121. count++;
  122. (void)node;
  123. });
  124. REQUIRE( count == 1);
  125. }
  126. }