@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,56 @@
1
+ import { Matrix4, Vector3 } from '@math.gl/core';
2
+ import type { CullingResult } from "../../constants.js";
3
+ import { AxisAlignedBoundingBox } from "../bounding-volumes/axis-aligned-bounding-box.js";
4
+ import { BoundingSphere } from "../bounding-volumes/bounding-sphere.js";
5
+ import type { BoundingVolume } from "../bounding-volumes/bounding-volume.js";
6
+ import type { Plane } from "../plane.js";
7
+ import type { Ray } from "../ray.js";
8
+ export type RayIntersection = {
9
+ distance: number;
10
+ point: Vector3;
11
+ normal: Vector3;
12
+ entering: boolean;
13
+ };
14
+ export interface ImplicitShape extends BoundingVolume {
15
+ readonly type: 'box' | 'capsule' | 'cylinder' | 'plane' | 'sphere';
16
+ readonly matrix: Matrix4;
17
+ clone(): ImplicitShape;
18
+ equals(shape: ImplicitShape): boolean;
19
+ containsPoint(point: readonly number[]): boolean;
20
+ intersectRay(ray: Ray): RayIntersection | undefined;
21
+ getAxisAlignedBoundingBox(): AxisAlignedBoundingBox | undefined;
22
+ getBoundingSphere(): BoundingSphere | undefined;
23
+ }
24
+ export type LocalRayIntersection = {
25
+ distance: number;
26
+ normal: readonly number[];
27
+ };
28
+ /** Shared affine transform, support mapping and query implementation for finite convex shapes. */
29
+ export declare abstract class ImplicitShapeBase implements ImplicitShape {
30
+ abstract readonly type: ImplicitShape['type'];
31
+ readonly matrix: Matrix4;
32
+ protected inverseMatrix: Matrix4;
33
+ constructor(matrix?: readonly number[]);
34
+ abstract clone(): ImplicitShapeBase;
35
+ abstract containsLocalPoint(point: readonly number[]): boolean;
36
+ abstract distanceToLocalPoint(point: readonly number[]): number;
37
+ abstract supportLocal(direction: readonly number[]): readonly number[];
38
+ abstract intersectLocalRay(origin: readonly number[], direction: readonly number[]): LocalRayIntersection | undefined;
39
+ equals(shape: ImplicitShape): boolean;
40
+ transform(transform: readonly number[]): this;
41
+ containsPoint(point: readonly number[]): boolean;
42
+ distanceSquaredTo(point: readonly number[]): number;
43
+ /** Exact for rigid/uniform transforms; conservative estimate for non-uniform scale or shear. */
44
+ distanceTo(point: readonly number[]): number;
45
+ intersectPlane(plane: Plane): CullingResult;
46
+ intersectRay(ray: Ray): RayIntersection | undefined;
47
+ getAxisAlignedBoundingBox(): AxisAlignedBoundingBox | undefined;
48
+ getBoundingSphere(): BoundingSphere | undefined;
49
+ protected getSupportPoint(worldDirection: readonly number[]): Vector3;
50
+ }
51
+ export declare function validateAffineMatrix(matrix: readonly number[]): void;
52
+ export declare function solveQuadratic(a: number, b: number, c: number): number[];
53
+ export declare function closestDistanceToSegment2D(px: number, py: number, ax: number, ay: number, bx: number, by: number): number;
54
+ /** Distance in the radial/Y half-plane to a spherical profile arc selected by normal Y range. */
55
+ export declare function closestDistanceToCircleArc2D(px: number, py: number, centerY: number, radius: number, minimumNormalY: number, maximumNormalY: number): number;
56
+ //# sourceMappingURL=implicit-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implicit-shape.d.ts","sourceRoot":"","sources":["../../../../src/culling/lib/shapes/implicit-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
4
+ import { Matrix4, Vector3 } from '@math.gl/core';
5
+ import { AxisAlignedBoundingBox } from "../bounding-volumes/axis-aligned-bounding-box.js";
6
+ import { BoundingSphere } from "../bounding-volumes/bounding-sphere.js";
7
+ /** Shared affine transform, support mapping and query implementation for finite convex shapes. */
8
+ export class ImplicitShapeBase {
9
+ constructor(matrix) {
10
+ this.matrix = new Matrix4();
11
+ if (matrix)
12
+ this.matrix.copy(matrix);
13
+ validateAffineMatrix(this.matrix);
14
+ this.inverseMatrix = this.matrix.clone().invert();
15
+ }
16
+ equals(shape) {
17
+ if (this.type !== shape.type)
18
+ return false;
19
+ for (let i = 0; i < 16; i++)
20
+ if (this.matrix[i] !== shape.matrix[i])
21
+ return false;
22
+ return true;
23
+ }
24
+ transform(transform) {
25
+ const next = new Matrix4().copy(transform);
26
+ validateAffineMatrix(next);
27
+ this.matrix.multiplyLeft(next);
28
+ validateAffineMatrix(this.matrix);
29
+ this.inverseMatrix.copy(this.matrix).invert();
30
+ return this;
31
+ }
32
+ containsPoint(point) {
33
+ return this.containsLocalPoint(this.inverseMatrix.transformAsPoint(point));
34
+ }
35
+ distanceSquaredTo(point) {
36
+ const distance = this.distanceTo(point);
37
+ return distance * distance;
38
+ }
39
+ /** Exact for rigid/uniform transforms; conservative estimate for non-uniform scale or shear. */
40
+ distanceTo(point) {
41
+ const localPoint = this.inverseMatrix.transformAsPoint(point);
42
+ const localDistance = this.distanceToLocalPoint(localPoint);
43
+ const scales = this.matrix.getScale();
44
+ return localDistance * Math.min(scales[0], scales[1], scales[2]);
45
+ }
46
+ intersectPlane(plane) {
47
+ const maximum = this.getSupportPoint(plane.normal);
48
+ const minimum = this.getSupportPoint([-plane.normal[0], -plane.normal[1], -plane.normal[2]]);
49
+ const maxDistance = plane.getPointDistance(maximum);
50
+ const minDistance = plane.getPointDistance(minimum);
51
+ if (minDistance > 0)
52
+ return 'inside';
53
+ if (maxDistance < 0)
54
+ return 'outside';
55
+ return 'intersecting';
56
+ }
57
+ intersectRay(ray) {
58
+ const localOrigin = this.inverseMatrix.transformAsPoint(ray.origin);
59
+ const localDirection = this.inverseMatrix.transformAsVector(ray.direction);
60
+ const hit = this.intersectLocalRay(localOrigin, localDirection);
61
+ if (!hit || hit.distance < 0)
62
+ return undefined;
63
+ const point = new Vector3(ray.direction).scale(hit.distance).add(ray.origin);
64
+ const inverse = this.inverseMatrix;
65
+ const normal = new Vector3(inverse[0] * hit.normal[0] + inverse[1] * hit.normal[1] + inverse[2] * hit.normal[2], inverse[4] * hit.normal[0] + inverse[5] * hit.normal[1] + inverse[6] * hit.normal[2], inverse[8] * hit.normal[0] + inverse[9] * hit.normal[1] + inverse[10] * hit.normal[2]).normalize();
66
+ return { distance: hit.distance, point, normal, entering: ray.direction.dot(normal) < 0 };
67
+ }
68
+ getAxisAlignedBoundingBox() {
69
+ const minimum = new Vector3();
70
+ const maximum = new Vector3();
71
+ for (let axis = 0; axis < 3; axis++) {
72
+ const direction = [0, 0, 0];
73
+ direction[axis] = 1;
74
+ maximum[axis] = this.getSupportPoint(direction)[axis];
75
+ direction[axis] = -1;
76
+ minimum[axis] = this.getSupportPoint(direction)[axis];
77
+ }
78
+ return new AxisAlignedBoundingBox(minimum, maximum);
79
+ }
80
+ getBoundingSphere() {
81
+ const box = this.getAxisAlignedBoundingBox();
82
+ if (!box)
83
+ return undefined;
84
+ return new BoundingSphere().fromCornerPoints(box.minimum, box.maximum);
85
+ }
86
+ getSupportPoint(worldDirection) {
87
+ const matrix = this.matrix;
88
+ const localDirection = [
89
+ matrix[0] * worldDirection[0] + matrix[1] * worldDirection[1] + matrix[2] * worldDirection[2],
90
+ matrix[4] * worldDirection[0] + matrix[5] * worldDirection[1] + matrix[6] * worldDirection[2],
91
+ matrix[8] * worldDirection[0] + matrix[9] * worldDirection[1] + matrix[10] * worldDirection[2]
92
+ ];
93
+ return new Vector3(this.supportLocal(localDirection)).transform(this.matrix);
94
+ }
95
+ }
96
+ export function validateAffineMatrix(matrix) {
97
+ if (matrix.length !== 16 || matrix.some(value => !Number.isFinite(value))) {
98
+ throw new Error('Shape matrix must contain 16 finite values');
99
+ }
100
+ if (Math.abs(matrix[3]) > 1e-12 ||
101
+ Math.abs(matrix[7]) > 1e-12 ||
102
+ Math.abs(matrix[11]) > 1e-12 ||
103
+ Math.abs(matrix[15] - 1) > 1e-12) {
104
+ throw new Error('Shape matrix must be affine');
105
+ }
106
+ if (Math.abs(new Matrix4().copy(matrix).determinant()) < 1e-15)
107
+ throw new Error('Shape matrix must be invertible');
108
+ }
109
+ export function solveQuadratic(a, b, c) {
110
+ if (Math.abs(a) < 1e-15)
111
+ return Math.abs(b) < 1e-15 ? [] : [-c / b];
112
+ const discriminant = b * b - 4 * a * c;
113
+ if (discriminant < 0)
114
+ return [];
115
+ const root = Math.sqrt(Math.max(0, discriminant));
116
+ return [(-b - root) / (2 * a), (-b + root) / (2 * a)].sort((left, right) => left - right);
117
+ }
118
+ export function closestDistanceToSegment2D(px, py, ax, ay, bx, by) {
119
+ const dx = bx - ax;
120
+ const dy = by - ay;
121
+ const denominator = dx * dx + dy * dy;
122
+ const t = denominator
123
+ ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / denominator))
124
+ : 0;
125
+ return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));
126
+ }
127
+ /** Distance in the radial/Y half-plane to a spherical profile arc selected by normal Y range. */
128
+ export function closestDistanceToCircleArc2D(px, py, centerY, radius, minimumNormalY, maximumNormalY) {
129
+ if (radius === 0)
130
+ return Math.hypot(px, py - centerY);
131
+ const dx = px;
132
+ const dy = py - centerY;
133
+ const length = Math.hypot(dx, dy);
134
+ const normalY = length ? dy / length : 0;
135
+ if (normalY >= minimumNormalY && normalY <= maximumNormalY) {
136
+ return Math.abs(length - radius);
137
+ }
138
+ const minimumRadius = radius * Math.sqrt(Math.max(0, 1 - minimumNormalY ** 2));
139
+ const maximumRadius = radius * Math.sqrt(Math.max(0, 1 - maximumNormalY ** 2));
140
+ return Math.min(Math.hypot(px - minimumRadius, py - (centerY + radius * minimumNormalY)), Math.hypot(px - maximumRadius, py - (centerY + radius * maximumNormalY)));
141
+ }
142
+ //# sourceMappingURL=implicit-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implicit-shape.js","sourceRoot":"","sources":["../../../../src/culling/lib/shapes/implicit-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { CullingResult } from "../../constants.js";
2
+ import { ImplicitShapeBase, type ImplicitShape, type LocalRayIntersection } from "./implicit-shape.js";
3
+ import type { AxisAlignedBoundingBox } from "../bounding-volumes/axis-aligned-bounding-box.js";
4
+ import type { BoundingSphere } from "../bounding-volumes/bounding-sphere.js";
5
+ import type { Plane } from "../plane.js";
6
+ export type PlaneShapeProps = {
7
+ sizeX?: number;
8
+ sizeZ?: number;
9
+ matrix?: readonly number[];
10
+ };
11
+ /** Analytic glTF plane. The surface faces +Y and the negative-Y half-space is inside. */
12
+ export declare class PlaneShape extends ImplicitShapeBase {
13
+ readonly type: "plane";
14
+ readonly sizeX?: number;
15
+ readonly sizeZ?: number;
16
+ constructor(props?: PlaneShapeProps);
17
+ clone(): PlaneShape;
18
+ equals(shape: ImplicitShape): boolean;
19
+ containsLocalPoint(point: readonly number[]): boolean;
20
+ distanceToLocalPoint(point: readonly number[]): number;
21
+ supportLocal(): readonly number[];
22
+ intersectLocalRay(origin: readonly number[], direction: readonly number[]): LocalRayIntersection | undefined;
23
+ intersectPlane(plane: Plane): CullingResult;
24
+ getAxisAlignedBoundingBox(): AxisAlignedBoundingBox | undefined;
25
+ getBoundingSphere(): BoundingSphere | undefined;
26
+ }
27
+ //# sourceMappingURL=plane-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plane-shape.d.ts","sourceRoot":"","sources":["../../../../src/culling/lib/shapes/plane-shape.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,2BAAwB;AACnD,OAAO,EAAC,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAC,4BAAyB;AAClG,OAAO,KAAK,EAAC,sBAAsB,EAAC,yDAAsD;AAC1F,OAAO,KAAK,EAAC,cAAc,EAAC,+CAA4C;AACxE,OAAO,KAAK,EAAC,KAAK,EAAC,oBAAiB;AAEpC,MAAM,MAAM,eAAe,GAAG;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAC,CAAC;AAE3F,yFAAyF;AACzF,qBAAa,UAAW,SAAQ,iBAAiB;IAC/C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;gBACZ,KAAK,GAAE,eAAoB;IASvC,KAAK,IAAI,UAAU;IAGV,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAQ9C,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAGrD,oBAAoB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM;IAGtD,YAAY,IAAI,SAAS,MAAM,EAAE;IAGjC,iBAAiB,CACf,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,oBAAoB,GAAG,SAAS;IAU1B,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa;IAW3C,yBAAyB,IAAI,sBAAsB,GAAG,SAAS;IAG/D,iBAAiB,IAAI,cAAc,GAAG,SAAS;CAGzD"}
@@ -0,0 +1,71 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
4
+ import { Vector3 } from '@math.gl/core';
5
+ import { ImplicitShapeBase } from "./implicit-shape.js";
6
+ /** Analytic glTF plane. The surface faces +Y and the negative-Y half-space is inside. */
7
+ export class PlaneShape extends ImplicitShapeBase {
8
+ constructor(props = {}) {
9
+ super(props.matrix);
10
+ this.type = 'plane';
11
+ this.sizeX = props.sizeX;
12
+ this.sizeZ = props.sizeZ;
13
+ if (this.sizeX !== undefined && (!Number.isFinite(this.sizeX) || this.sizeX <= 0))
14
+ throw new Error('Plane sizeX must be greater than zero');
15
+ if (this.sizeZ !== undefined && (!Number.isFinite(this.sizeZ) || this.sizeZ <= 0))
16
+ throw new Error('Plane sizeZ must be greater than zero');
17
+ }
18
+ clone() {
19
+ return new PlaneShape({ sizeX: this.sizeX, sizeZ: this.sizeZ, matrix: this.matrix });
20
+ }
21
+ equals(shape) {
22
+ return (shape instanceof PlaneShape &&
23
+ super.equals(shape) &&
24
+ this.sizeX === shape.sizeX &&
25
+ this.sizeZ === shape.sizeZ);
26
+ }
27
+ containsLocalPoint(point) {
28
+ return point[1] <= 1e-12;
29
+ }
30
+ distanceToLocalPoint(point) {
31
+ return Math.max(0, point[1]);
32
+ }
33
+ supportLocal() {
34
+ throw new Error('An unbounded plane half-space has no finite support point');
35
+ }
36
+ intersectLocalRay(origin, direction) {
37
+ if (Math.abs(direction[1]) < 1e-15)
38
+ return undefined;
39
+ const distance = -origin[1] / direction[1];
40
+ if (distance < 0)
41
+ return undefined;
42
+ const x = origin[0] + distance * direction[0];
43
+ const z = origin[2] + distance * direction[2];
44
+ if (this.sizeX !== undefined && Math.abs(x) > this.sizeX / 2 + 1e-12)
45
+ return undefined;
46
+ if (this.sizeZ !== undefined && Math.abs(z) > this.sizeZ / 2 + 1e-12)
47
+ return undefined;
48
+ return { distance, normal: [0, 1, 0] };
49
+ }
50
+ intersectPlane(plane) {
51
+ const boundaryPoint = new Vector3(0, 0, 0).transform(this.matrix);
52
+ const inverse = this.inverseMatrix;
53
+ const boundaryNormal = new Vector3(inverse[1], inverse[5], inverse[9]).normalize();
54
+ const alignment = boundaryNormal.dot(plane.normal);
55
+ if (Math.abs(Math.abs(alignment) - 1) > 1e-10)
56
+ return 'intersecting';
57
+ const boundaryDistance = plane.getPointDistance(boundaryPoint);
58
+ if (alignment < 0 && boundaryDistance > 0)
59
+ return 'inside';
60
+ if (alignment > 0 && boundaryDistance < 0)
61
+ return 'outside';
62
+ return 'intersecting';
63
+ }
64
+ getAxisAlignedBoundingBox() {
65
+ return undefined;
66
+ }
67
+ getBoundingSphere() {
68
+ return undefined;
69
+ }
70
+ }
71
+ //# sourceMappingURL=plane-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plane-shape.js","sourceRoot":"","sources":["../../../../src/culling/lib/shapes/plane-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ImplicitShapeBase, type ImplicitShape, type LocalRayIntersection } from "./implicit-shape.js";
2
+ export type SphereShapeProps = {
3
+ radius?: number;
4
+ matrix?: readonly number[];
5
+ };
6
+ /** Analytic glTF sphere shape. */
7
+ export declare class SphereShape extends ImplicitShapeBase {
8
+ readonly type: "sphere";
9
+ readonly radius: number;
10
+ constructor(props?: SphereShapeProps);
11
+ clone(): SphereShape;
12
+ equals(shape: ImplicitShape): boolean;
13
+ containsLocalPoint(point: readonly number[]): boolean;
14
+ distanceToLocalPoint(point: readonly number[]): number;
15
+ supportLocal(direction: readonly number[]): readonly number[];
16
+ intersectLocalRay(origin: readonly number[], direction: readonly number[]): LocalRayIntersection | undefined;
17
+ }
18
+ //# sourceMappingURL=sphere-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sphere-shape.d.ts","sourceRoot":"","sources":["../../../../src/culling/lib/shapes/sphere-shape.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,iBAAiB,EAEjB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,4BAAyB;AAI1B,MAAM,MAAM,gBAAgB,GAAG;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAC,CAAC;AAE7E,kCAAkC;AAClC,qBAAa,WAAY,SAAQ,iBAAiB;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,KAAK,GAAE,gBAAqB;IAMxC,KAAK,IAAI,WAAW;IAGX,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAG9C,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAGrD,oBAAoB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM;IAGtD,YAAY,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE;IAI7D,iBAAiB,CACf,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,oBAAoB,GAAG,SAAS;CAWpC"}
@@ -0,0 +1,43 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
4
+ import { ImplicitShapeBase, solveQuadratic } from "./implicit-shape.js";
5
+ const EPSILON = 1e-6;
6
+ /** Analytic glTF sphere shape. */
7
+ export class SphereShape extends ImplicitShapeBase {
8
+ constructor(props = {}) {
9
+ super(props.matrix);
10
+ this.type = 'sphere';
11
+ this.radius = props.radius ?? 0.5;
12
+ if (!Number.isFinite(this.radius) || this.radius <= 0)
13
+ throw new Error('Sphere radius must be greater than zero');
14
+ }
15
+ clone() {
16
+ return new SphereShape({ radius: this.radius, matrix: this.matrix });
17
+ }
18
+ equals(shape) {
19
+ return shape instanceof SphereShape && super.equals(shape) && this.radius === shape.radius;
20
+ }
21
+ containsLocalPoint(point) {
22
+ return Math.hypot(...point) <= this.radius + EPSILON;
23
+ }
24
+ distanceToLocalPoint(point) {
25
+ return Math.max(0, Math.hypot(...point) - this.radius);
26
+ }
27
+ supportLocal(direction) {
28
+ const length = Math.hypot(...direction);
29
+ return length ? direction.map(value => (value / length) * this.radius) : [this.radius, 0, 0];
30
+ }
31
+ intersectLocalRay(origin, direction) {
32
+ const roots = solveQuadratic(dot(direction, direction), 2 * dot(origin, direction), dot(origin, origin) - this.radius * this.radius);
33
+ const distance = roots.find(value => value >= 0);
34
+ if (distance === undefined)
35
+ return undefined;
36
+ const point = origin.map((value, i) => value + distance * direction[i]);
37
+ return { distance, normal: point.map(value => value / this.radius) };
38
+ }
39
+ }
40
+ function dot(a, b) {
41
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
42
+ }
43
+ //# sourceMappingURL=sphere-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sphere-shape.js","sourceRoot":"","sources":["../../../../src/culling/lib/shapes/sphere-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // dist/culling/oriented-box-2d.js
20
+ var oriented_box_2d_exports = {};
21
+ __export(oriented_box_2d_exports, {
22
+ intersectOrientedBoxes2D: () => intersectOrientedBoxes2D
23
+ });
24
+ module.exports = __toCommonJS(oriented_box_2d_exports);
25
+ function intersectOrientedBoxes2D(first, second, epsilon = 0) {
26
+ validateBox(first);
27
+ validateBox(second);
28
+ if (!Number.isFinite(epsilon) || epsilon < 0) {
29
+ throw new RangeError("Box separation allowance must be finite and nonnegative");
30
+ }
31
+ const firstDirectionScale = Math.max(Math.abs(first.direction[0]), Math.abs(first.direction[1]));
32
+ const secondDirectionScale = Math.max(Math.abs(second.direction[0]), Math.abs(second.direction[1]));
33
+ const firstWidthX = first.direction[0] / firstDirectionScale;
34
+ const firstWidthY = first.direction[1] / firstDirectionScale;
35
+ const secondWidthX = second.direction[0] / secondDirectionScale;
36
+ const secondWidthY = second.direction[1] / secondDirectionScale;
37
+ const firstLength = Math.hypot(firstWidthX, firstWidthY);
38
+ const secondLength = Math.hypot(secondWidthX, secondWidthY);
39
+ const firstX = firstWidthX / firstLength;
40
+ const firstY = firstWidthY / firstLength;
41
+ const secondX = secondWidthX / secondLength;
42
+ const secondY = secondWidthY / secondLength;
43
+ const cosine = Math.min(1, Math.abs(firstX * secondX + firstY * secondY));
44
+ const sine = Math.min(1, Math.abs(firstX * secondY - firstY * secondX));
45
+ return overlapsOnAxis(first, second, firstX, firstY, first.halfSize[0], second.halfSize[0] * cosine, second.halfSize[1] * sine, epsilon) && overlapsOnAxis(first, second, -firstY, firstX, first.halfSize[1], second.halfSize[0] * sine, second.halfSize[1] * cosine, epsilon) && overlapsOnAxis(first, second, secondX, secondY, second.halfSize[0], first.halfSize[0] * cosine, first.halfSize[1] * sine, epsilon) && overlapsOnAxis(first, second, -secondY, secondX, second.halfSize[1], first.halfSize[0] * sine, first.halfSize[1] * cosine, epsilon);
46
+ }
47
+ function overlapsOnAxis(first, second, axisX, axisY, ownRadius, otherWidthRadius, otherHeightRadius, epsilon) {
48
+ const displacementX = second.center[0] - first.center[0];
49
+ const displacementY = second.center[1] - first.center[1];
50
+ const projectionX = Number.isFinite(displacementX) ? displacementX * axisX : second.center[0] * axisX - first.center[0] * axisX;
51
+ const projectionY = Number.isFinite(displacementY) ? displacementY * axisY : second.center[1] * axisY - first.center[1] * axisY;
52
+ const scale = Math.max(ownRadius, otherWidthRadius, otherHeightRadius, epsilon, Number.isFinite(projectionX) ? Math.abs(projectionX) : Math.max(Math.abs(first.center[0] * axisX), Math.abs(second.center[0] * axisX)), Number.isFinite(projectionY) ? Math.abs(projectionY) : Math.max(Math.abs(first.center[1] * axisY), Math.abs(second.center[1] * axisY))) || 1;
53
+ const normalizedX = Number.isFinite(projectionX) ? projectionX / scale : second.center[0] * axisX / scale - first.center[0] * axisX / scale;
54
+ const normalizedY = Number.isFinite(projectionY) ? projectionY / scale : second.center[1] * axisY / scale - first.center[1] * axisY / scale;
55
+ return Math.abs(normalizedX + normalizedY) <= ownRadius / scale + otherWidthRadius / scale + otherHeightRadius / scale + epsilon / scale;
56
+ }
57
+ function validateBox(box) {
58
+ validateVector(box.center);
59
+ validateVector(box.halfSize);
60
+ validateVector(box.direction);
61
+ if (box.halfSize[0] < 0 || box.halfSize[1] < 0) {
62
+ throw new RangeError("Box half-sizes must be nonnegative");
63
+ }
64
+ if (box.direction[0] === 0 && box.direction[1] === 0) {
65
+ throw new RangeError("Box direction must be nonzero");
66
+ }
67
+ }
68
+ function validateVector(vector) {
69
+ if (vector.length !== 2 || !Number.isFinite(vector[0]) || !Number.isFinite(vector[1])) {
70
+ throw new RangeError("Box vectors must have exactly two finite components");
71
+ }
72
+ }
73
+ //# sourceMappingURL=oriented-box-2d.cjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/culling/oriented-box-2d.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;AAyBM,SAAU,yBACd,OACA,QACA,UAAU,GAAC;AAEX,cAAY,KAAK;AACjB,cAAY,MAAM;AAClB,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,UAAU,GAAG;AAC5C,UAAM,IAAI,WAAW,yDAAyD;EAChF;AAGA,QAAM,sBAAsB,KAAK,IAAI,KAAK,IAAI,MAAM,UAAU,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,UAAU,CAAC,CAAC,CAAC;AAC/F,QAAM,uBAAuB,KAAK,IAChC,KAAK,IAAI,OAAO,UAAU,CAAC,CAAC,GAC5B,KAAK,IAAI,OAAO,UAAU,CAAC,CAAC,CAAC;AAE/B,QAAM,cAAc,MAAM,UAAU,CAAC,IAAI;AACzC,QAAM,cAAc,MAAM,UAAU,CAAC,IAAI;AACzC,QAAM,eAAe,OAAO,UAAU,CAAC,IAAI;AAC3C,QAAM,eAAe,OAAO,UAAU,CAAC,IAAI;AAC3C,QAAM,cAAc,KAAK,MAAM,aAAa,WAAW;AACvD,QAAM,eAAe,KAAK,MAAM,cAAc,YAAY;AAC1D,QAAM,SAAS,cAAc;AAC7B,QAAM,SAAS,cAAc;AAC7B,QAAM,UAAU,eAAe;AAC/B,QAAM,UAAU,eAAe;AAG/B,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,UAAU,SAAS,OAAO,CAAC;AACxE,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,UAAU,SAAS,OAAO,CAAC;AACtE,SACE,eACE,OACA,QACA,QACA,QACA,MAAM,SAAS,CAAC,GAChB,OAAO,SAAS,CAAC,IAAI,QACrB,OAAO,SAAS,CAAC,IAAI,MACrB,OAAO,KAET,eACE,OACA,QACA,CAAC,QACD,QACA,MAAM,SAAS,CAAC,GAChB,OAAO,SAAS,CAAC,IAAI,MACrB,OAAO,SAAS,CAAC,IAAI,QACrB,OAAO,KAET,eACE,OACA,QACA,SACA,SACA,OAAO,SAAS,CAAC,GACjB,MAAM,SAAS,CAAC,IAAI,QACpB,MAAM,SAAS,CAAC,IAAI,MACpB,OAAO,KAET,eACE,OACA,QACA,CAAC,SACD,SACA,OAAO,SAAS,CAAC,GACjB,MAAM,SAAS,CAAC,IAAI,MACpB,MAAM,SAAS,CAAC,IAAI,QACpB,OAAO;AAGb;AAGA,SAAS,eACP,OACA,QACA,OACA,OACA,WACA,kBACA,mBACA,SAAe;AAEf,QAAM,gBAAgB,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC;AACvD,QAAM,gBAAgB,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC;AAGvD,QAAM,cAAc,OAAO,SAAS,aAAa,IAC7C,gBAAgB,QAChB,OAAO,OAAO,CAAC,IAAI,QAAQ,MAAM,OAAO,CAAC,IAAI;AACjD,QAAM,cAAc,OAAO,SAAS,aAAa,IAC7C,gBAAgB,QAChB,OAAO,OAAO,CAAC,IAAI,QAAQ,MAAM,OAAO,CAAC,IAAI;AACjD,QAAM,QACJ,KAAK,IACH,WACA,kBACA,mBACA,SACA,OAAO,SAAS,WAAW,IACvB,KAAK,IAAI,WAAW,IACpB,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,CAAC,GAClF,OAAO,SAAS,WAAW,IACvB,KAAK,IAAI,WAAW,IACpB,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,KAChF;AACP,QAAM,cAAc,OAAO,SAAS,WAAW,IAC3C,cAAc,QACb,OAAO,OAAO,CAAC,IAAI,QAAS,QAAS,MAAM,OAAO,CAAC,IAAI,QAAS;AACrE,QAAM,cAAc,OAAO,SAAS,WAAW,IAC3C,cAAc,QACb,OAAO,OAAO,CAAC,IAAI,QAAS,QAAS,MAAM,OAAO,CAAC,IAAI,QAAS;AACrE,SACE,KAAK,IAAI,cAAc,WAAW,KAClC,YAAY,QAAQ,mBAAmB,QAAQ,oBAAoB,QAAQ,UAAU;AAEzF;AAGA,SAAS,YAAY,KAAkB;AACrC,iBAAe,IAAI,MAAM;AACzB,iBAAe,IAAI,QAAQ;AAC3B,iBAAe,IAAI,SAAS;AAC5B,MAAI,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,SAAS,CAAC,IAAI,GAAG;AAC9C,UAAM,IAAI,WAAW,oCAAoC;EAC3D;AACA,MAAI,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,GAAG;AACpD,UAAM,IAAI,WAAW,+BAA+B;EACtD;AACF;AAGA,SAAS,eAAe,QAAmC;AACzD,MAAI,OAAO,WAAW,KAAK,CAAC,OAAO,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,OAAO,CAAC,CAAC,GAAG;AACrF,UAAM,IAAI,WAAW,qDAAqD;EAC5E;AACF;",
5
+ "names": []
6
+ }
@@ -0,0 +1,22 @@
1
+ /** A rectangle in a shared two-dimensional Euclidean coordinate space. */
2
+ export type OrientedBox2D = {
3
+ /** Two finite center coordinates; arrays, typed arrays and core vectors are accepted. */
4
+ readonly center: Readonly<ArrayLike<number>>;
5
+ /** Nonnegative half-width and half-height, in the center's coordinate units. */
6
+ readonly halfSize: Readonly<ArrayLike<number>>;
7
+ /** Nonzero finite width-axis direction. Its magnitude does not change the size. */
8
+ readonly direction: Readonly<ArrayLike<number>>;
9
+ };
10
+ /** Test closed rectangles using their four separating axes, without allocating query objects.
11
+ * Directions are normalized locally; the height axis is the perpendicular of the width axis.
12
+ * Points and line segments (zero half-sizes) are supported. Inputs are never modified.
13
+ * Subtracting centers before projection avoids projecting large translated corner coordinates.
14
+ * @param first First rectangle in the shared coordinate space.
15
+ * @param second Second rectangle in the shared coordinate space.
16
+ * @param epsilon Nonnegative finite separation allowance in coordinate units; default zero.
17
+ * Touching edges/vertices intersect. A gap no larger than epsilon on every tested axis also
18
+ * intersects; this is a SAT allowance, not a Euclidean-distance query.
19
+ * @throws RangeError For invalid vectors, sizes, directions or epsilon.
20
+ */
21
+ export declare function intersectOrientedBoxes2D(first: OrientedBox2D, second: OrientedBox2D, epsilon?: number): boolean;
22
+ //# sourceMappingURL=oriented-box-2d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oriented-box-2d.d.ts","sourceRoot":"","sources":["../../src/culling/oriented-box-2d.ts"],"names":[],"mappings":"AAIA,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG;IAC1B,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;CACjD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,aAAa,EACrB,OAAO,SAAI,GACV,OAAO,CAqET"}
@@ -0,0 +1,86 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
4
+ /** Test closed rectangles using their four separating axes, without allocating query objects.
5
+ * Directions are normalized locally; the height axis is the perpendicular of the width axis.
6
+ * Points and line segments (zero half-sizes) are supported. Inputs are never modified.
7
+ * Subtracting centers before projection avoids projecting large translated corner coordinates.
8
+ * @param first First rectangle in the shared coordinate space.
9
+ * @param second Second rectangle in the shared coordinate space.
10
+ * @param epsilon Nonnegative finite separation allowance in coordinate units; default zero.
11
+ * Touching edges/vertices intersect. A gap no larger than epsilon on every tested axis also
12
+ * intersects; this is a SAT allowance, not a Euclidean-distance query.
13
+ * @throws RangeError For invalid vectors, sizes, directions or epsilon.
14
+ */
15
+ export function intersectOrientedBoxes2D(first, second, epsilon = 0) {
16
+ validateBox(first);
17
+ validateBox(second);
18
+ if (!Number.isFinite(epsilon) || epsilon < 0) {
19
+ throw new RangeError('Box separation allowance must be finite and nonnegative');
20
+ }
21
+ // Scale before normalizing so both huge and subnormal directions remain usable.
22
+ const firstDirectionScale = Math.max(Math.abs(first.direction[0]), Math.abs(first.direction[1]));
23
+ const secondDirectionScale = Math.max(Math.abs(second.direction[0]), Math.abs(second.direction[1]));
24
+ const firstWidthX = first.direction[0] / firstDirectionScale;
25
+ const firstWidthY = first.direction[1] / firstDirectionScale;
26
+ const secondWidthX = second.direction[0] / secondDirectionScale;
27
+ const secondWidthY = second.direction[1] / secondDirectionScale;
28
+ const firstLength = Math.hypot(firstWidthX, firstWidthY);
29
+ const secondLength = Math.hypot(secondWidthX, secondWidthY);
30
+ const firstX = firstWidthX / firstLength;
31
+ const firstY = firstWidthY / firstLength;
32
+ const secondX = secondWidthX / secondLength;
33
+ const secondY = secondWidthY / secondLength;
34
+ // Clamp unit-axis dot products against rounding slightly above one.
35
+ const cosine = Math.min(1, Math.abs(firstX * secondX + firstY * secondY));
36
+ const sine = Math.min(1, Math.abs(firstX * secondY - firstY * secondX));
37
+ return (overlapsOnAxis(first, second, firstX, firstY, first.halfSize[0], second.halfSize[0] * cosine, second.halfSize[1] * sine, epsilon) &&
38
+ overlapsOnAxis(first, second, -firstY, firstX, first.halfSize[1], second.halfSize[0] * sine, second.halfSize[1] * cosine, epsilon) &&
39
+ overlapsOnAxis(first, second, secondX, secondY, second.halfSize[0], first.halfSize[0] * cosine, first.halfSize[1] * sine, epsilon) &&
40
+ overlapsOnAxis(first, second, -secondY, secondX, second.halfSize[1], first.halfSize[0] * sine, first.halfSize[1] * cosine, epsilon));
41
+ }
42
+ /** Scale each projection independently so an irrelevant huge extent cannot erase a small gap. */
43
+ function overlapsOnAxis(first, second, axisX, axisY, ownRadius, otherWidthRadius, otherHeightRadius, epsilon) {
44
+ const displacementX = second.center[0] - first.center[0];
45
+ const displacementY = second.center[1] - first.center[1];
46
+ // Keep a representable center difference before multiplying. If subtraction overflows,
47
+ // project the finite centers first; a zero axis component then stays exactly zero.
48
+ const projectionX = Number.isFinite(displacementX)
49
+ ? displacementX * axisX
50
+ : second.center[0] * axisX - first.center[0] * axisX;
51
+ const projectionY = Number.isFinite(displacementY)
52
+ ? displacementY * axisY
53
+ : second.center[1] * axisY - first.center[1] * axisY;
54
+ const scale = Math.max(ownRadius, otherWidthRadius, otherHeightRadius, epsilon, Number.isFinite(projectionX)
55
+ ? Math.abs(projectionX)
56
+ : Math.max(Math.abs(first.center[0] * axisX), Math.abs(second.center[0] * axisX)), Number.isFinite(projectionY)
57
+ ? Math.abs(projectionY)
58
+ : Math.max(Math.abs(first.center[1] * axisY), Math.abs(second.center[1] * axisY))) || 1;
59
+ const normalizedX = Number.isFinite(projectionX)
60
+ ? projectionX / scale
61
+ : (second.center[0] * axisX) / scale - (first.center[0] * axisX) / scale;
62
+ const normalizedY = Number.isFinite(projectionY)
63
+ ? projectionY / scale
64
+ : (second.center[1] * axisY) / scale - (first.center[1] * axisY) / scale;
65
+ return (Math.abs(normalizedX + normalizedY) <=
66
+ ownRadius / scale + otherWidthRadius / scale + otherHeightRadius / scale + epsilon / scale);
67
+ }
68
+ /** Validate structural boxes before entering the scalar query kernel. */
69
+ function validateBox(box) {
70
+ validateVector(box.center);
71
+ validateVector(box.halfSize);
72
+ validateVector(box.direction);
73
+ if (box.halfSize[0] < 0 || box.halfSize[1] < 0) {
74
+ throw new RangeError('Box half-sizes must be nonnegative');
75
+ }
76
+ if (box.direction[0] === 0 && box.direction[1] === 0) {
77
+ throw new RangeError('Box direction must be nonzero');
78
+ }
79
+ }
80
+ /** Require exactly two finite components, without copying the vector. */
81
+ function validateVector(vector) {
82
+ if (vector.length !== 2 || !Number.isFinite(vector[0]) || !Number.isFinite(vector[1])) {
83
+ throw new RangeError('Box vectors must have exactly two finite components');
84
+ }
85
+ }
86
+ //# sourceMappingURL=oriented-box-2d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oriented-box-2d.js","sourceRoot":"","sources":["../../src/culling/oriented-box-2d.ts"],"names":[],"mappings":"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"}