@loaders.gl/scene 5.0.0-beta.1 → 5.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DRACO-README.md +15 -0
- package/README.md +7 -1
- package/THIRD-PARTY-NOTICES.md +4 -1
- package/dist/dist.dev.js +5708 -4937
- package/dist/dist.min.js +24 -24
- package/dist/draco/bundled.cjs +37 -0
- package/dist/draco/bundled.cjs.map +7 -0
- package/dist/draco/bundled.d.ts +6 -0
- package/dist/draco/bundled.d.ts.map +1 -0
- package/dist/draco/bundled.js +7 -0
- package/dist/draco/bundled.js.map +1 -0
- package/dist/draco/draco-format.cjs +41 -0
- package/dist/draco/draco-format.cjs.map +7 -0
- package/dist/draco/draco-format.d.ts +15 -0
- package/dist/draco/draco-format.d.ts.map +1 -0
- package/dist/draco/draco-format.js +18 -0
- package/dist/draco/draco-format.js.map +1 -0
- package/dist/draco/draco-javascript-loader-with-parser.cjs +44 -0
- package/dist/draco/draco-javascript-loader-with-parser.cjs.map +7 -0
- package/dist/draco/draco-javascript-loader-with-parser.d.ts +34 -0
- package/dist/draco/draco-javascript-loader-with-parser.d.ts.map +1 -0
- package/dist/draco/draco-javascript-loader-with-parser.js +14 -0
- package/dist/draco/draco-javascript-loader-with-parser.js.map +1 -0
- package/dist/draco/draco-libraries.cjs +61 -0
- package/dist/draco/draco-libraries.cjs.map +7 -0
- package/dist/draco/draco-libraries.d.ts +28 -0
- package/dist/draco/draco-libraries.d.ts.map +1 -0
- package/dist/draco/draco-libraries.js +33 -0
- package/dist/draco/draco-libraries.js.map +1 -0
- package/dist/draco/draco-library-options.cjs +80 -0
- package/dist/draco/draco-library-options.cjs.map +7 -0
- package/dist/draco/draco-library-options.d.ts +16 -0
- package/dist/draco/draco-library-options.d.ts.map +1 -0
- package/dist/draco/draco-library-options.js +52 -0
- package/dist/draco/draco-library-options.js.map +1 -0
- package/dist/draco/draco-loader-options.cjs +37 -0
- package/dist/draco/draco-loader-options.cjs.map +7 -0
- package/dist/draco/draco-loader-options.d.ts +27 -0
- package/dist/draco/draco-loader-options.d.ts.map +1 -0
- package/dist/draco/draco-loader-options.js +12 -0
- package/dist/draco/draco-loader-options.js.map +1 -0
- package/dist/draco/draco-loader-types.cjs +88 -0
- package/dist/draco/draco-loader-types.cjs.map +7 -0
- package/dist/draco/draco-loader-types.d.ts +69 -0
- package/dist/draco/draco-loader-types.d.ts.map +1 -0
- package/dist/draco/draco-loader-types.js +54 -0
- package/dist/draco/draco-loader-types.js.map +1 -0
- package/dist/draco/draco-loader.cjs +51 -0
- package/dist/draco/draco-loader.cjs.map +7 -0
- package/dist/draco/draco-loader.d.ts +39 -0
- package/dist/draco/draco-loader.d.ts.map +1 -0
- package/dist/draco/draco-loader.js +22 -0
- package/dist/draco/draco-loader.js.map +1 -0
- package/dist/draco/draco-wasm-loader-with-parser.cjs +48 -0
- package/dist/draco/draco-wasm-loader-with-parser.cjs.map +7 -0
- package/dist/draco/draco-wasm-loader-with-parser.d.ts +34 -0
- package/dist/draco/draco-wasm-loader-with-parser.d.ts.map +1 -0
- package/dist/draco/draco-wasm-loader-with-parser.js +14 -0
- package/dist/draco/draco-wasm-loader-with-parser.js.map +1 -0
- package/dist/draco/draco-writer.cjs +183 -0
- package/dist/draco/draco-writer.cjs.map +7 -0
- package/dist/draco/draco-writer.d.ts +97 -0
- package/dist/draco/draco-writer.d.ts.map +1 -0
- package/dist/draco/draco-writer.js +166 -0
- package/dist/draco/draco-writer.js.map +1 -0
- package/dist/draco/draco3d/draco3d-types.cjs +76 -0
- package/dist/draco/draco3d/draco3d-types.cjs.map +7 -0
- package/dist/draco/draco3d/draco3d-types.d.ts +303 -0
- package/dist/draco/draco3d/draco3d-types.d.ts.map +1 -0
- package/dist/draco/draco3d/draco3d-types.js +47 -0
- package/dist/draco/draco3d/draco3d-types.js.map +1 -0
- package/dist/draco/draco3d-loader-with-parser.cjs +50 -0
- package/dist/draco/draco3d-loader-with-parser.cjs.map +7 -0
- package/dist/draco/draco3d-loader-with-parser.d.ts +34 -0
- package/dist/draco/draco3d-loader-with-parser.d.ts.map +1 -0
- package/dist/draco/draco3d-loader-with-parser.js +21 -0
- package/dist/draco/draco3d-loader-with-parser.js.map +1 -0
- package/dist/draco/index.cjs +54 -0
- package/dist/draco/index.cjs.map +7 -0
- package/dist/draco/index.d.ts +13 -0
- package/dist/draco/index.d.ts.map +1 -0
- package/dist/draco/index.js +13 -0
- package/dist/draco/index.js.map +1 -0
- package/dist/draco/lib/draco-builder.cjs +660 -0
- package/dist/draco/lib/draco-builder.cjs.map +7 -0
- package/dist/draco/lib/draco-builder.d.ts +175 -0
- package/dist/draco/lib/draco-builder.d.ts.map +1 -0
- package/dist/draco/lib/draco-builder.js +612 -0
- package/dist/draco/lib/draco-builder.js.map +1 -0
- package/dist/draco/lib/draco-library-loader.cjs +47 -0
- package/dist/draco/lib/draco-library-loader.cjs.map +7 -0
- package/dist/draco/lib/draco-library-loader.d.ts +5 -0
- package/dist/draco/lib/draco-library-loader.d.ts.map +1 -0
- package/dist/draco/lib/draco-library-loader.js +23 -0
- package/dist/draco/lib/draco-library-loader.js.map +1 -0
- package/dist/draco/lib/draco-module-loader.cjs +281 -0
- package/dist/draco/lib/draco-module-loader.cjs.map +7 -0
- package/dist/draco/lib/draco-module-loader.d.ts +25 -0
- package/dist/draco/lib/draco-module-loader.d.ts.map +1 -0
- package/dist/draco/lib/draco-module-loader.js +220 -0
- package/dist/draco/lib/draco-module-loader.js.map +1 -0
- package/dist/draco/lib/draco-parser.cjs +598 -0
- package/dist/draco/lib/draco-parser.cjs.map +7 -0
- package/dist/draco/lib/draco-parser.d.ts +142 -0
- package/dist/draco/lib/draco-parser.d.ts.map +1 -0
- package/dist/draco/lib/draco-parser.js +595 -0
- package/dist/draco/lib/draco-parser.js.map +1 -0
- package/dist/draco/lib/draco-types.cjs +19 -0
- package/dist/draco/lib/draco-types.cjs.map +7 -0
- package/dist/draco/lib/draco-types.d.ts +59 -0
- package/dist/draco/lib/draco-types.d.ts.map +1 -0
- package/dist/draco/lib/draco-types.js +5 -0
- package/dist/draco/lib/draco-types.js.map +1 -0
- package/dist/draco/lib/parse-draco.cjs +59 -0
- package/dist/draco/lib/parse-draco.cjs.map +7 -0
- package/dist/draco/lib/parse-draco.d.ts +22 -0
- package/dist/draco/lib/parse-draco.d.ts.map +1 -0
- package/dist/draco/lib/parse-draco.js +32 -0
- package/dist/draco/lib/parse-draco.js.map +1 -0
- package/dist/draco/lib/utils/get-draco-schema.cjs +74 -0
- package/dist/draco/lib/utils/get-draco-schema.cjs.map +7 -0
- package/dist/draco/lib/utils/get-draco-schema.d.ts +7 -0
- package/dist/draco/lib/utils/get-draco-schema.d.ts.map +1 -0
- package/dist/draco/lib/utils/get-draco-schema.js +45 -0
- package/dist/draco/lib/utils/get-draco-schema.js.map +1 -0
- package/dist/draco/lib/utils/version.cjs +31 -0
- package/dist/draco/lib/utils/version.cjs.map +7 -0
- package/dist/draco/lib/utils/version.d.ts +2 -0
- package/dist/draco/lib/utils/version.d.ts.map +1 -0
- package/dist/draco/lib/utils/version.js +8 -0
- package/dist/draco/lib/utils/version.js.map +1 -0
- package/dist/draco/unbundled.cjs +33 -0
- package/dist/draco/unbundled.cjs.map +7 -0
- package/dist/draco/unbundled.d.ts +3 -0
- package/dist/draco/unbundled.d.ts.map +1 -0
- package/dist/draco/unbundled.js +5 -0
- package/dist/draco/unbundled.js.map +1 -0
- package/dist/draco/workers/draco-worker-node.cjs +8 -0
- package/dist/draco/workers/draco-worker-node.cjs.map +7 -0
- package/dist/draco/workers/draco-worker-node.d.ts +2 -0
- package/dist/draco/workers/draco-worker-node.d.ts.map +1 -0
- package/dist/draco/workers/draco-worker-node.js +9 -0
- package/dist/draco/workers/draco-worker-node.js.map +1 -0
- package/dist/draco/workers/draco-worker.cjs +7 -0
- package/dist/draco/workers/draco-worker.cjs.map +7 -0
- package/dist/draco/workers/draco-worker.d.ts +2 -0
- package/dist/draco/workers/draco-worker.d.ts.map +1 -0
- package/dist/draco/workers/draco-worker.js +7 -0
- package/dist/draco/workers/draco-worker.js.map +1 -0
- package/dist/draco/workers/draco-writer-worker-node.cjs +11 -0
- package/dist/draco/workers/draco-writer-worker-node.cjs.map +7 -0
- package/dist/draco/workers/draco-writer-worker-node.d.cts +2 -0
- package/dist/draco/workers/draco-writer-worker-node.d.cts.map +1 -0
- package/dist/draco/workers/draco-writer-worker-node.d.ts +2 -0
- package/dist/draco/workers/draco-writer-worker-node.d.ts.map +1 -0
- package/dist/draco/workers/draco-writer-worker-node.js +9 -0
- package/dist/draco/workers/draco-writer-worker-node.js.map +1 -0
- package/dist/draco/workers/draco-writer-worker.cjs +10 -0
- package/dist/draco/workers/draco-writer-worker.cjs.map +7 -0
- package/dist/draco/workers/draco-writer-worker.d.ts +2 -0
- package/dist/draco/workers/draco-writer-worker.d.ts.map +1 -0
- package/dist/draco/workers/draco-writer-worker.js +7 -0
- package/dist/draco/workers/draco-writer-worker.js.map +1 -0
- package/dist/draco-javascript-loader.cjs +25 -0
- package/dist/draco-javascript-loader.cjs.map +7 -0
- package/dist/draco-javascript-loader.d.ts +2 -0
- package/dist/draco-javascript-loader.d.ts.map +1 -0
- package/dist/draco-javascript-loader.js +3 -0
- package/dist/draco-javascript-loader.js.map +1 -0
- package/dist/draco-library-options.cjs +36 -0
- package/dist/draco-library-options.cjs.map +7 -0
- package/dist/draco-library-options.d.ts +3 -0
- package/dist/draco-library-options.d.ts.map +1 -0
- package/dist/draco-library-options.js +4 -0
- package/dist/draco-library-options.js.map +1 -0
- package/dist/draco-loader-types.cjs +25 -0
- package/dist/draco-loader-types.cjs.map +7 -0
- package/dist/draco-loader-types.d.ts +2 -0
- package/dist/draco-loader-types.d.ts.map +1 -0
- package/dist/draco-loader-types.js +3 -0
- package/dist/draco-loader-types.js.map +1 -0
- package/dist/draco-loader.cjs +25 -0
- package/dist/draco-loader.cjs.map +7 -0
- package/dist/draco-loader.d.ts +2 -0
- package/dist/draco-loader.d.ts.map +1 -0
- package/dist/draco-loader.js +3 -0
- package/dist/draco-loader.js.map +1 -0
- package/dist/draco-wasm-loader.cjs +25 -0
- package/dist/draco-wasm-loader.cjs.map +7 -0
- package/dist/draco-wasm-loader.d.ts +2 -0
- package/dist/draco-wasm-loader.d.ts.map +1 -0
- package/dist/draco-wasm-loader.js +3 -0
- package/dist/draco-wasm-loader.js.map +1 -0
- package/dist/draco-worker-node.js +28279 -0
- package/dist/draco-worker-node.js.map +7 -0
- package/dist/draco-worker.js +18145 -0
- package/dist/draco-worker.js.map +7 -0
- package/dist/draco-writer-worker-node.cjs +27521 -0
- package/dist/draco-writer-worker-node.cjs.map +7 -0
- package/dist/draco-writer-worker.js +17339 -0
- package/dist/draco-writer-worker.js.map +7 -0
- package/dist/draco-writer.cjs +25 -0
- package/dist/draco-writer.cjs.map +7 -0
- package/dist/draco-writer.d.ts +2 -0
- package/dist/draco-writer.d.ts.map +1 -0
- package/dist/draco-writer.js +3 -0
- package/dist/draco-writer.js.map +1 -0
- package/dist/draco3d-loader.cjs +25 -0
- package/dist/draco3d-loader.cjs.map +7 -0
- package/dist/draco3d-loader.d.ts +2 -0
- package/dist/draco3d-loader.d.ts.map +1 -0
- package/dist/draco3d-loader.js +3 -0
- package/dist/draco3d-loader.js.map +1 -0
- package/dist/glb-loader-types.cjs +61 -0
- package/dist/glb-loader-types.cjs.map +7 -0
- package/dist/glb-loader-types.d.ts +2 -0
- package/dist/glb-loader-types.d.ts.map +1 -0
- package/dist/glb-loader-types.js +2 -0
- package/dist/glb-loader-types.js.map +1 -0
- package/dist/glb-loader.cjs +48 -0
- package/dist/glb-loader.cjs.map +7 -0
- package/dist/glb-loader.d.ts +2 -0
- package/dist/glb-loader.d.ts.map +1 -0
- package/dist/glb-loader.js +2 -0
- package/dist/glb-loader.js.map +1 -0
- package/dist/glb-writer.cjs +53 -0
- package/dist/glb-writer.cjs.map +7 -0
- package/dist/glb-writer.d.ts +2 -0
- package/dist/glb-writer.d.ts.map +1 -0
- package/dist/glb-writer.js +2 -0
- package/dist/glb-writer.js.map +1 -0
- package/dist/gltf/glb-loader-types.cjs +1 -1
- package/dist/gltf/glb-loader-types.cjs.map +2 -2
- package/dist/gltf/glb-loader-types.d.ts +2 -2
- package/dist/gltf/glb-loader-types.js +1 -1
- package/dist/gltf/glb-loader-types.js.map +1 -1
- package/dist/gltf/gltf-loader-types.cjs +1 -1
- package/dist/gltf/gltf-loader-types.cjs.map +2 -2
- package/dist/gltf/gltf-loader-types.d.ts +5 -5
- package/dist/gltf/gltf-loader-types.d.ts.map +1 -1
- package/dist/gltf/gltf-loader-types.js +1 -1
- package/dist/gltf/gltf-loader-types.js.map +1 -1
- package/dist/gltf/gltf-loader.cjs.map +1 -1
- package/dist/gltf/gltf-loader.d.ts +4 -4
- package/dist/gltf/gltf-loader.d.ts.map +1 -1
- package/dist/gltf/lib/encoders/encode-gltf-draco.cjs +12 -2
- package/dist/gltf/lib/encoders/encode-gltf-draco.cjs.map +2 -2
- package/dist/gltf/lib/encoders/encode-gltf-draco.d.ts +1 -1
- package/dist/gltf/lib/encoders/encode-gltf-draco.d.ts.map +1 -1
- package/dist/gltf/lib/encoders/encode-gltf-draco.js +1 -1
- package/dist/gltf/lib/encoders/encode-gltf-draco.js.map +1 -1
- package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.cjs +2 -2
- package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.cjs.map +2 -2
- package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.d.ts.map +1 -1
- package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.js +1 -1
- package/dist/gltf/lib/extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/dist/gltf/lib/parsers/parse-gltf.cjs +2 -2
- package/dist/gltf/lib/parsers/parse-gltf.cjs.map +3 -3
- package/dist/gltf/lib/parsers/parse-gltf.js +5 -5
- package/dist/gltf/lib/parsers/parse-gltf.js.map +1 -1
- package/dist/gltf/lib/types/gltf-zod-schema.d.ts +1 -1
- package/dist/gltf/lib/utils/version.cjs +1 -1
- package/dist/gltf/lib/utils/version.js +1 -1
- package/dist/gltf-loader-types.cjs +73 -0
- package/dist/gltf-loader-types.cjs.map +7 -0
- package/dist/gltf-loader-types.d.ts +2 -0
- package/dist/gltf-loader-types.d.ts.map +1 -0
- package/dist/gltf-loader-types.js +2 -0
- package/dist/gltf-loader-types.js.map +1 -0
- package/dist/gltf-loader.cjs +48 -0
- package/dist/gltf-loader.cjs.map +7 -0
- package/dist/gltf-loader.d.ts +2 -0
- package/dist/gltf-loader.d.ts.map +1 -0
- package/dist/gltf-loader.js +2 -0
- package/dist/gltf-loader.js.map +1 -0
- package/dist/gltf-source.cjs +238 -0
- package/dist/gltf-source.cjs.map +7 -0
- package/dist/gltf-source.d.ts +2 -0
- package/dist/gltf-source.d.ts.map +1 -0
- package/dist/gltf-source.js +2 -0
- package/dist/gltf-source.js.map +1 -0
- package/dist/gltf-writer.cjs +69 -0
- package/dist/gltf-writer.cjs.map +7 -0
- package/dist/gltf-writer.d.ts +2 -0
- package/dist/gltf-writer.d.ts.map +1 -0
- package/dist/gltf-writer.js +2 -0
- package/dist/gltf-writer.js.map +1 -0
- package/dist/index.cjs +13 -0
- package/dist/index.cjs.map +2 -2
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/libs/DRACO-LICENSE +252 -0
- package/dist/libs/README.md +20 -0
- package/dist/libs/draco_decoder.js +34 -0
- package/dist/libs/draco_decoder.mjs +37 -0
- package/dist/libs/draco_decoder.wasm +0 -0
- package/dist/libs/draco_decoder_gltf.wasm +0 -0
- package/dist/libs/draco_encoder.js +98 -0
- package/dist/libs/draco_encoder.mjs +101 -0
- package/dist/libs/draco_encoder.wasm +0 -0
- package/dist/libs/draco_wasm_wrapper.js +117 -0
- package/dist/libs/draco_wasm_wrapper.mjs +120 -0
- package/dist/libs/draco_wasm_wrapper_gltf.js +116 -0
- package/dist/libs/draco_wasm_wrapper_gltf.mjs +119 -0
- package/dist/mtl-loader-types.cjs +64 -0
- package/dist/mtl-loader-types.cjs.map +7 -0
- package/dist/mtl-loader-types.d.ts +2 -0
- package/dist/mtl-loader-types.d.ts.map +1 -0
- package/dist/mtl-loader-types.js +2 -0
- package/dist/mtl-loader-types.js.map +1 -0
- package/dist/mtl-loader.cjs +47 -0
- package/dist/mtl-loader.cjs.map +7 -0
- package/dist/mtl-loader.d.ts +2 -0
- package/dist/mtl-loader.d.ts.map +1 -0
- package/dist/mtl-loader.js +2 -0
- package/dist/mtl-loader.js.map +1 -0
- package/dist/obj/mtl-loader-types.cjs +2 -2
- package/dist/obj/mtl-loader-types.cjs.map +2 -2
- package/dist/obj/mtl-loader-types.d.ts +2 -2
- package/dist/obj/mtl-loader-types.js +2 -2
- package/dist/obj/mtl-loader-types.js.map +1 -1
- package/dist/obj/mtl-loader.cjs +1 -1
- package/dist/obj/mtl-loader.cjs.map +2 -2
- package/dist/obj/mtl-loader.js +1 -1
- package/dist/obj/mtl-loader.js.map +1 -1
- package/dist/obj/obj-loader-types.cjs +2 -2
- package/dist/obj/obj-loader-types.cjs.map +2 -2
- package/dist/obj/obj-loader-types.js +2 -2
- package/dist/obj/obj-loader-types.js.map +1 -1
- package/dist/obj/obj-writer.cjs +1 -1
- package/dist/obj/obj-writer.js +1 -1
- package/dist/obj-loader-types.cjs +71 -0
- package/dist/obj-loader-types.cjs.map +7 -0
- package/dist/obj-loader-types.d.ts +2 -0
- package/dist/obj-loader-types.d.ts.map +1 -0
- package/dist/obj-loader-types.js +2 -0
- package/dist/obj-loader-types.js.map +1 -0
- package/dist/obj-loader.cjs +163 -0
- package/dist/obj-loader.cjs.map +7 -0
- package/dist/obj-loader.d.ts +2 -0
- package/dist/obj-loader.d.ts.map +1 -0
- package/dist/obj-loader.js +2 -0
- package/dist/obj-loader.js.map +1 -0
- package/dist/obj-worker.js +204 -71
- package/dist/obj-writer.cjs +167 -0
- package/dist/obj-writer.cjs.map +7 -0
- package/dist/obj-writer.d.ts +2 -0
- package/dist/obj-writer.d.ts.map +1 -0
- package/dist/obj-writer.js +2 -0
- package/dist/obj-writer.js.map +1 -0
- package/dist/usd/usd-loader-types.cjs +2 -2
- package/dist/usd/usd-loader-types.cjs.map +2 -2
- package/dist/usd/usd-loader-types.js +2 -2
- package/dist/usd/usd-loader-types.js.map +1 -1
- package/dist/usd-loader-types.cjs +69 -0
- package/dist/usd-loader-types.cjs.map +7 -0
- package/dist/usd-loader-types.d.ts +2 -0
- package/dist/usd-loader-types.d.ts.map +1 -0
- package/dist/usd-loader-types.js +2 -0
- package/dist/usd-loader-types.js.map +1 -0
- package/dist/usd-loader.cjs +43 -0
- package/dist/usd-loader.cjs.map +7 -0
- package/dist/usd-loader.d.ts +2 -0
- package/dist/usd-loader.d.ts.map +1 -0
- package/dist/usd-loader.js +2 -0
- package/dist/usd-loader.js.map +1 -0
- package/package.json +130 -71
- package/src/draco/bundled.ts +10 -0
- package/src/draco/draco-format.ts +20 -0
- package/src/draco/draco-javascript-loader-with-parser.ts +26 -0
- package/src/draco/draco-libraries.ts +35 -0
- package/src/draco/draco-library-options.ts +76 -0
- package/src/draco/draco-loader-options.ts +33 -0
- package/src/draco/draco-loader-types.ts +78 -0
- package/src/draco/draco-loader.ts +45 -0
- package/src/draco/draco-wasm-loader-with-parser.ts +31 -0
- package/src/draco/draco-writer.ts +252 -0
- package/src/draco/draco3d/draco3d-types.ts +498 -0
- package/src/draco/draco3d-loader-with-parser.ts +34 -0
- package/src/draco/index.ts +46 -0
- package/src/draco/lib/draco-builder.ts +935 -0
- package/src/draco/lib/draco-library-loader.ts +38 -0
- package/src/draco/lib/draco-module-loader.ts +370 -0
- package/src/draco/lib/draco-parser.ts +776 -0
- package/src/draco/lib/draco-types.ts +72 -0
- package/src/draco/lib/parse-draco.ts +51 -0
- package/src/draco/lib/utils/get-draco-schema.ts +65 -0
- package/src/draco/lib/utils/version.ts +8 -0
- package/src/draco/libs/DRACO-LICENSE +252 -0
- package/src/draco/libs/README.md +20 -0
- package/src/draco/libs/draco_decoder.js +34 -0
- package/src/draco/libs/draco_decoder.wasm +0 -0
- package/src/draco/libs/draco_decoder_gltf.wasm +0 -0
- package/src/draco/libs/draco_encoder.js +98 -0
- package/src/draco/libs/draco_encoder.wasm +0 -0
- package/src/draco/libs/draco_wasm_wrapper.js +117 -0
- package/src/draco/libs/draco_wasm_wrapper_gltf.js +116 -0
- package/src/draco/unbundled.ts +6 -0
- package/src/draco/workers/draco-worker-node.ts +10 -0
- package/src/draco/workers/draco-worker.ts +8 -0
- package/src/draco/workers/draco-writer-worker-node.cjs +21 -0
- package/src/draco/workers/draco-writer-worker-node.ts +13 -0
- package/src/draco/workers/draco-writer-worker.ts +11 -0
- package/src/draco-javascript-loader.ts +2 -0
- package/src/draco-library-options.ts +6 -0
- package/src/draco-loader-types.ts +2 -0
- package/src/draco-loader.ts +2 -0
- package/src/draco-wasm-loader.ts +2 -0
- package/src/draco-writer.ts +2 -0
- package/src/draco3d-loader.ts +2 -0
- package/src/glb-loader-types.ts +1 -0
- package/src/glb-loader.ts +1 -0
- package/src/glb-writer.ts +1 -0
- package/src/gltf/glb-loader-types.ts +1 -1
- package/src/gltf/gltf-loader-types.ts +5 -5
- package/src/gltf/gltf-loader.ts +4 -4
- package/src/gltf/lib/encoders/encode-gltf-draco.ts +2 -2
- package/src/gltf/lib/extensions/KHR_draco_mesh_compression.ts +2 -1
- package/src/gltf/lib/parsers/parse-gltf.ts +5 -5
- package/src/gltf-loader-types.ts +1 -0
- package/src/gltf-loader.ts +1 -0
- package/src/gltf-source.ts +1 -0
- package/src/gltf-writer.ts +1 -0
- package/src/index.ts +5 -0
- package/src/mtl-loader-types.ts +1 -0
- package/src/mtl-loader.ts +1 -0
- package/src/obj/mtl-loader-types.ts +1 -1
- package/src/obj/mtl-loader.ts +1 -1
- package/src/obj/obj-loader-types.ts +1 -1
- package/src/obj-loader-types.ts +1 -0
- package/src/obj-loader.ts +1 -0
- package/src/obj-writer.ts +1 -0
- package/src/usd/usd-loader-types.ts +1 -1
- package/src/usd-loader-types.ts +1 -0
- package/src/usd-loader.ts +1 -0
|
@@ -0,0 +1,660 @@
|
|
|
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-builder.ts
|
|
21
|
+
var draco_builder_exports = {};
|
|
22
|
+
__export(draco_builder_exports, {
|
|
23
|
+
default: () => DracoBuilder
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(draco_builder_exports);
|
|
26
|
+
var GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP = {
|
|
27
|
+
POSITION: "POSITION",
|
|
28
|
+
NORMAL: "NORMAL",
|
|
29
|
+
COLOR_0: "COLOR",
|
|
30
|
+
TEXCOORD_0: "TEX_COORD"
|
|
31
|
+
};
|
|
32
|
+
var noop = () => {
|
|
33
|
+
};
|
|
34
|
+
var DracoBuilder = class {
|
|
35
|
+
draco;
|
|
36
|
+
dracoEncoder;
|
|
37
|
+
dracoMeshBuilder;
|
|
38
|
+
dracoMetadataBuilder;
|
|
39
|
+
log = noop;
|
|
40
|
+
// draco - the draco decoder, either import `draco3d` or load dynamically
|
|
41
|
+
constructor(draco) {
|
|
42
|
+
this.draco = draco;
|
|
43
|
+
this.dracoEncoder = new this.draco.Encoder();
|
|
44
|
+
this.dracoMeshBuilder = new this.draco.MeshBuilder();
|
|
45
|
+
this.dracoMetadataBuilder = new this.draco.MetadataBuilder();
|
|
46
|
+
}
|
|
47
|
+
destroy() {
|
|
48
|
+
this.destroyEncodedObject(this.dracoMeshBuilder);
|
|
49
|
+
this.destroyEncodedObject(this.dracoEncoder);
|
|
50
|
+
this.destroyEncodedObject(this.dracoMetadataBuilder);
|
|
51
|
+
}
|
|
52
|
+
// TBD - when does this need to be called?
|
|
53
|
+
destroyEncodedObject(object) {
|
|
54
|
+
if (object) {
|
|
55
|
+
this.draco.destroy(object);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Encode mesh or point cloud
|
|
60
|
+
* @param mesh =({})
|
|
61
|
+
* @param options
|
|
62
|
+
*/
|
|
63
|
+
encodeSync(mesh, options = {}) {
|
|
64
|
+
return this._encodeSync(mesh, options, false).data;
|
|
65
|
+
}
|
|
66
|
+
/** Encodes a mesh or point cloud and returns native encoding diagnostics. */
|
|
67
|
+
encodeSyncWithReport(mesh, options = {}) {
|
|
68
|
+
return this._encodeSync(mesh, options, true);
|
|
69
|
+
}
|
|
70
|
+
/** Shared implementation for ordinary encoding and report-producing encoding. */
|
|
71
|
+
_encodeSync(mesh, options, trackEncodedProperties) {
|
|
72
|
+
options = applyDracoEncodingPreset(options);
|
|
73
|
+
this.log = options.log || noop;
|
|
74
|
+
return options.pointcloud ? this._encodePointCloud(mesh, options, trackEncodedProperties) : this._encodeMesh(mesh, options, trackEncodedProperties);
|
|
75
|
+
}
|
|
76
|
+
// PRIVATE
|
|
77
|
+
_getAttributesFromMesh(mesh) {
|
|
78
|
+
return {
|
|
79
|
+
...mesh.indices ? { indices: mesh.indices } : {},
|
|
80
|
+
...mesh.attributes
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
_encodePointCloud(pointcloud, options, trackEncodedProperties) {
|
|
84
|
+
const dracoPointCloud = new this.draco.PointCloud();
|
|
85
|
+
const dracoData = new this.draco.DracoInt8Array();
|
|
86
|
+
let expertEncoder = null;
|
|
87
|
+
try {
|
|
88
|
+
if (options.metadata) {
|
|
89
|
+
this._addGeometryMetadata(dracoPointCloud, options.metadata);
|
|
90
|
+
}
|
|
91
|
+
const attributes = this._getAttributesFromMesh(pointcloud);
|
|
92
|
+
const attributeInfo = this._createDracoPointCloud(dracoPointCloud, attributes, options);
|
|
93
|
+
const useExpertEncoder = hasAttributeQuantization(options);
|
|
94
|
+
let encodedLen;
|
|
95
|
+
let activeEncoder;
|
|
96
|
+
if (useExpertEncoder) {
|
|
97
|
+
expertEncoder = new this.draco.ExpertEncoder(dracoPointCloud);
|
|
98
|
+
this._setExpertOptions(expertEncoder, attributeInfo, options);
|
|
99
|
+
activeEncoder = expertEncoder;
|
|
100
|
+
if (trackEncodedProperties) {
|
|
101
|
+
activeEncoder.SetTrackEncodedProperties(true);
|
|
102
|
+
}
|
|
103
|
+
encodedLen = expertEncoder.EncodeToDracoBuffer(
|
|
104
|
+
options.deduplicateValues ?? false,
|
|
105
|
+
dracoData
|
|
106
|
+
);
|
|
107
|
+
} else {
|
|
108
|
+
this._setOptions(options);
|
|
109
|
+
activeEncoder = this.dracoEncoder;
|
|
110
|
+
if (trackEncodedProperties) {
|
|
111
|
+
activeEncoder.SetTrackEncodedProperties(true);
|
|
112
|
+
}
|
|
113
|
+
encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(
|
|
114
|
+
dracoPointCloud,
|
|
115
|
+
options.deduplicateValues ?? false,
|
|
116
|
+
dracoData
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
if (!(encodedLen > 0)) {
|
|
120
|
+
throw new Error("Draco encoding failed.");
|
|
121
|
+
}
|
|
122
|
+
this.log(`DRACO encoded ${dracoPointCloud.num_points()} points
|
|
123
|
+
with ${dracoPointCloud.num_attributes()} attributes into ${encodedLen} bytes`);
|
|
124
|
+
const data = dracoInt8ArrayToArrayBuffer(dracoData);
|
|
125
|
+
return {
|
|
126
|
+
data,
|
|
127
|
+
report: this._getEncodingReport(
|
|
128
|
+
"point-cloud",
|
|
129
|
+
data.byteLength,
|
|
130
|
+
dracoPointCloud,
|
|
131
|
+
activeEncoder,
|
|
132
|
+
attributeInfo,
|
|
133
|
+
options,
|
|
134
|
+
trackEncodedProperties
|
|
135
|
+
)
|
|
136
|
+
};
|
|
137
|
+
} finally {
|
|
138
|
+
this.destroyEncodedObject(expertEncoder);
|
|
139
|
+
this.destroyEncodedObject(dracoData);
|
|
140
|
+
this.destroyEncodedObject(dracoPointCloud);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
_encodeMesh(mesh, options, trackEncodedProperties) {
|
|
144
|
+
const dracoMesh = new this.draco.Mesh();
|
|
145
|
+
const dracoData = new this.draco.DracoInt8Array();
|
|
146
|
+
let expertEncoder = null;
|
|
147
|
+
try {
|
|
148
|
+
if (options.metadata) {
|
|
149
|
+
this._addGeometryMetadata(dracoMesh, options.metadata);
|
|
150
|
+
}
|
|
151
|
+
const attributes = this._getAttributesFromMesh(mesh);
|
|
152
|
+
const attributeInfo = this._createDracoMesh(dracoMesh, attributes, options);
|
|
153
|
+
const useExpertEncoder = hasAttributeQuantization(options);
|
|
154
|
+
let encodedLen;
|
|
155
|
+
let activeEncoder;
|
|
156
|
+
if (useExpertEncoder) {
|
|
157
|
+
expertEncoder = new this.draco.ExpertEncoder(dracoMesh);
|
|
158
|
+
this._setExpertOptions(expertEncoder, attributeInfo, options);
|
|
159
|
+
activeEncoder = expertEncoder;
|
|
160
|
+
if (trackEncodedProperties) {
|
|
161
|
+
activeEncoder.SetTrackEncodedProperties(true);
|
|
162
|
+
}
|
|
163
|
+
encodedLen = expertEncoder.EncodeToDracoBuffer(false, dracoData);
|
|
164
|
+
} else {
|
|
165
|
+
this._setOptions(options);
|
|
166
|
+
activeEncoder = this.dracoEncoder;
|
|
167
|
+
if (trackEncodedProperties) {
|
|
168
|
+
activeEncoder.SetTrackEncodedProperties(true);
|
|
169
|
+
}
|
|
170
|
+
encodedLen = this.dracoEncoder.EncodeMeshToDracoBuffer(dracoMesh, dracoData);
|
|
171
|
+
}
|
|
172
|
+
if (encodedLen <= 0) {
|
|
173
|
+
throw new Error("Draco encoding failed.");
|
|
174
|
+
}
|
|
175
|
+
this.log(`DRACO encoded ${dracoMesh.num_points()} points
|
|
176
|
+
with ${dracoMesh.num_attributes()} attributes into ${encodedLen} bytes`);
|
|
177
|
+
const data = dracoInt8ArrayToArrayBuffer(dracoData);
|
|
178
|
+
return {
|
|
179
|
+
data,
|
|
180
|
+
report: this._getEncodingReport(
|
|
181
|
+
"mesh",
|
|
182
|
+
data.byteLength,
|
|
183
|
+
dracoMesh,
|
|
184
|
+
activeEncoder,
|
|
185
|
+
attributeInfo,
|
|
186
|
+
options,
|
|
187
|
+
trackEncodedProperties
|
|
188
|
+
)
|
|
189
|
+
};
|
|
190
|
+
} finally {
|
|
191
|
+
this.destroyEncodedObject(expertEncoder);
|
|
192
|
+
this.destroyEncodedObject(dracoData);
|
|
193
|
+
this.destroyEncodedObject(dracoMesh);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** Applies encoder speed, method, and quantization options. */
|
|
197
|
+
_setOptions(options) {
|
|
198
|
+
if (options.speed) {
|
|
199
|
+
this.dracoEncoder.SetSpeedOptions(...options.speed);
|
|
200
|
+
}
|
|
201
|
+
if (options.method) {
|
|
202
|
+
const dracoMethod = this.draco[options.method];
|
|
203
|
+
this.dracoEncoder.SetEncodingMethod(dracoMethod);
|
|
204
|
+
}
|
|
205
|
+
if (options.quantization) {
|
|
206
|
+
for (const attribute in options.quantization) {
|
|
207
|
+
const attributeType = attribute;
|
|
208
|
+
const bits = options.quantization[attributeType];
|
|
209
|
+
if (bits !== void 0) {
|
|
210
|
+
validateQuantizationBits(attributeType, bits, attributeType);
|
|
211
|
+
this.dracoEncoder.SetAttributeQuantization(this.draco[attributeType], bits);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** Applies common options and per-attribute quantization to an expert encoder. */
|
|
217
|
+
_setExpertOptions(expertEncoder, attributes, options) {
|
|
218
|
+
if (options.speed) {
|
|
219
|
+
expertEncoder.SetSpeedOptions(...options.speed);
|
|
220
|
+
}
|
|
221
|
+
if (options.method) {
|
|
222
|
+
expertEncoder.SetEncodingMethod(this.draco[options.method]);
|
|
223
|
+
}
|
|
224
|
+
const quantization = this._getAttributeQuantization(attributes, options);
|
|
225
|
+
for (const [attributeName, setting] of quantization) {
|
|
226
|
+
const attribute = attributes[attributeName];
|
|
227
|
+
if (typeof setting === "number") {
|
|
228
|
+
expertEncoder.SetAttributeQuantization(attribute.attributeId, setting);
|
|
229
|
+
} else {
|
|
230
|
+
expertEncoder.SetAttributeExplicitQuantization(
|
|
231
|
+
attribute.attributeId,
|
|
232
|
+
setting.bits,
|
|
233
|
+
attribute.componentCount,
|
|
234
|
+
setting.origin,
|
|
235
|
+
setting.range
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** Resolves category and exact quantization settings for every encoded attribute. */
|
|
241
|
+
_getAttributeQuantization(attributes, options) {
|
|
242
|
+
const categoryQuantization = /* @__PURE__ */ new Map();
|
|
243
|
+
for (const attributeType of Object.keys(options.quantization || {})) {
|
|
244
|
+
const bits = options.quantization?.[attributeType];
|
|
245
|
+
if (bits !== void 0) {
|
|
246
|
+
validateQuantizationBits(attributeType, bits, attributeType);
|
|
247
|
+
categoryQuantization.set(this.draco[attributeType], bits);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const quantization = /* @__PURE__ */ new Map();
|
|
251
|
+
for (const [attributeName, attribute] of Object.entries(attributes)) {
|
|
252
|
+
const bits = categoryQuantization.get(attribute.attributeType);
|
|
253
|
+
if (bits !== void 0) {
|
|
254
|
+
quantization.set(attributeName, bits);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
for (const [attributeName, setting] of Object.entries(options.attributeQuantization || {})) {
|
|
258
|
+
const attribute = attributes[attributeName];
|
|
259
|
+
if (!attribute) {
|
|
260
|
+
throw new Error(`DracoWriter: quantized attribute "${attributeName}" does not exist`);
|
|
261
|
+
}
|
|
262
|
+
if (typeof setting === "number") {
|
|
263
|
+
validateQuantizationBits(attributeName, setting, attribute.attributeTypeName);
|
|
264
|
+
} else {
|
|
265
|
+
if (attribute.attributeTypeName === "NORMAL") {
|
|
266
|
+
throw new Error(
|
|
267
|
+
`DracoWriter: explicit quantization transforms are not supported for NORMAL attribute "${attributeName}"`
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
validateExplicitQuantization(
|
|
271
|
+
attributeName,
|
|
272
|
+
attributes[attributeName].componentCount,
|
|
273
|
+
setting
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
quantization.set(attributeName, setting);
|
|
277
|
+
}
|
|
278
|
+
for (const attributeName of quantization.keys()) {
|
|
279
|
+
if (!attributes[attributeName].supportsQuantization) {
|
|
280
|
+
throw new Error(
|
|
281
|
+
`DracoWriter: quantization for "${attributeName}" requires floating-point attribute data`
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return quantization;
|
|
286
|
+
}
|
|
287
|
+
/** Builds public diagnostics for a completed native encoding. */
|
|
288
|
+
_getEncodingReport(geometryType, byteLength, geometry, encoder, attributes, options, trackEncodedProperties) {
|
|
289
|
+
const quantization = this._getAttributeQuantization(attributes, options);
|
|
290
|
+
const attributeReports = {};
|
|
291
|
+
for (const [attributeName, attribute] of Object.entries(attributes)) {
|
|
292
|
+
attributeReports[attributeName] = {
|
|
293
|
+
id: attribute.attributeId,
|
|
294
|
+
type: attribute.attributeTypeName,
|
|
295
|
+
componentCount: attribute.componentCount,
|
|
296
|
+
...quantization.has(attributeName) ? { quantization: quantization.get(attributeName) } : {}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
geometryType,
|
|
301
|
+
byteLength,
|
|
302
|
+
pointCount: trackEncodedProperties ? encoder.GetNumberOfEncodedPoints() : geometry.num_points(),
|
|
303
|
+
faceCount: trackEncodedProperties ? encoder.GetNumberOfEncodedFaces() : geometryType === "mesh" ? typeof geometry.num_faces === "function" ? geometry.num_faces() : 0 : 0,
|
|
304
|
+
attributeCount: geometry.num_attributes(),
|
|
305
|
+
...options.method ? { method: options.method } : {},
|
|
306
|
+
...options.speed ? { speed: options.speed } : {},
|
|
307
|
+
attributes: attributeReports
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* @param {Mesh} dracoMesh
|
|
312
|
+
* @param {object} attributes
|
|
313
|
+
* @returns {Mesh}
|
|
314
|
+
*/
|
|
315
|
+
_createDracoMesh(dracoMesh, attributes, options) {
|
|
316
|
+
const optionalMetadata = options.attributesMetadata || {};
|
|
317
|
+
const attributeInfo = {};
|
|
318
|
+
const vertexCount = this._getVertexCount(attributes, options);
|
|
319
|
+
for (const [attributeName, attribute] of Object.entries(attributes)) {
|
|
320
|
+
const uniqueId = this._addAttributeToMesh(
|
|
321
|
+
dracoMesh,
|
|
322
|
+
attributeName,
|
|
323
|
+
attribute,
|
|
324
|
+
vertexCount,
|
|
325
|
+
options
|
|
326
|
+
);
|
|
327
|
+
if (uniqueId !== -1) {
|
|
328
|
+
const attributeValue = getAttributeValue(attribute);
|
|
329
|
+
const attributeType = this._getDracoAttributeType(
|
|
330
|
+
attributeName,
|
|
331
|
+
options.attributeTypes
|
|
332
|
+
);
|
|
333
|
+
attributeInfo[attributeName] = {
|
|
334
|
+
attributeId: uniqueId,
|
|
335
|
+
attributeType,
|
|
336
|
+
attributeTypeName: getDracoAttributeTypeName(this.draco, attributeType),
|
|
337
|
+
componentCount: getAttributeSize(attribute, attributeValue.length / vertexCount),
|
|
338
|
+
supportsQuantization: attributeValue instanceof Float32Array
|
|
339
|
+
};
|
|
340
|
+
this._addAttributeMetadata(dracoMesh, uniqueId, {
|
|
341
|
+
[options.attributeNameEntry || "name"]: attributeName,
|
|
342
|
+
...optionalMetadata[attributeName] || {}
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return attributeInfo;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* @param {} dracoPointCloud
|
|
350
|
+
* @param {object} attributes
|
|
351
|
+
*/
|
|
352
|
+
_createDracoPointCloud(dracoPointCloud, attributes, options) {
|
|
353
|
+
const optionalMetadata = options.attributesMetadata || {};
|
|
354
|
+
const attributeInfo = {};
|
|
355
|
+
const vertexCount = this._getVertexCount(attributes, options);
|
|
356
|
+
for (const [attributeName, attribute] of Object.entries(attributes)) {
|
|
357
|
+
const uniqueId = this._addAttributeToMesh(
|
|
358
|
+
dracoPointCloud,
|
|
359
|
+
attributeName,
|
|
360
|
+
attribute,
|
|
361
|
+
vertexCount,
|
|
362
|
+
options
|
|
363
|
+
);
|
|
364
|
+
if (uniqueId !== -1) {
|
|
365
|
+
const attributeValue = getAttributeValue(attribute);
|
|
366
|
+
const attributeType = this._getDracoAttributeType(
|
|
367
|
+
attributeName,
|
|
368
|
+
options.attributeTypes
|
|
369
|
+
);
|
|
370
|
+
attributeInfo[attributeName] = {
|
|
371
|
+
attributeId: uniqueId,
|
|
372
|
+
attributeType,
|
|
373
|
+
attributeTypeName: getDracoAttributeTypeName(this.draco, attributeType),
|
|
374
|
+
componentCount: getAttributeSize(attribute, attributeValue.length / vertexCount),
|
|
375
|
+
supportsQuantization: attributeValue instanceof Float32Array
|
|
376
|
+
};
|
|
377
|
+
this._addAttributeMetadata(dracoPointCloud, uniqueId, {
|
|
378
|
+
[options.attributeNameEntry || "name"]: attributeName,
|
|
379
|
+
...optionalMetadata[attributeName] || {}
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return attributeInfo;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* @param mesh
|
|
387
|
+
* @param attributeName
|
|
388
|
+
* @param attribute
|
|
389
|
+
* @param vertexCount
|
|
390
|
+
*/
|
|
391
|
+
_addAttributeToMesh(mesh, attributeName, attribute, vertexCount, options = {}) {
|
|
392
|
+
const attributeValue = getAttributeValue(attribute);
|
|
393
|
+
if (!attributeValue) {
|
|
394
|
+
throw new Error(`DracoWriter: attribute "${attributeName}" must contain a typed array`);
|
|
395
|
+
}
|
|
396
|
+
const type = this._getDracoAttributeType(attributeName, options.attributeTypes);
|
|
397
|
+
const size = getAttributeSize(attribute, attributeValue.length / vertexCount);
|
|
398
|
+
if (type === "indices") {
|
|
399
|
+
if (attributeValue.length % 3 !== 0) {
|
|
400
|
+
throw new Error("DracoWriter: triangle indices length must be divisible by 3");
|
|
401
|
+
}
|
|
402
|
+
validateIndices(attributeValue, vertexCount);
|
|
403
|
+
const numFaces = attributeValue.length / 3;
|
|
404
|
+
this.log(`Adding attribute ${attributeName}, size ${numFaces}`);
|
|
405
|
+
const indices = attributeValue instanceof Uint16Array || attributeValue instanceof Uint32Array ? attributeValue : Uint32Array.from(attributeValue);
|
|
406
|
+
this.dracoMeshBuilder.AddFacesToMesh(mesh, numFaces, indices);
|
|
407
|
+
return -1;
|
|
408
|
+
}
|
|
409
|
+
if (!Number.isInteger(size) || size <= 0 || attributeValue.length !== vertexCount * size) {
|
|
410
|
+
throw new Error(
|
|
411
|
+
`DracoWriter: attribute "${attributeName}" has ${attributeValue.length} values, expected ${vertexCount * size}`
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
this.log(`Adding attribute ${attributeName}, size ${size}`);
|
|
415
|
+
const builder = this.dracoMeshBuilder;
|
|
416
|
+
let uniqueAttributeId = -1;
|
|
417
|
+
if (attributeValue instanceof Int8Array) {
|
|
418
|
+
uniqueAttributeId = builder.AddInt8Attribute(mesh, type, vertexCount, size, attributeValue);
|
|
419
|
+
} else if (attributeValue instanceof Int16Array) {
|
|
420
|
+
uniqueAttributeId = builder.AddInt16Attribute(mesh, type, vertexCount, size, attributeValue);
|
|
421
|
+
} else if (attributeValue instanceof Int32Array) {
|
|
422
|
+
uniqueAttributeId = builder.AddInt32Attribute(mesh, type, vertexCount, size, attributeValue);
|
|
423
|
+
} else if (attributeValue instanceof Uint8Array) {
|
|
424
|
+
uniqueAttributeId = builder.AddUInt8Attribute(mesh, type, vertexCount, size, attributeValue);
|
|
425
|
+
} else if (attributeValue instanceof Uint8ClampedArray) {
|
|
426
|
+
const uint8Value = new Uint8Array(
|
|
427
|
+
attributeValue.buffer,
|
|
428
|
+
attributeValue.byteOffset,
|
|
429
|
+
attributeValue.byteLength
|
|
430
|
+
);
|
|
431
|
+
uniqueAttributeId = builder.AddUInt8Attribute(mesh, type, vertexCount, size, uint8Value);
|
|
432
|
+
} else if (attributeValue instanceof Uint16Array) {
|
|
433
|
+
uniqueAttributeId = builder.AddUInt16Attribute(mesh, type, vertexCount, size, attributeValue);
|
|
434
|
+
} else if (attributeValue instanceof Uint32Array) {
|
|
435
|
+
uniqueAttributeId = builder.AddUInt32Attribute(mesh, type, vertexCount, size, attributeValue);
|
|
436
|
+
} else if (attributeValue instanceof Float32Array) {
|
|
437
|
+
uniqueAttributeId = builder.AddFloatAttribute(mesh, type, vertexCount, size, attributeValue);
|
|
438
|
+
} else {
|
|
439
|
+
throw new Error(
|
|
440
|
+
`DracoWriter: attribute "${attributeName}" uses unsupported ${attributeValue.constructor.name}`
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
if (!ArrayBuffer.isView(attribute) && attribute.normalized !== void 0) {
|
|
444
|
+
builder.SetNormalizedFlagForAttribute(mesh, uniqueAttributeId, attribute.normalized);
|
|
445
|
+
}
|
|
446
|
+
return uniqueAttributeId;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* DRACO can compress attributes of know type better
|
|
450
|
+
* @param attributeName
|
|
451
|
+
*/
|
|
452
|
+
_getDracoAttributeType(attributeName, attributeTypes = {}) {
|
|
453
|
+
if (attributeName.toLowerCase() === "indices") {
|
|
454
|
+
return "indices";
|
|
455
|
+
}
|
|
456
|
+
const explicitType = attributeTypes[attributeName];
|
|
457
|
+
if (explicitType) {
|
|
458
|
+
return this.draco[explicitType];
|
|
459
|
+
}
|
|
460
|
+
const gltfAttributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName];
|
|
461
|
+
if (gltfAttributeName) {
|
|
462
|
+
return this.draco[gltfAttributeName];
|
|
463
|
+
}
|
|
464
|
+
switch (attributeName.toLowerCase()) {
|
|
465
|
+
case "position":
|
|
466
|
+
case "positions":
|
|
467
|
+
case "vertices":
|
|
468
|
+
return this.draco.POSITION;
|
|
469
|
+
case "normal":
|
|
470
|
+
case "normals":
|
|
471
|
+
return this.draco.NORMAL;
|
|
472
|
+
case "color":
|
|
473
|
+
case "colors":
|
|
474
|
+
return this.draco.COLOR;
|
|
475
|
+
case "texcoord":
|
|
476
|
+
case "texcoords":
|
|
477
|
+
return this.draco.TEX_COORD;
|
|
478
|
+
default:
|
|
479
|
+
if (/^color_\d+$/i.test(attributeName)) {
|
|
480
|
+
return this.draco.COLOR;
|
|
481
|
+
}
|
|
482
|
+
if (/^texcoord_\d+$/i.test(attributeName)) {
|
|
483
|
+
return this.draco.TEX_COORD;
|
|
484
|
+
}
|
|
485
|
+
return this.draco.GENERIC;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
/** Returns the common vertex count after validating the required position attribute. */
|
|
489
|
+
_getVertexCount(attributes, options) {
|
|
490
|
+
const positions = this._getPositionAttribute(attributes, options.attributeTypes);
|
|
491
|
+
const positionValues = positions && getAttributeValue(positions);
|
|
492
|
+
if (!positions || !positionValues) {
|
|
493
|
+
throw new Error("DracoWriter: POSITION attribute is required");
|
|
494
|
+
}
|
|
495
|
+
const size = getAttributeSize(positions, 3);
|
|
496
|
+
if (!Number.isInteger(size) || size <= 0 || positionValues.length % size !== 0) {
|
|
497
|
+
throw new Error("DracoWriter: POSITION attribute has an invalid size or value count");
|
|
498
|
+
}
|
|
499
|
+
return positionValues.length / size;
|
|
500
|
+
}
|
|
501
|
+
_getPositionAttribute(attributes, attributeTypes = {}) {
|
|
502
|
+
for (const attributeName in attributes) {
|
|
503
|
+
const attribute = attributes[attributeName];
|
|
504
|
+
const dracoType = this._getDracoAttributeType(attributeName, attributeTypes);
|
|
505
|
+
if (dracoType === this.draco.POSITION && getAttributeValue(attribute)) {
|
|
506
|
+
return attribute;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return null;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Add metadata for the geometry.
|
|
513
|
+
* @param dracoGeometry - WASM Draco Object
|
|
514
|
+
* @param metadata
|
|
515
|
+
*/
|
|
516
|
+
_addGeometryMetadata(dracoGeometry, metadata) {
|
|
517
|
+
const dracoMetadata = new this.draco.Metadata();
|
|
518
|
+
this._populateDracoMetadata(dracoMetadata, metadata);
|
|
519
|
+
this.dracoMeshBuilder.AddMetadata(dracoGeometry, dracoMetadata);
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Add metadata for an attribute to geometry.
|
|
523
|
+
* @param dracoGeometry - WASM Draco Object
|
|
524
|
+
* @param uniqueAttributeId
|
|
525
|
+
* @param metadata
|
|
526
|
+
*/
|
|
527
|
+
_addAttributeMetadata(dracoGeometry, uniqueAttributeId, metadata) {
|
|
528
|
+
const dracoAttributeMetadata = new this.draco.Metadata();
|
|
529
|
+
this._populateDracoMetadata(dracoAttributeMetadata, metadata);
|
|
530
|
+
this.dracoMeshBuilder.SetMetadataForAttribute(
|
|
531
|
+
dracoGeometry,
|
|
532
|
+
uniqueAttributeId,
|
|
533
|
+
dracoAttributeMetadata
|
|
534
|
+
);
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Add contents of object or map to a WASM Draco Metadata Object
|
|
538
|
+
* @param dracoMetadata - WASM Draco Object
|
|
539
|
+
* @param metadata
|
|
540
|
+
*/
|
|
541
|
+
_populateDracoMetadata(dracoMetadata, metadata) {
|
|
542
|
+
for (const [key, value] of getEntries(metadata)) {
|
|
543
|
+
switch (typeof value) {
|
|
544
|
+
case "number":
|
|
545
|
+
if (Math.trunc(value) === value) {
|
|
546
|
+
this.dracoMetadataBuilder.AddIntEntry(dracoMetadata, key, value);
|
|
547
|
+
} else {
|
|
548
|
+
this.dracoMetadataBuilder.AddDoubleEntry(dracoMetadata, key, value);
|
|
549
|
+
}
|
|
550
|
+
break;
|
|
551
|
+
case "object":
|
|
552
|
+
if (value instanceof Int32Array) {
|
|
553
|
+
this.dracoMetadataBuilder.AddIntEntryArray(dracoMetadata, key, value, value.length);
|
|
554
|
+
}
|
|
555
|
+
break;
|
|
556
|
+
case "string":
|
|
557
|
+
default:
|
|
558
|
+
this.dracoMetadataBuilder.AddStringEntry(dracoMetadata, key, value);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
};
|
|
563
|
+
function dracoInt8ArrayToArrayBuffer(dracoData) {
|
|
564
|
+
const byteLength = dracoData.size();
|
|
565
|
+
const outputBuffer = new ArrayBuffer(byteLength);
|
|
566
|
+
const outputData = new Int8Array(outputBuffer);
|
|
567
|
+
for (let i = 0; i < byteLength; ++i) {
|
|
568
|
+
outputData[i] = dracoData.GetValue(i);
|
|
569
|
+
}
|
|
570
|
+
return outputBuffer;
|
|
571
|
+
}
|
|
572
|
+
function getEntries(container) {
|
|
573
|
+
return container instanceof Map ? container.entries() : Object.entries(container);
|
|
574
|
+
}
|
|
575
|
+
function getAttributeValue(attribute) {
|
|
576
|
+
if (ArrayBuffer.isView(attribute)) {
|
|
577
|
+
return attribute;
|
|
578
|
+
}
|
|
579
|
+
if (attribute && typeof attribute === "object" && "value" in attribute && ArrayBuffer.isView(attribute.value)) {
|
|
580
|
+
return attribute.value;
|
|
581
|
+
}
|
|
582
|
+
return null;
|
|
583
|
+
}
|
|
584
|
+
function getAttributeSize(attribute, inferredSize) {
|
|
585
|
+
return ArrayBuffer.isView(attribute) ? inferredSize : attribute.size;
|
|
586
|
+
}
|
|
587
|
+
function validateIndices(indices, vertexCount) {
|
|
588
|
+
for (const index of indices) {
|
|
589
|
+
if (!Number.isInteger(index) || index < 0 || index >= vertexCount) {
|
|
590
|
+
throw new Error(
|
|
591
|
+
`DracoWriter: triangle index ${index} is outside vertex range 0-${vertexCount - 1}`
|
|
592
|
+
);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
function hasAttributeQuantization(options) {
|
|
597
|
+
return Boolean(
|
|
598
|
+
options.attributeQuantization && Object.keys(options.attributeQuantization).length
|
|
599
|
+
);
|
|
600
|
+
}
|
|
601
|
+
function validateQuantizationBits(attributeName, bits, attributeType) {
|
|
602
|
+
if (!Number.isInteger(bits) || bits < 1 || bits > 30) {
|
|
603
|
+
throw new Error(
|
|
604
|
+
`DracoWriter: quantization bits for "${attributeName}" must be an integer from 1 to 30`
|
|
605
|
+
);
|
|
606
|
+
}
|
|
607
|
+
if (attributeType === "NORMAL" && (bits < 2 || bits > 29)) {
|
|
608
|
+
throw new Error(
|
|
609
|
+
`DracoWriter: quantization bits for NORMAL attribute "${attributeName}" must be an integer from 2 to 29`
|
|
610
|
+
);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
function validateExplicitQuantization(attributeName, componentCount, quantization) {
|
|
614
|
+
validateQuantizationBits(attributeName, quantization.bits);
|
|
615
|
+
if (!Array.isArray(quantization.origin) || quantization.origin.length !== componentCount) {
|
|
616
|
+
throw new Error(
|
|
617
|
+
`DracoWriter: quantization origin for "${attributeName}" must contain ${componentCount} values`
|
|
618
|
+
);
|
|
619
|
+
}
|
|
620
|
+
if (!quantization.origin.every(Number.isFinite)) {
|
|
621
|
+
throw new Error(`DracoWriter: quantization origin for "${attributeName}" must be finite`);
|
|
622
|
+
}
|
|
623
|
+
if (!Number.isFinite(quantization.range) || quantization.range <= 0) {
|
|
624
|
+
throw new Error(`DracoWriter: quantization range for "${attributeName}" must be positive`);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
function getDracoAttributeTypeName(draco, attributeType) {
|
|
628
|
+
for (const name of ["POSITION", "NORMAL", "COLOR", "TEX_COORD", "GENERIC"]) {
|
|
629
|
+
if (draco[name] === attributeType) {
|
|
630
|
+
return name;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
return "GENERIC";
|
|
634
|
+
}
|
|
635
|
+
function applyDracoEncodingPreset(options) {
|
|
636
|
+
const presetOptions = {
|
|
637
|
+
gltf: {
|
|
638
|
+
method: "MESH_EDGEBREAKER_ENCODING",
|
|
639
|
+
speed: [5, 5],
|
|
640
|
+
quantization: { POSITION: 14, NORMAL: 10, TEX_COORD: 12 }
|
|
641
|
+
},
|
|
642
|
+
webgpu: {
|
|
643
|
+
method: "MESH_SEQUENTIAL_ENCODING",
|
|
644
|
+
speed: [5, 5],
|
|
645
|
+
quantization: { POSITION: 14, NORMAL: 10, TEX_COORD: 12 }
|
|
646
|
+
},
|
|
647
|
+
balanced: {
|
|
648
|
+
method: "MESH_EDGEBREAKER_ENCODING",
|
|
649
|
+
speed: [5, 5],
|
|
650
|
+
quantization: { POSITION: 12, NORMAL: 10, TEX_COORD: 10 }
|
|
651
|
+
}
|
|
652
|
+
};
|
|
653
|
+
const preset = options.preset ? presetOptions[options.preset] : {};
|
|
654
|
+
return {
|
|
655
|
+
...preset,
|
|
656
|
+
...options,
|
|
657
|
+
quantization: { ...preset.quantization, ...options.quantization }
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
//# sourceMappingURL=draco-builder.cjs.map
|