@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,935 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ /* eslint-disable camelcase */
6
+ // This code is inspired by example code in the DRACO repository
7
+ import type {
8
+ Draco3D,
9
+ DracoInt8Array,
10
+ Encoder,
11
+ ExpertEncoder,
12
+ Mesh,
13
+ MeshBuilder,
14
+ PointCloud,
15
+ Metadata,
16
+ MetadataBuilder,
17
+ draco_GeometryAttribute_Type
18
+ } from '../draco3d/draco3d-types';
19
+
20
+ import type {MeshAttribute, TypedArray} from '@loaders.gl/core/schema';
21
+
22
+ /** Geometry accepted by the low-level Draco encoder. */
23
+ export type DracoBuilderMesh = {
24
+ /** Vertex attributes keyed by semantic or application attribute name. */
25
+ attributes: Record<string, TypedArray | MeshAttribute>;
26
+ /** Optional triangle indices. */
27
+ indices?: TypedArray | MeshAttribute;
28
+ };
29
+
30
+ /** Metadata values supported by the Draco WebAssembly API. */
31
+ export type DracoMetadata = Record<string, string | number | Int32Array>;
32
+
33
+ /** Draco mesh encoding method exposed by the WebAssembly encoder. */
34
+ export type DracoEncodingMethod = 'MESH_EDGEBREAKER_ENCODING' | 'MESH_SEQUENTIAL_ENCODING';
35
+
36
+ /** Draco attribute categories used to select compression transforms. */
37
+ export type DracoAttributeType = 'POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC';
38
+
39
+ /** Explicit quantization transform for one Draco attribute. */
40
+ export type DracoExplicitQuantization = {
41
+ /** Number of quantization bits, from 1 through 30. */
42
+ bits: number;
43
+ /** Quantization origin, with one finite value per attribute component. */
44
+ origin: number[];
45
+ /** Positive finite quantization range shared by every component. */
46
+ range: number;
47
+ };
48
+
49
+ /** Per-attribute quantization, expressed as a bit count or an explicit transform. */
50
+ export type DracoAttributeQuantization = number | DracoExplicitQuantization;
51
+
52
+ /** Named compression profile for common glTF and GPU workloads. */
53
+ export type DracoEncodingPreset = 'gltf' | 'webgpu' | 'balanced';
54
+
55
+ /** Per-attribute details captured after constructing a Draco geometry. */
56
+ export type DracoEncodingAttributeReport = {
57
+ /** Unique attribute identifier stored in the Draco geometry. */
58
+ id: number;
59
+ /** Draco compression category. */
60
+ type: DracoAttributeType;
61
+ /** Number of scalar components per attribute value. */
62
+ componentCount: number;
63
+ /** Configured quantization, omitted when Draco defaults are used. */
64
+ quantization?: DracoAttributeQuantization;
65
+ };
66
+
67
+ /** Diagnostics reported for one completed Draco encoding. */
68
+ export type DracoEncodingReport = {
69
+ /** Encoded geometry kind. */
70
+ geometryType: 'mesh' | 'point-cloud';
71
+ /** Encoded output size in bytes. */
72
+ byteLength: number;
73
+ /** Point count reported by the native encoder. */
74
+ pointCount: number;
75
+ /** Face count reported by the native encoder. */
76
+ faceCount: number;
77
+ /** Number of encoded vertex attributes. */
78
+ attributeCount: number;
79
+ /** Explicit encoding method, omitted when Draco selects its default. */
80
+ method?: DracoEncodingMethod;
81
+ /** Explicit encoder speed settings, omitted when Draco selects its defaults. */
82
+ speed?: [number, number];
83
+ /** Encoded attributes keyed by application attribute name. */
84
+ attributes: Record<string, DracoEncodingAttributeReport>;
85
+ };
86
+
87
+ /** Encoded Draco bytes and diagnostics from the same native operation. */
88
+ export type DracoEncodingResult = {
89
+ /** Encoded Draco bytes. */
90
+ data: ArrayBuffer;
91
+ /** Encoding diagnostics. */
92
+ report: DracoEncodingReport;
93
+ };
94
+
95
+ export type DracoBuildOptions = {
96
+ pointcloud?: boolean;
97
+ /** Deduplicate identical point-cloud attribute tuples before encoding. */
98
+ deduplicateValues?: boolean;
99
+ /** Metadata key used to preserve application attribute names. */
100
+ attributeNameEntry?: string;
101
+ /** Explicit Draco attribute categories keyed by application attribute name. */
102
+ attributeTypes?: Record<string, DracoAttributeType>;
103
+ metadata?: DracoMetadata;
104
+ attributesMetadata?: Record<string, DracoMetadata>;
105
+ log?: (message: string) => void;
106
+
107
+ // draco encoding options
108
+ speed?: [number, number];
109
+ method?: DracoEncodingMethod;
110
+ /** Quantization bits keyed by Draco attribute category. */
111
+ quantization?: Partial<Record<DracoAttributeType, number>>;
112
+ /** Quantization keyed by application attribute name, overriding category settings. */
113
+ attributeQuantization?: Record<string, DracoAttributeQuantization>;
114
+ /** Applies a documented set of compression defaults before explicit options. */
115
+ preset?: DracoEncodingPreset;
116
+ };
117
+
118
+ type DracoBuilderAttributeInfo = {
119
+ /** Unique attribute identifier assigned by Draco's geometry builder. */
120
+ attributeId: number;
121
+ /** Draco compression category for the attribute. */
122
+ attributeType: draco_GeometryAttribute_Type;
123
+ /** Public name of the Draco compression category. */
124
+ attributeTypeName: DracoAttributeType;
125
+ /** Number of scalar components in each attribute value. */
126
+ componentCount: number;
127
+ /** Whether Draco can apply a lossy quantization transform to the source values. */
128
+ supportsQuantization: boolean;
129
+ };
130
+
131
+ // Native Draco attribute names to GLTF attribute names.
132
+ const GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP = {
133
+ POSITION: 'POSITION',
134
+ NORMAL: 'NORMAL',
135
+ COLOR_0: 'COLOR',
136
+ TEXCOORD_0: 'TEX_COORD'
137
+ } as const satisfies Record<string, DracoAttributeType>;
138
+
139
+ const noop = () => {};
140
+
141
+ export default class DracoBuilder {
142
+ draco: Draco3D;
143
+ dracoEncoder: Encoder;
144
+ dracoMeshBuilder: MeshBuilder;
145
+ dracoMetadataBuilder: MetadataBuilder;
146
+ log: (message: string) => void = noop;
147
+
148
+ // draco - the draco decoder, either import `draco3d` or load dynamically
149
+ constructor(draco: Draco3D) {
150
+ this.draco = draco;
151
+ this.dracoEncoder = new this.draco.Encoder();
152
+ this.dracoMeshBuilder = new this.draco.MeshBuilder();
153
+ this.dracoMetadataBuilder = new this.draco.MetadataBuilder();
154
+ }
155
+
156
+ destroy(): void {
157
+ this.destroyEncodedObject(this.dracoMeshBuilder);
158
+ this.destroyEncodedObject(this.dracoEncoder);
159
+ this.destroyEncodedObject(this.dracoMetadataBuilder);
160
+ }
161
+
162
+ // TBD - when does this need to be called?
163
+ destroyEncodedObject(object: unknown): void {
164
+ if (object) {
165
+ this.draco.destroy(object);
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Encode mesh or point cloud
171
+ * @param mesh =({})
172
+ * @param options
173
+ */
174
+ encodeSync(mesh: DracoBuilderMesh, options: DracoBuildOptions = {}): ArrayBuffer {
175
+ return this._encodeSync(mesh, options, false).data;
176
+ }
177
+
178
+ /** Encodes a mesh or point cloud and returns native encoding diagnostics. */
179
+ encodeSyncWithReport(
180
+ mesh: DracoBuilderMesh,
181
+ options: DracoBuildOptions = {}
182
+ ): DracoEncodingResult {
183
+ return this._encodeSync(mesh, options, true);
184
+ }
185
+
186
+ /** Shared implementation for ordinary encoding and report-producing encoding. */
187
+ _encodeSync(
188
+ mesh: DracoBuilderMesh,
189
+ options: DracoBuildOptions,
190
+ trackEncodedProperties: boolean
191
+ ): DracoEncodingResult {
192
+ options = applyDracoEncodingPreset(options);
193
+ this.log = options.log || noop;
194
+
195
+ return options.pointcloud
196
+ ? this._encodePointCloud(mesh, options, trackEncodedProperties)
197
+ : this._encodeMesh(mesh, options, trackEncodedProperties);
198
+ }
199
+
200
+ // PRIVATE
201
+
202
+ _getAttributesFromMesh(mesh: DracoBuilderMesh): Record<string, TypedArray | MeshAttribute> {
203
+ return {
204
+ ...(mesh.indices ? {indices: mesh.indices} : {}),
205
+ ...mesh.attributes
206
+ };
207
+ }
208
+
209
+ _encodePointCloud(
210
+ pointcloud: DracoBuilderMesh,
211
+ options: DracoBuildOptions,
212
+ trackEncodedProperties: boolean
213
+ ): DracoEncodingResult {
214
+ const dracoPointCloud = new this.draco.PointCloud();
215
+ const dracoData = new this.draco.DracoInt8Array();
216
+ let expertEncoder: ExpertEncoder | null = null;
217
+
218
+ try {
219
+ if (options.metadata) {
220
+ this._addGeometryMetadata(dracoPointCloud, options.metadata);
221
+ }
222
+ const attributes = this._getAttributesFromMesh(pointcloud);
223
+ const attributeInfo = this._createDracoPointCloud(dracoPointCloud, attributes, options);
224
+ const useExpertEncoder = hasAttributeQuantization(options);
225
+ let encodedLen: number;
226
+ let activeEncoder: Encoder | ExpertEncoder;
227
+ if (useExpertEncoder) {
228
+ expertEncoder = new this.draco.ExpertEncoder(dracoPointCloud);
229
+ this._setExpertOptions(expertEncoder, attributeInfo, options);
230
+ activeEncoder = expertEncoder;
231
+ if (trackEncodedProperties) {
232
+ activeEncoder.SetTrackEncodedProperties(true);
233
+ }
234
+ encodedLen = expertEncoder.EncodeToDracoBuffer(
235
+ options.deduplicateValues ?? false,
236
+ dracoData
237
+ );
238
+ } else {
239
+ this._setOptions(options);
240
+ activeEncoder = this.dracoEncoder;
241
+ if (trackEncodedProperties) {
242
+ activeEncoder.SetTrackEncodedProperties(true);
243
+ }
244
+ encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(
245
+ dracoPointCloud,
246
+ options.deduplicateValues ?? false,
247
+ dracoData
248
+ );
249
+ }
250
+
251
+ if (!(encodedLen > 0)) {
252
+ throw new Error('Draco encoding failed.');
253
+ }
254
+
255
+ this.log(`DRACO encoded ${dracoPointCloud.num_points()} points
256
+ with ${dracoPointCloud.num_attributes()} attributes into ${encodedLen} bytes`);
257
+
258
+ const data = dracoInt8ArrayToArrayBuffer(dracoData);
259
+ return {
260
+ data,
261
+ report: this._getEncodingReport(
262
+ 'point-cloud',
263
+ data.byteLength,
264
+ dracoPointCloud,
265
+ activeEncoder,
266
+ attributeInfo,
267
+ options,
268
+ trackEncodedProperties
269
+ )
270
+ };
271
+ } finally {
272
+ this.destroyEncodedObject(expertEncoder);
273
+ this.destroyEncodedObject(dracoData);
274
+ this.destroyEncodedObject(dracoPointCloud);
275
+ }
276
+ }
277
+
278
+ _encodeMesh(
279
+ mesh: DracoBuilderMesh,
280
+ options: DracoBuildOptions,
281
+ trackEncodedProperties: boolean
282
+ ): DracoEncodingResult {
283
+ const dracoMesh = new this.draco.Mesh();
284
+ const dracoData = new this.draco.DracoInt8Array();
285
+ let expertEncoder: ExpertEncoder | null = null;
286
+
287
+ try {
288
+ if (options.metadata) {
289
+ this._addGeometryMetadata(dracoMesh, options.metadata);
290
+ }
291
+ const attributes = this._getAttributesFromMesh(mesh);
292
+ const attributeInfo = this._createDracoMesh(dracoMesh, attributes, options);
293
+ const useExpertEncoder = hasAttributeQuantization(options);
294
+ let encodedLen: number;
295
+ let activeEncoder: Encoder | ExpertEncoder;
296
+ if (useExpertEncoder) {
297
+ expertEncoder = new this.draco.ExpertEncoder(dracoMesh);
298
+ this._setExpertOptions(expertEncoder, attributeInfo, options);
299
+ activeEncoder = expertEncoder;
300
+ if (trackEncodedProperties) {
301
+ activeEncoder.SetTrackEncodedProperties(true);
302
+ }
303
+ encodedLen = expertEncoder.EncodeToDracoBuffer(false, dracoData);
304
+ } else {
305
+ this._setOptions(options);
306
+ activeEncoder = this.dracoEncoder;
307
+ if (trackEncodedProperties) {
308
+ activeEncoder.SetTrackEncodedProperties(true);
309
+ }
310
+ encodedLen = this.dracoEncoder.EncodeMeshToDracoBuffer(dracoMesh, dracoData);
311
+ }
312
+ if (encodedLen <= 0) {
313
+ throw new Error('Draco encoding failed.');
314
+ }
315
+
316
+ this.log(`DRACO encoded ${dracoMesh.num_points()} points
317
+ with ${dracoMesh.num_attributes()} attributes into ${encodedLen} bytes`);
318
+
319
+ const data = dracoInt8ArrayToArrayBuffer(dracoData);
320
+ return {
321
+ data,
322
+ report: this._getEncodingReport(
323
+ 'mesh',
324
+ data.byteLength,
325
+ dracoMesh,
326
+ activeEncoder,
327
+ attributeInfo,
328
+ options,
329
+ trackEncodedProperties
330
+ )
331
+ };
332
+ } finally {
333
+ this.destroyEncodedObject(expertEncoder);
334
+ this.destroyEncodedObject(dracoData);
335
+ this.destroyEncodedObject(dracoMesh);
336
+ }
337
+ }
338
+
339
+ /** Applies encoder speed, method, and quantization options. */
340
+ _setOptions(options: DracoBuildOptions): void {
341
+ if (options.speed) {
342
+ this.dracoEncoder.SetSpeedOptions(...options.speed);
343
+ }
344
+ if (options.method) {
345
+ const dracoMethod = this.draco[options.method];
346
+ this.dracoEncoder.SetEncodingMethod(dracoMethod);
347
+ }
348
+ if (options.quantization) {
349
+ for (const attribute in options.quantization) {
350
+ const attributeType = attribute as DracoAttributeType;
351
+ const bits = options.quantization[attributeType];
352
+ if (bits !== undefined) {
353
+ validateQuantizationBits(attributeType, bits, attributeType);
354
+ this.dracoEncoder.SetAttributeQuantization(this.draco[attributeType], bits);
355
+ }
356
+ }
357
+ }
358
+ }
359
+
360
+ /** Applies common options and per-attribute quantization to an expert encoder. */
361
+ _setExpertOptions(
362
+ expertEncoder: ExpertEncoder,
363
+ attributes: Record<string, DracoBuilderAttributeInfo>,
364
+ options: DracoBuildOptions
365
+ ): void {
366
+ if (options.speed) {
367
+ expertEncoder.SetSpeedOptions(...options.speed);
368
+ }
369
+ if (options.method) {
370
+ expertEncoder.SetEncodingMethod(this.draco[options.method]);
371
+ }
372
+
373
+ const quantization = this._getAttributeQuantization(attributes, options);
374
+ for (const [attributeName, setting] of quantization) {
375
+ const attribute = attributes[attributeName];
376
+ if (typeof setting === 'number') {
377
+ expertEncoder.SetAttributeQuantization(attribute.attributeId, setting);
378
+ } else {
379
+ expertEncoder.SetAttributeExplicitQuantization(
380
+ attribute.attributeId,
381
+ setting.bits,
382
+ attribute.componentCount,
383
+ setting.origin,
384
+ setting.range
385
+ );
386
+ }
387
+ }
388
+ }
389
+
390
+ /** Resolves category and exact quantization settings for every encoded attribute. */
391
+ _getAttributeQuantization(
392
+ attributes: Record<string, DracoBuilderAttributeInfo>,
393
+ options: DracoBuildOptions
394
+ ): Map<string, DracoAttributeQuantization> {
395
+ const categoryQuantization = new Map<draco_GeometryAttribute_Type, number>();
396
+ for (const attributeType of Object.keys(options.quantization || {}) as DracoAttributeType[]) {
397
+ const bits = options.quantization?.[attributeType];
398
+ if (bits !== undefined) {
399
+ validateQuantizationBits(attributeType, bits, attributeType);
400
+ categoryQuantization.set(this.draco[attributeType], bits);
401
+ }
402
+ }
403
+
404
+ const quantization = new Map<string, DracoAttributeQuantization>();
405
+ for (const [attributeName, attribute] of Object.entries(attributes)) {
406
+ const bits = categoryQuantization.get(attribute.attributeType);
407
+ if (bits !== undefined) {
408
+ quantization.set(attributeName, bits);
409
+ }
410
+ }
411
+ for (const [attributeName, setting] of Object.entries(options.attributeQuantization || {})) {
412
+ const attribute = attributes[attributeName];
413
+ if (!attribute) {
414
+ throw new Error(`DracoWriter: quantized attribute "${attributeName}" does not exist`);
415
+ }
416
+ if (typeof setting === 'number') {
417
+ validateQuantizationBits(attributeName, setting, attribute.attributeTypeName);
418
+ } else {
419
+ if (attribute.attributeTypeName === 'NORMAL') {
420
+ throw new Error(
421
+ `DracoWriter: explicit quantization transforms are not supported for NORMAL attribute "${attributeName}"`
422
+ );
423
+ }
424
+ validateExplicitQuantization(
425
+ attributeName,
426
+ attributes[attributeName].componentCount,
427
+ setting
428
+ );
429
+ }
430
+ quantization.set(attributeName, setting);
431
+ }
432
+ for (const attributeName of quantization.keys()) {
433
+ if (!attributes[attributeName].supportsQuantization) {
434
+ throw new Error(
435
+ `DracoWriter: quantization for "${attributeName}" requires floating-point attribute data`
436
+ );
437
+ }
438
+ }
439
+ return quantization;
440
+ }
441
+
442
+ /** Builds public diagnostics for a completed native encoding. */
443
+ _getEncodingReport(
444
+ geometryType: 'mesh' | 'point-cloud',
445
+ byteLength: number,
446
+ geometry: Mesh | PointCloud,
447
+ encoder: Encoder | ExpertEncoder,
448
+ attributes: Record<string, DracoBuilderAttributeInfo>,
449
+ options: DracoBuildOptions,
450
+ trackEncodedProperties: boolean
451
+ ): DracoEncodingReport {
452
+ const quantization = this._getAttributeQuantization(attributes, options);
453
+ const attributeReports: Record<string, DracoEncodingAttributeReport> = {};
454
+ for (const [attributeName, attribute] of Object.entries(attributes)) {
455
+ attributeReports[attributeName] = {
456
+ id: attribute.attributeId,
457
+ type: attribute.attributeTypeName,
458
+ componentCount: attribute.componentCount,
459
+ ...(quantization.has(attributeName) ? {quantization: quantization.get(attributeName)} : {})
460
+ };
461
+ }
462
+ return {
463
+ geometryType,
464
+ byteLength,
465
+ pointCount: trackEncodedProperties
466
+ ? encoder.GetNumberOfEncodedPoints()
467
+ : geometry.num_points(),
468
+ faceCount: trackEncodedProperties
469
+ ? encoder.GetNumberOfEncodedFaces()
470
+ : geometryType === 'mesh'
471
+ ? typeof (geometry as Mesh).num_faces === 'function'
472
+ ? (geometry as Mesh).num_faces()
473
+ : 0
474
+ : 0,
475
+ attributeCount: geometry.num_attributes(),
476
+ ...(options.method ? {method: options.method} : {}),
477
+ ...(options.speed ? {speed: options.speed} : {}),
478
+ attributes: attributeReports
479
+ };
480
+ }
481
+
482
+ /**
483
+ * @param {Mesh} dracoMesh
484
+ * @param {object} attributes
485
+ * @returns {Mesh}
486
+ */
487
+ _createDracoMesh(
488
+ dracoMesh: Mesh,
489
+ attributes: Record<string, TypedArray | MeshAttribute>,
490
+ options: DracoBuildOptions
491
+ ): Record<string, DracoBuilderAttributeInfo> {
492
+ const optionalMetadata = options.attributesMetadata || {};
493
+ const attributeInfo: Record<string, DracoBuilderAttributeInfo> = {};
494
+
495
+ const vertexCount = this._getVertexCount(attributes, options);
496
+ for (const [attributeName, attribute] of Object.entries(attributes)) {
497
+ const uniqueId = this._addAttributeToMesh(
498
+ dracoMesh,
499
+ attributeName,
500
+ attribute,
501
+ vertexCount,
502
+ options
503
+ );
504
+
505
+ if (uniqueId !== -1) {
506
+ const attributeValue = getAttributeValue(attribute);
507
+ const attributeType = this._getDracoAttributeType(
508
+ attributeName,
509
+ options.attributeTypes
510
+ ) as draco_GeometryAttribute_Type;
511
+ attributeInfo[attributeName] = {
512
+ attributeId: uniqueId,
513
+ attributeType,
514
+ attributeTypeName: getDracoAttributeTypeName(this.draco, attributeType),
515
+ componentCount: getAttributeSize(attribute, attributeValue!.length / vertexCount),
516
+ supportsQuantization: attributeValue instanceof Float32Array
517
+ };
518
+ this._addAttributeMetadata(dracoMesh, uniqueId, {
519
+ [options.attributeNameEntry || 'name']: attributeName,
520
+ ...(optionalMetadata[attributeName] || {})
521
+ });
522
+ }
523
+ }
524
+
525
+ return attributeInfo;
526
+ }
527
+
528
+ /**
529
+ * @param {} dracoPointCloud
530
+ * @param {object} attributes
531
+ */
532
+ _createDracoPointCloud(
533
+ dracoPointCloud: PointCloud,
534
+ attributes: Record<string, TypedArray | MeshAttribute>,
535
+ options: DracoBuildOptions
536
+ ): Record<string, DracoBuilderAttributeInfo> {
537
+ const optionalMetadata = options.attributesMetadata || {};
538
+ const attributeInfo: Record<string, DracoBuilderAttributeInfo> = {};
539
+
540
+ const vertexCount = this._getVertexCount(attributes, options);
541
+ for (const [attributeName, attribute] of Object.entries(attributes)) {
542
+ const uniqueId = this._addAttributeToMesh(
543
+ dracoPointCloud,
544
+ attributeName,
545
+ attribute,
546
+ vertexCount,
547
+ options
548
+ );
549
+ if (uniqueId !== -1) {
550
+ const attributeValue = getAttributeValue(attribute);
551
+ const attributeType = this._getDracoAttributeType(
552
+ attributeName,
553
+ options.attributeTypes
554
+ ) as draco_GeometryAttribute_Type;
555
+ attributeInfo[attributeName] = {
556
+ attributeId: uniqueId,
557
+ attributeType,
558
+ attributeTypeName: getDracoAttributeTypeName(this.draco, attributeType),
559
+ componentCount: getAttributeSize(attribute, attributeValue!.length / vertexCount),
560
+ supportsQuantization: attributeValue instanceof Float32Array
561
+ };
562
+ this._addAttributeMetadata(dracoPointCloud, uniqueId, {
563
+ [options.attributeNameEntry || 'name']: attributeName,
564
+ ...(optionalMetadata[attributeName] || {})
565
+ });
566
+ }
567
+ }
568
+
569
+ return attributeInfo;
570
+ }
571
+
572
+ /**
573
+ * @param mesh
574
+ * @param attributeName
575
+ * @param attribute
576
+ * @param vertexCount
577
+ */
578
+ _addAttributeToMesh(
579
+ mesh: PointCloud,
580
+ attributeName: string,
581
+ attribute: TypedArray | MeshAttribute,
582
+ vertexCount: number,
583
+ options: DracoBuildOptions = {}
584
+ ): number {
585
+ const attributeValue = getAttributeValue(attribute);
586
+ if (!attributeValue) {
587
+ throw new Error(`DracoWriter: attribute "${attributeName}" must contain a typed array`);
588
+ }
589
+
590
+ const type = this._getDracoAttributeType(attributeName, options.attributeTypes);
591
+ const size = getAttributeSize(attribute, attributeValue.length / vertexCount);
592
+
593
+ if (type === 'indices') {
594
+ if (attributeValue.length % 3 !== 0) {
595
+ throw new Error('DracoWriter: triangle indices length must be divisible by 3');
596
+ }
597
+ validateIndices(attributeValue, vertexCount);
598
+ const numFaces = attributeValue.length / 3;
599
+ this.log(`Adding attribute ${attributeName}, size ${numFaces}`);
600
+
601
+ const indices =
602
+ attributeValue instanceof Uint16Array || attributeValue instanceof Uint32Array
603
+ ? attributeValue
604
+ : Uint32Array.from(attributeValue);
605
+ this.dracoMeshBuilder.AddFacesToMesh(mesh as Mesh, numFaces, indices);
606
+ return -1;
607
+ }
608
+
609
+ if (!Number.isInteger(size) || size <= 0 || attributeValue.length !== vertexCount * size) {
610
+ throw new Error(
611
+ `DracoWriter: attribute "${attributeName}" has ${attributeValue.length} values, expected ${vertexCount * size}`
612
+ );
613
+ }
614
+
615
+ this.log(`Adding attribute ${attributeName}, size ${size}`);
616
+
617
+ const builder = this.dracoMeshBuilder;
618
+ let uniqueAttributeId = -1;
619
+ if (attributeValue instanceof Int8Array) {
620
+ uniqueAttributeId = builder.AddInt8Attribute(mesh, type, vertexCount, size, attributeValue);
621
+ } else if (attributeValue instanceof Int16Array) {
622
+ uniqueAttributeId = builder.AddInt16Attribute(mesh, type, vertexCount, size, attributeValue);
623
+ } else if (attributeValue instanceof Int32Array) {
624
+ uniqueAttributeId = builder.AddInt32Attribute(mesh, type, vertexCount, size, attributeValue);
625
+ } else if (attributeValue instanceof Uint8Array) {
626
+ uniqueAttributeId = builder.AddUInt8Attribute(mesh, type, vertexCount, size, attributeValue);
627
+ } else if (attributeValue instanceof Uint8ClampedArray) {
628
+ const uint8Value = new Uint8Array(
629
+ attributeValue.buffer,
630
+ attributeValue.byteOffset,
631
+ attributeValue.byteLength
632
+ );
633
+ uniqueAttributeId = builder.AddUInt8Attribute(mesh, type, vertexCount, size, uint8Value);
634
+ } else if (attributeValue instanceof Uint16Array) {
635
+ uniqueAttributeId = builder.AddUInt16Attribute(mesh, type, vertexCount, size, attributeValue);
636
+ } else if (attributeValue instanceof Uint32Array) {
637
+ uniqueAttributeId = builder.AddUInt32Attribute(mesh, type, vertexCount, size, attributeValue);
638
+ } else if (attributeValue instanceof Float32Array) {
639
+ uniqueAttributeId = builder.AddFloatAttribute(mesh, type, vertexCount, size, attributeValue);
640
+ } else {
641
+ throw new Error(
642
+ `DracoWriter: attribute "${attributeName}" uses unsupported ${attributeValue.constructor.name}`
643
+ );
644
+ }
645
+
646
+ if (!ArrayBuffer.isView(attribute) && attribute.normalized !== undefined) {
647
+ builder.SetNormalizedFlagForAttribute(mesh, uniqueAttributeId, attribute.normalized);
648
+ }
649
+ return uniqueAttributeId;
650
+
651
+ // case Float64Array:
652
+ // Add attribute does not seem to be exposed
653
+ // return builder.AddAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));
654
+ }
655
+
656
+ /**
657
+ * DRACO can compress attributes of know type better
658
+ * @param attributeName
659
+ */
660
+ _getDracoAttributeType(
661
+ attributeName: string,
662
+ attributeTypes: Record<string, DracoAttributeType> = {}
663
+ ): draco_GeometryAttribute_Type | 'indices' {
664
+ if (attributeName.toLowerCase() === 'indices') {
665
+ return 'indices';
666
+ }
667
+ const explicitType = attributeTypes[attributeName];
668
+ if (explicitType) {
669
+ return this.draco[explicitType];
670
+ }
671
+ const gltfAttributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName];
672
+ if (gltfAttributeName) {
673
+ return this.draco[gltfAttributeName];
674
+ }
675
+ switch (attributeName.toLowerCase()) {
676
+ case 'position':
677
+ case 'positions':
678
+ case 'vertices':
679
+ return this.draco.POSITION;
680
+ case 'normal':
681
+ case 'normals':
682
+ return this.draco.NORMAL;
683
+ case 'color':
684
+ case 'colors':
685
+ return this.draco.COLOR;
686
+ case 'texcoord':
687
+ case 'texcoords':
688
+ return this.draco.TEX_COORD;
689
+ default:
690
+ if (/^color_\d+$/i.test(attributeName)) {
691
+ return this.draco.COLOR;
692
+ }
693
+ if (/^texcoord_\d+$/i.test(attributeName)) {
694
+ return this.draco.TEX_COORD;
695
+ }
696
+ return this.draco.GENERIC;
697
+ }
698
+ }
699
+
700
+ /** Returns the common vertex count after validating the required position attribute. */
701
+ _getVertexCount(
702
+ attributes: Record<string, TypedArray | MeshAttribute>,
703
+ options: DracoBuildOptions
704
+ ): number {
705
+ const positions = this._getPositionAttribute(attributes, options.attributeTypes);
706
+ const positionValues = positions && getAttributeValue(positions);
707
+ if (!positions || !positionValues) {
708
+ throw new Error('DracoWriter: POSITION attribute is required');
709
+ }
710
+ const size = getAttributeSize(positions, 3);
711
+ if (!Number.isInteger(size) || size <= 0 || positionValues.length % size !== 0) {
712
+ throw new Error('DracoWriter: POSITION attribute has an invalid size or value count');
713
+ }
714
+ return positionValues.length / size;
715
+ }
716
+
717
+ _getPositionAttribute(
718
+ attributes: Record<string, TypedArray | MeshAttribute>,
719
+ attributeTypes: Record<string, DracoAttributeType> = {}
720
+ ): TypedArray | MeshAttribute | null {
721
+ for (const attributeName in attributes) {
722
+ const attribute = attributes[attributeName];
723
+ const dracoType = this._getDracoAttributeType(attributeName, attributeTypes);
724
+ if (dracoType === this.draco.POSITION && getAttributeValue(attribute)) {
725
+ return attribute;
726
+ }
727
+ }
728
+ return null;
729
+ }
730
+
731
+ /**
732
+ * Add metadata for the geometry.
733
+ * @param dracoGeometry - WASM Draco Object
734
+ * @param metadata
735
+ */
736
+ _addGeometryMetadata(dracoGeometry: PointCloud, metadata: DracoMetadata): void {
737
+ const dracoMetadata = new this.draco.Metadata();
738
+ this._populateDracoMetadata(dracoMetadata, metadata);
739
+ this.dracoMeshBuilder.AddMetadata(dracoGeometry, dracoMetadata);
740
+ }
741
+
742
+ /**
743
+ * Add metadata for an attribute to geometry.
744
+ * @param dracoGeometry - WASM Draco Object
745
+ * @param uniqueAttributeId
746
+ * @param metadata
747
+ */
748
+ _addAttributeMetadata(
749
+ dracoGeometry: PointCloud,
750
+ uniqueAttributeId: number,
751
+ metadata: Map<string, string> | DracoMetadata
752
+ ): void {
753
+ // Note: Draco JS IDL doesn't seem to expose draco.AttributeMetadata, however it seems to
754
+ // create such objects automatically from draco.Metadata object.
755
+ const dracoAttributeMetadata = new this.draco.Metadata();
756
+ this._populateDracoMetadata(dracoAttributeMetadata, metadata);
757
+ // Draco3d doc note: Directly add attribute metadata to geometry.
758
+ // You can do this without explicitly adding |GeometryMetadata| to mesh.
759
+ this.dracoMeshBuilder.SetMetadataForAttribute(
760
+ dracoGeometry,
761
+ uniqueAttributeId,
762
+ dracoAttributeMetadata
763
+ );
764
+ }
765
+
766
+ /**
767
+ * Add contents of object or map to a WASM Draco Metadata Object
768
+ * @param dracoMetadata - WASM Draco Object
769
+ * @param metadata
770
+ */
771
+ _populateDracoMetadata(
772
+ dracoMetadata: Metadata,
773
+ metadata: Map<string, string | number | Int32Array> | DracoMetadata
774
+ ): void {
775
+ for (const [key, value] of getEntries(metadata)) {
776
+ switch (typeof value) {
777
+ case 'number':
778
+ if (Math.trunc(value) === value) {
779
+ this.dracoMetadataBuilder.AddIntEntry(dracoMetadata, key, value);
780
+ } else {
781
+ this.dracoMetadataBuilder.AddDoubleEntry(dracoMetadata, key, value);
782
+ }
783
+ break;
784
+ case 'object':
785
+ if (value instanceof Int32Array) {
786
+ this.dracoMetadataBuilder.AddIntEntryArray(dracoMetadata, key, value, value.length);
787
+ }
788
+ break;
789
+ case 'string':
790
+ default:
791
+ this.dracoMetadataBuilder.AddStringEntry(dracoMetadata, key, value);
792
+ }
793
+ }
794
+ }
795
+ }
796
+
797
+ // HELPER FUNCTIONS
798
+
799
+ /**
800
+ * Copy encoded data to buffer
801
+ * @param dracoData
802
+ */
803
+ function dracoInt8ArrayToArrayBuffer(dracoData: DracoInt8Array): ArrayBuffer {
804
+ const byteLength = dracoData.size();
805
+ const outputBuffer = new ArrayBuffer(byteLength);
806
+ const outputData = new Int8Array(outputBuffer);
807
+ for (let i = 0; i < byteLength; ++i) {
808
+ outputData[i] = dracoData.GetValue(i);
809
+ }
810
+ return outputBuffer;
811
+ }
812
+
813
+ /** Enable iteration over either an object or a map */
814
+ function getEntries(
815
+ container: Map<string, string | number | Int32Array> | DracoMetadata
816
+ ): Iterable<[string, string | number | Int32Array]> {
817
+ return container instanceof Map ? container.entries() : Object.entries(container);
818
+ }
819
+
820
+ /** Returns the typed-array payload from either accepted attribute representation. */
821
+ function getAttributeValue(attribute: TypedArray | MeshAttribute): TypedArray | null {
822
+ if (ArrayBuffer.isView(attribute)) {
823
+ return attribute;
824
+ }
825
+ if (
826
+ attribute &&
827
+ typeof attribute === 'object' &&
828
+ 'value' in attribute &&
829
+ ArrayBuffer.isView(attribute.value)
830
+ ) {
831
+ return attribute.value;
832
+ }
833
+ return null;
834
+ }
835
+
836
+ /** Returns the declared component count, falling back to the inferred legacy value. */
837
+ function getAttributeSize(attribute: TypedArray | MeshAttribute, inferredSize: number): number {
838
+ return ArrayBuffer.isView(attribute) ? inferredSize : attribute.size;
839
+ }
840
+
841
+ /** Validates that triangle indices are integers within the encoded vertex range. */
842
+ function validateIndices(indices: TypedArray, vertexCount: number): void {
843
+ for (const index of indices) {
844
+ if (!Number.isInteger(index) || index < 0 || index >= vertexCount) {
845
+ throw new Error(
846
+ `DracoWriter: triangle index ${index} is outside vertex range 0-${vertexCount - 1}`
847
+ );
848
+ }
849
+ }
850
+ }
851
+
852
+ /** Returns true when exact application attributes require the expert encoder. */
853
+ function hasAttributeQuantization(options: DracoBuildOptions): boolean {
854
+ return Boolean(
855
+ options.attributeQuantization && Object.keys(options.attributeQuantization).length
856
+ );
857
+ }
858
+
859
+ /** Validates a Draco quantization bit count. */
860
+ function validateQuantizationBits(
861
+ attributeName: string,
862
+ bits: number,
863
+ attributeType?: DracoAttributeType
864
+ ): void {
865
+ if (!Number.isInteger(bits) || bits < 1 || bits > 30) {
866
+ throw new Error(
867
+ `DracoWriter: quantization bits for "${attributeName}" must be an integer from 1 to 30`
868
+ );
869
+ }
870
+ if (attributeType === 'NORMAL' && (bits < 2 || bits > 29)) {
871
+ throw new Error(
872
+ `DracoWriter: quantization bits for NORMAL attribute "${attributeName}" must be an integer from 2 to 29`
873
+ );
874
+ }
875
+ }
876
+
877
+ /** Validates an explicit per-attribute quantization transform. */
878
+ function validateExplicitQuantization(
879
+ attributeName: string,
880
+ componentCount: number,
881
+ quantization: DracoExplicitQuantization
882
+ ): void {
883
+ validateQuantizationBits(attributeName, quantization.bits);
884
+ if (!Array.isArray(quantization.origin) || quantization.origin.length !== componentCount) {
885
+ throw new Error(
886
+ `DracoWriter: quantization origin for "${attributeName}" must contain ${componentCount} values`
887
+ );
888
+ }
889
+ if (!quantization.origin.every(Number.isFinite)) {
890
+ throw new Error(`DracoWriter: quantization origin for "${attributeName}" must be finite`);
891
+ }
892
+ if (!Number.isFinite(quantization.range) || quantization.range <= 0) {
893
+ throw new Error(`DracoWriter: quantization range for "${attributeName}" must be positive`);
894
+ }
895
+ }
896
+
897
+ /** Returns the public Draco category name for a native enum value. */
898
+ function getDracoAttributeTypeName(
899
+ draco: Draco3D,
900
+ attributeType: draco_GeometryAttribute_Type
901
+ ): DracoAttributeType {
902
+ for (const name of ['POSITION', 'NORMAL', 'COLOR', 'TEX_COORD', 'GENERIC'] as const) {
903
+ if (draco[name] === attributeType) {
904
+ return name;
905
+ }
906
+ }
907
+ return 'GENERIC';
908
+ }
909
+
910
+ /** Resolves named presets without mutating the caller's options object. */
911
+ function applyDracoEncodingPreset(options: DracoBuildOptions): DracoBuildOptions {
912
+ const presetOptions: Record<DracoEncodingPreset, DracoBuildOptions> = {
913
+ gltf: {
914
+ method: 'MESH_EDGEBREAKER_ENCODING',
915
+ speed: [5, 5],
916
+ quantization: {POSITION: 14, NORMAL: 10, TEX_COORD: 12}
917
+ },
918
+ webgpu: {
919
+ method: 'MESH_SEQUENTIAL_ENCODING',
920
+ speed: [5, 5],
921
+ quantization: {POSITION: 14, NORMAL: 10, TEX_COORD: 12}
922
+ },
923
+ balanced: {
924
+ method: 'MESH_EDGEBREAKER_ENCODING',
925
+ speed: [5, 5],
926
+ quantization: {POSITION: 12, NORMAL: 10, TEX_COORD: 10}
927
+ }
928
+ };
929
+ const preset = options.preset ? presetOptions[options.preset] : {};
930
+ return {
931
+ ...preset,
932
+ ...options,
933
+ quantization: {...preset.quantization, ...options.quantization}
934
+ };
935
+ }