@math.gl/geometry 5.0.0-alpha.2 → 5.0.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/LICENSE +97 -49
  2. package/README.md +16 -1
  3. package/THIRD-PARTY-NOTICES.md +18 -0
  4. package/dist/culling/constants.d.ts +3 -0
  5. package/dist/culling/constants.d.ts.map +1 -0
  6. package/dist/culling/constants.js +5 -0
  7. package/dist/culling/constants.js.map +1 -0
  8. package/dist/culling/index.cjs +2014 -0
  9. package/dist/culling/index.cjs.map +6 -0
  10. package/dist/culling/index.d.ts +29 -0
  11. package/dist/culling/index.d.ts.map +1 -0
  12. package/dist/culling/index.js +23 -0
  13. package/dist/culling/index.js.map +1 -0
  14. package/dist/culling/lib/algorithms/bounding-box-from-points.d.ts +15 -0
  15. package/dist/culling/lib/algorithms/bounding-box-from-points.d.ts.map +1 -0
  16. package/dist/culling/lib/algorithms/bounding-box-from-points.js +137 -0
  17. package/dist/culling/lib/algorithms/bounding-box-from-points.js.map +1 -0
  18. package/dist/culling/lib/algorithms/bounding-sphere-from-points.d.ts +14 -0
  19. package/dist/culling/lib/algorithms/bounding-sphere-from-points.d.ts.map +1 -0
  20. package/dist/culling/lib/algorithms/bounding-sphere-from-points.js +146 -0
  21. package/dist/culling/lib/algorithms/bounding-sphere-from-points.js.map +1 -0
  22. package/dist/culling/lib/algorithms/compute-eigen-decomposition.d.ts +37 -0
  23. package/dist/culling/lib/algorithms/compute-eigen-decomposition.d.ts.map +1 -0
  24. package/dist/culling/lib/algorithms/compute-eigen-decomposition.js +137 -0
  25. package/dist/culling/lib/algorithms/compute-eigen-decomposition.js.map +1 -0
  26. package/dist/culling/lib/algorithms/oriented-bounding-box-quaternion.d.ts +7 -0
  27. package/dist/culling/lib/algorithms/oriented-bounding-box-quaternion.d.ts.map +1 -0
  28. package/dist/culling/lib/algorithms/oriented-bounding-box-quaternion.js +26 -0
  29. package/dist/culling/lib/algorithms/oriented-bounding-box-quaternion.js.map +1 -0
  30. package/dist/culling/lib/bounding-volumes/axis-aligned-bounding-box.d.ts +56 -0
  31. package/dist/culling/lib/bounding-volumes/axis-aligned-bounding-box.d.ts.map +1 -0
  32. package/dist/culling/lib/bounding-volumes/axis-aligned-bounding-box.js +116 -0
  33. package/dist/culling/lib/bounding-volumes/axis-aligned-bounding-box.js.map +1 -0
  34. package/dist/culling/lib/bounding-volumes/bounding-sphere.d.ts +40 -0
  35. package/dist/culling/lib/bounding-volumes/bounding-sphere.d.ts.map +1 -0
  36. package/dist/culling/lib/bounding-volumes/bounding-sphere.js +123 -0
  37. package/dist/culling/lib/bounding-volumes/bounding-sphere.js.map +1 -0
  38. package/dist/culling/lib/bounding-volumes/bounding-volume.d.ts +30 -0
  39. package/dist/culling/lib/bounding-volumes/bounding-volume.d.ts.map +1 -0
  40. package/dist/culling/lib/bounding-volumes/bounding-volume.js +7 -0
  41. package/dist/culling/lib/bounding-volumes/bounding-volume.js.map +1 -0
  42. package/dist/culling/lib/bounding-volumes/oriented-bounding-box.d.ts +62 -0
  43. package/dist/culling/lib/bounding-volumes/oriented-bounding-box.d.ts.map +1 -0
  44. package/dist/culling/lib/bounding-volumes/oriented-bounding-box.js +230 -0
  45. package/dist/culling/lib/bounding-volumes/oriented-bounding-box.js.map +1 -0
  46. package/dist/culling/lib/culling-volume.d.ts +46 -0
  47. package/dist/culling/lib/culling-volume.d.ts.map +1 -0
  48. package/dist/culling/lib/culling-volume.js +126 -0
  49. package/dist/culling/lib/culling-volume.js.map +1 -0
  50. package/dist/culling/lib/perspective-frustum.d.ts +153 -0
  51. package/dist/culling/lib/perspective-frustum.d.ts.map +1 -0
  52. package/dist/culling/lib/perspective-frustum.js +191 -0
  53. package/dist/culling/lib/perspective-frustum.js.map +1 -0
  54. package/dist/culling/lib/perspective-off-center-frustum.d.ts +158 -0
  55. package/dist/culling/lib/perspective-off-center-frustum.d.ts.map +1 -0
  56. package/dist/culling/lib/perspective-off-center-frustum.js +276 -0
  57. package/dist/culling/lib/perspective-off-center-frustum.js.map +1 -0
  58. package/dist/culling/lib/plane.d.ts +35 -0
  59. package/dist/culling/lib/plane.d.ts.map +1 -0
  60. package/dist/culling/lib/plane.js +90 -0
  61. package/dist/culling/lib/plane.js.map +1 -0
  62. package/dist/culling/lib/ray.d.ts +13 -0
  63. package/dist/culling/lib/ray.d.ts.map +1 -0
  64. package/dist/culling/lib/ray.js +30 -0
  65. package/dist/culling/lib/ray.js.map +1 -0
  66. package/dist/culling/lib/shapes/box-shape.d.ts +19 -0
  67. package/dist/culling/lib/shapes/box-shape.d.ts.map +1 -0
  68. package/dist/culling/lib/shapes/box-shape.js +69 -0
  69. package/dist/culling/lib/shapes/box-shape.js.map +1 -0
  70. package/dist/culling/lib/shapes/capsule-shape.d.ts +23 -0
  71. package/dist/culling/lib/shapes/capsule-shape.d.ts.map +1 -0
  72. package/dist/culling/lib/shapes/capsule-shape.js +151 -0
  73. package/dist/culling/lib/shapes/capsule-shape.js.map +1 -0
  74. package/dist/culling/lib/shapes/cylinder-shape.d.ts +22 -0
  75. package/dist/culling/lib/shapes/cylinder-shape.d.ts.map +1 -0
  76. package/dist/culling/lib/shapes/cylinder-shape.js +99 -0
  77. package/dist/culling/lib/shapes/cylinder-shape.js.map +1 -0
  78. package/dist/culling/lib/shapes/implicit-shape.d.ts +56 -0
  79. package/dist/culling/lib/shapes/implicit-shape.d.ts.map +1 -0
  80. package/dist/culling/lib/shapes/implicit-shape.js +142 -0
  81. package/dist/culling/lib/shapes/implicit-shape.js.map +1 -0
  82. package/dist/culling/lib/shapes/plane-shape.d.ts +27 -0
  83. package/dist/culling/lib/shapes/plane-shape.d.ts.map +1 -0
  84. package/dist/culling/lib/shapes/plane-shape.js +71 -0
  85. package/dist/culling/lib/shapes/plane-shape.js.map +1 -0
  86. package/dist/culling/lib/shapes/sphere-shape.d.ts +18 -0
  87. package/dist/culling/lib/shapes/sphere-shape.d.ts.map +1 -0
  88. package/dist/culling/lib/shapes/sphere-shape.js +43 -0
  89. package/dist/culling/lib/shapes/sphere-shape.js.map +1 -0
  90. package/dist/culling/oriented-box-2d.cjs +73 -0
  91. package/dist/culling/oriented-box-2d.cjs.map +6 -0
  92. package/dist/culling/oriented-box-2d.d.ts +22 -0
  93. package/dist/culling/oriented-box-2d.d.ts.map +1 -0
  94. package/dist/culling/oriented-box-2d.js +86 -0
  95. package/dist/culling/oriented-box-2d.js.map +1 -0
  96. package/dist/culling/queries.cjs +161 -0
  97. package/dist/culling/queries.cjs.map +6 -0
  98. package/dist/culling/queries.d.ts +20 -0
  99. package/dist/culling/queries.d.ts.map +1 -0
  100. package/dist/culling/queries.js +139 -0
  101. package/dist/culling/queries.js.map +1 -0
  102. package/dist/curves/bezier-curves.d.ts +18 -0
  103. package/dist/curves/bezier-curves.d.ts.map +1 -0
  104. package/dist/curves/bezier-curves.js +54 -0
  105. package/dist/curves/bezier-curves.js.map +1 -0
  106. package/dist/curves/catmull-rom-curve.d.ts +15 -0
  107. package/dist/curves/catmull-rom-curve.d.ts.map +1 -0
  108. package/dist/curves/catmull-rom-curve.js +77 -0
  109. package/dist/curves/catmull-rom-curve.js.map +1 -0
  110. package/dist/curves/curve-arc-length.d.ts +17 -0
  111. package/dist/curves/curve-arc-length.d.ts.map +1 -0
  112. package/dist/curves/curve-arc-length.js +58 -0
  113. package/dist/curves/curve-arc-length.js.map +1 -0
  114. package/dist/curves/curve.d.ts +23 -0
  115. package/dist/curves/curve.d.ts.map +1 -0
  116. package/dist/curves/curve.js +77 -0
  117. package/dist/curves/curve.js.map +1 -0
  118. package/dist/curves/hermite-curve.d.ts +9 -0
  119. package/dist/curves/hermite-curve.d.ts.map +1 -0
  120. package/dist/curves/hermite-curve.js +24 -0
  121. package/dist/curves/hermite-curve.js.map +1 -0
  122. package/dist/curves/index.cjs +293 -0
  123. package/dist/curves/index.cjs.map +6 -0
  124. package/dist/curves/index.d.ts +8 -0
  125. package/dist/curves/index.d.ts.map +1 -0
  126. package/dist/curves/index.js +9 -0
  127. package/dist/curves/index.js.map +1 -0
  128. package/dist/geometries/box-geometry.js +1 -1
  129. package/dist/geometries/box-geometry.js.map +1 -1
  130. package/dist/geometries/capsule-geometry.js +1 -1
  131. package/dist/geometries/capsule-geometry.js.map +1 -1
  132. package/dist/geometries/cylinder-geometry.js +1 -1
  133. package/dist/geometries/cylinder-geometry.js.map +1 -1
  134. package/dist/geometries/geometry-helpers.js +1 -1
  135. package/dist/geometries/geometry-helpers.js.map +1 -1
  136. package/dist/geometries/ico-sphere-geometry.js +1 -1
  137. package/dist/geometries/ico-sphere-geometry.js.map +1 -1
  138. package/dist/geometries/plane-geometry.js +1 -1
  139. package/dist/geometries/plane-geometry.js.map +1 -1
  140. package/dist/geometries/primitive-mesh-builder.d.ts +24 -0
  141. package/dist/geometries/primitive-mesh-builder.d.ts.map +1 -0
  142. package/dist/geometries/primitive-mesh-builder.js +74 -0
  143. package/dist/geometries/primitive-mesh-builder.js.map +1 -0
  144. package/dist/geometries/prism-geometry.d.ts +13 -0
  145. package/dist/geometries/prism-geometry.d.ts.map +1 -0
  146. package/dist/geometries/prism-geometry.js +34 -0
  147. package/dist/geometries/prism-geometry.js.map +1 -0
  148. package/dist/geometries/ring-geometry.d.ts +15 -0
  149. package/dist/geometries/ring-geometry.d.ts.map +1 -0
  150. package/dist/geometries/ring-geometry.js +64 -0
  151. package/dist/geometries/ring-geometry.js.map +1 -0
  152. package/dist/geometries/sphere-geometry.js +1 -1
  153. package/dist/geometries/sphere-geometry.js.map +1 -1
  154. package/dist/geometries/surface-of-revolution.js +1 -1
  155. package/dist/geometries/surface-of-revolution.js.map +1 -1
  156. package/dist/geometries/truncated-cone-geometry.js +1 -1
  157. package/dist/geometries/truncated-cone-geometry.js.map +1 -1
  158. package/dist/index.cjs +290 -9
  159. package/dist/index.cjs.map +3 -3
  160. package/dist/index.d.ts +6 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +4 -1
  163. package/dist/index.js.map +1 -1
  164. package/dist/lib/geometry-utils.js +1 -1
  165. package/dist/lib/geometry-utils.js.map +1 -1
  166. package/dist/lib/geometry.d.ts +1 -1
  167. package/dist/lib/geometry.d.ts.map +1 -1
  168. package/dist/lib/geometry.js +1 -1
  169. package/dist/lib/geometry.js.map +1 -1
  170. package/dist/lib/hinge-tree.d.ts +33 -0
  171. package/dist/lib/hinge-tree.d.ts.map +1 -0
  172. package/dist/lib/hinge-tree.js +144 -0
  173. package/dist/lib/hinge-tree.js.map +1 -0
  174. package/dist/parametric/lathe-geometry.d.ts +14 -0
  175. package/dist/parametric/lathe-geometry.d.ts.map +1 -0
  176. package/dist/parametric/lathe-geometry.js +48 -0
  177. package/dist/parametric/lathe-geometry.js.map +1 -0
  178. package/dist/parametric/parametric-geometry.d.ts +20 -0
  179. package/dist/parametric/parametric-geometry.d.ts.map +1 -0
  180. package/dist/parametric/parametric-geometry.js +88 -0
  181. package/dist/parametric/parametric-geometry.js.map +1 -0
  182. package/dist/parametric/torus-geometry.d.ts +19 -0
  183. package/dist/parametric/torus-geometry.d.ts.map +1 -0
  184. package/dist/parametric/torus-geometry.js +89 -0
  185. package/dist/parametric/torus-geometry.js.map +1 -0
  186. package/dist/parametric.cjs +328 -0
  187. package/dist/parametric.cjs.map +6 -0
  188. package/dist/parametric.d.ts +7 -0
  189. package/dist/parametric.d.ts.map +1 -0
  190. package/dist/parametric.js +7 -0
  191. package/dist/parametric.js.map +1 -0
  192. package/dist/polygon/cut-by-grid.d.ts +24 -0
  193. package/dist/polygon/cut-by-grid.d.ts.map +1 -0
  194. package/dist/polygon/cut-by-grid.js +221 -0
  195. package/dist/polygon/cut-by-grid.js.map +1 -0
  196. package/dist/polygon/cut-by-mercator-bounds.d.ts +17 -0
  197. package/dist/polygon/cut-by-mercator-bounds.d.ts.map +1 -0
  198. package/dist/polygon/cut-by-mercator-bounds.js +149 -0
  199. package/dist/polygon/cut-by-mercator-bounds.js.map +1 -0
  200. package/dist/polygon/earcut.d.ts +13 -0
  201. package/dist/polygon/earcut.d.ts.map +1 -0
  202. package/dist/polygon/earcut.js +627 -0
  203. package/dist/polygon/earcut.js.map +1 -0
  204. package/dist/polygon/index.cjs +1437 -0
  205. package/dist/polygon/index.cjs.map +6 -0
  206. package/dist/polygon/index.d.ts +12 -0
  207. package/dist/polygon/index.d.ts.map +1 -0
  208. package/dist/polygon/index.js +12 -0
  209. package/dist/polygon/index.js.map +1 -0
  210. package/dist/polygon/lineclip.d.ts +31 -0
  211. package/dist/polygon/lineclip.d.ts.map +1 -0
  212. package/dist/polygon/lineclip.js +184 -0
  213. package/dist/polygon/lineclip.js.map +1 -0
  214. package/dist/polygon/polygon-utils.d.ts +103 -0
  215. package/dist/polygon/polygon-utils.d.ts.map +1 -0
  216. package/dist/polygon/polygon-utils.js +155 -0
  217. package/dist/polygon/polygon-utils.js.map +1 -0
  218. package/dist/polygon/polygon.d.ts +41 -0
  219. package/dist/polygon/polygon.d.ts.map +1 -0
  220. package/dist/polygon/polygon.js +76 -0
  221. package/dist/polygon/polygon.js.map +1 -0
  222. package/dist/polygon/subdivide-polyline.d.ts +56 -0
  223. package/dist/polygon/subdivide-polyline.d.ts.map +1 -0
  224. package/dist/polygon/subdivide-polyline.js +141 -0
  225. package/dist/polygon/subdivide-polyline.js.map +1 -0
  226. package/dist/polygon/subdivide-triangle-mesh.d.ts +68 -0
  227. package/dist/polygon/subdivide-triangle-mesh.d.ts.map +1 -0
  228. package/dist/polygon/subdivide-triangle-mesh.js +228 -0
  229. package/dist/polygon/subdivide-triangle-mesh.js.map +1 -0
  230. package/dist/polygon/utils.d.ts +5 -0
  231. package/dist/polygon/utils.d.ts.map +1 -0
  232. package/dist/polygon/utils.js +38 -0
  233. package/dist/polygon/utils.js.map +1 -0
  234. package/dist/spatial-index/box-index.cjs +328 -0
  235. package/dist/spatial-index/box-index.cjs.map +6 -0
  236. package/dist/spatial-index/box-index.d.ts +65 -0
  237. package/dist/spatial-index/box-index.d.ts.map +1 -0
  238. package/dist/spatial-index/box-index.js +263 -0
  239. package/dist/spatial-index/box-index.js.map +1 -0
  240. package/dist/spatial-index/index.cjs +494 -0
  241. package/dist/spatial-index/index.cjs.map +6 -0
  242. package/dist/spatial-index/index.d.ts +5 -0
  243. package/dist/spatial-index/index.d.ts.map +1 -0
  244. package/dist/spatial-index/index.js +6 -0
  245. package/dist/spatial-index/index.js.map +1 -0
  246. package/dist/spatial-index/triangle-bvh.d.ts +53 -0
  247. package/dist/spatial-index/triangle-bvh.d.ts.map +1 -0
  248. package/dist/spatial-index/triangle-bvh.js +102 -0
  249. package/dist/spatial-index/triangle-bvh.js.map +1 -0
  250. package/dist/utils/attribute-compression.d.ts +50 -0
  251. package/dist/utils/attribute-compression.d.ts.map +1 -0
  252. package/dist/utils/attribute-compression.js +186 -0
  253. package/dist/utils/attribute-compression.js.map +1 -0
  254. package/dist/utils/attribute-iterator.d.ts +8 -0
  255. package/dist/utils/attribute-iterator.d.ts.map +1 -0
  256. package/dist/utils/attribute-iterator.js +25 -0
  257. package/dist/utils/attribute-iterator.js.map +1 -0
  258. package/dist/utils/compute-vertex-normals.d.ts +4 -0
  259. package/dist/utils/compute-vertex-normals.d.ts.map +1 -0
  260. package/dist/utils/compute-vertex-normals.js +54 -0
  261. package/dist/utils/compute-vertex-normals.js.map +1 -0
  262. package/dist/utils/constants.d.ts +52 -0
  263. package/dist/utils/constants.d.ts.map +1 -0
  264. package/dist/utils/constants.js +39 -0
  265. package/dist/utils/constants.js.map +1 -0
  266. package/dist/utils/coordinates.d.ts +3 -0
  267. package/dist/utils/coordinates.d.ts.map +1 -0
  268. package/dist/utils/coordinates.js +8 -0
  269. package/dist/utils/coordinates.js.map +1 -0
  270. package/dist/utils/geometry.d.ts +20 -0
  271. package/dist/utils/geometry.d.ts.map +1 -0
  272. package/dist/utils/geometry.js +31 -0
  273. package/dist/utils/geometry.js.map +1 -0
  274. package/dist/utils/gl-type.d.ts +17 -0
  275. package/dist/utils/gl-type.d.ts.map +1 -0
  276. package/dist/utils/gl-type.js +69 -0
  277. package/dist/utils/gl-type.js.map +1 -0
  278. package/dist/utils/index.cjs +965 -0
  279. package/dist/utils/index.cjs.map +6 -0
  280. package/dist/utils/index.d.ts +18 -0
  281. package/dist/utils/index.d.ts.map +1 -0
  282. package/dist/utils/index.js +16 -0
  283. package/dist/utils/index.js.map +1 -0
  284. package/dist/utils/interpolate-packed-attributes.cjs +176 -0
  285. package/dist/utils/interpolate-packed-attributes.cjs.map +6 -0
  286. package/dist/utils/interpolate-packed-attributes.d.ts +43 -0
  287. package/dist/utils/interpolate-packed-attributes.d.ts.map +1 -0
  288. package/dist/utils/interpolate-packed-attributes.js +192 -0
  289. package/dist/utils/interpolate-packed-attributes.js.map +1 -0
  290. package/dist/utils/mesh-processing.d.ts +18 -0
  291. package/dist/utils/mesh-processing.d.ts.map +1 -0
  292. package/dist/utils/mesh-processing.js +300 -0
  293. package/dist/utils/mesh-processing.js.map +1 -0
  294. package/dist/utils/primitive-iterator.d.ts +21 -0
  295. package/dist/utils/primitive-iterator.d.ts.map +1 -0
  296. package/dist/utils/primitive-iterator.js +117 -0
  297. package/dist/utils/primitive-iterator.js.map +1 -0
  298. package/dist/utils/rgb565.d.ts +5 -0
  299. package/dist/utils/rgb565.d.ts.map +1 -0
  300. package/dist/utils/rgb565.js +24 -0
  301. package/dist/utils/rgb565.js.map +1 -0
  302. package/dist/utils/typed-array-utils.d.ts +3 -0
  303. package/dist/utils/typed-array-utils.d.ts.map +1 -0
  304. package/dist/utils/typed-array-utils.js +16 -0
  305. package/dist/utils/typed-array-utils.js.map +1 -0
  306. package/package.json +57 -4
  307. package/src/culling/constants.ts +6 -0
  308. package/src/culling/index.ts +45 -0
  309. package/src/culling/lib/algorithms/bounding-box-from-points.ts +174 -0
  310. package/src/culling/lib/algorithms/bounding-sphere-from-points.ts +175 -0
  311. package/src/culling/lib/algorithms/compute-eigen-decomposition.ts +171 -0
  312. package/src/culling/lib/algorithms/oriented-bounding-box-quaternion.ts +32 -0
  313. package/src/culling/lib/bounding-volumes/axis-aligned-bounding-box.ts +153 -0
  314. package/src/culling/lib/bounding-volumes/bounding-sphere.ts +154 -0
  315. package/src/culling/lib/bounding-volumes/bounding-volume.ts +38 -0
  316. package/src/culling/lib/bounding-volumes/oriented-bounding-box.ts +320 -0
  317. package/src/culling/lib/culling-volume.ts +163 -0
  318. package/src/culling/lib/perspective-frustum.ts +288 -0
  319. package/src/culling/lib/perspective-off-center-frustum.ts +381 -0
  320. package/src/culling/lib/plane.ts +118 -0
  321. package/src/culling/lib/ray.ts +33 -0
  322. package/src/culling/lib/shapes/box-shape.ts +78 -0
  323. package/src/culling/lib/shapes/capsule-shape.ts +232 -0
  324. package/src/culling/lib/shapes/cylinder-shape.ts +133 -0
  325. package/src/culling/lib/shapes/implicit-shape.ts +209 -0
  326. package/src/culling/lib/shapes/plane-shape.ts +78 -0
  327. package/src/culling/lib/shapes/sphere-shape.ts +60 -0
  328. package/src/culling/oriented-box-2d.ts +165 -0
  329. package/src/culling/queries.ts +155 -0
  330. package/src/curves/bezier-curves.ts +62 -0
  331. package/src/curves/catmull-rom-curve.ts +89 -0
  332. package/src/curves/curve-arc-length.ts +70 -0
  333. package/src/curves/curve.ts +96 -0
  334. package/src/curves/hermite-curve.ts +34 -0
  335. package/src/curves/index.ts +15 -0
  336. package/src/geometries/box-geometry.ts +1 -1
  337. package/src/geometries/capsule-geometry.ts +1 -1
  338. package/src/geometries/cylinder-geometry.ts +1 -1
  339. package/src/geometries/geometry-helpers.ts +1 -1
  340. package/src/geometries/ico-sphere-geometry.ts +1 -1
  341. package/src/geometries/plane-geometry.ts +1 -1
  342. package/src/geometries/primitive-mesh-builder.ts +84 -0
  343. package/src/geometries/prism-geometry.ts +57 -0
  344. package/src/geometries/ring-geometry.ts +102 -0
  345. package/src/geometries/sphere-geometry.ts +1 -1
  346. package/src/geometries/surface-of-revolution.ts +1 -1
  347. package/src/geometries/truncated-cone-geometry.ts +1 -1
  348. package/src/index.ts +10 -1
  349. package/src/lib/geometry-utils.ts +2 -2
  350. package/src/lib/geometry.ts +2 -2
  351. package/src/lib/hinge-tree.ts +170 -0
  352. package/src/parametric/lathe-geometry.ts +70 -0
  353. package/src/parametric/parametric-geometry.ts +118 -0
  354. package/src/parametric/torus-geometry.ts +118 -0
  355. package/src/parametric.ts +9 -0
  356. package/src/polygon/cut-by-grid.ts +313 -0
  357. package/src/polygon/cut-by-mercator-bounds.ts +204 -0
  358. package/src/polygon/earcut.ts +798 -0
  359. package/src/polygon/index.ts +35 -0
  360. package/src/polygon/lineclip.ts +218 -0
  361. package/src/polygon/polygon-utils.ts +273 -0
  362. package/src/polygon/polygon.ts +105 -0
  363. package/src/polygon/subdivide-polyline.ts +223 -0
  364. package/src/polygon/subdivide-triangle-mesh.ts +322 -0
  365. package/src/polygon/utils.ts +50 -0
  366. package/src/spatial-index/box-index.ts +343 -0
  367. package/src/spatial-index/index.ts +18 -0
  368. package/src/spatial-index/triangle-bvh.ts +162 -0
  369. package/src/utils/attribute-compression.ts +234 -0
  370. package/src/utils/attribute-iterator.ts +28 -0
  371. package/src/utils/compute-vertex-normals.ts +63 -0
  372. package/src/utils/constants.ts +42 -0
  373. package/src/utils/coordinates.ts +8 -0
  374. package/src/utils/geometry.ts +49 -0
  375. package/src/utils/gl-type.ts +87 -0
  376. package/src/utils/index.ts +55 -0
  377. package/src/utils/interpolate-packed-attributes.ts +284 -0
  378. package/src/utils/mesh-processing.ts +377 -0
  379. package/src/utils/primitive-iterator.ts +145 -0
  380. package/src/utils/rgb565.ts +26 -0
  381. package/src/utils/typed-array-utils.ts +16 -0
