@loaders.gl/scene 5.0.0-beta.1 → 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 (675) hide show
  1. package/DRACO-README.md +15 -0
  2. package/GLTF-README.md +1 -1
  3. package/OBJ-README.md +1 -1
  4. package/README.md +13 -2
  5. package/THIRD-PARTY-NOTICES.md +10 -1
  6. package/dist/dist.dev.js +21207 -14204
  7. package/dist/dist.min.js +32 -24
  8. package/dist/draco/bundled.cjs +34 -0
  9. package/dist/draco/bundled.cjs.map +7 -0
  10. package/dist/draco/bundled.d.ts +5 -0
  11. package/dist/draco/bundled.d.ts.map +1 -0
  12. package/dist/draco/bundled.js +6 -0
  13. package/dist/draco/bundled.js.map +1 -0
  14. package/dist/draco/draco-format.cjs +41 -0
  15. package/dist/draco/draco-format.cjs.map +7 -0
  16. package/dist/draco/draco-format.d.ts +15 -0
  17. package/dist/draco/draco-format.d.ts.map +1 -0
  18. package/dist/draco/draco-format.js +18 -0
  19. package/dist/draco/draco-format.js.map +1 -0
  20. package/dist/draco/draco-javascript-loader-with-parser.cjs +47 -0
  21. package/dist/draco/draco-javascript-loader-with-parser.cjs.map +7 -0
  22. package/dist/draco/draco-javascript-loader-with-parser.d.ts +36 -0
  23. package/dist/draco/draco-javascript-loader-with-parser.d.ts.map +1 -0
  24. package/dist/draco/draco-javascript-loader-with-parser.js +14 -0
  25. package/dist/draco/draco-javascript-loader-with-parser.js.map +1 -0
  26. package/dist/draco/draco-libraries.cjs +61 -0
  27. package/dist/draco/draco-libraries.cjs.map +7 -0
  28. package/dist/draco/draco-libraries.d.ts +28 -0
  29. package/dist/draco/draco-libraries.d.ts.map +1 -0
  30. package/dist/draco/draco-libraries.js +33 -0
  31. package/dist/draco/draco-libraries.js.map +1 -0
  32. package/dist/draco/draco-library-options.cjs +80 -0
  33. package/dist/draco/draco-library-options.cjs.map +7 -0
  34. package/dist/draco/draco-library-options.d.ts +16 -0
  35. package/dist/draco/draco-library-options.d.ts.map +1 -0
  36. package/dist/draco/draco-library-options.js +52 -0
  37. package/dist/draco/draco-library-options.js.map +1 -0
  38. package/dist/draco/draco-loader-options.cjs +37 -0
  39. package/dist/draco/draco-loader-options.cjs.map +7 -0
  40. package/dist/draco/draco-loader-options.d.ts +27 -0
  41. package/dist/draco/draco-loader-options.d.ts.map +1 -0
  42. package/dist/draco/draco-loader-options.js +12 -0
  43. package/dist/draco/draco-loader-options.js.map +1 -0
  44. package/dist/draco/draco-loader-types.cjs +87 -0
  45. package/dist/draco/draco-loader-types.cjs.map +7 -0
  46. package/dist/draco/draco-loader-types.d.ts +41 -0
  47. package/dist/draco/draco-loader-types.d.ts.map +1 -0
  48. package/dist/draco/draco-loader-types.js +54 -0
  49. package/dist/draco/draco-loader-types.js.map +1 -0
  50. package/dist/draco/draco-loader.cjs +51 -0
  51. package/dist/draco/draco-loader.cjs.map +7 -0
  52. package/dist/draco/draco-loader.d.ts +41 -0
  53. package/dist/draco/draco-loader.d.ts.map +1 -0
  54. package/dist/draco/draco-loader.js +22 -0
  55. package/dist/draco/draco-loader.js.map +1 -0
  56. package/dist/draco/draco-wasm-loader-with-parser.cjs +48 -0
  57. package/dist/draco/draco-wasm-loader-with-parser.cjs.map +7 -0
  58. package/dist/draco/draco-wasm-loader-with-parser.d.ts +36 -0
  59. package/dist/draco/draco-wasm-loader-with-parser.d.ts.map +1 -0
  60. package/dist/draco/draco-wasm-loader-with-parser.js +14 -0
  61. package/dist/draco/draco-wasm-loader-with-parser.js.map +1 -0
  62. package/dist/draco/draco-writer.cjs +183 -0
  63. package/dist/draco/draco-writer.cjs.map +7 -0
  64. package/dist/draco/draco-writer.d.ts +98 -0
  65. package/dist/draco/draco-writer.d.ts.map +1 -0
  66. package/dist/draco/draco-writer.js +166 -0
  67. package/dist/draco/draco-writer.js.map +1 -0
  68. package/dist/draco/draco3d/draco3d-types.cjs +76 -0
  69. package/dist/draco/draco3d/draco3d-types.cjs.map +7 -0
  70. package/dist/draco/draco3d/draco3d-types.d.ts +303 -0
  71. package/dist/draco/draco3d/draco3d-types.d.ts.map +1 -0
  72. package/dist/draco/draco3d/draco3d-types.js +47 -0
  73. package/dist/draco/draco3d/draco3d-types.js.map +1 -0
  74. package/dist/draco/draco3d-loader-with-parser.cjs +50 -0
  75. package/dist/draco/draco3d-loader-with-parser.cjs.map +7 -0
  76. package/dist/draco/draco3d-loader-with-parser.d.ts +36 -0
  77. package/dist/draco/draco3d-loader-with-parser.d.ts.map +1 -0
  78. package/dist/draco/draco3d-loader-with-parser.js +21 -0
  79. package/dist/draco/draco3d-loader-with-parser.js.map +1 -0
  80. package/dist/draco/index.cjs +51 -0
  81. package/dist/draco/index.cjs.map +7 -0
  82. package/dist/draco/index.d.ts +11 -0
  83. package/dist/draco/index.d.ts.map +1 -0
  84. package/dist/draco/index.js +10 -0
  85. package/dist/draco/index.js.map +1 -0
  86. package/dist/draco/lib/draco-builder.cjs +660 -0
  87. package/dist/draco/lib/draco-builder.cjs.map +7 -0
  88. package/dist/draco/lib/draco-builder.d.ts +175 -0
  89. package/dist/draco/lib/draco-builder.d.ts.map +1 -0
  90. package/dist/draco/lib/draco-builder.js +612 -0
  91. package/dist/draco/lib/draco-builder.js.map +1 -0
  92. package/dist/draco/lib/draco-library-loader.cjs +47 -0
  93. package/dist/draco/lib/draco-library-loader.cjs.map +7 -0
  94. package/dist/draco/lib/draco-library-loader.d.ts +5 -0
  95. package/dist/draco/lib/draco-library-loader.d.ts.map +1 -0
  96. package/dist/draco/lib/draco-library-loader.js +23 -0
  97. package/dist/draco/lib/draco-library-loader.js.map +1 -0
  98. package/dist/draco/lib/draco-module-loader.cjs +281 -0
  99. package/dist/draco/lib/draco-module-loader.cjs.map +7 -0
  100. package/dist/draco/lib/draco-module-loader.d.ts +25 -0
  101. package/dist/draco/lib/draco-module-loader.d.ts.map +1 -0
  102. package/dist/draco/lib/draco-module-loader.js +220 -0
  103. package/dist/draco/lib/draco-module-loader.js.map +1 -0
  104. package/dist/draco/lib/draco-parser.cjs +601 -0
  105. package/dist/draco/lib/draco-parser.cjs.map +7 -0
  106. package/dist/draco/lib/draco-parser.d.ts +143 -0
  107. package/dist/draco/lib/draco-parser.d.ts.map +1 -0
  108. package/dist/draco/lib/draco-parser.js +598 -0
  109. package/dist/draco/lib/draco-parser.js.map +1 -0
  110. package/dist/draco/lib/draco-types.cjs +19 -0
  111. package/dist/draco/lib/draco-types.cjs.map +7 -0
  112. package/dist/draco/lib/draco-types.d.ts +59 -0
  113. package/dist/draco/lib/draco-types.d.ts.map +1 -0
  114. package/dist/draco/lib/draco-types.js +5 -0
  115. package/dist/draco/lib/draco-types.js.map +1 -0
  116. package/dist/draco/lib/parse-draco.cjs +60 -0
  117. package/dist/draco/lib/parse-draco.cjs.map +7 -0
  118. package/dist/draco/lib/parse-draco.d.ts +22 -0
  119. package/dist/draco/lib/parse-draco.d.ts.map +1 -0
  120. package/dist/draco/lib/parse-draco.js +33 -0
  121. package/dist/draco/lib/parse-draco.js.map +1 -0
  122. package/dist/draco/lib/utils/get-draco-schema.cjs +74 -0
  123. package/dist/draco/lib/utils/get-draco-schema.cjs.map +7 -0
  124. package/dist/draco/lib/utils/get-draco-schema.d.ts +7 -0
  125. package/dist/draco/lib/utils/get-draco-schema.d.ts.map +1 -0
  126. package/dist/draco/lib/utils/get-draco-schema.js +45 -0
  127. package/dist/draco/lib/utils/get-draco-schema.js.map +1 -0
  128. package/dist/draco/lib/utils/version.cjs +31 -0
  129. package/dist/draco/lib/utils/version.cjs.map +7 -0
  130. package/dist/draco/lib/utils/version.d.ts +2 -0
  131. package/dist/draco/lib/utils/version.d.ts.map +1 -0
  132. package/dist/draco/lib/utils/version.js +8 -0
  133. package/dist/draco/lib/utils/version.js.map +1 -0
  134. package/dist/draco/unbundled.cjs +31 -0
  135. package/dist/draco/unbundled.cjs.map +7 -0
  136. package/dist/draco/unbundled.d.ts +3 -0
  137. package/dist/draco/unbundled.d.ts.map +1 -0
  138. package/dist/draco/unbundled.js +5 -0
  139. package/dist/draco/unbundled.js.map +1 -0
  140. package/dist/draco/workers/draco-worker-node.cjs +8 -0
  141. package/dist/draco/workers/draco-worker-node.cjs.map +7 -0
  142. package/dist/draco/workers/draco-worker-node.d.ts +2 -0
  143. package/dist/draco/workers/draco-worker-node.d.ts.map +1 -0
  144. package/dist/draco/workers/draco-worker-node.js +9 -0
  145. package/dist/draco/workers/draco-worker-node.js.map +1 -0
  146. package/dist/draco/workers/draco-worker.cjs +7 -0
  147. package/dist/draco/workers/draco-worker.cjs.map +7 -0
  148. package/dist/draco/workers/draco-worker.d.ts +2 -0
  149. package/dist/draco/workers/draco-worker.d.ts.map +1 -0
  150. package/dist/draco/workers/draco-worker.js +7 -0
  151. package/dist/draco/workers/draco-worker.js.map +1 -0
  152. package/dist/draco/workers/draco-writer-worker-node.cjs +11 -0
  153. package/dist/draco/workers/draco-writer-worker-node.cjs.map +7 -0
  154. package/dist/draco/workers/draco-writer-worker-node.d.cts +2 -0
  155. package/dist/draco/workers/draco-writer-worker-node.d.cts.map +1 -0
  156. package/dist/draco/workers/draco-writer-worker-node.d.ts +2 -0
  157. package/dist/draco/workers/draco-writer-worker-node.d.ts.map +1 -0
  158. package/dist/draco/workers/draco-writer-worker-node.js +9 -0
  159. package/dist/draco/workers/draco-writer-worker-node.js.map +1 -0
  160. package/dist/draco/workers/draco-writer-worker.cjs +10 -0
  161. package/dist/draco/workers/draco-writer-worker.cjs.map +7 -0
  162. package/dist/draco/workers/draco-writer-worker.d.ts +2 -0
  163. package/dist/draco/workers/draco-writer-worker.d.ts.map +1 -0
  164. package/dist/draco/workers/draco-writer-worker.js +7 -0
  165. package/dist/draco/workers/draco-writer-worker.js.map +1 -0
  166. package/dist/draco-javascript-loader.cjs +25 -0
  167. package/dist/draco-javascript-loader.cjs.map +7 -0
  168. package/dist/draco-javascript-loader.d.ts +2 -0
  169. package/dist/draco-javascript-loader.d.ts.map +1 -0
  170. package/dist/draco-javascript-loader.js +3 -0
  171. package/dist/draco-javascript-loader.js.map +1 -0
  172. package/dist/draco-library-options.cjs +36 -0
  173. package/dist/draco-library-options.cjs.map +7 -0
  174. package/dist/draco-library-options.d.ts +3 -0
  175. package/dist/draco-library-options.d.ts.map +1 -0
  176. package/dist/draco-library-options.js +4 -0
  177. package/dist/draco-library-options.js.map +1 -0
  178. package/dist/draco-loader-types.cjs +25 -0
  179. package/dist/draco-loader-types.cjs.map +7 -0
  180. package/dist/draco-loader-types.d.ts +2 -0
  181. package/dist/draco-loader-types.d.ts.map +1 -0
  182. package/dist/draco-loader-types.js +3 -0
  183. package/dist/draco-loader-types.js.map +1 -0
  184. package/dist/draco-loader.cjs +25 -0
  185. package/dist/draco-loader.cjs.map +7 -0
  186. package/dist/draco-loader.d.ts +2 -0
  187. package/dist/draco-loader.d.ts.map +1 -0
  188. package/dist/draco-loader.js +3 -0
  189. package/dist/draco-loader.js.map +1 -0
  190. package/dist/draco-wasm-loader.cjs +25 -0
  191. package/dist/draco-wasm-loader.cjs.map +7 -0
  192. package/dist/draco-wasm-loader.d.ts +2 -0
  193. package/dist/draco-wasm-loader.d.ts.map +1 -0
  194. package/dist/draco-wasm-loader.js +3 -0
  195. package/dist/draco-wasm-loader.js.map +1 -0
  196. package/dist/draco-worker-node.js +29842 -0
  197. package/dist/draco-worker-node.js.map +7 -0
  198. package/dist/draco-worker.js +19668 -0
  199. package/dist/draco-worker.js.map +7 -0
  200. package/dist/draco-writer-worker-node.cjs +30022 -0
  201. package/dist/draco-writer-worker-node.cjs.map +7 -0
  202. package/dist/draco-writer-worker.js +19767 -0
  203. package/dist/draco-writer-worker.js.map +7 -0
  204. package/dist/draco-writer.cjs +25 -0
  205. package/dist/draco-writer.cjs.map +7 -0
  206. package/dist/draco-writer.d.ts +2 -0
  207. package/dist/draco-writer.d.ts.map +1 -0
  208. package/dist/draco-writer.js +3 -0
  209. package/dist/draco-writer.js.map +1 -0
  210. package/dist/draco3d-loader.cjs +25 -0
  211. package/dist/draco3d-loader.cjs.map +7 -0
  212. package/dist/draco3d-loader.d.ts +2 -0
  213. package/dist/draco3d-loader.d.ts.map +1 -0
  214. package/dist/draco3d-loader.js +3 -0
  215. package/dist/draco3d-loader.js.map +1 -0
  216. package/dist/glb-loader-types.cjs +61 -0
  217. package/dist/glb-loader-types.cjs.map +7 -0
  218. package/dist/glb-loader-types.d.ts +2 -0
  219. package/dist/glb-loader-types.d.ts.map +1 -0
  220. package/dist/glb-loader-types.js +2 -0
  221. package/dist/glb-loader-types.js.map +1 -0
  222. package/dist/glb-loader.cjs +48 -0
  223. package/dist/glb-loader.cjs.map +7 -0
  224. package/dist/glb-loader.d.ts +2 -0
  225. package/dist/glb-loader.d.ts.map +1 -0
  226. package/dist/glb-loader.js +2 -0
  227. package/dist/glb-loader.js.map +1 -0
  228. package/dist/glb-writer.cjs +53 -0
  229. package/dist/glb-writer.cjs.map +7 -0
  230. package/dist/glb-writer.d.ts +2 -0
  231. package/dist/glb-writer.d.ts.map +1 -0
  232. package/dist/glb-writer.js +2 -0
  233. package/dist/glb-writer.js.map +1 -0
  234. package/dist/gltf/glb-loader-types.cjs +1 -1
  235. package/dist/gltf/glb-loader-types.cjs.map +2 -2
  236. package/dist/gltf/glb-loader-types.d.ts +2 -2
  237. package/dist/gltf/glb-loader-types.js +1 -1
  238. package/dist/gltf/glb-loader-types.js.map +1 -1
  239. package/dist/gltf/gltf-loader-types.cjs +1 -1
  240. package/dist/gltf/gltf-loader-types.cjs.map +2 -2
  241. package/dist/gltf/gltf-loader-types.d.ts +11 -5
  242. package/dist/gltf/gltf-loader-types.d.ts.map +1 -1
  243. package/dist/gltf/gltf-loader-types.js +1 -1
  244. package/dist/gltf/gltf-loader-types.js.map +1 -1
  245. package/dist/gltf/gltf-loader.cjs.map +1 -1
  246. package/dist/gltf/gltf-loader.d.ts +4 -4
  247. package/dist/gltf/gltf-loader.d.ts.map +1 -1
  248. package/dist/gltf/index.cjs +2 -0
  249. package/dist/gltf/index.cjs.map +2 -2
  250. package/dist/gltf/index.d.ts +2 -2
  251. package/dist/gltf/index.d.ts.map +1 -1
  252. package/dist/gltf/index.js +1 -1
  253. package/dist/gltf/index.js.map +1 -1
  254. package/dist/gltf/lib/api/gltf-extensions.cjs +7 -2
  255. package/dist/gltf/lib/api/gltf-extensions.cjs.map +2 -2
  256. package/dist/gltf/lib/api/gltf-extensions.d.ts.map +1 -1
  257. package/dist/gltf/lib/api/gltf-extensions.js +7 -5
  258. package/dist/gltf/lib/api/gltf-extensions.js.map +1 -1
  259. package/dist/gltf/lib/encoders/encode-gltf-draco.cjs +12 -2
  260. package/dist/gltf/lib/encoders/encode-gltf-draco.cjs.map +2 -2
  261. package/dist/gltf/lib/encoders/encode-gltf-draco.d.ts +1 -1
  262. package/dist/gltf/lib/encoders/encode-gltf-draco.d.ts.map +1 -1
  263. package/dist/gltf/lib/encoders/encode-gltf-draco.js +1 -1
  264. package/dist/gltf/lib/encoders/encode-gltf-draco.js.map +1 -1
  265. package/dist/gltf/lib/extensions/EXT_texture_webp.cjs +1 -0
  266. package/dist/gltf/lib/extensions/EXT_texture_webp.cjs.map +2 -2
  267. package/dist/gltf/lib/extensions/EXT_texture_webp.d.ts.map +1 -1
  268. package/dist/gltf/lib/extensions/EXT_texture_webp.js +3 -0
  269. package/dist/gltf/lib/extensions/EXT_texture_webp.js.map +1 -1
  270. package/dist/gltf/lib/extensions/KHR_accessor_float64.cjs +45 -0
  271. package/dist/gltf/lib/extensions/KHR_accessor_float64.cjs.map +7 -0
  272. package/dist/gltf/lib/extensions/KHR_accessor_float64.d.ts +6 -0
  273. package/dist/gltf/lib/extensions/KHR_accessor_float64.d.ts.map +1 -0
  274. package/dist/gltf/lib/extensions/KHR_accessor_float64.js +20 -0
  275. package/dist/gltf/lib/extensions/KHR_accessor_float64.js.map +1 -0
  276. package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.cjs +2 -2
  277. package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.cjs.map +2 -2
  278. package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.d.ts.map +1 -1
  279. package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.js +1 -1
  280. package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.js.map +1 -1
  281. package/dist/gltf/lib/extensions/KHR_gaussian_splatting.cjs +23 -7
  282. package/dist/gltf/lib/extensions/KHR_gaussian_splatting.cjs.map +2 -2
  283. package/dist/gltf/lib/extensions/KHR_gaussian_splatting.d.ts +2 -1
  284. package/dist/gltf/lib/extensions/KHR_gaussian_splatting.d.ts.map +1 -1
  285. package/dist/gltf/lib/extensions/KHR_gaussian_splatting.js +21 -5
  286. package/dist/gltf/lib/extensions/KHR_gaussian_splatting.js.map +1 -1
  287. package/dist/gltf/lib/extensions/MSFT_texture_dds.cjs +64 -0
  288. package/dist/gltf/lib/extensions/MSFT_texture_dds.cjs.map +7 -0
  289. package/dist/gltf/lib/extensions/MSFT_texture_dds.d.ts +12 -0
  290. package/dist/gltf/lib/extensions/MSFT_texture_dds.d.ts.map +1 -0
  291. package/dist/gltf/lib/extensions/MSFT_texture_dds.js +39 -0
  292. package/dist/gltf/lib/extensions/MSFT_texture_dds.js.map +1 -0
  293. package/dist/gltf/lib/extensions/utils/3d-tiles-utils.cjs +1 -1
  294. package/dist/gltf/lib/extensions/utils/3d-tiles-utils.cjs.map +2 -2
  295. package/dist/gltf/lib/extensions/utils/3d-tiles-utils.d.ts.map +1 -1
  296. package/dist/gltf/lib/extensions/utils/3d-tiles-utils.js +3 -1
  297. package/dist/gltf/lib/extensions/utils/3d-tiles-utils.js.map +1 -1
  298. package/dist/gltf/lib/parsers/parse-gltf.cjs +34 -8
  299. package/dist/gltf/lib/parsers/parse-gltf.cjs.map +3 -3
  300. package/dist/gltf/lib/parsers/parse-gltf.d.ts +2 -0
  301. package/dist/gltf/lib/parsers/parse-gltf.d.ts.map +1 -1
  302. package/dist/gltf/lib/parsers/parse-gltf.js +26 -6
  303. package/dist/gltf/lib/parsers/parse-gltf.js.map +1 -1
  304. package/dist/gltf/lib/types/gltf-additional-extension-schemas.cjs +22 -0
  305. package/dist/gltf/lib/types/gltf-additional-extension-schemas.cjs.map +2 -2
  306. package/dist/gltf/lib/types/gltf-additional-extension-schemas.d.ts +23 -0
  307. package/dist/gltf/lib/types/gltf-additional-extension-schemas.d.ts.map +1 -1
  308. package/dist/gltf/lib/types/gltf-additional-extension-schemas.js +22 -0
  309. package/dist/gltf/lib/types/gltf-additional-extension-schemas.js.map +1 -1
  310. package/dist/gltf/lib/types/gltf-ext-gaussian-splatting-schema.cjs.map +1 -1
  311. package/dist/gltf/lib/types/gltf-ext-gaussian-splatting-schema.d.ts +1 -1
  312. package/dist/gltf/lib/types/gltf-ext-gaussian-splatting-schema.d.ts.map +1 -1
  313. package/dist/gltf/lib/types/gltf-extension-schemas.cjs +8 -0
  314. package/dist/gltf/lib/types/gltf-extension-schemas.cjs.map +2 -2
  315. package/dist/gltf/lib/types/gltf-extension-schemas.d.ts +27 -0
  316. package/dist/gltf/lib/types/gltf-extension-schemas.d.ts.map +1 -1
  317. package/dist/gltf/lib/types/gltf-extension-schemas.js +8 -1
  318. package/dist/gltf/lib/types/gltf-extension-schemas.js.map +1 -1
  319. package/dist/gltf/lib/types/gltf-json-schema.cjs.map +1 -1
  320. package/dist/gltf/lib/types/gltf-json-schema.d.ts +2 -2
  321. package/dist/gltf/lib/types/gltf-json-schema.d.ts.map +1 -1
  322. package/dist/gltf/lib/types/gltf-texture-procedurals.cjs +19 -0
  323. package/dist/gltf/lib/types/gltf-texture-procedurals.cjs.map +7 -0
  324. package/dist/gltf/lib/types/gltf-texture-procedurals.d.ts +45 -0
  325. package/dist/gltf/lib/types/gltf-texture-procedurals.d.ts.map +1 -0
  326. package/dist/gltf/lib/types/gltf-texture-procedurals.js +5 -0
  327. package/dist/gltf/lib/types/gltf-texture-procedurals.js.map +1 -0
  328. package/dist/gltf/lib/types/gltf-types.cjs.map +1 -1
  329. package/dist/gltf/lib/types/gltf-types.d.ts +7 -0
  330. package/dist/gltf/lib/types/gltf-types.d.ts.map +1 -1
  331. package/dist/gltf/lib/types/gltf-version-zod-schemas.d.ts +34 -0
  332. package/dist/gltf/lib/types/gltf-version-zod-schemas.d.ts.map +1 -1
  333. package/dist/gltf/lib/types/gltf-zod-schema.cjs +4 -1
  334. package/dist/gltf/lib/types/gltf-zod-schema.cjs.map +2 -2
  335. package/dist/gltf/lib/types/gltf-zod-schema.d.ts +57 -1
  336. package/dist/gltf/lib/types/gltf-zod-schema.d.ts.map +1 -1
  337. package/dist/gltf/lib/types/gltf-zod-schema.js +6 -2
  338. package/dist/gltf/lib/types/gltf-zod-schema.js.map +1 -1
  339. package/dist/gltf/lib/utils/version.cjs +1 -1
  340. package/dist/gltf/lib/utils/version.cjs.map +1 -1
  341. package/dist/gltf/lib/utils/version.js +1 -1
  342. package/dist/gltf/lib/utils/version.js.map +1 -1
  343. package/dist/gltf/schema.cjs +3 -0
  344. package/dist/gltf/schema.cjs.map +2 -2
  345. package/dist/gltf/schema.d.ts +1 -0
  346. package/dist/gltf/schema.d.ts.map +1 -1
  347. package/dist/gltf/schema.js +1 -0
  348. package/dist/gltf/schema.js.map +1 -1
  349. package/dist/gltf-loader-types.cjs +73 -0
  350. package/dist/gltf-loader-types.cjs.map +7 -0
  351. package/dist/gltf-loader-types.d.ts +2 -0
  352. package/dist/gltf-loader-types.d.ts.map +1 -0
  353. package/dist/gltf-loader-types.js +2 -0
  354. package/dist/gltf-loader-types.js.map +1 -0
  355. package/dist/gltf-loader.cjs +48 -0
  356. package/dist/gltf-loader.cjs.map +7 -0
  357. package/dist/gltf-loader.d.ts +2 -0
  358. package/dist/gltf-loader.d.ts.map +1 -0
  359. package/dist/gltf-loader.js +2 -0
  360. package/dist/gltf-loader.js.map +1 -0
  361. package/dist/gltf-source.cjs +238 -0
  362. package/dist/gltf-source.cjs.map +7 -0
  363. package/dist/gltf-source.d.ts +2 -0
  364. package/dist/gltf-source.d.ts.map +1 -0
  365. package/dist/gltf-source.js +2 -0
  366. package/dist/gltf-source.js.map +1 -0
  367. package/dist/gltf-writer.cjs +69 -0
  368. package/dist/gltf-writer.cjs.map +7 -0
  369. package/dist/gltf-writer.d.ts +2 -0
  370. package/dist/gltf-writer.d.ts.map +1 -0
  371. package/dist/gltf-writer.js +2 -0
  372. package/dist/gltf-writer.js.map +1 -0
  373. package/dist/index.cjs +18 -5
  374. package/dist/index.cjs.map +2 -2
  375. package/dist/index.d.ts +9 -2
  376. package/dist/index.d.ts.map +1 -1
  377. package/dist/index.js +8 -3
  378. package/dist/index.js.map +1 -1
  379. package/dist/libs/DRACO-LICENSE +252 -0
  380. package/dist/libs/README.md +20 -0
  381. package/dist/libs/draco_decoder.js +34 -0
  382. package/dist/libs/draco_decoder.mjs +37 -0
  383. package/dist/libs/draco_decoder.wasm +0 -0
  384. package/dist/libs/draco_decoder_gltf.wasm +0 -0
  385. package/dist/libs/draco_encoder.js +98 -0
  386. package/dist/libs/draco_encoder.mjs +101 -0
  387. package/dist/libs/draco_encoder.wasm +0 -0
  388. package/dist/libs/draco_wasm_wrapper.js +117 -0
  389. package/dist/libs/draco_wasm_wrapper.mjs +120 -0
  390. package/dist/libs/draco_wasm_wrapper_gltf.js +116 -0
  391. package/dist/libs/draco_wasm_wrapper_gltf.mjs +119 -0
  392. package/dist/materialx/parse-materialx.cjs +61 -0
  393. package/dist/materialx/parse-materialx.cjs.map +7 -0
  394. package/dist/materialx/parse-materialx.d.ts +23 -0
  395. package/dist/materialx/parse-materialx.d.ts.map +1 -0
  396. package/dist/materialx/parse-materialx.js +39 -0
  397. package/dist/materialx/parse-materialx.js.map +1 -0
  398. package/dist/materialx/procedural-graph.cjs +77 -0
  399. package/dist/materialx/procedural-graph.cjs.map +7 -0
  400. package/dist/materialx/procedural-graph.d.ts +40 -0
  401. package/dist/materialx/procedural-graph.d.ts.map +1 -0
  402. package/dist/materialx/procedural-graph.js +59 -0
  403. package/dist/materialx/procedural-graph.js.map +1 -0
  404. package/dist/materialx-loader-types.cjs +57 -0
  405. package/dist/materialx-loader-types.cjs.map +7 -0
  406. package/dist/materialx-loader-types.d.ts +34 -0
  407. package/dist/materialx-loader-types.d.ts.map +1 -0
  408. package/dist/materialx-loader-types.js +20 -0
  409. package/dist/materialx-loader-types.js.map +1 -0
  410. package/dist/materialx-loader.cjs +40 -0
  411. package/dist/materialx-loader.cjs.map +7 -0
  412. package/dist/materialx-loader.d.ts +19 -0
  413. package/dist/materialx-loader.d.ts.map +1 -0
  414. package/dist/materialx-loader.js +14 -0
  415. package/dist/materialx-loader.js.map +1 -0
  416. package/dist/mtl-loader-types.cjs +61 -0
  417. package/dist/mtl-loader-types.cjs.map +7 -0
  418. package/dist/mtl-loader-types.d.ts +2 -0
  419. package/dist/mtl-loader-types.d.ts.map +1 -0
  420. package/dist/mtl-loader-types.js +2 -0
  421. package/dist/mtl-loader-types.js.map +1 -0
  422. package/dist/mtl-loader.cjs +47 -0
  423. package/dist/mtl-loader.cjs.map +7 -0
  424. package/dist/mtl-loader.d.ts +2 -0
  425. package/dist/mtl-loader.d.ts.map +1 -0
  426. package/dist/mtl-loader.js +2 -0
  427. package/dist/mtl-loader.js.map +1 -0
  428. package/dist/obj/bundled.cjs +2 -4
  429. package/dist/obj/bundled.cjs.map +2 -2
  430. package/dist/obj/bundled.d.ts +1 -1
  431. package/dist/obj/bundled.d.ts.map +1 -1
  432. package/dist/obj/bundled.js +1 -1
  433. package/dist/obj/bundled.js.map +1 -1
  434. package/dist/obj/index.cjs +0 -6
  435. package/dist/obj/index.cjs.map +3 -3
  436. package/dist/obj/index.d.ts +0 -4
  437. package/dist/obj/index.d.ts.map +1 -1
  438. package/dist/obj/index.js +0 -5
  439. package/dist/obj/index.js.map +1 -1
  440. package/dist/obj/mtl-loader-types.cjs +4 -7
  441. package/dist/obj/mtl-loader-types.cjs.map +2 -2
  442. package/dist/obj/mtl-loader-types.d.ts +2 -22
  443. package/dist/obj/mtl-loader-types.d.ts.map +1 -1
  444. package/dist/obj/mtl-loader-types.js +2 -4
  445. package/dist/obj/mtl-loader-types.js.map +1 -1
  446. package/dist/obj/mtl-loader.cjs +1 -1
  447. package/dist/obj/mtl-loader.cjs.map +2 -2
  448. package/dist/obj/mtl-loader.js +1 -1
  449. package/dist/obj/mtl-loader.js.map +1 -1
  450. package/dist/obj/obj-loader-types.cjs +9 -10
  451. package/dist/obj/obj-loader-types.cjs.map +2 -2
  452. package/dist/obj/obj-loader-types.d.ts +19 -39
  453. package/dist/obj/obj-loader-types.d.ts.map +1 -1
  454. package/dist/obj/obj-loader-types.js +6 -6
  455. package/dist/obj/obj-loader-types.js.map +1 -1
  456. package/dist/obj/obj-loader.cjs +63 -31
  457. package/dist/obj/obj-loader.cjs.map +3 -3
  458. package/dist/obj/obj-loader.d.ts +43 -9
  459. package/dist/obj/obj-loader.d.ts.map +1 -1
  460. package/dist/obj/obj-loader.js +61 -22
  461. package/dist/obj/obj-loader.js.map +1 -1
  462. package/dist/obj/obj-writer.cjs +3 -3
  463. package/dist/obj/obj-writer.cjs.map +2 -2
  464. package/dist/obj/obj-writer.d.ts +5 -4
  465. package/dist/obj/obj-writer.d.ts.map +1 -1
  466. package/dist/obj/obj-writer.js +4 -4
  467. package/dist/obj/obj-writer.js.map +1 -1
  468. package/dist/obj/unbundled.cjs +2 -6
  469. package/dist/obj/unbundled.cjs.map +2 -2
  470. package/dist/obj/unbundled.d.ts +2 -2
  471. package/dist/obj/unbundled.d.ts.map +1 -1
  472. package/dist/obj/unbundled.js +2 -2
  473. package/dist/obj/unbundled.js.map +1 -1
  474. package/dist/obj/workers/obj-worker.cjs +5 -5
  475. package/dist/obj/workers/obj-worker.cjs.map +2 -2
  476. package/dist/obj/workers/obj-worker.js +6 -6
  477. package/dist/obj/workers/obj-worker.js.map +1 -1
  478. package/dist/obj-loader-types.cjs +70 -0
  479. package/dist/obj-loader-types.cjs.map +7 -0
  480. package/dist/obj-loader-types.d.ts +2 -0
  481. package/dist/obj-loader-types.d.ts.map +1 -0
  482. package/dist/obj-loader-types.js +2 -0
  483. package/dist/obj-loader-types.js.map +1 -0
  484. package/dist/obj-loader.cjs +195 -0
  485. package/dist/obj-loader.cjs.map +7 -0
  486. package/dist/obj-loader.d.ts +2 -0
  487. package/dist/obj-loader.d.ts.map +1 -0
  488. package/dist/obj-loader.js +2 -0
  489. package/dist/obj-loader.js.map +1 -0
  490. package/dist/obj-worker.js +1420 -406
  491. package/dist/obj-writer.cjs +167 -0
  492. package/dist/obj-writer.cjs.map +7 -0
  493. package/dist/obj-writer.d.ts +2 -0
  494. package/dist/obj-writer.d.ts.map +1 -0
  495. package/dist/obj-writer.js +2 -0
  496. package/dist/obj-writer.js.map +1 -0
  497. package/dist/stl/parse-stl.cjs +100 -0
  498. package/dist/stl/parse-stl.cjs.map +7 -0
  499. package/dist/stl/parse-stl.d.ts +4 -0
  500. package/dist/stl/parse-stl.d.ts.map +1 -0
  501. package/dist/stl/parse-stl.js +84 -0
  502. package/dist/stl/parse-stl.js.map +1 -0
  503. package/dist/stl-loader-types.cjs +58 -0
  504. package/dist/stl-loader-types.cjs.map +7 -0
  505. package/dist/stl-loader-types.d.ts +32 -0
  506. package/dist/stl-loader-types.d.ts.map +1 -0
  507. package/dist/stl-loader-types.js +25 -0
  508. package/dist/stl-loader-types.js.map +1 -0
  509. package/dist/stl-loader.cjs +38 -0
  510. package/dist/stl-loader.cjs.map +7 -0
  511. package/dist/stl-loader.d.ts +17 -0
  512. package/dist/stl-loader.d.ts.map +1 -0
  513. package/dist/stl-loader.js +13 -0
  514. package/dist/stl-loader.js.map +1 -0
  515. package/dist/usd/index.cjs.map +1 -1
  516. package/dist/usd/index.d.ts +1 -1
  517. package/dist/usd/index.d.ts.map +1 -1
  518. package/dist/usd/lib/parse-usd.cjs +42 -5
  519. package/dist/usd/lib/parse-usd.cjs.map +2 -2
  520. package/dist/usd/lib/parse-usd.d.ts.map +1 -1
  521. package/dist/usd/lib/parse-usd.js +53 -6
  522. package/dist/usd/lib/parse-usd.js.map +1 -1
  523. package/dist/usd/lib/parse-usdc.cjs +187 -0
  524. package/dist/usd/lib/parse-usdc.cjs.map +7 -0
  525. package/dist/usd/lib/parse-usdc.d.ts +4 -0
  526. package/dist/usd/lib/parse-usdc.d.ts.map +1 -0
  527. package/dist/usd/lib/parse-usdc.js +176 -0
  528. package/dist/usd/lib/parse-usdc.js.map +1 -0
  529. package/dist/usd/lib/parse-usdz.cjs +22 -0
  530. package/dist/usd/lib/parse-usdz.cjs.map +2 -2
  531. package/dist/usd/lib/parse-usdz.d.ts.map +1 -1
  532. package/dist/usd/lib/parse-usdz.js +26 -0
  533. package/dist/usd/lib/parse-usdz.js.map +1 -1
  534. package/dist/usd/lib/usd-types.cjs.map +1 -1
  535. package/dist/usd/lib/usd-types.d.ts +14 -1
  536. package/dist/usd/lib/usd-types.d.ts.map +1 -1
  537. package/dist/usd/lib/usd-types.js +1 -1
  538. package/dist/usd/lib/usd-types.js.map +1 -1
  539. package/dist/usd/libs/README.md +27 -0
  540. package/dist/usd/libs/THREE-LICENSE +21 -0
  541. package/dist/usd/libs/usdc-parser.d.ts +78 -0
  542. package/dist/usd/libs/usdc-parser.d.ts.map +1 -0
  543. package/dist/usd/libs/usdc-parser.js +1669 -0
  544. package/dist/usd/libs/usdc-parser.js.map +1 -0
  545. package/dist/usd/usd-loader-types.cjs +5 -5
  546. package/dist/usd/usd-loader-types.cjs.map +2 -2
  547. package/dist/usd/usd-loader-types.d.ts +7 -7
  548. package/dist/usd/usd-loader-types.d.ts.map +1 -1
  549. package/dist/usd/usd-loader-types.js +7 -7
  550. package/dist/usd/usd-loader-types.js.map +1 -1
  551. package/dist/usd/usd-loader.cjs.map +1 -1
  552. package/dist/usd/usd-loader.d.ts +4 -4
  553. package/dist/usd/usd-loader.d.ts.map +1 -1
  554. package/dist/usd/usd-loader.js +2 -2
  555. package/dist/usd/usd-loader.js.map +1 -1
  556. package/dist/usd-loader-types.cjs +69 -0
  557. package/dist/usd-loader-types.cjs.map +7 -0
  558. package/dist/usd-loader-types.d.ts +2 -0
  559. package/dist/usd-loader-types.d.ts.map +1 -0
  560. package/dist/usd-loader-types.js +2 -0
  561. package/dist/usd-loader-types.js.map +1 -0
  562. package/dist/usd-loader.cjs +43 -0
  563. package/dist/usd-loader.cjs.map +7 -0
  564. package/dist/usd-loader.d.ts +2 -0
  565. package/dist/usd-loader.d.ts.map +1 -0
  566. package/dist/usd-loader.js +2 -0
  567. package/dist/usd-loader.js.map +1 -0
  568. package/package.json +144 -72
  569. package/src/draco/bundled.ts +9 -0
  570. package/src/draco/draco-format.ts +20 -0
  571. package/src/draco/draco-javascript-loader-with-parser.ts +30 -0
  572. package/src/draco/draco-libraries.ts +35 -0
  573. package/src/draco/draco-library-options.ts +76 -0
  574. package/src/draco/draco-loader-options.ts +33 -0
  575. package/src/draco/draco-loader-types.ts +77 -0
  576. package/src/draco/draco-loader.ts +45 -0
  577. package/src/draco/draco-wasm-loader-with-parser.ts +31 -0
  578. package/src/draco/draco-writer.ts +254 -0
  579. package/src/draco/draco3d/draco3d-types.ts +498 -0
  580. package/src/draco/draco3d-loader-with-parser.ts +34 -0
  581. package/src/draco/index.ts +42 -0
  582. package/src/draco/lib/draco-builder.ts +935 -0
  583. package/src/draco/lib/draco-library-loader.ts +38 -0
  584. package/src/draco/lib/draco-module-loader.ts +370 -0
  585. package/src/draco/lib/draco-parser.ts +779 -0
  586. package/src/draco/lib/draco-types.ts +72 -0
  587. package/src/draco/lib/parse-draco.ts +52 -0
  588. package/src/draco/lib/utils/get-draco-schema.ts +65 -0
  589. package/src/draco/lib/utils/version.ts +8 -0
  590. package/src/draco/libs/DRACO-LICENSE +252 -0
  591. package/src/draco/libs/README.md +20 -0
  592. package/src/draco/libs/draco_decoder.js +34 -0
  593. package/src/draco/libs/draco_decoder.wasm +0 -0
  594. package/src/draco/libs/draco_decoder_gltf.wasm +0 -0
  595. package/src/draco/libs/draco_encoder.js +98 -0
  596. package/src/draco/libs/draco_encoder.wasm +0 -0
  597. package/src/draco/libs/draco_wasm_wrapper.js +117 -0
  598. package/src/draco/libs/draco_wasm_wrapper_gltf.js +116 -0
  599. package/src/draco/unbundled.ts +6 -0
  600. package/src/draco/workers/draco-worker-node.ts +10 -0
  601. package/src/draco/workers/draco-worker.ts +8 -0
  602. package/src/draco/workers/draco-writer-worker-node.cjs +21 -0
  603. package/src/draco/workers/draco-writer-worker-node.ts +13 -0
  604. package/src/draco/workers/draco-writer-worker.ts +11 -0
  605. package/src/draco-javascript-loader.ts +2 -0
  606. package/src/draco-library-options.ts +6 -0
  607. package/src/draco-loader-types.ts +2 -0
  608. package/src/draco-loader.ts +2 -0
  609. package/src/draco-wasm-loader.ts +2 -0
  610. package/src/draco-writer.ts +2 -0
  611. package/src/draco3d-loader.ts +2 -0
  612. package/src/glb-loader-types.ts +1 -0
  613. package/src/glb-loader.ts +1 -0
  614. package/src/glb-writer.ts +1 -0
  615. package/src/gltf/glb-loader-types.ts +1 -1
  616. package/src/gltf/gltf-loader-types.ts +11 -5
  617. package/src/gltf/gltf-loader.ts +4 -4
  618. package/src/gltf/index.ts +4 -1
  619. package/src/gltf/lib/api/gltf-extensions.ts +7 -2
  620. package/src/gltf/lib/encoders/encode-gltf-draco.ts +2 -2
  621. package/src/gltf/lib/extensions/EXT_texture_webp.ts +3 -0
  622. package/src/gltf/lib/extensions/KHR_accessor_float64.ts +22 -0
  623. package/src/gltf/lib/extensions/KHR_draco_mesh_compression.ts +2 -1
  624. package/src/gltf/lib/extensions/KHR_gaussian_splatting.ts +31 -7
  625. package/src/gltf/lib/extensions/MSFT_texture_dds.ts +52 -0
  626. package/src/gltf/lib/extensions/utils/3d-tiles-utils.ts +5 -1
  627. package/src/gltf/lib/parsers/parse-gltf.ts +38 -6
  628. package/src/gltf/lib/types/gltf-additional-extension-schemas.ts +32 -0
  629. package/src/gltf/lib/types/gltf-ext-gaussian-splatting-schema.ts +1 -1
  630. package/src/gltf/lib/types/gltf-extension-schemas.ts +12 -0
  631. package/src/gltf/lib/types/gltf-json-schema.ts +2 -1
  632. package/src/gltf/lib/types/gltf-texture-procedurals.ts +67 -0
  633. package/src/gltf/lib/types/gltf-types.ts +8 -0
  634. package/src/gltf/lib/types/gltf-zod-schema.ts +7 -1
  635. package/src/gltf/schema.ts +1 -0
  636. package/src/gltf-loader-types.ts +1 -0
  637. package/src/gltf-loader.ts +1 -0
  638. package/src/gltf-source.ts +1 -0
  639. package/src/gltf-writer.ts +1 -0
  640. package/src/index.ts +13 -3
  641. package/src/materialx/README.md +5 -0
  642. package/src/materialx/parse-materialx.ts +70 -0
  643. package/src/materialx/procedural-graph.ts +94 -0
  644. package/src/materialx-loader-types.ts +24 -0
  645. package/src/materialx-loader.ts +15 -0
  646. package/src/mtl-loader-types.ts +1 -0
  647. package/src/mtl-loader.ts +1 -0
  648. package/src/obj/bundled.ts +1 -4
  649. package/src/obj/index.ts +0 -6
  650. package/src/obj/mtl-loader-types.ts +1 -4
  651. package/src/obj/mtl-loader.ts +1 -1
  652. package/src/obj/obj-loader-types.ts +11 -11
  653. package/src/obj/obj-loader.ts +87 -37
  654. package/src/obj/obj-writer.ts +12 -8
  655. package/src/obj/unbundled.ts +2 -2
  656. package/src/obj/workers/obj-worker.ts +6 -6
  657. package/src/obj-loader-types.ts +1 -0
  658. package/src/obj-loader.ts +1 -0
  659. package/src/obj-writer.ts +1 -0
  660. package/src/stl/parse-stl.ts +90 -0
  661. package/src/stl-loader-types.ts +28 -0
  662. package/src/stl-loader.ts +12 -0
  663. package/src/usd/index.ts +1 -0
  664. package/src/usd/lib/parse-usd.ts +68 -7
  665. package/src/usd/lib/parse-usdc.ts +188 -0
  666. package/src/usd/lib/parse-usdz.ts +28 -0
  667. package/src/usd/lib/usd-types.ts +16 -2
  668. package/src/usd/libs/README.md +27 -0
  669. package/src/usd/libs/THREE-LICENSE +21 -0
  670. package/src/usd/libs/usdc-parser.d.ts +18 -0
  671. package/src/usd/libs/usdc-parser.js +1669 -0
  672. package/src/usd/usd-loader-types.ts +6 -6
  673. package/src/usd/usd-loader.ts +2 -2
  674. package/src/usd-loader-types.ts +1 -0
  675. package/src/usd-loader.ts +1 -0
