intersect_spec.lua 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. local intersect = require "modules.intersect"
  2. local vec3 = require "modules.vec3"
  3. local mat4 = require "modules.mat4"
  4. describe("intersect:", function()
  5. it("intersects a point with a triangle", function()
  6. local a = vec3()
  7. local b = vec3(0, 0, 5)
  8. local c = {
  9. vec3(-1, -1, 0),
  10. vec3( 1, -1, 0),
  11. vec3( 0.5, 1, 0)
  12. }
  13. assert.is_true(intersect.point_triangle(a, c))
  14. assert.is_not_true(intersect.point_triangle(b, c))
  15. end)
  16. it("intersects a point with an aabb", function()
  17. local a = vec3()
  18. local b = vec3(0, 0, 5)
  19. local c = {
  20. min = vec3(-1),
  21. max = vec3( 1)
  22. }
  23. assert.is_true(intersect.point_aabb(a, c))
  24. assert.is_not_true(intersect.point_aabb(b, c))
  25. end)
  26. it("intersects a point with a frustum", function()
  27. pending("TODO")
  28. end)
  29. it("intersects a ray with a triangle", function()
  30. local a = {
  31. position = vec3(0.5, 0.5, -1),
  32. direction = vec3(0, 0, 1)
  33. }
  34. local b = {
  35. position = vec3(0.5, 0.5, -1),
  36. direction = vec3(0, 0, -1)
  37. }
  38. local c = {
  39. vec3(-1, -1, 0),
  40. vec3( 1, -1, 0),
  41. vec3( 0.5, 1, 0)
  42. }
  43. assert.is_true(vec3.is_vec3(intersect.ray_triangle(a, c)))
  44. assert.is_not_true(intersect.ray_triangle(b, c))
  45. end)
  46. it("intersects a ray with a sphere", function()
  47. local a = {
  48. position = vec3(0, 0, -2),
  49. direction = vec3(0, 0, 1)
  50. }
  51. local b = {
  52. position = vec3(0, 0, -2),
  53. direction = vec3(0, 0, -1)
  54. }
  55. local c = {
  56. position = vec3(),
  57. radius = 1
  58. }
  59. local w, x = intersect.ray_sphere(a, c)
  60. local y, z = intersect.ray_sphere(b, c)
  61. assert.is_true(vec3.is_vec3(w))
  62. assert.is_not_true(y)
  63. end)
  64. it("intersects a ray with an aabb", function()
  65. local a = {
  66. position = vec3(0, 0, -2),
  67. direction = vec3(0, 0, 1)
  68. }
  69. local b = {
  70. position = vec3(0, 0, -2),
  71. direction = vec3(0, 0, -1)
  72. }
  73. local c = {
  74. min = vec3(-1),
  75. max = vec3( 1)
  76. }
  77. local w, x = intersect.ray_aabb(a, c)
  78. local y, z = intersect.ray_aabb(b, c)
  79. assert.is_true(vec3.is_vec3(w))
  80. assert.is_not_true(y)
  81. end)
  82. it("intersects a ray with a plane", function()
  83. local a = {
  84. position = vec3(0, 0, 1),
  85. direction = vec3(0, 0, -1)
  86. }
  87. local b = {
  88. position = vec3(0, 0, 1),
  89. direction = vec3(0, 0, 1)
  90. }
  91. local c = {
  92. position = vec3(),
  93. normal = vec3(0, 0, 1)
  94. }
  95. local w, x = intersect.ray_plane(a, c)
  96. local y, z = intersect.ray_plane(b, c)
  97. assert.is_true(vec3.is_vec3(w))
  98. assert.is_not_true(y)
  99. end)
  100. it("intersects a line with a line", function()
  101. local a = {
  102. vec3(0, 0, -1),
  103. vec3(0, 0, 1)
  104. }
  105. local b = {
  106. vec3(0, 0, -1),
  107. vec3(0, 1, -1)
  108. }
  109. local c = {
  110. vec3(-1, 0, 0),
  111. vec3( 1, 0, 0)
  112. }
  113. local w, x = intersect.line_line(a, c, 0.001)
  114. local y, z = intersect.line_line(b, c, 0.001)
  115. local u, v = intersect.line_line(b, c)
  116. assert.is_truthy(w)
  117. assert.is_not_truthy(y)
  118. assert.is_truthy(u)
  119. end)
  120. it("intersects a segment with a segment", function()
  121. local a = {
  122. vec3(0, 0, -1),
  123. vec3(0, 0, 1)
  124. }
  125. local b = {
  126. vec3(0, 0, -1),
  127. vec3(0, 1, -1)
  128. }
  129. local c = {
  130. vec3(-1, 0, 0),
  131. vec3( 1, 0, 0)
  132. }
  133. local w, x = intersect.segment_segment(a, c, 0.001)
  134. local y, z = intersect.segment_segment(b, c, 0.001)
  135. local u, v = intersect.segment_segment(b, c)
  136. assert.is_truthy(w)
  137. assert.is_not_truthy(y)
  138. assert.is_truthy(u)
  139. end)
  140. it("intersects an aabb with an aabb", function()
  141. local a = {
  142. min = vec3(-1),
  143. max = vec3( 1)
  144. }
  145. local b = {
  146. min = vec3(-5),
  147. max = vec3(-3)
  148. }
  149. local c = {
  150. min = vec3(),
  151. max = vec3(2)
  152. }
  153. assert.is_true(intersect.aabb_aabb(a, c))
  154. assert.is_not_true(intersect.aabb_aabb(b, c))
  155. end)
  156. it("intersects an aabb with an obb", function()
  157. local r = mat4():rotate(mat4(), math.pi / 4, vec3.unit_z)
  158. local a = {
  159. position = vec3(),
  160. extent = vec3(0.5)
  161. }
  162. local b = {
  163. position = vec3(),
  164. extent = vec3(0.5),
  165. rotation = r
  166. }
  167. local c = {
  168. position = vec3(0, 0, 2),
  169. extent = vec3(0.5),
  170. rotation = r
  171. }
  172. assert.is_true(vec3.is_vec3(intersect.aabb_obb(a, b)))
  173. assert.is_not_true(intersect.aabb_obb(a, c))
  174. end)
  175. it("intersects an aabb with a sphere", function()
  176. local a = {
  177. min = vec3(-1),
  178. max = vec3( 1)
  179. }
  180. local b = {
  181. min = vec3(-5),
  182. max = vec3(-3)
  183. }
  184. local c = {
  185. position = vec3(0, 0, 3),
  186. radius = 3
  187. }
  188. assert.is_true(intersect.aabb_sphere(a, c))
  189. assert.is_not_true(intersect.aabb_sphere(b, c))
  190. end)
  191. it("intersects an aabb with a frustum", function()
  192. pending("TODO")
  193. end)
  194. it("encapsulates an aabb", function()
  195. local a = {
  196. min = vec3(-1),
  197. max = vec3( 1)
  198. }
  199. local b = {
  200. min = vec3(-1.5),
  201. max = vec3( 1.5)
  202. }
  203. local c = {
  204. min = vec3(-0.5),
  205. max = vec3( 0.5)
  206. }
  207. local d = {
  208. min = vec3(-1),
  209. max = vec3( 1)
  210. }
  211. assert.is_true(intersect.encapsulate_aabb(a, d))
  212. assert.is_true(intersect.encapsulate_aabb(b, d))
  213. assert.is_not_true(intersect.encapsulate_aabb(c, d))
  214. end)
  215. it("intersects a circle with a circle", function()
  216. local a = {
  217. position = vec3(0, 0, 6),
  218. radius = 3
  219. }
  220. local b = {
  221. position = vec3(0, 0, 7),
  222. radius = 3
  223. }
  224. local c = {
  225. position = vec3(),
  226. radius = 3
  227. }
  228. assert.is_true(intersect.circle_circle(a, c))
  229. assert.is_not_true(intersect.circle_circle(b, c))
  230. end)
  231. it("intersects a sphere with a sphere", function()
  232. local a = {
  233. position = vec3(0, 0, 6),
  234. radius = 3
  235. }
  236. local b = {
  237. position = vec3(0, 0, 7),
  238. radius = 3
  239. }
  240. local c = {
  241. position = vec3(),
  242. radius = 3
  243. }
  244. assert.is_true(intersect.sphere_sphere(a, c))
  245. assert.is_not_true(intersect.sphere_sphere(b, c))
  246. end)
  247. it("intersects a sphere with a frustum", function()
  248. pending("TODO")
  249. end)
  250. it("intersects a capsule with another capsule", function()
  251. pending("TODO")
  252. end)
  253. end)