@loaders.gl/pointclouds 0.0.0-stage → 5.0.0-beta.10

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 (511) hide show
  1. package/LAS-README.md +12 -0
  2. package/LICENSE +24 -0
  3. package/PCD-README.md +12 -0
  4. package/PLY-README.md +38 -0
  5. package/README.md +11 -2
  6. package/THIRD-PARTY-NOTICES.md +27 -0
  7. package/dist/dist.dev.js +31514 -0
  8. package/dist/dist.min.js +54 -0
  9. package/dist/index.cjs +55 -0
  10. package/dist/index.cjs.map +7 -0
  11. package/dist/index.d.ts +16 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +13 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/las/bundled.cjs +69 -0
  16. package/dist/las/bundled.cjs.map +7 -0
  17. package/dist/las/bundled.d.ts +11 -0
  18. package/dist/las/bundled.d.ts.map +1 -0
  19. package/dist/las/bundled.js +11 -0
  20. package/dist/las/bundled.js.map +1 -0
  21. package/dist/las/index.cjs +75 -0
  22. package/dist/las/index.cjs.map +7 -0
  23. package/dist/las/index.d.ts +15 -0
  24. package/dist/las/index.d.ts.map +1 -0
  25. package/dist/las/index.js +12 -0
  26. package/dist/las/index.js.map +1 -0
  27. package/dist/las/las-copc-loader-types.cjs +49 -0
  28. package/dist/las/las-copc-loader-types.cjs.map +7 -0
  29. package/dist/las/las-copc-loader-types.d.ts +67 -0
  30. package/dist/las/las-copc-loader-types.d.ts.map +1 -0
  31. package/dist/las/las-copc-loader-types.js +14 -0
  32. package/dist/las/las-copc-loader-types.js.map +1 -0
  33. package/dist/las/las-copc-loader.cjs +60 -0
  34. package/dist/las/las-copc-loader.cjs.map +7 -0
  35. package/dist/las/las-copc-loader.d.ts +39 -0
  36. package/dist/las/las-copc-loader.d.ts.map +1 -0
  37. package/dist/las/las-copc-loader.js +45 -0
  38. package/dist/las/las-copc-loader.js.map +1 -0
  39. package/dist/las/las-format.cjs +44 -0
  40. package/dist/las/las-format.cjs.map +7 -0
  41. package/dist/las/las-format.d.ts +16 -0
  42. package/dist/las/las-format.d.ts.map +1 -0
  43. package/dist/las/las-format.js +19 -0
  44. package/dist/las/las-format.js.map +1 -0
  45. package/dist/las/las-loader-shared.cjs +84 -0
  46. package/dist/las/las-loader-shared.cjs.map +7 -0
  47. package/dist/las/las-loader-shared.d.ts +68 -0
  48. package/dist/las/las-loader-shared.d.ts.map +1 -0
  49. package/dist/las/las-loader-shared.js +60 -0
  50. package/dist/las/las-loader-shared.js.map +1 -0
  51. package/dist/las/las-loader-types.cjs +51 -0
  52. package/dist/las/las-loader-types.cjs.map +7 -0
  53. package/dist/las/las-loader-types.d.ts +77 -0
  54. package/dist/las/las-loader-types.d.ts.map +1 -0
  55. package/dist/las/las-loader-types.js +17 -0
  56. package/dist/las/las-loader-types.js.map +1 -0
  57. package/dist/las/las-loader.cjs +128 -0
  58. package/dist/las/las-loader.cjs.map +7 -0
  59. package/dist/las/las-loader.d.ts +91 -0
  60. package/dist/las/las-loader.d.ts.map +1 -0
  61. package/dist/las/las-loader.js +108 -0
  62. package/dist/las/las-loader.js.map +1 -0
  63. package/dist/las/las-writer.cjs +1054 -0
  64. package/dist/las/las-writer.cjs.map +7 -0
  65. package/dist/las/las-writer.d.ts +70 -0
  66. package/dist/las/las-writer.d.ts.map +1 -0
  67. package/dist/las/las-writer.js +992 -0
  68. package/dist/las/las-writer.js.map +1 -0
  69. package/dist/las/laz-rs-loader-types.cjs +49 -0
  70. package/dist/las/laz-rs-loader-types.cjs.map +7 -0
  71. package/dist/las/laz-rs-loader-types.d.ts +69 -0
  72. package/dist/las/laz-rs-loader-types.d.ts.map +1 -0
  73. package/dist/las/laz-rs-loader-types.js +16 -0
  74. package/dist/las/laz-rs-loader-types.js.map +1 -0
  75. package/dist/las/laz-rs-loader.cjs +275 -0
  76. package/dist/las/laz-rs-loader.cjs.map +7 -0
  77. package/dist/las/laz-rs-loader.d.ts +39 -0
  78. package/dist/las/laz-rs-loader.d.ts.map +1 -0
  79. package/dist/las/laz-rs-loader.js +43 -0
  80. package/dist/las/laz-rs-loader.js.map +1 -0
  81. package/dist/las/lazperf-loader-types.cjs +49 -0
  82. package/dist/las/lazperf-loader-types.cjs.map +7 -0
  83. package/dist/las/lazperf-loader-types.d.ts +71 -0
  84. package/dist/las/lazperf-loader-types.d.ts.map +1 -0
  85. package/dist/las/lazperf-loader-types.js +17 -0
  86. package/dist/las/lazperf-loader-types.js.map +1 -0
  87. package/dist/las/lazperf-loader.cjs +63 -0
  88. package/dist/las/lazperf-loader.cjs.map +7 -0
  89. package/dist/las/lazperf-loader.d.ts +41 -0
  90. package/dist/las/lazperf-loader.d.ts.map +1 -0
  91. package/dist/las/lazperf-loader.js +49 -0
  92. package/dist/las/lazperf-loader.js.map +1 -0
  93. package/dist/las/lib/copc/parse-las.cjs +177 -0
  94. package/dist/las/lib/copc/parse-las.cjs.map +7 -0
  95. package/dist/las/lib/copc/parse-las.d.ts +17 -0
  96. package/dist/las/lib/copc/parse-las.d.ts.map +1 -0
  97. package/dist/las/lib/copc/parse-las.js +215 -0
  98. package/dist/las/lib/copc/parse-las.js.map +1 -0
  99. package/dist/las/lib/get-las-schema.cjs +67 -0
  100. package/dist/las/lib/get-las-schema.cjs.map +7 -0
  101. package/dist/las/lib/get-las-schema.d.ts +16 -0
  102. package/dist/las/lib/get-las-schema.d.ts.map +1 -0
  103. package/dist/las/lib/get-las-schema.js +52 -0
  104. package/dist/las/lib/get-las-schema.js.map +1 -0
  105. package/dist/las/lib/las-compatibility.cjs +110 -0
  106. package/dist/las/lib/las-compatibility.cjs.map +7 -0
  107. package/dist/las/lib/las-compatibility.d.ts +40 -0
  108. package/dist/las/lib/las-compatibility.d.ts.map +1 -0
  109. package/dist/las/lib/las-compatibility.js +115 -0
  110. package/dist/las/lib/las-compatibility.js.map +1 -0
  111. package/dist/las/lib/las-extra-bytes.cjs +228 -0
  112. package/dist/las/lib/las-extra-bytes.cjs.map +7 -0
  113. package/dist/las/lib/las-extra-bytes.d.ts +35 -0
  114. package/dist/las/lib/las-extra-bytes.d.ts.map +1 -0
  115. package/dist/las/lib/las-extra-bytes.js +197 -0
  116. package/dist/las/lib/las-extra-bytes.js.map +1 -0
  117. package/dist/las/lib/las-types.cjs +19 -0
  118. package/dist/las/lib/las-types.cjs.map +7 -0
  119. package/dist/las/lib/las-types.d.ts +194 -0
  120. package/dist/las/lib/las-types.d.ts.map +1 -0
  121. package/dist/las/lib/las-types.js +5 -0
  122. package/dist/las/lib/las-types.js.map +1 -0
  123. package/dist/las/lib/las-waveform.cjs +196 -0
  124. package/dist/las/lib/las-waveform.cjs.map +7 -0
  125. package/dist/las/lib/las-waveform.d.ts +89 -0
  126. package/dist/las/lib/las-waveform.d.ts.map +1 -0
  127. package/dist/las/lib/las-waveform.js +193 -0
  128. package/dist/las/lib/las-waveform.js.map +1 -0
  129. package/dist/las/lib/laz-perf/laslaz-decoder.cjs +382 -0
  130. package/dist/las/lib/laz-perf/laslaz-decoder.cjs.map +7 -0
  131. package/dist/las/lib/laz-perf/laslaz-decoder.d.ts +129 -0
  132. package/dist/las/lib/laz-perf/laslaz-decoder.d.ts.map +1 -0
  133. package/dist/las/lib/laz-perf/laslaz-decoder.js +377 -0
  134. package/dist/las/lib/laz-perf/laslaz-decoder.js.map +1 -0
  135. package/dist/las/lib/laz-perf/parse-las.cjs +271 -0
  136. package/dist/las/lib/laz-perf/parse-las.cjs.map +7 -0
  137. package/dist/las/lib/laz-perf/parse-las.d.ts +24 -0
  138. package/dist/las/lib/laz-perf/parse-las.d.ts.map +1 -0
  139. package/dist/las/lib/laz-perf/parse-las.js +308 -0
  140. package/dist/las/lib/laz-perf/parse-las.js.map +1 -0
  141. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.cjs +631 -0
  142. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.cjs.map +7 -0
  143. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.d.ts +129 -0
  144. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.d.ts.map +1 -0
  145. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.js +414 -0
  146. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.js.map +1 -0
  147. package/dist/las/lib/laz-rs-wasm/parse-las.cjs +271 -0
  148. package/dist/las/lib/laz-rs-wasm/parse-las.cjs.map +7 -0
  149. package/dist/las/lib/laz-rs-wasm/parse-las.d.ts +24 -0
  150. package/dist/las/lib/laz-rs-wasm/parse-las.d.ts.map +1 -0
  151. package/dist/las/lib/laz-rs-wasm/parse-las.js +308 -0
  152. package/dist/las/lib/laz-rs-wasm/parse-las.js.map +1 -0
  153. package/dist/las/lib/typescript/parse-las.cjs +2889 -0
  154. package/dist/las/lib/typescript/parse-las.cjs.map +7 -0
  155. package/dist/las/lib/typescript/parse-las.d.ts +39 -0
  156. package/dist/las/lib/typescript/parse-las.d.ts.map +1 -0
  157. package/dist/las/lib/typescript/parse-las.js +2703 -0
  158. package/dist/las/lib/typescript/parse-las.js.map +1 -0
  159. package/dist/las/libs/laz-perf/laz-perf.cjs +18093 -0
  160. package/dist/las/libs/laz-perf/laz-perf.cjs.map +7 -0
  161. package/dist/las/libs/laz-perf/laz-perf.d.ts +2 -0
  162. package/dist/las/libs/laz-perf/laz-perf.d.ts.map +1 -0
  163. package/dist/las/libs/laz-perf/laz-perf.js +19003 -0
  164. package/dist/las/libs/laz-perf/laz-perf.js.map +1 -0
  165. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts +95 -0
  166. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts.map +1 -0
  167. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.js +442 -0
  168. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.js.map +1 -0
  169. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm +0 -0
  170. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm.d.ts +38 -0
  171. package/dist/las/unbundled.cjs +69 -0
  172. package/dist/las/unbundled.cjs.map +7 -0
  173. package/dist/las/unbundled.d.ts +11 -0
  174. package/dist/las/unbundled.d.ts.map +1 -0
  175. package/dist/las/unbundled.js +11 -0
  176. package/dist/las/unbundled.js.map +1 -0
  177. package/dist/las/workers/las-worker.cjs +23 -0
  178. package/dist/las/workers/las-worker.cjs.map +7 -0
  179. package/dist/las/workers/las-worker.d.ts +2 -0
  180. package/dist/las/workers/las-worker.d.ts.map +1 -0
  181. package/dist/las/workers/las-worker.js +23 -0
  182. package/dist/las/workers/las-worker.js.map +1 -0
  183. package/dist/las-copc-loader-types.cjs +51 -0
  184. package/dist/las-copc-loader-types.cjs.map +7 -0
  185. package/dist/las-copc-loader-types.d.ts +2 -0
  186. package/dist/las-copc-loader-types.d.ts.map +1 -0
  187. package/dist/las-copc-loader-types.js +2 -0
  188. package/dist/las-copc-loader-types.js.map +1 -0
  189. package/dist/las-copc-loader.cjs +62 -0
  190. package/dist/las-copc-loader.cjs.map +7 -0
  191. package/dist/las-copc-loader.d.ts +2 -0
  192. package/dist/las-copc-loader.d.ts.map +1 -0
  193. package/dist/las-copc-loader.js +2 -0
  194. package/dist/las-copc-loader.js.map +1 -0
  195. package/dist/las-loader-types.cjs +53 -0
  196. package/dist/las-loader-types.cjs.map +7 -0
  197. package/dist/las-loader-types.d.ts +2 -0
  198. package/dist/las-loader-types.d.ts.map +1 -0
  199. package/dist/las-loader-types.js +2 -0
  200. package/dist/las-loader-types.js.map +1 -0
  201. package/dist/las-loader.cjs +130 -0
  202. package/dist/las-loader.cjs.map +7 -0
  203. package/dist/las-loader.d.ts +2 -0
  204. package/dist/las-loader.d.ts.map +1 -0
  205. package/dist/las-loader.js +2 -0
  206. package/dist/las-loader.js.map +1 -0
  207. package/dist/las-worker.js +24024 -0
  208. package/dist/las-writer.cjs +1056 -0
  209. package/dist/las-writer.cjs.map +7 -0
  210. package/dist/las-writer.d.ts +2 -0
  211. package/dist/las-writer.d.ts.map +1 -0
  212. package/dist/las-writer.js +2 -0
  213. package/dist/las-writer.js.map +1 -0
  214. package/dist/laz-rs-loader-types.cjs +51 -0
  215. package/dist/laz-rs-loader-types.cjs.map +7 -0
  216. package/dist/laz-rs-loader-types.d.ts +2 -0
  217. package/dist/laz-rs-loader-types.d.ts.map +1 -0
  218. package/dist/laz-rs-loader-types.js +2 -0
  219. package/dist/laz-rs-loader-types.js.map +1 -0
  220. package/dist/laz-rs-loader.cjs +277 -0
  221. package/dist/laz-rs-loader.cjs.map +7 -0
  222. package/dist/laz-rs-loader.d.ts +2 -0
  223. package/dist/laz-rs-loader.d.ts.map +1 -0
  224. package/dist/laz-rs-loader.js +2 -0
  225. package/dist/laz-rs-loader.js.map +1 -0
  226. package/dist/lazperf-loader-types.cjs +51 -0
  227. package/dist/lazperf-loader-types.cjs.map +7 -0
  228. package/dist/lazperf-loader-types.d.ts +2 -0
  229. package/dist/lazperf-loader-types.d.ts.map +1 -0
  230. package/dist/lazperf-loader-types.js +2 -0
  231. package/dist/lazperf-loader-types.js.map +1 -0
  232. package/dist/lazperf-loader.cjs +65 -0
  233. package/dist/lazperf-loader.cjs.map +7 -0
  234. package/dist/lazperf-loader.d.ts +2 -0
  235. package/dist/lazperf-loader.d.ts.map +1 -0
  236. package/dist/lazperf-loader.js +2 -0
  237. package/dist/lazperf-loader.js.map +1 -0
  238. package/dist/pcd/bundled.cjs +31 -0
  239. package/dist/pcd/bundled.cjs.map +7 -0
  240. package/dist/pcd/bundled.d.ts +3 -0
  241. package/dist/pcd/bundled.d.ts.map +1 -0
  242. package/dist/pcd/bundled.js +5 -0
  243. package/dist/pcd/bundled.js.map +1 -0
  244. package/dist/pcd/index.cjs +37 -0
  245. package/dist/pcd/index.cjs.map +7 -0
  246. package/dist/pcd/index.d.ts +6 -0
  247. package/dist/pcd/index.d.ts.map +1 -0
  248. package/dist/pcd/index.js +7 -0
  249. package/dist/pcd/index.js.map +1 -0
  250. package/dist/pcd/lib/decompress-lzf.cjs +80 -0
  251. package/dist/pcd/lib/decompress-lzf.cjs.map +7 -0
  252. package/dist/pcd/lib/decompress-lzf.d.ts +7 -0
  253. package/dist/pcd/lib/decompress-lzf.d.ts.map +1 -0
  254. package/dist/pcd/lib/decompress-lzf.js +62 -0
  255. package/dist/pcd/lib/decompress-lzf.js.map +1 -0
  256. package/dist/pcd/lib/get-pcd-schema.cjs +70 -0
  257. package/dist/pcd/lib/get-pcd-schema.cjs.map +7 -0
  258. package/dist/pcd/lib/get-pcd-schema.d.ts +10 -0
  259. package/dist/pcd/lib/get-pcd-schema.d.ts.map +1 -0
  260. package/dist/pcd/lib/get-pcd-schema.js +53 -0
  261. package/dist/pcd/lib/get-pcd-schema.js.map +1 -0
  262. package/dist/pcd/lib/parse-pcd.cjs +354 -0
  263. package/dist/pcd/lib/parse-pcd.cjs.map +7 -0
  264. package/dist/pcd/lib/parse-pcd.d.ts +20 -0
  265. package/dist/pcd/lib/parse-pcd.d.ts.map +1 -0
  266. package/dist/pcd/lib/parse-pcd.js +341 -0
  267. package/dist/pcd/lib/parse-pcd.js.map +1 -0
  268. package/dist/pcd/lib/pcd-types.cjs +19 -0
  269. package/dist/pcd/lib/pcd-types.cjs.map +7 -0
  270. package/dist/pcd/lib/pcd-types.d.ts +31 -0
  271. package/dist/pcd/lib/pcd-types.d.ts.map +1 -0
  272. package/dist/pcd/lib/pcd-types.js +5 -0
  273. package/dist/pcd/lib/pcd-types.js.map +1 -0
  274. package/dist/pcd/pcd-format.cjs +42 -0
  275. package/dist/pcd/pcd-format.cjs.map +7 -0
  276. package/dist/pcd/pcd-format.d.ts +16 -0
  277. package/dist/pcd/pcd-format.d.ts.map +1 -0
  278. package/dist/pcd/pcd-format.js +19 -0
  279. package/dist/pcd/pcd-format.js.map +1 -0
  280. package/dist/pcd/pcd-loader-types.cjs +63 -0
  281. package/dist/pcd/pcd-loader-types.cjs.map +7 -0
  282. package/dist/pcd/pcd-loader-types.d.ts +82 -0
  283. package/dist/pcd/pcd-loader-types.d.ts.map +1 -0
  284. package/dist/pcd/pcd-loader-types.js +35 -0
  285. package/dist/pcd/pcd-loader-types.js.map +1 -0
  286. package/dist/pcd/pcd-loader.cjs +201 -0
  287. package/dist/pcd/pcd-loader.cjs.map +7 -0
  288. package/dist/pcd/pcd-loader.d.ts +80 -0
  289. package/dist/pcd/pcd-loader.d.ts.map +1 -0
  290. package/dist/pcd/pcd-loader.js +179 -0
  291. package/dist/pcd/pcd-loader.js.map +1 -0
  292. package/dist/pcd/pcd-writer.cjs +134 -0
  293. package/dist/pcd/pcd-writer.cjs.map +7 -0
  294. package/dist/pcd/pcd-writer.d.ts +38 -0
  295. package/dist/pcd/pcd-writer.d.ts.map +1 -0
  296. package/dist/pcd/pcd-writer.js +115 -0
  297. package/dist/pcd/pcd-writer.js.map +1 -0
  298. package/dist/pcd/unbundled.cjs +31 -0
  299. package/dist/pcd/unbundled.cjs.map +7 -0
  300. package/dist/pcd/unbundled.d.ts +3 -0
  301. package/dist/pcd/unbundled.d.ts.map +1 -0
  302. package/dist/pcd/unbundled.js +5 -0
  303. package/dist/pcd/unbundled.js.map +1 -0
  304. package/dist/pcd/workers/pcd-worker.cjs +23 -0
  305. package/dist/pcd/workers/pcd-worker.cjs.map +7 -0
  306. package/dist/pcd/workers/pcd-worker.d.ts +2 -0
  307. package/dist/pcd/workers/pcd-worker.d.ts.map +1 -0
  308. package/dist/pcd/workers/pcd-worker.js +23 -0
  309. package/dist/pcd/workers/pcd-worker.js.map +1 -0
  310. package/dist/pcd-loader-types.cjs +65 -0
  311. package/dist/pcd-loader-types.cjs.map +7 -0
  312. package/dist/pcd-loader-types.d.ts +2 -0
  313. package/dist/pcd-loader-types.d.ts.map +1 -0
  314. package/dist/pcd-loader-types.js +2 -0
  315. package/dist/pcd-loader-types.js.map +1 -0
  316. package/dist/pcd-loader.cjs +203 -0
  317. package/dist/pcd-loader.cjs.map +7 -0
  318. package/dist/pcd-loader.d.ts +2 -0
  319. package/dist/pcd-loader.d.ts.map +1 -0
  320. package/dist/pcd-loader.js +2 -0
  321. package/dist/pcd-loader.js.map +1 -0
  322. package/dist/pcd-worker.js +18561 -0
  323. package/dist/pcd-writer.cjs +136 -0
  324. package/dist/pcd-writer.cjs.map +7 -0
  325. package/dist/pcd-writer.d.ts +2 -0
  326. package/dist/pcd-writer.d.ts.map +1 -0
  327. package/dist/pcd-writer.js +2 -0
  328. package/dist/pcd-writer.js.map +1 -0
  329. package/dist/ply/bundled.cjs +31 -0
  330. package/dist/ply/bundled.cjs.map +7 -0
  331. package/dist/ply/bundled.d.ts +3 -0
  332. package/dist/ply/bundled.d.ts.map +1 -0
  333. package/dist/ply/bundled.js +5 -0
  334. package/dist/ply/bundled.js.map +1 -0
  335. package/dist/ply/index.cjs +37 -0
  336. package/dist/ply/index.cjs.map +7 -0
  337. package/dist/ply/index.d.ts +6 -0
  338. package/dist/ply/index.d.ts.map +1 -0
  339. package/dist/ply/index.js +8 -0
  340. package/dist/ply/index.js.map +1 -0
  341. package/dist/ply/lib/get-ply-schema.cjs +128 -0
  342. package/dist/ply/lib/get-ply-schema.cjs.map +7 -0
  343. package/dist/ply/lib/get-ply-schema.d.ts +16 -0
  344. package/dist/ply/lib/get-ply-schema.d.ts.map +1 -0
  345. package/dist/ply/lib/get-ply-schema.js +117 -0
  346. package/dist/ply/lib/get-ply-schema.js.map +1 -0
  347. package/dist/ply/lib/normalize-ply.cjs +96 -0
  348. package/dist/ply/lib/normalize-ply.cjs.map +7 -0
  349. package/dist/ply/lib/normalize-ply.d.ts +8 -0
  350. package/dist/ply/lib/normalize-ply.d.ts.map +1 -0
  351. package/dist/ply/lib/normalize-ply.js +89 -0
  352. package/dist/ply/lib/normalize-ply.js.map +1 -0
  353. package/dist/ply/lib/parse-ply-arrow.cjs +552 -0
  354. package/dist/ply/lib/parse-ply-arrow.cjs.map +7 -0
  355. package/dist/ply/lib/parse-ply-arrow.d.ts +25 -0
  356. package/dist/ply/lib/parse-ply-arrow.d.ts.map +1 -0
  357. package/dist/ply/lib/parse-ply-arrow.js +493 -0
  358. package/dist/ply/lib/parse-ply-arrow.js.map +1 -0
  359. package/dist/ply/lib/parse-ply-in-batches.cjs +613 -0
  360. package/dist/ply/lib/parse-ply-in-batches.cjs.map +7 -0
  361. package/dist/ply/lib/parse-ply-in-batches.d.ts +9 -0
  362. package/dist/ply/lib/parse-ply-in-batches.d.ts.map +1 -0
  363. package/dist/ply/lib/parse-ply-in-batches.js +630 -0
  364. package/dist/ply/lib/parse-ply-in-batches.js.map +1 -0
  365. package/dist/ply/lib/parse-ply.cjs +758 -0
  366. package/dist/ply/lib/parse-ply.cjs.map +7 -0
  367. package/dist/ply/lib/parse-ply.d.ts +69 -0
  368. package/dist/ply/lib/parse-ply.d.ts.map +1 -0
  369. package/dist/ply/lib/parse-ply.js +855 -0
  370. package/dist/ply/lib/parse-ply.js.map +1 -0
  371. package/dist/ply/lib/ply-types.cjs +19 -0
  372. package/dist/ply/lib/ply-types.cjs.map +7 -0
  373. package/dist/ply/lib/ply-types.d.ts +37 -0
  374. package/dist/ply/lib/ply-types.d.ts.map +1 -0
  375. package/dist/ply/lib/ply-types.js +2 -0
  376. package/dist/ply/lib/ply-types.js.map +1 -0
  377. package/dist/ply/ply-format.cjs +43 -0
  378. package/dist/ply/ply-format.cjs.map +7 -0
  379. package/dist/ply/ply-format.d.ts +18 -0
  380. package/dist/ply/ply-format.d.ts.map +1 -0
  381. package/dist/ply/ply-format.js +22 -0
  382. package/dist/ply/ply-format.js.map +1 -0
  383. package/dist/ply/ply-loader-types.cjs +64 -0
  384. package/dist/ply/ply-loader-types.cjs.map +7 -0
  385. package/dist/ply/ply-loader-types.d.ts +88 -0
  386. package/dist/ply/ply-loader-types.d.ts.map +1 -0
  387. package/dist/ply/ply-loader-types.js +38 -0
  388. package/dist/ply/ply-loader-types.js.map +1 -0
  389. package/dist/ply/ply-loader.cjs +192 -0
  390. package/dist/ply/ply-loader.cjs.map +7 -0
  391. package/dist/ply/ply-loader.d.ts +81 -0
  392. package/dist/ply/ply-loader.d.ts.map +1 -0
  393. package/dist/ply/ply-loader.js +173 -0
  394. package/dist/ply/ply-loader.js.map +1 -0
  395. package/dist/ply/ply-writer.cjs +175 -0
  396. package/dist/ply/ply-writer.cjs.map +7 -0
  397. package/dist/ply/ply-writer.d.ts +38 -0
  398. package/dist/ply/ply-writer.d.ts.map +1 -0
  399. package/dist/ply/ply-writer.js +140 -0
  400. package/dist/ply/ply-writer.js.map +1 -0
  401. package/dist/ply/unbundled.cjs +31 -0
  402. package/dist/ply/unbundled.cjs.map +7 -0
  403. package/dist/ply/unbundled.d.ts +3 -0
  404. package/dist/ply/unbundled.d.ts.map +1 -0
  405. package/dist/ply/unbundled.js +5 -0
  406. package/dist/ply/unbundled.js.map +1 -0
  407. package/dist/ply/workers/ply-worker.cjs +34 -0
  408. package/dist/ply/workers/ply-worker.cjs.map +7 -0
  409. package/dist/ply/workers/ply-worker.d.ts +2 -0
  410. package/dist/ply/workers/ply-worker.d.ts.map +1 -0
  411. package/dist/ply/workers/ply-worker.js +37 -0
  412. package/dist/ply/workers/ply-worker.js.map +1 -0
  413. package/dist/ply-loader-types.cjs +66 -0
  414. package/dist/ply-loader-types.cjs.map +7 -0
  415. package/dist/ply-loader-types.d.ts +2 -0
  416. package/dist/ply-loader-types.d.ts.map +1 -0
  417. package/dist/ply-loader-types.js +2 -0
  418. package/dist/ply-loader-types.js.map +1 -0
  419. package/dist/ply-loader.cjs +194 -0
  420. package/dist/ply-loader.cjs.map +7 -0
  421. package/dist/ply-loader.d.ts +2 -0
  422. package/dist/ply-loader.d.ts.map +1 -0
  423. package/dist/ply-loader.js +2 -0
  424. package/dist/ply-loader.js.map +1 -0
  425. package/dist/ply-worker.js +20962 -0
  426. package/dist/ply-writer.cjs +177 -0
  427. package/dist/ply-writer.cjs.map +7 -0
  428. package/dist/ply-writer.d.ts +2 -0
  429. package/dist/ply-writer.d.ts.map +1 -0
  430. package/dist/ply-writer.js +2 -0
  431. package/dist/ply-writer.js.map +1 -0
  432. package/package.json +238 -4
  433. package/src/index.ts +19 -0
  434. package/src/las/bundled.ts +38 -0
  435. package/src/las/index.ts +66 -0
  436. package/src/las/las-copc-loader-types.ts +18 -0
  437. package/src/las/las-copc-loader.ts +61 -0
  438. package/src/las/las-format.ts +21 -0
  439. package/src/las/las-loader-shared.ts +126 -0
  440. package/src/las/las-loader-types.ts +24 -0
  441. package/src/las/las-loader.ts +163 -0
  442. package/src/las/las-writer.ts +1477 -0
  443. package/src/las/laz-rs-loader-types.ts +21 -0
  444. package/src/las/laz-rs-loader.ts +53 -0
  445. package/src/las/lazperf-loader-types.ts +22 -0
  446. package/src/las/lazperf-loader.ts +65 -0
  447. package/src/las/lib/LASZIP-LICENSE +202 -0
  448. package/src/las/lib/LASZIP-NOTICE +4 -0
  449. package/src/las/lib/copc/parse-las.ts +265 -0
  450. package/src/las/lib/get-las-schema.ts +55 -0
  451. package/src/las/lib/las-compatibility.ts +178 -0
  452. package/src/las/lib/las-extra-bytes.ts +276 -0
  453. package/src/las/lib/las-types.ts +206 -0
  454. package/src/las/lib/las-waveform.ts +292 -0
  455. package/src/las/lib/laz-perf/laslaz-decoder.ts +443 -0
  456. package/src/las/lib/laz-perf/parse-las.ts +411 -0
  457. package/src/las/lib/laz-rs-wasm/laslaz-decoder.ts +488 -0
  458. package/src/las/lib/laz-rs-wasm/parse-las.ts +411 -0
  459. package/src/las/lib/typescript/parse-las.ts +3862 -0
  460. package/src/las/libs/laz-perf/laz-perf.ts +20615 -0
  461. package/src/las/libs/laz-rs-wasm/README.md +5 -0
  462. package/src/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts +89 -0
  463. package/src/las/libs/laz-rs-wasm/laz_rs_wasm.js +497 -0
  464. package/src/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm +0 -0
  465. package/src/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm.d.ts +38 -0
  466. package/src/las/libs/laz-rs-wasm/package.json +25 -0
  467. package/src/las/unbundled.ts +38 -0
  468. package/src/las/workers/las-worker.ts +24 -0
  469. package/src/las-copc-loader-types.ts +1 -0
  470. package/src/las-copc-loader.ts +1 -0
  471. package/src/las-loader-types.ts +1 -0
  472. package/src/las-loader.ts +1 -0
  473. package/src/las-writer.ts +1 -0
  474. package/src/laz-rs-loader-types.ts +1 -0
  475. package/src/laz-rs-loader.ts +1 -0
  476. package/src/lazperf-loader-types.ts +1 -0
  477. package/src/lazperf-loader.ts +1 -0
  478. package/src/pcd/bundled.ts +6 -0
  479. package/src/pcd/index.ts +9 -0
  480. package/src/pcd/lib/decompress-lzf.ts +68 -0
  481. package/src/pcd/lib/get-pcd-schema.ts +66 -0
  482. package/src/pcd/lib/parse-pcd.ts +474 -0
  483. package/src/pcd/lib/pcd-types.ts +34 -0
  484. package/src/pcd/pcd-format.ts +21 -0
  485. package/src/pcd/pcd-loader-types.ts +52 -0
  486. package/src/pcd/pcd-loader.ts +247 -0
  487. package/src/pcd/pcd-writer.ts +156 -0
  488. package/src/pcd/unbundled.ts +6 -0
  489. package/src/pcd/workers/pcd-worker.ts +24 -0
  490. package/src/pcd-loader-types.ts +1 -0
  491. package/src/pcd-loader.ts +1 -0
  492. package/src/pcd-writer.ts +1 -0
  493. package/src/ply/bundled.ts +6 -0
  494. package/src/ply/index.ts +11 -0
  495. package/src/ply/lib/get-ply-schema.ts +133 -0
  496. package/src/ply/lib/normalize-ply.ts +110 -0
  497. package/src/ply/lib/parse-ply-arrow.ts +676 -0
  498. package/src/ply/lib/parse-ply-in-batches.ts +832 -0
  499. package/src/ply/lib/parse-ply.ts +1084 -0
  500. package/src/ply/lib/ply-types.ts +47 -0
  501. package/src/ply/ply-format.ts +24 -0
  502. package/src/ply/ply-loader-types.ts +60 -0
  503. package/src/ply/ply-loader.ts +255 -0
  504. package/src/ply/ply-writer.ts +219 -0
  505. package/src/ply/unbundled.ts +6 -0
  506. package/src/ply/workers/ply-worker.ts +40 -0
  507. package/src/ply-loader-types.ts +1 -0
  508. package/src/ply-loader.ts +1 -0
  509. package/src/ply-writer.ts +1 -0
  510. package/third-party-licenses/plasio-LICENSE +21 -0
  511. package/third-party-licenses/three-LICENSE +21 -0
