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

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