@@ -0,0 +1,381 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT AND Apache-2.0
3
+ // SPDX-FileCopyrightText: Copyright 2011-2018 CesiumJS Contributors
4
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
5
+ // SPDX-FileComment: Derived from Cesium. See the repository LICENSE for upstream attribution and Apache-2.0 terms.
6
+
7
+ // This file is derived from the Cesium math library under Apache 2 license
8
+ // See ../../../LICENSE for the retained Cesium notice and Apache-2.0 terms.
9
+
10
+ // Note: This class is still an experimental export, mainly used by other test cases
11
+ // - It has not been fully adapted to math.gl conventions
12
+ // - Documentation has not been ported
13
+
14
+ import {Vector3, Vector2, Matrix4, assert, NumericArray} from '@math.gl/core';
15
+ import {CullingVolume} from './culling-volume';
16
+ import {Plane} from './plane';
17
+
18
+ const scratchPlaneUpVector = new Vector3();
19
+ const scratchPlaneRightVector = new Vector3();
20
+ const scratchPlaneNearCenter = new Vector3();
21
+ const scratchPlaneFarCenter = new Vector3();
22
+ const scratchPlaneNormal = new Vector3();
23
+
24
+ type PerspectiveOffCenterFrustumOptions = {
25
+ left?: number;
26
+ right?: number;
27
+ top?: number;
28
+ bottom?: number;
29
+ near?: number;
30
+ far?: number;
31
+ };
32
+
33
+ export class PerspectiveOffCenterFrustum {
34
+ /**
35
+ * Defines the left clipping plane.
36
+ * @type {Number}
37
+ * @default undefined
38
+ */
39
+ left?: number;
40
+ private _left?: number;
41
+ /**
42
+ * Defines the right clipping plane.
43
+ * @type {Number}
44
+ * @default undefined
45
+ */
46
+ right?: number;
47
+ private _right?: number;
48
+ /**
49
+ * Defines the top clipping plane.
50
+ * @type {Number}
51
+ * @default undefined
52
+ */
53
+ top?: number;
54
+ private _top?: number;
55
+ /**
56
+ * Defines the bottom clipping plane.
57
+ * @type {Number}
58
+ * @default undefined
59
+ */
60
+ bottom?: number;
61
+ private _bottom?: number;
62
+ /**
63
+ * The distance of the near plane.
64
+ * @type {Number}
65
+ * @default 1.0
66
+ */
67
+ near: number;
68
+ private _near: number;
69
+ /**
70
+ * The distance of the far plane.
71
+ * @type {Number}
72
+ * @default 500000000.0
73
+ */
74
+ far: number;
75
+ private _far: number;
76
+
77
+ private _cullingVolume = new CullingVolume([
78
+ new Plane(),
79
+ new Plane(),
80
+ new Plane(),
81
+ new Plane(),
82
+ new Plane(),
83
+ new Plane()
84
+ ]);
85
+ private _perspectiveMatrix = new Matrix4();
86
+ private _infinitePerspective = new Matrix4();
87
+
88
+ /**
89
+ * The viewing frustum is defined by 6 planes.
90
+ * Each plane is represented by a {@link Vector4} object, where the x, y, and z components
91
+ * define the unit vector normal to the plane, and the w component is the distance of the
92
+ * plane from the origin/camera position.
93
+ *
94
+ * @alias PerspectiveOffCenterFrustum
95
+ *
96
+ * @example
97
+ * const frustum = new PerspectiveOffCenterFrustum({
98
+ * left : -1.0,
99
+ * right : 1.0,
100
+ * top : 1.0,
101
+ * bottom : -1.0,
102
+ * near : 1.0,
103
+ * far : 100.0
104
+ * });
105
+ *
106
+ * @see PerspectiveFrustum
107
+ */
108
+ constructor(options: PerspectiveOffCenterFrustumOptions = {}) {
109
+ const {near = 1.0, far = 500000000.0} = options;
110
+
111
+ this.left = options.left;
112
+ this._left = undefined;
113
+
114
+ this.right = options.right;
115
+ this._right = undefined;
116
+
117
+ this.top = options.top;
118
+ this._top = undefined;
119
+
120
+ this.bottom = options.bottom;
121
+ this._bottom = undefined;
122
+
123
+ this.near = near;
124
+ this._near = near;
125
+
126
+ this.far = far;
127
+ this._far = far;
128
+ }
129
+
130
+ /**
131
+ * Returns a duplicate of a PerspectiveOffCenterFrustum instance.
132
+ * @returns {PerspectiveOffCenterFrustum} A new PerspectiveFrustum instance.
133
+ * */
134
+ clone(): PerspectiveOffCenterFrustum {
135
+ return new PerspectiveOffCenterFrustum({
136
+ right: this.right,
137
+ left: this.left,
138
+ top: this.top,
139
+ bottom: this.bottom,
140
+ near: this.near,
141
+ far: this.far
142
+ });
143
+ }
144
+
145
+ /**
146
+ * Compares the provided PerspectiveOffCenterFrustum componentwise and returns
147
+ * <code>true</code> if they are equal, <code>false</code> otherwise.
148
+ *
149
+ * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
150
+ */
151
+ equals(other: PerspectiveOffCenterFrustum): boolean {
152
+ return (
153
+ other &&
154
+ other instanceof PerspectiveOffCenterFrustum &&
155
+ this.right === other.right &&
156
+ this.left === other.left &&
157
+ this.top === other.top &&
158
+ this.bottom === other.bottom &&
159
+ this.near === other.near &&
160
+ this.far === other.far
161
+ );
162
+ }
163
+
164
+ /**
165
+ * Gets the perspective projection matrix computed from the view frustum.
166
+ * @memberof PerspectiveOffCenterFrustum.prototype
167
+ * @type {Matrix4}
168
+ *
169
+ * @see PerspectiveOffCenterFrustum#infiniteProjectionMatrix
170
+ */
171
+ get projectionMatrix(): Matrix4 {
172
+ this._update();
173
+ return this._perspectiveMatrix;
174
+ }
175
+
176
+ /**
177
+ * Gets the perspective projection matrix computed from the view frustum with an infinite far plane.
178
+ * @memberof PerspectiveOffCenterFrustum.prototype
179
+ * @type {Matrix4}
180
+ *
181
+ * @see PerspectiveOffCenterFrustum#projectionMatrix
182
+ */
183
+ get infiniteProjectionMatrix(): Matrix4 {
184
+ this._update();
185
+ return this._infinitePerspective;
186
+ }
187
+
188
+ /**
189
+ * Creates a culling volume for this frustum.
190
+ * @returns {CullingVolume} A culling volume at the given position and orientation.
191
+ *
192
+ * @example
193
+ * // Check if a bounding volume intersects the frustum.
194
+ * const cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp);
195
+ * const intersect = cullingVolume.computeVisibility(boundingVolume);
196
+ */
197
+ // eslint-disable-next-line complexity, max-statements
198
+ computeCullingVolume(
199
+ /** A Vector3 defines the eye position. */
200
+ position: Readonly<NumericArray>,
201
+ /** A Vector3 defines the view direction. */
202
+ direction: Readonly<NumericArray>,
203
+ /** A Vector3 defines the up direction. */
204
+ up: Readonly<NumericArray>
205
+ ): CullingVolume {
206
+ assert(position, 'position is required.');
207
+ assert(direction, 'direction is required.');
208
+ assert(up, 'up is required.');
209
+
210
+ const planes = this._cullingVolume.planes;
211
+
212
+ up = scratchPlaneUpVector.copy(up).normalize();
213
+ const right = scratchPlaneRightVector.copy(direction).cross(up).normalize();
214
+
215
+ const nearCenter = scratchPlaneNearCenter
216
+ .copy(direction)
217
+ .multiplyByScalar(this.near)
218
+ .add(position);
219
+
220
+ const farCenter = scratchPlaneFarCenter
221
+ .copy(direction)
222
+ .multiplyByScalar(this.far)
223
+ .add(position);
224
+
225
+ let normal = scratchPlaneNormal;
226
+
227
+ // Left plane computation
228
+ normal.copy(right).multiplyByScalar(this.left).add(nearCenter).subtract(position).cross(up);
229
+
230
+ planes[0].fromPointNormal(position, normal);
231
+
232
+ // Right plane computation
233
+ normal
234
+ .copy(right)
235
+ .multiplyByScalar(this.right)
236
+ .add(nearCenter)
237
+ .subtract(position)
238
+ .cross(up)
239
+ .negate();
240
+
241
+ planes[1].fromPointNormal(position, normal);
242
+
243
+ // Bottom plane computation
244
+ normal
245
+ .copy(up)
246
+ .multiplyByScalar(this.bottom)
247
+ .add(nearCenter)
248
+ .subtract(position)
249
+ .cross(right)
250
+ .negate();
251
+
252
+ planes[2].fromPointNormal(position, normal);
253
+
254
+ // Top plane computation
255
+ normal.copy(up).multiplyByScalar(this.top).add(nearCenter).subtract(position).cross(right);
256
+
257
+ planes[3].fromPointNormal(position, normal);
258
+
259
+ normal = new Vector3().copy(direction);
260
+
261
+ // Near plane computation
262
+ planes[4].fromPointNormal(nearCenter, normal);
263
+
264
+ // Far plane computation
265
+ normal.negate();
266
+
267
+ planes[5].fromPointNormal(farCenter, normal);
268
+
269
+ return this._cullingVolume;
270
+ }
271
+
272
+ /**
273
+ * Returns the pixel's width and height in meters.
274
+ *
275
+ * @returns {Vector2} The modified result parameter or a new instance of {@link Vector2} with the pixel's width and height in the x and y properties, respectively.
276
+ *
277
+ * @exception {DeveloperError} drawingBufferWidth must be greater than zero.
278
+ * @exception {DeveloperError} drawingBufferHeight must be greater than zero.
279
+ *
280
+ * @example
281
+ * // Example 1
282
+ * // Get the width and height of a pixel.
283
+ * const pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 1.0, new Vector2());
284
+ *
285
+ * @example
286
+ * // Example 2
287
+ * // Get the width and height of a pixel if the near plane was set to 'distance'.
288
+ * // For example, get the size of a pixel of an image on a billboard.
289
+ * const position = camera.position;
290
+ * const direction = camera.direction;
291
+ * const toCenter = Vector3.subtract(primitive.boundingVolume.center, position, new Vector3()); // vector from camera to a primitive
292
+ * const toCenterProj = Vector3.multiplyByScalar(direction, Vector3.dot(direction, toCenter), new Vector3()); // project vector onto camera direction vector
293
+ * const distance = Vector3.magnitude(toCenterProj);
294
+ * const pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, distance, new Vector2());
295
+ */
296
+ getPixelDimensions(
297
+ /** The width of the drawing buffer. */
298
+ drawingBufferWidth: number,
299
+ /** The height of the drawing buffer. */
300
+ drawingBufferHeight: number,
301
+ /** The distance to the near plane in meters. */
302
+ distance: number,
303
+ /** The object onto which to store the result. */
304
+ result: Vector2
305
+ ): Vector2 {
306
+ this._update();
307
+
308
+ assert(Number.isFinite(drawingBufferWidth) && Number.isFinite(drawingBufferHeight));
309
+ // 'Both drawingBufferWidth and drawingBufferHeight are required.'
310
+ assert(drawingBufferWidth > 0);
311
+ // 'drawingBufferWidth must be greater than zero.'
312
+ assert(drawingBufferHeight > 0);
313
+ // 'drawingBufferHeight must be greater than zero.'
314
+ assert(distance > 0);
315
+ // 'distance is required.');
316
+ assert(result);
317
+ // 'A result object is required.');
318
+
319
+ const inverseNear = 1.0 / this.near;
320
+ let tanTheta = this.top * inverseNear;
321
+ const pixelHeight = (2.0 * distance * tanTheta) / drawingBufferHeight;
322
+ tanTheta = this.right * inverseNear;
323
+ const pixelWidth = (2.0 * distance * tanTheta) / drawingBufferWidth;
324
+
325
+ result.x = pixelWidth;
326
+ result.y = pixelHeight;
327
+ return result;
328
+ }
329
+
330
+ // eslint-disable-next-line complexity, max-statements
331
+ private _update() {
332
+ assert(
333
+ Number.isFinite(this.right) &&
334
+ Number.isFinite(this.left) &&
335
+ Number.isFinite(this.top) &&
336
+ Number.isFinite(this.bottom) &&
337
+ Number.isFinite(this.near) &&
338
+ Number.isFinite(this.far)
339
+ );
340
+ // throw new DeveloperError('right, left, top, bottom, near, or far parameters are not set.');
341
+
342
+ const {top, bottom, right, left, near, far} = this;
343
+
344
+ if (
345
+ top !== this._top ||
346
+ bottom !== this._bottom ||
347
+ left !== this._left ||
348
+ right !== this._right ||
349
+ near !== this._near ||
350
+ far !== this._far
351
+ ) {
352
+ assert(
353
+ this.near > 0 && this.near < this.far,
354
+ 'near must be greater than zero and less than far.'
355
+ );
356
+
357
+ this._left = left;
358
+ this._right = right;
359
+ this._top = top;
360
+ this._bottom = bottom;
361
+ this._near = near;
362
+ this._far = far;
363
+ this._perspectiveMatrix = new Matrix4().frustum({
364
+ left,
365
+ right,
366
+ bottom,
367
+ top,
368
+ near,
369
+ far
370
+ });
371
+ this._infinitePerspective = new Matrix4().frustum({
372
+ left,
373
+ right,
374
+ bottom,
375
+ top,
376
+ near,
377
+ far: Infinity
378
+ });
379
+ }
380
+ }
381
+ }
@@ -0,0 +1,118 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT AND Apache-2.0
3
+ // SPDX-FileCopyrightText: Copyright 2011-2018 CesiumJS Contributors
4
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
5
+ // SPDX-FileComment: Derived from Cesium. See the repository LICENSE for upstream attribution and Apache-2.0 terms.
6
+
7
+ // This file is derived from the Cesium math library under Apache 2 license
8
+ // See ../../../LICENSE for the retained Cesium notice and Apache-2.0 terms.
9
+
10
+ /* eslint-disable */
11
+ import {Vector3, equals, assert, NumericArray, _MathUtils} from '@math.gl/core';
12
+ import {Ray} from './ray';
13
+
14
+ const scratchPosition = new Vector3();
15
+ const scratchNormal = new Vector3();
16
+
17
+ // A plane in Hessian Normal Form
18
+ export class Plane {
19
+ readonly normal: Vector3;
20
+ distance: number;
21
+
22
+ constructor(normal: Readonly<NumericArray> = [0, 0, 1], distance: number = 0) {
23
+ this.normal = new Vector3();
24
+ this.distance = -0;
25
+ this.fromNormalDistance(normal, distance);
26
+ }
27
+
28
+ /** Creates a plane from a normal and a distance from the origin. */
29
+ fromNormalDistance(normal: Readonly<NumericArray>, distance: number): this {
30
+ assert(Number.isFinite(distance));
31
+ this.normal.from(normal).normalize();
32
+ this.distance = distance;
33
+ return this;
34
+ }
35
+
36
+ /** Creates a plane from a normal and a point on the plane. */
37
+ fromPointNormal(point: Readonly<NumericArray>, normal: Readonly<NumericArray>): this {
38
+ point = scratchPosition.from(point);
39
+ this.normal.from(normal).normalize();
40
+ const distance = -this.normal.dot(point);
41
+ this.distance = distance;
42
+ return this;
43
+ }
44
+
45
+ /** Creates a plane from the general equation */
46
+ fromCoefficients(a: number, b: number, c: number, d: number): this {
47
+ this.normal.set(a, b, c);
48
+ assert(equals(this.normal.len(), 1));
49
+ this.distance = d;
50
+ return this;
51
+ }
52
+
53
+ /** Duplicates a Plane instance. */
54
+ clone(): Plane {
55
+ return new Plane(this.normal, this.distance);
56
+ }
57
+
58
+ /** Compares the provided Planes by normal and distance */
59
+ equals(right: Plane): boolean {
60
+ return equals(this.distance, right.distance) && equals(this.normal, right.normal);
61
+ }
62
+
63
+ /** Computes the signed shortest distance of a point to a plane.
64
+ * The sign of the distance determines which side of the plane the point is on.
65
+ */
66
+ getPointDistance(point: Readonly<NumericArray>): number {
67
+ return this.normal.dot(point) + this.distance;
68
+ }
69
+
70
+ /** Transforms the plane by the given transformation matrix. */
71
+ transform(matrix4: Readonly<NumericArray>): this {
72
+ const normal = scratchNormal.copy(this.normal).transformAsVector(matrix4).normalize();
73
+ const point = this.normal.scale(-this.distance).transform(matrix4);
74
+ return this.fromPointNormal(point, normal);
75
+ }
76
+
77
+ /** Projects a point onto the plane. */
78
+ projectPointOntoPlane(point: Readonly<NumericArray>, result: Vector3): Vector3;
79
+ projectPointOntoPlane(
80
+ point: Readonly<NumericArray>,
81
+ result?: readonly number[]
82
+ ): readonly number[];
83
+
84
+ projectPointOntoPlane(point: Readonly<NumericArray>, result = [0, 0, 0]) {
85
+ const scratchPoint = scratchPosition.from(point);
86
+ // projectedPoint = point - (normal.point + scale) * normal
87
+ const pointDistance = this.getPointDistance(scratchPoint);
88
+ const scaledNormal = scratchNormal.copy(this.normal).scale(pointDistance);
89
+
90
+ return scratchPoint.subtract(scaledNormal).to(result);
91
+ }
92
+
93
+ /**
94
+ * Computes the intersection of a ray and this plane.
95
+ *
96
+ * @param {Ray} ray The ray.
97
+ * @param {Vector3} [result] The object onto which to store the result.
98
+ * @returns {Vector3} The intersection point or undefined if there is no intersection.
99
+ */
100
+ intersectWithRay(ray: Ray, result: Vector3 = new Vector3()): Vector3 | undefined {
101
+ const origin = ray.origin;
102
+ const direction = ray.direction;
103
+ const normal = this.normal;
104
+ const denominator = normal.dot(direction);
105
+
106
+ if (Math.abs(denominator) < _MathUtils.EPSILON15) {
107
+ return undefined;
108
+ }
109
+
110
+ const t = (-this.distance - normal.dot(origin)) / denominator;
111
+
112
+ if (t < 0) {
113
+ return undefined;
114
+ }
115
+
116
+ return result.copy(direction).multiplyByScalar(t).add(origin);
117
+ }
118
+ }
@@ -0,0 +1,33 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT AND Apache-2.0
3
+ // SPDX-FileCopyrightText: Copyright 2011-2018 CesiumJS Contributors
4
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
5
+ // SPDX-FileComment: Derived from Cesium. See the repository LICENSE for upstream attribution and Apache-2.0 terms.
6
+
7
+ // This file is derived from the Cesium library under Apache 2 license
8
+ // See ../../../LICENSE for the retained Cesium notice and Apache-2.0 terms.
9
+
10
+ import {Vector3} from '@math.gl/core';
11
+
12
+ /* Represents a ray that extends infinitely from the provided origin in the provided direction. */
13
+ export class Ray {
14
+ origin: Vector3;
15
+ direction: Vector3;
16
+
17
+ /**
18
+ * Creates a new ray that extends infinitely from the provided origin in the provided direction.
19
+ *
20
+ * @param [origin=Vector3] The origin of the ray.
21
+ * @param [direction=Vector3] The direction of the ray.
22
+ */
23
+ constructor(origin?: Vector3, direction?: Vector3) {
24
+ if (origin) origin = origin.clone();
25
+ else origin = new Vector3();
26
+
27
+ if (direction) direction = direction.clone().normalize();
28
+ else direction = new Vector3();
29
+
30
+ this.origin = origin;
31
+ this.direction = direction;
32
+ }
33
+ }
@@ -0,0 +1,78 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
4
+
5
+ import {ImplicitShapeBase, type ImplicitShape, type LocalRayIntersection} from './implicit-shape';
6
+
7
+ const EPSILON = 1e-6;
8
+
9
+ export type BoxShapeProps = {size?: readonly [number, number, number]; matrix?: readonly number[]};
10
+
11
+ /** Analytic glTF box shape. */
12
+ export class BoxShape extends ImplicitShapeBase {
13
+ readonly type = 'box' as const;
14
+ readonly size: readonly [number, number, number];
15
+ private readonly halfSize: readonly [number, number, number];
16
+
17
+ constructor(props: BoxShapeProps = {}) {
18
+ super(props.matrix);
19
+ this.size = props.size ? [...props.size] : [1, 1, 1];
20
+ if (this.size.some(value => !Number.isFinite(value) || value <= 0))
21
+ throw new Error('Box size values must be greater than zero');
22
+ this.halfSize = [this.size[0] / 2, this.size[1] / 2, this.size[2] / 2];
23
+ }
24
+
25
+ clone(): BoxShape {
26
+ return new BoxShape({size: this.size, matrix: this.matrix});
27
+ }
28
+ override equals(shape: ImplicitShape): boolean {
29
+ return (
30
+ shape instanceof BoxShape &&
31
+ super.equals(shape) &&
32
+ this.size.every((value, i) => value === shape.size[i])
33
+ );
34
+ }
35
+ containsLocalPoint(point: readonly number[]): boolean {
36
+ return point.every((value, i) => Math.abs(value) <= this.halfSize[i] + EPSILON);
37
+ }
38
+ distanceToLocalPoint(point: readonly number[]): number {
39
+ return Math.hypot(...point.map((value, i) => Math.max(0, Math.abs(value) - this.halfSize[i])));
40
+ }
41
+ supportLocal(direction: readonly number[]): readonly number[] {
42
+ return direction.map((value, i) => (value < 0 ? -this.halfSize[i] : this.halfSize[i]));
43
+ }
44
+ intersectLocalRay(
45
+ origin: readonly number[],
46
+ direction: readonly number[]
47
+ ): LocalRayIntersection | undefined {
48
+ let near = -Infinity;
49
+ let far = Infinity;
50
+ let nearAxis = 0;
51
+ let farAxis = 0;
52
+ for (let axis = 0; axis < 3; axis++) {
53
+ if (Math.abs(direction[axis]) < 1e-15) {
54
+ if (Math.abs(origin[axis]) > this.halfSize[axis]) return undefined;
55
+ continue;
56
+ }
57
+ let t1 = (-this.halfSize[axis] - origin[axis]) / direction[axis];
58
+ let t2 = (this.halfSize[axis] - origin[axis]) / direction[axis];
59
+ if (t1 > t2) [t1, t2] = [t2, t1];
60
+ if (t1 > near) {
61
+ near = t1;
62
+ nearAxis = axis;
63
+ }
64
+ if (t2 < far) {
65
+ far = t2;
66
+ farAxis = axis;
67
+ }
68
+ if (near > far) return undefined;
69
+ }
70
+ const distance = near >= 0 ? near : far;
71
+ if (distance < 0 || !Number.isFinite(distance)) return undefined;
72
+ const axis = near >= 0 ? nearAxis : farAxis;
73
+ const pointCoordinate = origin[axis] + distance * direction[axis];
74
+ const normal = [0, 0, 0];
75
+ normal[axis] = pointCoordinate < 0 ? -1 : 1;
76
+ return {distance, normal};
77
+ }
78
+ }