@@ -0,0 +1,832 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ // PLY Loader, adapted from THREE.js (MIT license)
6
+ //
7
+ // Attributions per original THREE.js source file:
8
+ //
9
+ // @author Wei Meng / http://about.me/menway
10
+ //
11
+ // Description: A loader for PLY ASCII files (known as the Polygon File Format
12
+ // or the Stanford Triangle Format).
13
+ //
14
+ // Limitations: ASCII decoding assumes file is UTF-8.
15
+ //
16
+ // If the PLY file uses non standard property names, they can be mapped while
17
+ // loading. For example, the following maps the properties
18
+ // “diffuse_(red|green|blue)” in the file to standard color names.
19
+ //
20
+ // parsePLY(data, {
21
+ // propertyNameMapping: {
22
+ // diffuse_red: 'red',
23
+ // diffuse_green: 'green',
24
+ // diffuse_blue: 'blue'
25
+ // }
26
+ // });
27
+
28
+ import {log as loaderLog} from '@loaders.gl/core/loader-utils';
29
+ import {
30
+ makeLineIterator,
31
+ makeTextDecoderIterator,
32
+ forEach,
33
+ toArrayBufferIterator
34
+ } from '@loaders.gl/core/loader-utils';
35
+ import type {MeshArrowTable} from '@loaders.gl/core/schema';
36
+ import {updateArrowTableMetadata} from '@loaders.gl/core/schema-utils';
37
+ import {makeMetadataFromPlyHeader} from './get-ply-schema';
38
+ import normalizePLY from './normalize-ply';
39
+ import {PLYMesh, PLYHeader, PLYElement, PLYProperty, PLYAttributes} from './ply-types';
40
+ import {
41
+ getPLYBinaryPointCloudParsePlan,
42
+ parsePLYBinaryPointCloudRecordsToArrowTable,
43
+ parsePLYHeader,
44
+ type PLYBinaryPointCloudParsePlan
45
+ } from './parse-ply';
46
+ import {convertPLYElementTablesToMeshArrowTable, parsePLYToElementTables} from './parse-ply-arrow';
47
+
48
+ type MutablePLYAttributes = {[index: string]: number[]};
49
+ type ByteArray = Uint8Array<ArrayBufferLike>;
50
+ const DEFAULT_BINARY_BATCH_SIZE = 65536;
51
+ const PLY_END_HEADER = 'end_header';
52
+
53
+ /**
54
+ * PARSER
55
+ * @param iterator
56
+ * @param options
57
+ */
58
+ export async function* parsePLYInBatches(
59
+ iterator:
60
+ | AsyncIterable<ArrayBufferLike | ArrayBufferView>
61
+ | Iterable<ArrayBufferLike | ArrayBufferView>,
62
+ options: any
63
+ ): AsyncIterable<PLYMesh | MeshArrowTable> {
64
+ if (options?.shape === 'arrow') {
65
+ yield* parseBinaryPLYToArrowInBatches(iterator, options);
66
+ return;
67
+ }
68
+
69
+ const lineIterator = makeLineIterator(makeTextDecoderIterator(toArrayBufferIterator(iterator)));
70
+ const header = await parseASCIIHeader(lineIterator, options);
71
+
72
+ let attributes: PLYAttributes;
73
+ switch (header.format) {
74
+ case 'ascii':
75
+ attributes = await parseASCII(lineIterator, header);
76
+ break;
77
+ default:
78
+ throw new Error('Binary PLY can not yet be parsed in streaming mode');
79
+ // attributes = await parseBinary(lineIterator, header);
80
+ }
81
+
82
+ yield normalizePLY(header, attributes, options);
83
+ }
84
+
85
+ /** Parse PLY vertices into Arrow table batches. */
86
+ async function* parseBinaryPLYToArrowInBatches(
87
+ iterator:
88
+ | AsyncIterable<ArrayBufferLike | ArrayBufferView>
89
+ | Iterable<ArrayBufferLike | ArrayBufferView>,
90
+ options: any
91
+ ): AsyncIterable<MeshArrowTable> {
92
+ const byteIterator = toArrayBufferIterator(iterator)[Symbol.asyncIterator]();
93
+ const {header, initialBodyBytes} = await readPLYHeader(byteIterator, options);
94
+ let tables: AsyncIterable<MeshArrowTable>;
95
+ if (header.format === 'ascii') {
96
+ tables = parseASCIIPLYToArrowInBatches(byteIterator, header, initialBodyBytes, options);
97
+ } else {
98
+ const vertexElement = getVertexElement(header, options);
99
+ tables = vertexElement.properties.some(property => property.type === 'list')
100
+ ? parseBinaryVariableWidthVertexPLYToArrowInBatches(
101
+ byteIterator,
102
+ header,
103
+ initialBodyBytes,
104
+ options
105
+ )
106
+ : parseBinaryFixedWidthVertexPLYToArrowInBatches(
107
+ byteIterator,
108
+ header,
109
+ initialBodyBytes,
110
+ options
111
+ );
112
+ }
113
+ for await (const table of tables) {
114
+ yield {
115
+ ...updateArrowTableMetadata(table, makeMetadataFromPlyHeader(header)),
116
+ loaderData: header
117
+ } as MeshArrowTable;
118
+ }
119
+ }
120
+
121
+ /** Parse fixed-width binary PLY vertices into Arrow table batches. */
122
+ async function* parseBinaryFixedWidthVertexPLYToArrowInBatches(
123
+ byteIterator: AsyncIterator<ArrayBufferLike>,
124
+ header: PLYHeader,
125
+ initialBodyBytes: ByteArray,
126
+ options: any
127
+ ): AsyncIterable<MeshArrowTable> {
128
+ const vertexElement = getFixedWidthVertexElement(header, options);
129
+ const batchSize = getBatchSize(options);
130
+ const vertexStride = getPLYElementSize(vertexElement);
131
+ const parsePlan = getPLYBinaryPointCloudParsePlan(header, options);
132
+ let remainingVertices = vertexElement.count;
133
+ let pendingBytes = initialBodyBytes;
134
+
135
+ while (true) {
136
+ while (remainingVertices > 0 && Math.floor(pendingBytes.length / vertexStride) >= batchSize) {
137
+ const batchVertexCount = Math.min(batchSize, remainingVertices);
138
+ const batch = makeBinaryPLYArrowBatch(
139
+ header,
140
+ pendingBytes,
141
+ batchVertexCount,
142
+ vertexStride,
143
+ options,
144
+ parsePlan
145
+ );
146
+ pendingBytes = pendingBytes.subarray(batchVertexCount * vertexStride);
147
+ remainingVertices -= batchVertexCount;
148
+ yield batch;
149
+ }
150
+
151
+ if (options?.pointCloud && remainingVertices <= 0) {
152
+ return;
153
+ }
154
+
155
+ const {value: chunk, done} = await byteIterator.next();
156
+ if (done) {
157
+ break;
158
+ }
159
+ pendingBytes = concatenateBytes([pendingBytes, getUint8Array(chunk)]);
160
+ }
161
+
162
+ if (remainingVertices > 0) {
163
+ const batchVertexCount = Math.min(
164
+ remainingVertices,
165
+ Math.floor(pendingBytes.length / vertexStride)
166
+ );
167
+ if (batchVertexCount > 0) {
168
+ yield makeBinaryPLYArrowBatch(
169
+ header,
170
+ pendingBytes,
171
+ batchVertexCount,
172
+ vertexStride,
173
+ options,
174
+ parsePlan
175
+ );
176
+ }
177
+ }
178
+ }
179
+
180
+ /** Parse ASCII vertex PLY rows into Arrow table batches. */
181
+ async function* parseASCIIPLYToArrowInBatches(
182
+ byteIterator: AsyncIterator<ArrayBufferLike>,
183
+ header: PLYHeader,
184
+ initialBodyBytes: ByteArray,
185
+ options: any
186
+ ): AsyncIterable<MeshArrowTable> {
187
+ const vertexElement = getVertexElement(header, options);
188
+ const batchSize = getBatchSize(options);
189
+ const lineIterator = makeLineIterator(
190
+ makeTextDecoderIterator(getByteIteratorWithInitialBytes(byteIterator, initialBodyBytes))
191
+ );
192
+ let batchLines: string[] = [];
193
+ let remainingVertices = vertexElement.count;
194
+
195
+ for await (const sourceLine of lineIterator) {
196
+ const line = sourceLine.trim();
197
+ if (line === '') {
198
+ continue;
199
+ }
200
+ batchLines.push(line);
201
+ remainingVertices--;
202
+ if (batchLines.length >= batchSize) {
203
+ yield makeASCIIPLYArrowBatch(header, batchLines, options);
204
+ batchLines = [];
205
+ }
206
+ if (remainingVertices <= 0) {
207
+ break;
208
+ }
209
+ }
210
+
211
+ if (batchLines.length > 0) {
212
+ yield makeASCIIPLYArrowBatch(header, batchLines, options);
213
+ }
214
+ }
215
+
216
+ /** Parse variable-width binary vertex rows into Arrow table batches. */
217
+ async function* parseBinaryVariableWidthVertexPLYToArrowInBatches(
218
+ byteIterator: AsyncIterator<ArrayBufferLike>,
219
+ header: PLYHeader,
220
+ initialBodyBytes: ByteArray,
221
+ options: any
222
+ ): AsyncIterable<MeshArrowTable> {
223
+ const vertexElement = getVertexElement(header, options);
224
+ const batchSize = getBatchSize(options);
225
+ const littleEndian = header.format !== 'binary_big_endian';
226
+ let remainingVertices = vertexElement.count;
227
+ let pendingBytes = initialBodyBytes;
228
+ let batchBytes: ByteArray[] = [];
229
+ let batchByteLength = 0;
230
+ let batchRowCount = 0;
231
+
232
+ while (remainingVertices > 0) {
233
+ const rowByteLength = getBinaryElementRowByteLength(pendingBytes, vertexElement, littleEndian);
234
+ if (rowByteLength === null) {
235
+ const {value: chunk, done} = await byteIterator.next();
236
+ if (done) {
237
+ break;
238
+ }
239
+ pendingBytes = concatenateBytes([pendingBytes, getUint8Array(chunk)]);
240
+ continue;
241
+ }
242
+
243
+ const rowBytes = pendingBytes.subarray(0, rowByteLength);
244
+ batchBytes.push(rowBytes);
245
+ batchByteLength += rowByteLength;
246
+ batchRowCount++;
247
+ remainingVertices--;
248
+ pendingBytes = pendingBytes.subarray(rowByteLength);
249
+
250
+ if (batchRowCount >= batchSize) {
251
+ yield makeBinaryPLYArrowBatchFromRows(
252
+ header,
253
+ batchBytes,
254
+ batchByteLength,
255
+ batchRowCount,
256
+ options
257
+ );
258
+ batchBytes = [];
259
+ batchByteLength = 0;
260
+ batchRowCount = 0;
261
+ }
262
+ }
263
+
264
+ if (batchRowCount > 0) {
265
+ yield makeBinaryPLYArrowBatchFromRows(
266
+ header,
267
+ batchBytes,
268
+ batchByteLength,
269
+ batchRowCount,
270
+ options
271
+ );
272
+ }
273
+ }
274
+
275
+ /** Read and parse the PLY header from the byte stream. */
276
+ async function readPLYHeader(
277
+ iterator: AsyncIterator<ArrayBufferLike>,
278
+ options: any
279
+ ): Promise<{header: PLYHeader; initialBodyBytes: ByteArray}> {
280
+ let headerBytes: ByteArray = new Uint8Array(0);
281
+
282
+ while (true) {
283
+ const {value, done} = await iterator.next();
284
+ if (done) {
285
+ throw new Error('Incomplete PLY header');
286
+ }
287
+
288
+ headerBytes = concatenateBytes([headerBytes, getUint8Array(value)]);
289
+ const headerEnd = findHeaderEnd(headerBytes);
290
+ if (headerEnd === -1) {
291
+ continue;
292
+ }
293
+
294
+ const header = parsePLYHeader(getArrayBuffer(headerBytes.subarray(0, headerEnd)), options);
295
+ return {header, initialBodyBytes: headerBytes.subarray(headerEnd)};
296
+ }
297
+ }
298
+
299
+ /** Return the vertex element, or throw for unsupported Arrow batches. */
300
+ function getVertexElement(header: PLYHeader, options: any): PLYElement {
301
+ const vertexElement = header.elements[0];
302
+ if ((!options?.pointCloud && header.elements.length !== 1) || vertexElement?.name !== 'vertex') {
303
+ throw new Error('PLY arrow-table batch parsing requires one vertex element');
304
+ }
305
+ return vertexElement;
306
+ }
307
+
308
+ /** Return the fixed-width vertex element, or throw for unsupported binary batches. */
309
+ function getFixedWidthVertexElement(header: PLYHeader, options: any): PLYElement {
310
+ const vertexElement = header.elements[0];
311
+ if (
312
+ (!options?.pointCloud && header.elements.length !== 1) ||
313
+ vertexElement?.name !== 'vertex' ||
314
+ vertexElement.properties.some(property => property.type === 'list')
315
+ ) {
316
+ throw new Error('Binary PLY arrow-table batch parsing requires one scalar vertex element');
317
+ }
318
+ return vertexElement;
319
+ }
320
+
321
+ /** Build one Arrow table batch from pending vertex record bytes. */
322
+ function makeBinaryPLYArrowBatch(
323
+ header: PLYHeader,
324
+ pendingBytes: ByteArray,
325
+ vertexCount: number,
326
+ vertexStride: number,
327
+ options: any,
328
+ parsePlan: PLYBinaryPointCloudParsePlan | null
329
+ ): MeshArrowTable {
330
+ const vertexElement = header.elements[0];
331
+ const batchHeader = {
332
+ ...header,
333
+ headerLength: 0,
334
+ elements: [{...vertexElement, count: vertexCount}]
335
+ };
336
+ const byteLength = vertexCount * vertexStride;
337
+ const table = parsePLYBinaryPointCloudRecordsToArrowTable(
338
+ pendingBytes.subarray(0, byteLength),
339
+ batchHeader,
340
+ options,
341
+ parsePlan || undefined
342
+ );
343
+ if (!table) {
344
+ throw new Error('Failed to parse binary PLY Arrow batch');
345
+ }
346
+ return table;
347
+ }
348
+
349
+ /** Build one Arrow table batch from ASCII PLY vertex lines. */
350
+ function makeASCIIPLYArrowBatch(header: PLYHeader, lines: string[], options: any): MeshArrowTable {
351
+ const batchHeaderText = makePLYHeaderText(header, lines.length, options);
352
+ const elementTables = parsePLYToElementTables(`${batchHeaderText}${lines.join('\n')}\n`, options);
353
+ return convertPLYElementTablesToMeshArrowTable(elementTables);
354
+ }
355
+
356
+ /** Build one Arrow table batch from variable-width binary PLY vertex rows. */
357
+ function makeBinaryPLYArrowBatchFromRows(
358
+ header: PLYHeader,
359
+ rows: ByteArray[],
360
+ byteLength: number,
361
+ vertexCount: number,
362
+ options: any
363
+ ): MeshArrowTable {
364
+ const batchHeaderText = makePLYHeaderText(header, vertexCount, options);
365
+ const headerBytes = new TextEncoder().encode(batchHeaderText);
366
+ const batchBytes = new Uint8Array(headerBytes.length + byteLength);
367
+ batchBytes.set(headerBytes, 0);
368
+ let byteOffset = headerBytes.length;
369
+ for (const row of rows) {
370
+ batchBytes.set(row, byteOffset);
371
+ byteOffset += row.length;
372
+ }
373
+ const elementTables = parsePLYToElementTables(getArrayBuffer(batchBytes), options);
374
+ return convertPLYElementTablesToMeshArrowTable(elementTables);
375
+ }
376
+
377
+ /** Return binary element row byte length, or null if more bytes are needed. */
378
+ function getBinaryElementRowByteLength(
379
+ bytes: ByteArray,
380
+ element: PLYElement,
381
+ littleEndian: boolean
382
+ ): number | null {
383
+ const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
384
+ let byteOffset = 0;
385
+
386
+ for (const property of element.properties) {
387
+ if (property.type === 'list') {
388
+ const countSize = getPLYTypeSize(property.countType!);
389
+ if (byteOffset + countSize > bytes.length) {
390
+ return null;
391
+ }
392
+ const count = readBinaryScalar(dataView, byteOffset, property.countType!, littleEndian);
393
+ byteOffset += countSize;
394
+ const valuesByteLength = count * getPLYTypeSize(property.itemType!);
395
+ if (byteOffset + valuesByteLength > bytes.length) {
396
+ return null;
397
+ }
398
+ byteOffset += valuesByteLength;
399
+ } else {
400
+ const propertySize = getPLYTypeSize(property.type);
401
+ if (byteOffset + propertySize > bytes.length) {
402
+ return null;
403
+ }
404
+ byteOffset += propertySize;
405
+ }
406
+ }
407
+
408
+ return byteOffset;
409
+ }
410
+
411
+ /** Read one binary scalar value. */
412
+ // eslint-disable-next-line complexity
413
+ function readBinaryScalar(
414
+ dataView: DataView,
415
+ byteOffset: number,
416
+ type: string,
417
+ littleEndian: boolean
418
+ ): number {
419
+ switch (type) {
420
+ case 'int8':
421
+ case 'char':
422
+ return dataView.getInt8(byteOffset);
423
+ case 'uint8':
424
+ case 'uchar':
425
+ return dataView.getUint8(byteOffset);
426
+ case 'int16':
427
+ case 'short':
428
+ return dataView.getInt16(byteOffset, littleEndian);
429
+ case 'uint16':
430
+ case 'ushort':
431
+ return dataView.getUint16(byteOffset, littleEndian);
432
+ case 'int32':
433
+ case 'int':
434
+ return dataView.getInt32(byteOffset, littleEndian);
435
+ case 'uint32':
436
+ case 'uint':
437
+ return dataView.getUint32(byteOffset, littleEndian);
438
+ case 'float32':
439
+ case 'float':
440
+ return dataView.getFloat32(byteOffset, littleEndian);
441
+ case 'float64':
442
+ case 'double':
443
+ return dataView.getFloat64(byteOffset, littleEndian);
444
+ default:
445
+ throw new Error(type);
446
+ }
447
+ }
448
+
449
+ /** Rebuild a PLY header text for one emitted batch. */
450
+ function makePLYHeaderText(header: PLYHeader, vertexCount: number, options: any): string {
451
+ const lines = ['ply', `format ${header.format} ${header.version || '1.0'}`];
452
+ const elements = options?.pointCloud ? header.elements.slice(0, 1) : header.elements;
453
+ for (const comment of header.comments) {
454
+ lines.push(`comment ${comment}`);
455
+ }
456
+ for (const element of elements) {
457
+ lines.push(
458
+ `element ${element.name} ${element.name === 'vertex' ? vertexCount : element.count}`
459
+ );
460
+ for (const property of element.properties) {
461
+ lines.push(
462
+ property.type === 'list'
463
+ ? `property list ${property.countType} ${property.itemType} ${property.name}`
464
+ : `property ${property.type} ${property.name}`
465
+ );
466
+ }
467
+ }
468
+ lines.push('end_header');
469
+ return `${lines.join('\n')}\n`;
470
+ }
471
+
472
+ /** Return a byte iterator that emits pending body bytes before reading source chunks. */
473
+ async function* getByteIteratorWithInitialBytes(
474
+ iterator: AsyncIterator<ArrayBufferLike>,
475
+ initialBodyBytes: ByteArray
476
+ ): AsyncIterable<ArrayBuffer> {
477
+ if (initialBodyBytes.length > 0) {
478
+ yield getArrayBuffer(initialBodyBytes);
479
+ }
480
+ while (true) {
481
+ const {value, done} = await iterator.next();
482
+ if (done) {
483
+ break;
484
+ }
485
+ yield getArrayBuffer(getUint8Array(value));
486
+ }
487
+ }
488
+
489
+ /** Return the configured binary PLY batch size. */
490
+ function getBatchSize(options: any): number {
491
+ const batchSize = options?.batchSize;
492
+ return typeof batchSize === 'number' ? batchSize : DEFAULT_BINARY_BATCH_SIZE;
493
+ }
494
+
495
+ /** Return the byte size of a fixed-width PLY element. */
496
+ function getPLYElementSize(element: PLYElement): number {
497
+ return element.properties.reduce((size, property) => size + getPLYTypeSize(property.type), 0);
498
+ }
499
+
500
+ /** Return the byte size of a scalar PLY type. */
501
+ // eslint-disable-next-line complexity
502
+ function getPLYTypeSize(type: string): number {
503
+ switch (type) {
504
+ case 'int8':
505
+ case 'uint8':
506
+ case 'char':
507
+ case 'uchar':
508
+ return 1;
509
+ case 'int16':
510
+ case 'uint16':
511
+ case 'short':
512
+ case 'ushort':
513
+ return 2;
514
+ case 'int32':
515
+ case 'uint32':
516
+ case 'int':
517
+ case 'uint':
518
+ case 'float32':
519
+ case 'float':
520
+ return 4;
521
+ case 'float64':
522
+ case 'double':
523
+ return 8;
524
+ default:
525
+ throw new Error(type);
526
+ }
527
+ }
528
+
529
+ /** Find the byte offset immediately after the `end_header` terminator. */
530
+ function findHeaderEnd(bytes: Uint8Array): number {
531
+ const pattern = new TextEncoder().encode(PLY_END_HEADER);
532
+ const lastPatternStart = bytes.length - pattern.length;
533
+
534
+ for (let byteIndex = 0; byteIndex <= lastPatternStart; byteIndex++) {
535
+ let matches = true;
536
+ for (let patternIndex = 0; patternIndex < pattern.length; patternIndex++) {
537
+ if (bytes[byteIndex + patternIndex] !== pattern[patternIndex]) {
538
+ matches = false;
539
+ break;
540
+ }
541
+ }
542
+
543
+ if (matches) {
544
+ let headerEnd = byteIndex + pattern.length;
545
+ if (
546
+ headerEnd === bytes.length ||
547
+ (bytes[headerEnd] === 0x0d && headerEnd + 1 === bytes.length)
548
+ ) {
549
+ return -1;
550
+ }
551
+ if (bytes[headerEnd] === 0x0d && bytes[headerEnd + 1] === 0x0a) {
552
+ headerEnd += 2;
553
+ } else if (headerEnd < bytes.length && isWhitespaceByte(bytes[headerEnd])) {
554
+ headerEnd += 1;
555
+ }
556
+ return headerEnd;
557
+ }
558
+ }
559
+
560
+ return -1;
561
+ }
562
+
563
+ /** Return true for ASCII whitespace bytes that can terminate a PLY header. */
564
+ function isWhitespaceByte(byte: number): boolean {
565
+ return byte === 0x0a || byte === 0x0d || byte === 0x09 || byte === 0x20;
566
+ }
567
+
568
+ /** Normalize an ArrayBuffer or view into a Uint8Array view. */
569
+ function getUint8Array(data: ArrayBufferLike | ArrayBufferView): ByteArray {
570
+ return ArrayBuffer.isView(data)
571
+ ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength)
572
+ : new Uint8Array(data);
573
+ }
574
+
575
+ /** Return an exact ArrayBuffer copy for a byte range. */
576
+ function getArrayBuffer(bytes: ByteArray): ArrayBuffer {
577
+ const copy = new Uint8Array(bytes.byteLength);
578
+ copy.set(bytes);
579
+ return copy.buffer;
580
+ }
581
+
582
+ /** Concatenate byte chunks into a new Uint8Array. */
583
+ function concatenateBytes(chunks: ByteArray[]): ByteArray {
584
+ const byteLength = chunks.reduce((length, chunk) => length + chunk.length, 0);
585
+ const bytes = new Uint8Array(byteLength);
586
+ let byteOffset = 0;
587
+
588
+ for (const chunk of chunks) {
589
+ bytes.set(chunk, byteOffset);
590
+ byteOffset += chunk.length;
591
+ }
592
+
593
+ return bytes;
594
+ }
595
+
596
+ /**
597
+ * Parses header
598
+ * @param lineIterator
599
+ * @param options
600
+ * @returns
601
+ */
602
+ async function parseASCIIHeader(
603
+ lineIterator: AsyncIterable<string> | Iterable<string>,
604
+ options: {[key: string]: any}
605
+ ): Promise<PLYHeader> {
606
+ let currentElement: PLYElement | undefined;
607
+ const header: PLYHeader = {
608
+ comments: [],
609
+ elements: []
610
+ // headerLength
611
+ };
612
+
613
+ // Note: forEach does not reset iterator if exiting loop prematurely
614
+ // so that iteration can continue in a second loop
615
+ await forEach(lineIterator, (line: string) => {
616
+ line = line.trim();
617
+
618
+ // End of header
619
+ if (line === 'end_header') {
620
+ return true; // Returning true cancels `forEach`
621
+ }
622
+
623
+ // Ignore empty lines
624
+ if (line === '') {
625
+ // eslint-disable-next-line
626
+ return false; // Returning false does not cancel `forEach`
627
+ }
628
+
629
+ const lineValues = line.split(/\s+/);
630
+ const lineType = lineValues.shift();
631
+ line = lineValues.join(' ');
632
+
633
+ switch (lineType) {
634
+ case 'ply':
635
+ // First line magic characters, ignore
636
+ break;
637
+
638
+ case 'format':
639
+ header.format = lineValues[0];
640
+ header.version = lineValues[1];
641
+ break;
642
+
643
+ case 'comment':
644
+ header.comments.push(line);
645
+ break;
646
+
647
+ case 'element':
648
+ if (currentElement) {
649
+ header.elements.push(currentElement);
650
+ }
651
+
652
+ currentElement = {
653
+ name: lineValues[0],
654
+ count: parseInt(lineValues[1], 10),
655
+ properties: []
656
+ };
657
+ break;
658
+
659
+ case 'property':
660
+ const property = makePLYElementProperty(lineValues, options.propertyNameMapping);
661
+ currentElement?.properties.push(property);
662
+ break;
663
+
664
+ default:
665
+ loaderLog.log(0, 'unhandled', lineType, lineValues)();
666
+ }
667
+
668
+ return false;
669
+ });
670
+
671
+ if (currentElement) {
672
+ header.elements.push(currentElement);
673
+ }
674
+
675
+ return header;
676
+ }
677
+
678
+ function makePLYElementProperty(propertyValues: string[], propertyNameMapping: []): PLYProperty {
679
+ const type = propertyValues[0];
680
+ switch (type) {
681
+ case 'list':
682
+ return {
683
+ type,
684
+ name: propertyValues[3],
685
+ countType: propertyValues[1],
686
+ itemType: propertyValues[2]
687
+ };
688
+ default:
689
+ return {
690
+ type,
691
+ name: propertyValues[1]
692
+ };
693
+ }
694
+ }
695
+
696
+ // ASCII PARSING
697
+ /**
698
+ * @param lineIterator
699
+ * @param header
700
+ * @returns
701
+ */
702
+ async function parseASCII(lineIterator: AsyncIterable<string>, header: PLYHeader) {
703
+ // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)
704
+ const attributes: MutablePLYAttributes = {
705
+ indices: [],
706
+ vertices: [],
707
+ normals: [],
708
+ uvs: [],
709
+ colors: []
710
+ };
711
+
712
+ let currentElement = 0;
713
+ let currentElementCount = 0;
714
+
715
+ for await (let line of lineIterator) {
716
+ line = line.trim();
717
+
718
+ if (line !== '') {
719
+ if (currentElementCount >= header.elements[currentElement].count) {
720
+ currentElement++;
721
+ currentElementCount = 0;
722
+ }
723
+
724
+ const element = parsePLYElement(header.elements[currentElement].properties, line);
725
+ handleElement(attributes, header.elements[currentElement].name, element);
726
+ currentElementCount++;
727
+ }
728
+ }
729
+
730
+ return attributes;
731
+ }
732
+ /**
733
+ * Parses ASCII number
734
+ * @param n
735
+ * @param type
736
+ * @returns ASCII number
737
+ */
738
+ // eslint-disable-next-line complexity
739
+ function parseASCIINumber(n: string, type: string): number {
740
+ switch (type) {
741
+ case 'char':
742
+ case 'uchar':
743
+ case 'short':
744
+ case 'ushort':
745
+ case 'int':
746
+ case 'uint':
747
+ case 'int8':
748
+ case 'uint8':
749
+ case 'int16':
750
+ case 'uint16':
751
+ case 'int32':
752
+ case 'uint32':
753
+ return parseInt(n, 10);
754
+
755
+ case 'float':
756
+ case 'double':
757
+ case 'float32':
758
+ case 'float64':
759
+ return parseFloat(n);
760
+
761
+ default:
762
+ throw new Error(type);
763
+ }
764
+ }
765
+ /**
766
+ * Parses ASCII element
767
+ * @param properties
768
+ * @param line
769
+ * @returns element
770
+ */
771
+ function parsePLYElement(properties: any[], line: string) {
772
+ const values: any = line.split(/\s+/);
773
+
774
+ const element = {};
775
+
776
+ for (let i = 0; i < properties.length; i++) {
777
+ if (properties[i].type === 'list') {
778
+ const list: any = [];
779
+ const n = parseASCIINumber(values.shift(), properties[i].countType);
780
+
781
+ for (let j = 0; j < n; j++) {
782
+ list.push(parseASCIINumber(values.shift(), properties[i].itemType));
783
+ }
784
+
785
+ element[properties[i].name] = list;
786
+ } else {
787
+ element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);
788
+ }
789
+ }
790
+
791
+ return element;
792
+ }
793
+ /**
794
+ * @param buffer
795
+ * @param elementName
796
+ * @param element
797
+ */
798
+ // HELPER FUNCTIONS
799
+ // eslint-disable-next-line complexity
800
+ function handleElement(
801
+ buffer: {[index: string]: number[]},
802
+ elementName: string,
803
+ element: any = {}
804
+ ) {
805
+ switch (elementName) {
806
+ case 'vertex':
807
+ buffer.vertices.push(element.x, element.y, element.z);
808
+ if ('nx' in element && 'ny' in element && 'nz' in element) {
809
+ buffer.normals.push(element.nx, element.ny, element.nz);
810
+ }
811
+ if ('s' in element && 't' in element) {
812
+ buffer.uvs.push(element.s, element.t);
813
+ }
814
+ if ('red' in element && 'green' in element && 'blue' in element) {
815
+ buffer.colors.push(element.red, element.green, element.blue);
816
+ }
817
+ break;
818
+
819
+ case 'face':
820
+ const vertexIndices = element.vertex_indices || element.vertex_index; // issue #9338
821
+ if (vertexIndices.length === 3) {
822
+ buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[2]);
823
+ } else if (vertexIndices.length === 4) {
824
+ buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[3]);
825
+ buffer.indices.push(vertexIndices[1], vertexIndices[2], vertexIndices[3]);
826
+ }
827
+ break;
828
+
829
+ default:
830
+ break;
831
+ }
832
+ }