@@ -0,0 +1,601 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/draco/lib/draco-parser.ts
21
+ var draco_parser_exports = {};
22
+ __export(draco_parser_exports, {
23
+ default: () => DracoParser
24
+ });
25
+ module.exports = __toCommonJS(draco_parser_exports);
26
+ var import_loader_utils = require("@loaders.gl/core/loader-utils");
27
+ var import_schema_utils = require("@loaders.gl/core/schema-utils");
28
+ var import_get_draco_schema = require("./utils/get-draco-schema.cjs");
29
+ var DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP = {
30
+ POSITION: "POSITION",
31
+ NORMAL: "NORMAL",
32
+ COLOR: "COLOR_0",
33
+ TEX_COORD: "TEXCOORD_0"
34
+ };
35
+ var DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP = {
36
+ 1: Int8Array,
37
+ 2: Uint8Array,
38
+ 3: Int16Array,
39
+ 4: Uint16Array,
40
+ 5: Int32Array,
41
+ 6: Uint32Array,
42
+ // 7: BigInt64Array,
43
+ // 8: BigUint64Array,
44
+ 9: Float32Array
45
+ // 10: Float64Array
46
+ // 11: BOOL - What array type do we use for this?
47
+ };
48
+ var UINT16_INDEX_ITEM_SIZE = 2;
49
+ var UINT32_INDEX_ITEM_SIZE = 4;
50
+ var DracoParser = class {
51
+ // draco - the draco decoder, either import `draco3d` or load dynamically
52
+ constructor(draco, logger = (0, import_loader_utils.getLoaderLog)()) {
53
+ this.logger = logger;
54
+ this.draco = draco;
55
+ this.decoder = new this.draco.Decoder();
56
+ this.metadataQuerier = new this.draco.MetadataQuerier();
57
+ }
58
+ logger;
59
+ draco;
60
+ decoder;
61
+ metadataQuerier;
62
+ /**
63
+ * Destroy draco resources
64
+ */
65
+ destroy() {
66
+ this.draco.destroy(this.decoder);
67
+ this.draco.destroy(this.metadataQuerier);
68
+ }
69
+ /**
70
+ * NOTE: caller must call `destroyGeometry` on the return value after using it
71
+ * @param arrayBuffer
72
+ * @param options
73
+ */
74
+ parseSync(arrayBuffer, options = {}) {
75
+ validateAttributeSelection(options);
76
+ const encodedData = ArrayBuffer.isView(arrayBuffer) ? new Int8Array(arrayBuffer.buffer, arrayBuffer.byteOffset, arrayBuffer.byteLength) : new Int8Array(arrayBuffer);
77
+ this._disableAttributeTransforms(options);
78
+ const geometry_type = this.decoder.GetEncodedGeometryType(encodedData);
79
+ const dracoGeometry = geometry_type === this.draco.TRIANGULAR_MESH ? new this.draco.Mesh() : new this.draco.PointCloud();
80
+ let dracoStatus = null;
81
+ try {
82
+ switch (geometry_type) {
83
+ case this.draco.TRIANGULAR_MESH:
84
+ dracoStatus = this.decoder.DecodeArrayToMesh(
85
+ encodedData,
86
+ encodedData.byteLength,
87
+ dracoGeometry
88
+ );
89
+ break;
90
+ case this.draco.POINT_CLOUD:
91
+ dracoStatus = this.decoder.DecodeArrayToPointCloud(
92
+ encodedData,
93
+ encodedData.byteLength,
94
+ dracoGeometry
95
+ );
96
+ break;
97
+ default:
98
+ throw new Error("DRACO: Unknown geometry type.");
99
+ }
100
+ if (!dracoStatus.ok() || !dracoGeometry.ptr) {
101
+ const message = `DRACO decompression failed: ${dracoStatus.error_msg()}`;
102
+ throw new Error(message);
103
+ }
104
+ const loaderData = this._getDracoLoaderData(dracoGeometry, geometry_type, options);
105
+ const geometry = this._getMeshData(dracoGeometry, loaderData, options);
106
+ const boundingBox = getTransformedMeshBoundingBox(geometry.attributes);
107
+ const schema = (0, import_get_draco_schema.getDracoSchema)(geometry.attributes, loaderData, geometry.indices);
108
+ const data = {
109
+ loader: "draco",
110
+ loaderData,
111
+ header: {
112
+ vertexCount: dracoGeometry.num_points(),
113
+ boundingBox
114
+ },
115
+ ...geometry,
116
+ schema
117
+ };
118
+ return data;
119
+ } finally {
120
+ if (dracoStatus) {
121
+ this.draco.destroy(dracoStatus);
122
+ }
123
+ if (dracoGeometry) {
124
+ this.draco.destroy(dracoGeometry);
125
+ }
126
+ }
127
+ }
128
+ // Draco specific "loader data"
129
+ /**
130
+ * Extract
131
+ * @param dracoGeometry
132
+ * @param geometry_type
133
+ * @param options
134
+ * @returns
135
+ */
136
+ _getDracoLoaderData(dracoGeometry, geometry_type, options) {
137
+ const metadata = this._getTopLevelMetadata(dracoGeometry);
138
+ const attributes = this._getDracoAttributes(dracoGeometry, options);
139
+ return {
140
+ geometry_type,
141
+ num_attributes: dracoGeometry.num_attributes(),
142
+ num_points: dracoGeometry.num_points(),
143
+ num_faces: dracoGeometry instanceof this.draco.Mesh ? dracoGeometry.num_faces() : 0,
144
+ metadata,
145
+ attributes
146
+ };
147
+ }
148
+ /**
149
+ * Extract all draco provided information and metadata for each attribute
150
+ * @param dracoGeometry
151
+ * @param options
152
+ * @returns
153
+ */
154
+ _getDracoAttributes(dracoGeometry, options) {
155
+ const dracoAttributes = {};
156
+ for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {
157
+ const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);
158
+ const metadata = this._getAttributeMetadata(dracoGeometry, attributeId);
159
+ dracoAttributes[dracoAttribute.unique_id()] = {
160
+ unique_id: dracoAttribute.unique_id(),
161
+ attribute_type: dracoAttribute.attribute_type(),
162
+ data_type: dracoAttribute.data_type(),
163
+ num_components: dracoAttribute.num_components(),
164
+ byte_offset: dracoAttribute.byte_offset(),
165
+ byte_stride: dracoAttribute.byte_stride(),
166
+ normalized: dracoAttribute.normalized(),
167
+ attribute_index: attributeId,
168
+ metadata
169
+ };
170
+ const quantization = this._getQuantizationTransform(dracoAttribute, options);
171
+ if (quantization) {
172
+ dracoAttributes[dracoAttribute.unique_id()].quantization_transform = quantization;
173
+ }
174
+ const octahedron = this._getOctahedronTransform(dracoAttribute, options);
175
+ if (octahedron) {
176
+ dracoAttributes[dracoAttribute.unique_id()].octahedron_transform = octahedron;
177
+ }
178
+ }
179
+ return dracoAttributes;
180
+ }
181
+ /**
182
+ * Get standard loaders.gl mesh category data
183
+ * Extracts the geometry from draco
184
+ * @param dracoGeometry
185
+ * @param options
186
+ */
187
+ _getMeshData(dracoGeometry, loaderData, options) {
188
+ const attributes = this._getMeshAttributes(loaderData, dracoGeometry, options);
189
+ const positionAttribute = attributes.POSITION;
190
+ if (!positionAttribute) {
191
+ throw new Error("DRACO: No position attribute found.");
192
+ }
193
+ if (dracoGeometry instanceof this.draco.Mesh) {
194
+ switch (options.topology) {
195
+ case "triangle-strip":
196
+ return {
197
+ topology: "triangle-strip",
198
+ mode: 5,
199
+ // GL.TRIANGLE_STRIP
200
+ attributes,
201
+ indices: {
202
+ value: this._getTriangleStripIndices(dracoGeometry),
203
+ size: 1
204
+ }
205
+ };
206
+ case "triangle-list":
207
+ default:
208
+ return {
209
+ topology: "triangle-list",
210
+ mode: 4,
211
+ // GL.TRIANGLES
212
+ attributes,
213
+ indices: {
214
+ value: this._getTriangleListIndices(dracoGeometry),
215
+ size: 1
216
+ }
217
+ };
218
+ }
219
+ }
220
+ return {
221
+ topology: "point-list",
222
+ mode: 0,
223
+ // GL.POINTS
224
+ attributes
225
+ };
226
+ }
227
+ _getMeshAttributes(loaderData, dracoGeometry, options) {
228
+ const attributes = {};
229
+ const usedAttributeNames = {};
230
+ const loaderAttributes = Object.values(loaderData.attributes).sort(
231
+ (left, right) => left.attribute_index - right.attribute_index
232
+ );
233
+ const namedAttributes = loaderAttributes.map((loaderAttribute) => {
234
+ const deducedAttributeName = this._deduceAttributeName(loaderAttribute, options);
235
+ const attributeName = getUniqueAttributeName(deducedAttributeName, usedAttributeNames);
236
+ usedAttributeNames[attributeName] = true;
237
+ loaderAttribute.name = attributeName;
238
+ return { attributeName, loaderAttribute };
239
+ });
240
+ validateSelectedAttributeNames(options, Object.keys(usedAttributeNames));
241
+ for (const { attributeName, loaderAttribute } of namedAttributes) {
242
+ if (!this._shouldExtractAttribute(attributeName, loaderAttribute, options)) {
243
+ continue;
244
+ }
245
+ const values = this._getAttributeValues(dracoGeometry, loaderAttribute);
246
+ if (values) {
247
+ const { value, size } = values;
248
+ attributes[attributeName] = {
249
+ value,
250
+ size,
251
+ byteOffset: loaderAttribute.byte_offset,
252
+ byteStride: loaderAttribute.byte_stride,
253
+ normalized: loaderAttribute.normalized,
254
+ transform: getMeshAttributeTransform(loaderAttribute)
255
+ };
256
+ }
257
+ }
258
+ return attributes;
259
+ }
260
+ /** Returns true when an attribute should be copied from WASM into the requested output. */
261
+ _shouldExtractAttribute(attributeName, attribute, options) {
262
+ if (attribute.attribute_type === this.draco.POSITION) {
263
+ if (options.excludeAttributes?.includes(attributeName)) {
264
+ throw new Error(`DracoLoader: position attribute "${attributeName}" cannot be excluded`);
265
+ }
266
+ return true;
267
+ }
268
+ if (options.includeAttributes && !options.includeAttributes.includes(attributeName)) {
269
+ return false;
270
+ }
271
+ return !options.excludeAttributes?.includes(attributeName);
272
+ }
273
+ // MESH INDICES EXTRACTION
274
+ /**
275
+ * For meshes, we need indices to define the faces.
276
+ * @param dracoGeometry
277
+ */
278
+ _getTriangleListIndices(dracoGeometry) {
279
+ const numFaces = dracoGeometry.num_faces();
280
+ const numIndices = numFaces * 3;
281
+ const useUint16 = dracoGeometry.num_points() <= 65536;
282
+ const byteLength = numIndices * (useUint16 ? UINT16_INDEX_ITEM_SIZE : UINT32_INDEX_ITEM_SIZE);
283
+ const ptr = this.draco._malloc(byteLength);
284
+ try {
285
+ if (useUint16) {
286
+ const decoded2 = this.decoder.GetTrianglesUInt16Array(dracoGeometry, byteLength, ptr);
287
+ if (!decoded2) {
288
+ throw new Error("DRACO: Failed to decode triangle indices.");
289
+ }
290
+ return new Uint16Array(this.draco.HEAPU8.buffer, ptr, numIndices).slice();
291
+ }
292
+ const decoded = this.decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);
293
+ if (!decoded) {
294
+ throw new Error("DRACO: Failed to decode triangle indices.");
295
+ }
296
+ return new Uint32Array(this.draco.HEAPU8.buffer, ptr, numIndices).slice();
297
+ } finally {
298
+ this.draco._free(ptr);
299
+ }
300
+ }
301
+ /**
302
+ * For meshes, we need indices to define the faces.
303
+ * @param dracoGeometry
304
+ */
305
+ _getTriangleStripIndices(dracoGeometry) {
306
+ const dracoArray = new this.draco.DracoInt32Array();
307
+ try {
308
+ this.decoder.GetTriangleStripsFromMesh(dracoGeometry, dracoArray);
309
+ return getUint32Array(dracoArray);
310
+ } finally {
311
+ this.draco.destroy(dracoArray);
312
+ }
313
+ }
314
+ /**
315
+ *
316
+ * @param dracoGeometry
317
+ * @param dracoAttribute
318
+ * @param attributeName
319
+ */
320
+ _getAttributeValues(dracoGeometry, attribute) {
321
+ const TypedArrayCtor = DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP[attribute.data_type];
322
+ if (!TypedArrayCtor) {
323
+ this.logger.warn(`DRACO: Unsupported attribute type ${attribute.data_type}`)();
324
+ return null;
325
+ }
326
+ const numComponents = attribute.num_components;
327
+ const numPoints = dracoGeometry.num_points();
328
+ const numValues = numPoints * numComponents;
329
+ const byteLength = numValues * TypedArrayCtor.BYTES_PER_ELEMENT;
330
+ const dataType = getDracoDataType(this.draco, TypedArrayCtor);
331
+ let value;
332
+ const ptr = this.draco._malloc(byteLength);
333
+ try {
334
+ const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attribute.attribute_index);
335
+ const decoded = this.decoder.GetAttributeDataArrayForAllPoints(
336
+ dracoGeometry,
337
+ dracoAttribute,
338
+ dataType,
339
+ byteLength,
340
+ ptr
341
+ );
342
+ if (!decoded) {
343
+ throw new Error(`DRACO: Failed to decode attribute ${attribute.unique_id}.`);
344
+ }
345
+ value = new TypedArrayCtor(this.draco.HEAPU8.buffer, ptr, numValues).slice();
346
+ } finally {
347
+ this.draco._free(ptr);
348
+ }
349
+ return { value, size: numComponents };
350
+ }
351
+ // Attribute names
352
+ /**
353
+ * DRACO does not store attribute names - We need to deduce an attribute name
354
+ * for each attribute
355
+ _getAttributeNames(
356
+ dracoGeometry: Mesh | PointCloud,
357
+ options: DracoParseOptions
358
+ ): {[unique_id: number]: string} {
359
+ const attributeNames: {[unique_id: number]: string} = {};
360
+ for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {
361
+ const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);
362
+ const attributeName = this._deduceAttributeName(dracoAttribute, options);
363
+ attributeNames[attributeName] = attributeName;
364
+ }
365
+ return attributeNames;
366
+ }
367
+ */
368
+ /**
369
+ * Deduce an attribute name.
370
+ * @note DRACO does not save attribute names, just general type (POSITION, COLOR)
371
+ * to help optimize compression. We generate GLTF compatible names for the Draco-recognized
372
+ * types
373
+ * @param attributeData
374
+ */
375
+ _deduceAttributeName(attribute, options) {
376
+ const uniqueId = attribute.unique_id;
377
+ for (const [attributeName, attributeUniqueId] of Object.entries(
378
+ options.extraAttributes || {}
379
+ )) {
380
+ if (attributeUniqueId === uniqueId) {
381
+ return attributeName;
382
+ }
383
+ }
384
+ const entryName = options.attributeNameEntry || "name";
385
+ if (attribute.metadata[entryName]) {
386
+ const attributeName = attribute.metadata[entryName].string;
387
+ if (attributeName === "COLOR") {
388
+ return "COLOR_0";
389
+ }
390
+ if (attributeName === "TEX_COORD") {
391
+ return "TEXCOORD_0";
392
+ }
393
+ return attributeName;
394
+ }
395
+ const thisAttributeType = attribute.attribute_type;
396
+ for (const dracoAttributeConstant in DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP) {
397
+ const attributeType = this.draco[dracoAttributeConstant];
398
+ if (attributeType === thisAttributeType) {
399
+ return DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP[dracoAttributeConstant];
400
+ }
401
+ }
402
+ return `CUSTOM_ATTRIBUTE_${uniqueId}`;
403
+ }
404
+ // METADATA EXTRACTION
405
+ /** Get top level metadata */
406
+ _getTopLevelMetadata(dracoGeometry) {
407
+ const dracoMetadata = this.decoder.GetMetadata(dracoGeometry);
408
+ return this._getDracoMetadata(dracoMetadata);
409
+ }
410
+ /** Get per attribute metadata */
411
+ _getAttributeMetadata(dracoGeometry, attributeId) {
412
+ const dracoMetadata = this.decoder.GetAttributeMetadata(dracoGeometry, attributeId);
413
+ return this._getDracoMetadata(dracoMetadata);
414
+ }
415
+ /**
416
+ * Extract metadata field values
417
+ * @param dracoMetadata
418
+ * @returns
419
+ */
420
+ _getDracoMetadata(dracoMetadata) {
421
+ if (!dracoMetadata || !dracoMetadata.ptr) {
422
+ return {};
423
+ }
424
+ const result = {};
425
+ const numEntries = this.metadataQuerier.NumEntries(dracoMetadata);
426
+ for (let entryIndex = 0; entryIndex < numEntries; entryIndex++) {
427
+ const entryName = this.metadataQuerier.GetEntryName(dracoMetadata, entryIndex);
428
+ result[entryName] = this._getDracoMetadataField(dracoMetadata, entryName);
429
+ }
430
+ return result;
431
+ }
432
+ /**
433
+ * Extracts possible values for one metadata entry by name
434
+ * @param dracoMetadata
435
+ * @param entryName
436
+ */
437
+ _getDracoMetadataField(dracoMetadata, entryName) {
438
+ const dracoArray = new this.draco.DracoInt32Array();
439
+ try {
440
+ this.metadataQuerier.GetIntEntryArray(dracoMetadata, entryName, dracoArray);
441
+ const intArray = getInt32Array(dracoArray);
442
+ return {
443
+ int: this.metadataQuerier.GetIntEntry(dracoMetadata, entryName),
444
+ string: this.metadataQuerier.GetStringEntry(dracoMetadata, entryName),
445
+ double: this.metadataQuerier.GetDoubleEntry(dracoMetadata, entryName),
446
+ intArray
447
+ };
448
+ } finally {
449
+ this.draco.destroy(dracoArray);
450
+ }
451
+ }
452
+ // QUANTIZED ATTRIBUTE SUPPORT (NO DECOMPRESSION)
453
+ /** Skip transforms for specific attribute types */
454
+ _disableAttributeTransforms(options) {
455
+ const { quantizedAttributes = [], octahedronAttributes = [] } = options;
456
+ const skipAttributes = [...quantizedAttributes, ...octahedronAttributes];
457
+ for (const dracoAttributeName of skipAttributes) {
458
+ this.decoder.SkipAttributeTransform(this.draco[dracoAttributeName]);
459
+ }
460
+ }
461
+ /**
462
+ * Extract (and apply?) Position Transform
463
+ * @todo not used
464
+ */
465
+ _getQuantizationTransform(dracoAttribute, options) {
466
+ const { quantizedAttributes = [] } = options;
467
+ const attribute_type = dracoAttribute.attribute_type();
468
+ const skip = quantizedAttributes.map((type) => this.draco[type]).includes(attribute_type);
469
+ if (skip) {
470
+ const transform = new this.draco.AttributeQuantizationTransform();
471
+ try {
472
+ if (transform.InitFromAttribute(dracoAttribute)) {
473
+ return {
474
+ quantization_bits: transform.quantization_bits(),
475
+ range: transform.range(),
476
+ min_values: Float32Array.from(
477
+ { length: dracoAttribute.num_components() },
478
+ (_, componentIndex) => transform.min_value(componentIndex)
479
+ )
480
+ };
481
+ }
482
+ } finally {
483
+ this.draco.destroy(transform);
484
+ }
485
+ }
486
+ return null;
487
+ }
488
+ _getOctahedronTransform(dracoAttribute, options) {
489
+ const { octahedronAttributes = [] } = options;
490
+ const attribute_type = dracoAttribute.attribute_type();
491
+ const octahedron = octahedronAttributes.map((type) => this.draco[type]).includes(attribute_type);
492
+ if (octahedron) {
493
+ const transform = new this.draco.AttributeOctahedronTransform();
494
+ try {
495
+ if (transform.InitFromAttribute(dracoAttribute)) {
496
+ return {
497
+ quantization_bits: transform.quantization_bits()
498
+ };
499
+ }
500
+ } finally {
501
+ this.draco.destroy(transform);
502
+ }
503
+ }
504
+ return null;
505
+ }
506
+ // HELPERS
507
+ };
508
+ function getDracoDataType(draco, attributeType) {
509
+ switch (attributeType) {
510
+ case Float32Array:
511
+ return draco.DT_FLOAT32;
512
+ case Int8Array:
513
+ return draco.DT_INT8;
514
+ case Int16Array:
515
+ return draco.DT_INT16;
516
+ case Int32Array:
517
+ return draco.DT_INT32;
518
+ case Uint8Array:
519
+ return draco.DT_UINT8;
520
+ case Uint16Array:
521
+ return draco.DT_UINT16;
522
+ case Uint32Array:
523
+ return draco.DT_UINT32;
524
+ default:
525
+ return draco.DT_INVALID;
526
+ }
527
+ }
528
+ function getInt32Array(dracoArray) {
529
+ const numValues = dracoArray.size();
530
+ const intArray = new Int32Array(numValues);
531
+ for (let i = 0; i < numValues; i++) {
532
+ intArray[i] = dracoArray.GetValue(i);
533
+ }
534
+ return intArray;
535
+ }
536
+ function getUint32Array(dracoArray) {
537
+ const numValues = dracoArray.size();
538
+ const intArray = new Uint32Array(numValues);
539
+ for (let i = 0; i < numValues; i++) {
540
+ intArray[i] = dracoArray.GetValue(i);
541
+ }
542
+ return intArray;
543
+ }
544
+ function getUniqueAttributeName(attributeName, attributes) {
545
+ if (!Object.prototype.hasOwnProperty.call(attributes, attributeName)) {
546
+ return attributeName;
547
+ }
548
+ const suffixMatch = /^(.*)_([0-9]+)$/.exec(attributeName);
549
+ const baseName = suffixMatch ? suffixMatch[1] : attributeName;
550
+ let suffix = suffixMatch ? BigInt(suffixMatch[2]) + 1n : 1n;
551
+ while (Object.prototype.hasOwnProperty.call(attributes, `${baseName}_${suffix}`)) {
552
+ suffix++;
553
+ }
554
+ return `${baseName}_${suffix}`;
555
+ }
556
+ function getMeshAttributeTransform(attribute) {
557
+ if (attribute.quantization_transform) {
558
+ const { quantization_bits, min_values, range } = attribute.quantization_transform;
559
+ if (quantization_bits !== void 0 && min_values && range !== void 0) {
560
+ return {
561
+ type: "quantization",
562
+ bits: quantization_bits,
563
+ origin: Array.from(min_values),
564
+ range
565
+ };
566
+ }
567
+ }
568
+ if (attribute.octahedron_transform?.quantization_bits !== void 0) {
569
+ return {
570
+ type: "octahedron",
571
+ bits: attribute.octahedron_transform.quantization_bits
572
+ };
573
+ }
574
+ return void 0;
575
+ }
576
+ function validateAttributeSelection(options) {
577
+ if (options.includeAttributes && options.excludeAttributes) {
578
+ throw new Error("DracoLoader: includeAttributes and excludeAttributes cannot be combined");
579
+ }
580
+ }
581
+ function validateSelectedAttributeNames(options, attributeNames) {
582
+ for (const attributeName of options.includeAttributes || options.excludeAttributes || []) {
583
+ if (!attributeNames.includes(attributeName)) {
584
+ throw new Error(`DracoLoader: selected attribute "${attributeName}" does not exist`);
585
+ }
586
+ }
587
+ }
588
+ function getTransformedMeshBoundingBox(attributes) {
589
+ const boundingBox = (0, import_schema_utils.getMeshBoundingBox)(attributes);
590
+ if (!boundingBox) throw new Error("Decoded mesh is missing positions");
591
+ const position = attributes.POSITION;
592
+ if (position?.transform?.type !== "quantization") {
593
+ return boundingBox;
594
+ }
595
+ const { bits, origin, range } = position.transform;
596
+ const scale = range / (2 ** bits - 1);
597
+ return boundingBox.map(
598
+ (bounds) => bounds.map((value, componentIndex) => origin[componentIndex] + value * scale)
599
+ );
600
+ }
601
+ //# sourceMappingURL=draco-parser.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/draco/lib/draco-parser.ts"],
4
+ "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable camelcase */\n\nimport {getLoaderLog} from '@loaders.gl/core/loader-utils';\nimport type {\n TypedArray,\n TypedArrayConstructor,\n MeshAttribute,\n MeshAttributeTransform,\n MeshGeometry\n} from '@loaders.gl/core/schema';\n\n// Draco types (input)\nimport type {\n Draco3D,\n Decoder,\n Mesh,\n PointCloud,\n PointAttribute,\n Metadata,\n MetadataQuerier,\n DracoInt32Array,\n draco_DataType,\n Status\n} from '../draco3d/draco3d-types';\n\n// Parsed data types (output)\nimport type {\n DracoMesh,\n DracoLoaderData,\n DracoAttribute,\n DracoMetadataEntry,\n DracoQuantizationTransform,\n DracoOctahedronTransform\n} from './draco-types';\n\nimport {getMeshBoundingBox} from '@loaders.gl/core/schema-utils';\nimport {getDracoSchema} from './utils/get-draco-schema';\n\n/** Options to control draco parsing */\nexport type DracoParseOptions = {\n /** How triangle indices should be generated (mesh only) */\n topology?: 'triangle-list' | 'triangle-strip';\n /** Specify which attribute metadata entry stores the attribute name */\n attributeNameEntry?: string;\n /** Names and ids of extra attributes to include in the output */\n extraAttributes?: {[uniqueId: string]: number};\n /** Skip transforms specific quantized attributes */\n quantizedAttributes?: ('POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC')[];\n /** Skip transforms specific octahedron encoded attributes */\n octahedronAttributes?: ('POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC')[];\n /** Application attribute names to extract in addition to the required position attribute. */\n includeAttributes?: string[];\n /** Application attribute names to omit. The position attribute cannot be omitted. */\n excludeAttributes?: string[];\n};\n\n// Native Draco attribute names to GLTF attribute names.\nconst DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP = {\n POSITION: 'POSITION',\n NORMAL: 'NORMAL',\n COLOR: 'COLOR_0',\n TEX_COORD: 'TEXCOORD_0'\n};\n\nconst DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP = {\n 1: Int8Array,\n 2: Uint8Array,\n 3: Int16Array,\n 4: Uint16Array,\n 5: Int32Array,\n 6: Uint32Array,\n // 7: BigInt64Array,\n // 8: BigUint64Array,\n 9: Float32Array\n // 10: Float64Array\n // 11: BOOL - What array type do we use for this?\n};\n\nconst UINT16_INDEX_ITEM_SIZE = 2;\nconst UINT32_INDEX_ITEM_SIZE = 4;\n\nexport default class DracoParser {\n draco: Draco3D;\n decoder: Decoder;\n metadataQuerier: MetadataQuerier;\n\n // draco - the draco decoder, either import `draco3d` or load dynamically\n constructor(\n draco: Draco3D,\n private readonly logger = getLoaderLog()\n ) {\n this.draco = draco;\n this.decoder = new this.draco.Decoder();\n this.metadataQuerier = new this.draco.MetadataQuerier();\n }\n\n /**\n * Destroy draco resources\n */\n destroy(): void {\n this.draco.destroy(this.decoder);\n this.draco.destroy(this.metadataQuerier);\n }\n\n /**\n * NOTE: caller must call `destroyGeometry` on the return value after using it\n * @param arrayBuffer\n * @param options\n */\n parseSync(\n arrayBuffer: ArrayBuffer | ArrayBufferView,\n options: DracoParseOptions = {}\n ): DracoMesh {\n validateAttributeSelection(options);\n const encodedData = ArrayBuffer.isView(arrayBuffer)\n ? new Int8Array(arrayBuffer.buffer, arrayBuffer.byteOffset, arrayBuffer.byteLength)\n : new Int8Array(arrayBuffer);\n\n this._disableAttributeTransforms(options);\n\n const geometry_type = this.decoder.GetEncodedGeometryType(encodedData);\n const dracoGeometry =\n geometry_type === this.draco.TRIANGULAR_MESH\n ? new this.draco.Mesh()\n : new this.draco.PointCloud();\n\n let dracoStatus: Status | null = null;\n try {\n switch (geometry_type) {\n case this.draco.TRIANGULAR_MESH:\n dracoStatus = this.decoder.DecodeArrayToMesh(\n encodedData,\n encodedData.byteLength,\n dracoGeometry as Mesh\n );\n break;\n\n case this.draco.POINT_CLOUD:\n dracoStatus = this.decoder.DecodeArrayToPointCloud(\n encodedData,\n encodedData.byteLength,\n dracoGeometry\n );\n break;\n\n default:\n throw new Error('DRACO: Unknown geometry type.');\n }\n\n if (!dracoStatus.ok() || !dracoGeometry.ptr) {\n const message = `DRACO decompression failed: ${dracoStatus.error_msg()}`;\n // console.error(message);\n throw new Error(message);\n }\n\n const loaderData = this._getDracoLoaderData(dracoGeometry, geometry_type, options);\n\n const geometry = this._getMeshData(dracoGeometry, loaderData, options);\n\n const boundingBox = getTransformedMeshBoundingBox(geometry.attributes);\n\n const schema = getDracoSchema(geometry.attributes, loaderData, geometry.indices);\n\n const data: DracoMesh = {\n loader: 'draco',\n loaderData,\n header: {\n vertexCount: dracoGeometry.num_points(),\n boundingBox\n },\n ...geometry,\n schema\n };\n return data;\n } finally {\n if (dracoStatus) {\n this.draco.destroy(dracoStatus);\n }\n if (dracoGeometry) {\n this.draco.destroy(dracoGeometry);\n }\n }\n }\n\n // Draco specific \"loader data\"\n\n /**\n * Extract\n * @param dracoGeometry\n * @param geometry_type\n * @param options\n * @returns\n */\n _getDracoLoaderData(\n dracoGeometry: Mesh | PointCloud,\n geometry_type,\n options: DracoParseOptions\n ): DracoLoaderData {\n const metadata = this._getTopLevelMetadata(dracoGeometry);\n const attributes = this._getDracoAttributes(dracoGeometry, options);\n\n return {\n geometry_type,\n num_attributes: dracoGeometry.num_attributes(),\n num_points: dracoGeometry.num_points(),\n num_faces: dracoGeometry instanceof this.draco.Mesh ? dracoGeometry.num_faces() : 0,\n metadata,\n attributes\n };\n }\n\n /**\n * Extract all draco provided information and metadata for each attribute\n * @param dracoGeometry\n * @param options\n * @returns\n */\n _getDracoAttributes(\n dracoGeometry: Mesh | PointCloud,\n options: DracoParseOptions\n ): {[unique_id: number]: DracoAttribute} {\n const dracoAttributes: {[unique_id: number]: DracoAttribute} = {};\n\n for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {\n // Note: Draco docs do not seem clear on `GetAttribute` ids just being a zero-based index,\n // but it does seems to work this way\n const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);\n\n const metadata = this._getAttributeMetadata(dracoGeometry, attributeId);\n\n dracoAttributes[dracoAttribute.unique_id()] = {\n unique_id: dracoAttribute.unique_id(),\n attribute_type: dracoAttribute.attribute_type(),\n data_type: dracoAttribute.data_type(),\n num_components: dracoAttribute.num_components(),\n\n byte_offset: dracoAttribute.byte_offset(),\n byte_stride: dracoAttribute.byte_stride(),\n normalized: dracoAttribute.normalized(),\n attribute_index: attributeId,\n\n metadata\n };\n\n // Add transformation parameters for any attributes app wants untransformed\n const quantization = this._getQuantizationTransform(dracoAttribute, options);\n if (quantization) {\n dracoAttributes[dracoAttribute.unique_id()].quantization_transform = quantization;\n }\n\n const octahedron = this._getOctahedronTransform(dracoAttribute, options);\n if (octahedron) {\n dracoAttributes[dracoAttribute.unique_id()].octahedron_transform = octahedron;\n }\n }\n\n return dracoAttributes;\n }\n\n /**\n * Get standard loaders.gl mesh category data\n * Extracts the geometry from draco\n * @param dracoGeometry\n * @param options\n */\n _getMeshData(\n dracoGeometry: Mesh | PointCloud,\n loaderData: DracoLoaderData,\n options: DracoParseOptions\n ): MeshGeometry {\n const attributes = this._getMeshAttributes(loaderData, dracoGeometry, options);\n\n const positionAttribute = attributes.POSITION;\n if (!positionAttribute) {\n throw new Error('DRACO: No position attribute found.');\n }\n\n // For meshes, we need indices to define the faces.\n if (dracoGeometry instanceof this.draco.Mesh) {\n switch (options.topology) {\n case 'triangle-strip':\n return {\n topology: 'triangle-strip',\n mode: 5, // GL.TRIANGLE_STRIP\n attributes,\n indices: {\n value: this._getTriangleStripIndices(dracoGeometry),\n size: 1\n }\n };\n case 'triangle-list':\n default:\n return {\n topology: 'triangle-list',\n mode: 4, // GL.TRIANGLES\n attributes,\n indices: {\n value: this._getTriangleListIndices(dracoGeometry),\n size: 1\n }\n };\n }\n }\n\n // PointCloud - must come last as Mesh inherits from PointCloud\n return {\n topology: 'point-list',\n mode: 0, // GL.POINTS\n attributes\n };\n }\n\n _getMeshAttributes(\n loaderData: DracoLoaderData,\n dracoGeometry: Mesh | PointCloud,\n options: DracoParseOptions\n ): {[attributeName: string]: MeshAttribute} {\n const attributes: {[key: string]: MeshAttribute} = {};\n const usedAttributeNames: Record<string, unknown> = {};\n\n const loaderAttributes = Object.values(loaderData.attributes).sort(\n (left, right) => left.attribute_index - right.attribute_index\n );\n const namedAttributes = loaderAttributes.map(loaderAttribute => {\n const deducedAttributeName = this._deduceAttributeName(loaderAttribute, options);\n const attributeName = getUniqueAttributeName(deducedAttributeName, usedAttributeNames);\n usedAttributeNames[attributeName] = true;\n loaderAttribute.name = attributeName;\n return {attributeName, loaderAttribute};\n });\n validateSelectedAttributeNames(options, Object.keys(usedAttributeNames));\n\n for (const {attributeName, loaderAttribute} of namedAttributes) {\n if (!this._shouldExtractAttribute(attributeName, loaderAttribute, options)) {\n continue;\n }\n const values = this._getAttributeValues(dracoGeometry, loaderAttribute);\n if (values) {\n const {value, size} = values;\n attributes[attributeName] = {\n value,\n size,\n byteOffset: loaderAttribute.byte_offset,\n byteStride: loaderAttribute.byte_stride,\n normalized: loaderAttribute.normalized,\n transform: getMeshAttributeTransform(loaderAttribute)\n };\n }\n }\n\n return attributes;\n }\n\n /** Returns true when an attribute should be copied from WASM into the requested output. */\n _shouldExtractAttribute(\n attributeName: string,\n attribute: DracoAttribute,\n options: DracoParseOptions\n ): boolean {\n if (attribute.attribute_type === this.draco.POSITION) {\n if (options.excludeAttributes?.includes(attributeName)) {\n throw new Error(`DracoLoader: position attribute \"${attributeName}\" cannot be excluded`);\n }\n return true;\n }\n if (options.includeAttributes && !options.includeAttributes.includes(attributeName)) {\n return false;\n }\n return !options.excludeAttributes?.includes(attributeName);\n }\n\n // MESH INDICES EXTRACTION\n\n /**\n * For meshes, we need indices to define the faces.\n * @param dracoGeometry\n */\n _getTriangleListIndices(dracoGeometry: Mesh): Uint16Array | Uint32Array {\n // Example on how to retrieve mesh and attributes.\n const numFaces = dracoGeometry.num_faces();\n const numIndices = numFaces * 3;\n const useUint16 = dracoGeometry.num_points() <= 65536;\n const byteLength = numIndices * (useUint16 ? UINT16_INDEX_ITEM_SIZE : UINT32_INDEX_ITEM_SIZE);\n\n const ptr = this.draco._malloc(byteLength);\n try {\n if (useUint16) {\n const decoded = this.decoder.GetTrianglesUInt16Array(dracoGeometry, byteLength, ptr);\n if (!decoded) {\n throw new Error('DRACO: Failed to decode triangle indices.');\n }\n return new Uint16Array(this.draco.HEAPU8.buffer, ptr, numIndices).slice();\n }\n const decoded = this.decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);\n if (!decoded) {\n throw new Error('DRACO: Failed to decode triangle indices.');\n }\n return new Uint32Array(this.draco.HEAPU8.buffer, ptr, numIndices).slice();\n } finally {\n this.draco._free(ptr);\n }\n }\n\n /**\n * For meshes, we need indices to define the faces.\n * @param dracoGeometry\n */\n _getTriangleStripIndices(dracoGeometry: Mesh) {\n const dracoArray = new this.draco.DracoInt32Array();\n try {\n /* const numStrips = */ this.decoder.GetTriangleStripsFromMesh(dracoGeometry, dracoArray);\n return getUint32Array(dracoArray);\n } finally {\n this.draco.destroy(dracoArray);\n }\n }\n\n /**\n *\n * @param dracoGeometry\n * @param dracoAttribute\n * @param attributeName\n */\n _getAttributeValues(\n dracoGeometry: Mesh | PointCloud,\n attribute: DracoAttribute\n ): {value: TypedArray; size: number} | null {\n const TypedArrayCtor = DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP[attribute.data_type];\n if (!TypedArrayCtor) {\n this.logger.warn(`DRACO: Unsupported attribute type ${attribute.data_type}`)();\n return null;\n }\n const numComponents = attribute.num_components;\n const numPoints = dracoGeometry.num_points();\n const numValues = numPoints * numComponents;\n\n const byteLength = numValues * TypedArrayCtor.BYTES_PER_ELEMENT;\n const dataType = getDracoDataType(this.draco, TypedArrayCtor);\n\n let value: TypedArray;\n\n const ptr = this.draco._malloc(byteLength);\n try {\n const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attribute.attribute_index);\n const decoded = this.decoder.GetAttributeDataArrayForAllPoints(\n dracoGeometry,\n dracoAttribute,\n dataType,\n byteLength,\n ptr\n );\n if (!decoded) {\n throw new Error(`DRACO: Failed to decode attribute ${attribute.unique_id}.`);\n }\n value = new TypedArrayCtor(this.draco.HEAPU8.buffer, ptr, numValues).slice();\n } finally {\n this.draco._free(ptr);\n }\n\n return {value, size: numComponents};\n }\n\n // Attribute names\n\n /** \n * DRACO does not store attribute names - We need to deduce an attribute name\n * for each attribute\n _getAttributeNames(\n dracoGeometry: Mesh | PointCloud,\n options: DracoParseOptions\n ): {[unique_id: number]: string} {\n const attributeNames: {[unique_id: number]: string} = {};\n for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {\n const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);\n const attributeName = this._deduceAttributeName(dracoAttribute, options);\n attributeNames[attributeName] = attributeName;\n }\n return attributeNames;\n }\n */\n\n /**\n * Deduce an attribute name.\n * @note DRACO does not save attribute names, just general type (POSITION, COLOR)\n * to help optimize compression. We generate GLTF compatible names for the Draco-recognized\n * types\n * @param attributeData\n */\n _deduceAttributeName(attribute: DracoAttribute, options: DracoParseOptions): string {\n // Deduce name based on application provided map\n const uniqueId = attribute.unique_id;\n for (const [attributeName, attributeUniqueId] of Object.entries(\n options.extraAttributes || {}\n )) {\n if (attributeUniqueId === uniqueId) {\n return attributeName;\n }\n }\n\n // Prefer the application name preserved by a Draco writer.\n const entryName = options.attributeNameEntry || 'name';\n if (attribute.metadata[entryName]) {\n const attributeName = attribute.metadata[entryName].string;\n // DracoWriter versions before v5 stored these category names instead of glTF semantics.\n if (attributeName === 'COLOR') {\n return 'COLOR_0';\n }\n if (attributeName === 'TEX_COORD') {\n return 'TEXCOORD_0';\n }\n return attributeName;\n }\n\n // Deduce name based on attribute type\n const thisAttributeType = attribute.attribute_type;\n for (const dracoAttributeConstant in DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP) {\n const attributeType = this.draco[dracoAttributeConstant];\n if (attributeType === thisAttributeType) {\n // TODO - Return unique names if there multiple attributes per type\n // (e.g. multiple TEX_COORDS or COLORS)\n return DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP[dracoAttributeConstant];\n }\n }\n\n // Attribute of \"GENERIC\" type, we need to assign some name\n return `CUSTOM_ATTRIBUTE_${uniqueId}`;\n }\n\n // METADATA EXTRACTION\n\n /** Get top level metadata */\n _getTopLevelMetadata(dracoGeometry: Mesh | PointCloud) {\n const dracoMetadata = this.decoder.GetMetadata(dracoGeometry);\n return this._getDracoMetadata(dracoMetadata);\n }\n\n /** Get per attribute metadata */\n _getAttributeMetadata(dracoGeometry: Mesh | PointCloud, attributeId: number) {\n const dracoMetadata = this.decoder.GetAttributeMetadata(dracoGeometry, attributeId);\n return this._getDracoMetadata(dracoMetadata);\n }\n\n /**\n * Extract metadata field values\n * @param dracoMetadata\n * @returns\n */\n _getDracoMetadata(dracoMetadata: Metadata): {[entry: string]: DracoMetadataEntry} {\n // The not so wonderful world of undocumented Draco APIs :(\n if (!dracoMetadata || !dracoMetadata.ptr) {\n return {};\n }\n const result = {};\n const numEntries = this.metadataQuerier.NumEntries(dracoMetadata);\n for (let entryIndex = 0; entryIndex < numEntries; entryIndex++) {\n const entryName = this.metadataQuerier.GetEntryName(dracoMetadata, entryIndex);\n result[entryName] = this._getDracoMetadataField(dracoMetadata, entryName);\n }\n return result;\n }\n\n /**\n * Extracts possible values for one metadata entry by name\n * @param dracoMetadata\n * @param entryName\n */\n _getDracoMetadataField(dracoMetadata: Metadata, entryName: string): DracoMetadataEntry {\n const dracoArray = new this.draco.DracoInt32Array();\n try {\n // Draco metadata fields can hold int32 arrays\n this.metadataQuerier.GetIntEntryArray(dracoMetadata, entryName, dracoArray);\n const intArray = getInt32Array(dracoArray);\n return {\n int: this.metadataQuerier.GetIntEntry(dracoMetadata, entryName),\n string: this.metadataQuerier.GetStringEntry(dracoMetadata, entryName),\n double: this.metadataQuerier.GetDoubleEntry(dracoMetadata, entryName),\n intArray\n };\n } finally {\n this.draco.destroy(dracoArray);\n }\n }\n\n // QUANTIZED ATTRIBUTE SUPPORT (NO DECOMPRESSION)\n\n /** Skip transforms for specific attribute types */\n _disableAttributeTransforms(options: DracoParseOptions) {\n const {quantizedAttributes = [], octahedronAttributes = []} = options;\n const skipAttributes = [...quantizedAttributes, ...octahedronAttributes];\n for (const dracoAttributeName of skipAttributes) {\n this.decoder.SkipAttributeTransform(this.draco[dracoAttributeName]);\n }\n }\n\n /**\n * Extract (and apply?) Position Transform\n * @todo not used\n */\n _getQuantizationTransform(\n dracoAttribute: PointAttribute,\n options: DracoParseOptions\n ): DracoQuantizationTransform | null {\n const {quantizedAttributes = []} = options;\n const attribute_type = dracoAttribute.attribute_type();\n const skip = quantizedAttributes.map(type => this.draco[type]).includes(attribute_type);\n if (skip) {\n const transform = new this.draco.AttributeQuantizationTransform();\n try {\n if (transform.InitFromAttribute(dracoAttribute)) {\n return {\n quantization_bits: transform.quantization_bits(),\n range: transform.range(),\n min_values: Float32Array.from(\n {length: dracoAttribute.num_components()},\n (_, componentIndex) => transform.min_value(componentIndex)\n )\n };\n }\n } finally {\n this.draco.destroy(transform);\n }\n }\n return null;\n }\n\n _getOctahedronTransform(\n dracoAttribute: PointAttribute,\n options: DracoParseOptions\n ): DracoOctahedronTransform | null {\n const {octahedronAttributes = []} = options;\n const attribute_type = dracoAttribute.attribute_type();\n const octahedron = octahedronAttributes.map(type => this.draco[type]).includes(attribute_type);\n if (octahedron) {\n const transform = new this.draco.AttributeOctahedronTransform();\n try {\n if (transform.InitFromAttribute(dracoAttribute)) {\n return {\n quantization_bits: transform.quantization_bits()\n };\n }\n } finally {\n this.draco.destroy(transform);\n }\n }\n return null;\n }\n\n // HELPERS\n}\n\n/**\n * Get draco specific data type by TypedArray constructor type\n * @param attributeType\n * @returns draco specific data type\n */\nfunction getDracoDataType(draco: Draco3D, attributeType: TypedArrayConstructor): draco_DataType {\n switch (attributeType) {\n case Float32Array:\n return draco.DT_FLOAT32;\n case Int8Array:\n return draco.DT_INT8;\n case Int16Array:\n return draco.DT_INT16;\n case Int32Array:\n return draco.DT_INT32;\n case Uint8Array:\n return draco.DT_UINT8;\n case Uint16Array:\n return draco.DT_UINT16;\n case Uint32Array:\n return draco.DT_UINT32;\n default:\n return draco.DT_INVALID;\n }\n}\n\n/**\n * Copy a Draco int32 array into a JS typed array\n */\nfunction getInt32Array(dracoArray: DracoInt32Array): Int32Array {\n const numValues = dracoArray.size();\n const intArray = new Int32Array(numValues);\n for (let i = 0; i < numValues; i++) {\n intArray[i] = dracoArray.GetValue(i);\n }\n return intArray;\n}\n\n/**\n * Copy a Draco int32 array into a JS typed array\n */\nfunction getUint32Array(dracoArray: DracoInt32Array): Uint32Array {\n const numValues = dracoArray.size();\n const intArray = new Uint32Array(numValues);\n for (let i = 0; i < numValues; i++) {\n intArray[i] = dracoArray.GetValue(i);\n }\n return intArray;\n}\n\n/** Returns a collision-free output name without discarding an earlier decoded attribute. */\nfunction getUniqueAttributeName(\n attributeName: string,\n attributes: Record<string, unknown>\n): string {\n if (!Object.prototype.hasOwnProperty.call(attributes, attributeName)) {\n return attributeName;\n }\n\n const suffixMatch = /^(.*)_([0-9]+)$/.exec(attributeName);\n const baseName = suffixMatch ? suffixMatch[1] : attributeName;\n let suffix = suffixMatch ? BigInt(suffixMatch[2]) + 1n : 1n;\n while (Object.prototype.hasOwnProperty.call(attributes, `${baseName}_${suffix}`)) {\n suffix++;\n }\n return `${baseName}_${suffix}`;\n}\n\n/** Converts Draco-specific transform metadata into the shared Mesh attribute representation. */\nfunction getMeshAttributeTransform(attribute: DracoAttribute): MeshAttributeTransform | undefined {\n if (attribute.quantization_transform) {\n const {quantization_bits, min_values, range} = attribute.quantization_transform;\n if (quantization_bits !== undefined && min_values && range !== undefined) {\n return {\n type: 'quantization',\n bits: quantization_bits,\n origin: Array.from(min_values),\n range\n };\n }\n }\n if (attribute.octahedron_transform?.quantization_bits !== undefined) {\n return {\n type: 'octahedron',\n bits: attribute.octahedron_transform.quantization_bits\n };\n }\n return undefined;\n}\n\n/** Validates mutually exclusive attribute selection options. */\nfunction validateAttributeSelection(options: DracoParseOptions): void {\n if (options.includeAttributes && options.excludeAttributes) {\n throw new Error('DracoLoader: includeAttributes and excludeAttributes cannot be combined');\n }\n}\n\n/** Rejects selection entries that do not match decoded application attribute names. */\nfunction validateSelectedAttributeNames(\n options: DracoParseOptions,\n attributeNames: string[]\n): void {\n for (const attributeName of options.includeAttributes || options.excludeAttributes || []) {\n if (!attributeNames.includes(attributeName)) {\n throw new Error(`DracoLoader: selected attribute \"${attributeName}\" does not exist`);\n }\n }\n}\n\n/** Returns a logical bounding box when quantized positions remain encoded. */\nfunction getTransformedMeshBoundingBox(\n attributes: Record<string, MeshAttribute>\n): [number[], number[]] {\n const boundingBox = getMeshBoundingBox(attributes);\n if (!boundingBox) throw new Error('Decoded mesh is missing positions');\n const position = attributes.POSITION;\n if (position?.transform?.type !== 'quantization') {\n return boundingBox;\n }\n const {bits, origin, range} = position.transform;\n const scale = range / (2 ** bits - 1);\n return boundingBox.map(bounds =>\n bounds.map((value, componentIndex) => origin[componentIndex] + value * scale)\n ) as [number[], number[]];\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["decoded"]
7
+ }