@carbonenginejs/runtime-resource 0.1.0
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/FORMAT-PROVENANCE.md +135 -0
- package/LICENSE +21 -0
- package/NOTICE +29 -0
- package/README.md +241 -0
- package/dist/CjsMotherLode.js +56 -0
- package/dist/CjsMotherLode.js.map +1 -0
- package/dist/CjsResMan.js +740 -0
- package/dist/CjsResMan.js.map +1 -0
- package/dist/CjsResManQueue.js +214 -0
- package/dist/CjsResManQueue.js.map +1 -0
- package/dist/CjsResource.js +366 -0
- package/dist/CjsResource.js.map +1 -0
- package/dist/CjsResourceSource.js +59 -0
- package/dist/CjsResourceSource.js.map +1 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/dist/format/CjsFormat.js +178 -0
- package/dist/format/CjsFormat.js.map +1 -0
- package/dist/format/CjsResourceProbe.js +269 -0
- package/dist/format/CjsResourceProbe.js.map +1 -0
- package/dist/format/payloadContract.js +173 -0
- package/dist/format/payloadContract.js.map +1 -0
- package/dist/formats/black/CjsBlackFormat.js +272 -0
- package/dist/formats/black/CjsBlackFormat.js.map +1 -0
- package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -0
- package/dist/formats/black/core/CjsBlackBinaryReader.js.map +1 -0
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -0
- package/dist/formats/black/core/CjsBlackPropertyReaders.js.map +1 -0
- package/dist/formats/black/core/CjsBlackReader.js +760 -0
- package/dist/formats/black/core/CjsBlackReader.js.map +1 -0
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -0
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js.map +1 -0
- package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -0
- package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js.map +1 -0
- package/dist/formats/black/core/blackConstants.js +7 -0
- package/dist/formats/black/core/blackConstants.js.map +1 -0
- package/dist/formats/black/core/blackDefinitions.js +10 -0
- package/dist/formats/black/core/blackDefinitions.js.map +1 -0
- package/dist/formats/black/core/blackEnums.js +6 -0
- package/dist/formats/black/core/blackEnums.js.map +1 -0
- package/dist/formats/black/core/blackSchema.js +3 -0
- package/dist/formats/black/core/blackSchema.js.map +1 -0
- package/dist/formats/black/core/blackVersion.js +22 -0
- package/dist/formats/black/core/blackVersion.js.map +1 -0
- package/dist/formats/black/core/helpers.js +182 -0
- package/dist/formats/black/core/helpers.js.map +1 -0
- package/dist/formats/black/core/schema.js +4 -0
- package/dist/formats/black/core/schema.js.map +1 -0
- package/dist/formats/black/index.js +2 -0
- package/dist/formats/black/index.js.map +1 -0
- package/dist/formats/bnk/CjsBnkFormat.js +245 -0
- package/dist/formats/bnk/CjsBnkFormat.js.map +1 -0
- package/dist/formats/bnk/core/helpers.js +354 -0
- package/dist/formats/bnk/core/helpers.js.map +1 -0
- package/dist/formats/bnk/core/soundbanksInfo.js +246 -0
- package/dist/formats/bnk/core/soundbanksInfo.js.map +1 -0
- package/dist/formats/bnk/index.js +3 -0
- package/dist/formats/bnk/index.js.map +1 -0
- package/dist/formats/cmf/CjsCmfFormat.js +491 -0
- package/dist/formats/cmf/CjsCmfFormat.js.map +1 -0
- package/dist/formats/cmf/core/binary.js +118 -0
- package/dist/formats/cmf/core/binary.js.map +1 -0
- package/dist/formats/cmf/core/buffers.js +233 -0
- package/dist/formats/cmf/core/buffers.js.map +1 -0
- package/dist/formats/cmf/core/constants.js +47 -0
- package/dist/formats/cmf/core/constants.js.map +1 -0
- package/dist/formats/cmf/core/gr2Anim.js +453 -0
- package/dist/formats/cmf/core/gr2Anim.js.map +1 -0
- package/dist/formats/cmf/core/helpers.js +287 -0
- package/dist/formats/cmf/core/helpers.js.map +1 -0
- package/dist/formats/cmf/core/pack.js +276 -0
- package/dist/formats/cmf/core/pack.js.map +1 -0
- package/dist/formats/cmf/core/schema.js +364 -0
- package/dist/formats/cmf/core/schema.js.map +1 -0
- package/dist/formats/cmf/core/shared.js +268 -0
- package/dist/formats/cmf/core/shared.js.map +1 -0
- package/dist/formats/cmf/core/writer.js +517 -0
- package/dist/formats/cmf/core/writer.js.map +1 -0
- package/dist/formats/cmf/index.js +2 -0
- package/dist/formats/cmf/index.js.map +1 -0
- package/dist/formats/dds/CjsDdsFormat.js +187 -0
- package/dist/formats/dds/CjsDdsFormat.js.map +1 -0
- package/dist/formats/dds/core/helpers.js +812 -0
- package/dist/formats/dds/core/helpers.js.map +1 -0
- package/dist/formats/dds/index.js +2 -0
- package/dist/formats/dds/index.js.map +1 -0
- package/dist/formats/fbx/CjsFbxFormat.js +260 -0
- package/dist/formats/fbx/CjsFbxFormat.js.map +1 -0
- package/dist/formats/fbx/core/helpers.js +3901 -0
- package/dist/formats/fbx/core/helpers.js.map +1 -0
- package/dist/formats/fbx/index.js +2 -0
- package/dist/formats/fbx/index.js.map +1 -0
- package/dist/formats/flac/CjsFlacFormat.js +81 -0
- package/dist/formats/flac/CjsFlacFormat.js.map +1 -0
- package/dist/formats/flac/core/helpers.js +295 -0
- package/dist/formats/flac/core/helpers.js.map +1 -0
- package/dist/formats/flac/index.js +2 -0
- package/dist/formats/flac/index.js.map +1 -0
- package/dist/formats/gif/CjsGifFormat.js +81 -0
- package/dist/formats/gif/CjsGifFormat.js.map +1 -0
- package/dist/formats/gif/core/helpers.js +360 -0
- package/dist/formats/gif/core/helpers.js.map +1 -0
- package/dist/formats/gif/index.js +2 -0
- package/dist/formats/gif/index.js.map +1 -0
- package/dist/formats/gltf/CjsGltfFormat.js +284 -0
- package/dist/formats/gltf/CjsGltfFormat.js.map +1 -0
- package/dist/formats/gltf/core/helpers.js +292 -0
- package/dist/formats/gltf/core/helpers.js.map +1 -0
- package/dist/formats/gltf/core/json.js +79 -0
- package/dist/formats/gltf/core/json.js.map +1 -0
- package/dist/formats/gltf/core/parser.js +666 -0
- package/dist/formats/gltf/core/parser.js.map +1 -0
- package/dist/formats/gltf/core/targets.js +163 -0
- package/dist/formats/gltf/core/targets.js.map +1 -0
- package/dist/formats/gltf/index.js +2 -0
- package/dist/formats/gltf/index.js.map +1 -0
- package/dist/formats/index.js +23 -0
- package/dist/formats/index.js.map +1 -0
- package/dist/formats/jpeg/CjsJpegFormat.js +200 -0
- package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -0
- package/dist/formats/jpeg/core/helpers.js +350 -0
- package/dist/formats/jpeg/core/helpers.js.map +1 -0
- package/dist/formats/jpeg/core/jpeg.js +377 -0
- package/dist/formats/jpeg/core/jpeg.js.map +1 -0
- package/dist/formats/jpeg/index.js +2 -0
- package/dist/formats/jpeg/index.js.map +1 -0
- package/dist/formats/mp3/CjsMp3Format.js +186 -0
- package/dist/formats/mp3/CjsMp3Format.js.map +1 -0
- package/dist/formats/mp3/core/helpers.js +338 -0
- package/dist/formats/mp3/core/helpers.js.map +1 -0
- package/dist/formats/mp3/index.js +2 -0
- package/dist/formats/mp3/index.js.map +1 -0
- package/dist/formats/mp4/CjsMp4Format.js +185 -0
- package/dist/formats/mp4/CjsMp4Format.js.map +1 -0
- package/dist/formats/mp4/core/helpers.js +449 -0
- package/dist/formats/mp4/core/helpers.js.map +1 -0
- package/dist/formats/mp4/index.js +2 -0
- package/dist/formats/mp4/index.js.map +1 -0
- package/dist/formats/obj/CjsObjFormat.js +247 -0
- package/dist/formats/obj/CjsObjFormat.js.map +1 -0
- package/dist/formats/obj/core/helpers.js +573 -0
- package/dist/formats/obj/core/helpers.js.map +1 -0
- package/dist/formats/obj/core/json.js +64 -0
- package/dist/formats/obj/core/json.js.map +1 -0
- package/dist/formats/obj/core/parser.js +321 -0
- package/dist/formats/obj/core/parser.js.map +1 -0
- package/dist/formats/obj/index.js +2 -0
- package/dist/formats/obj/index.js.map +1 -0
- package/dist/formats/ogg/CjsOggFormat.js +82 -0
- package/dist/formats/ogg/CjsOggFormat.js.map +1 -0
- package/dist/formats/ogg/core/helpers.js +387 -0
- package/dist/formats/ogg/core/helpers.js.map +1 -0
- package/dist/formats/ogg/core/imdct.js +178 -0
- package/dist/formats/ogg/core/imdct.js.map +1 -0
- package/dist/formats/ogg/core/vorbis.js +999 -0
- package/dist/formats/ogg/core/vorbis.js.map +1 -0
- package/dist/formats/ogg/index.js +2 -0
- package/dist/formats/ogg/index.js.map +1 -0
- package/dist/formats/png/CjsPngFormat.js +189 -0
- package/dist/formats/png/CjsPngFormat.js.map +1 -0
- package/dist/formats/png/core/helpers.js +583 -0
- package/dist/formats/png/core/helpers.js.map +1 -0
- package/dist/formats/png/index.js +2 -0
- package/dist/formats/png/index.js.map +1 -0
- package/dist/formats/red/CjsRedFormat.js +247 -0
- package/dist/formats/red/CjsRedFormat.js.map +1 -0
- package/dist/formats/red/core/CjsRedReader.js +201 -0
- package/dist/formats/red/core/CjsRedReader.js.map +1 -0
- package/dist/formats/red/core/blackDefinitions.js +3 -0
- package/dist/formats/red/core/blackDefinitions.js.map +1 -0
- package/dist/formats/red/core/helpers.js +136 -0
- package/dist/formats/red/core/helpers.js.map +1 -0
- package/dist/formats/red/core/redGraph.js +68 -0
- package/dist/formats/red/core/redGraph.js.map +1 -0
- package/dist/formats/red/core/schema.js +4 -0
- package/dist/formats/red/core/schema.js.map +1 -0
- package/dist/formats/red/index.js +2 -0
- package/dist/formats/red/index.js.map +1 -0
- package/dist/formats/stl/CjsStlFormat.js +304 -0
- package/dist/formats/stl/CjsStlFormat.js.map +1 -0
- package/dist/formats/stl/core/helpers.js +257 -0
- package/dist/formats/stl/core/helpers.js.map +1 -0
- package/dist/formats/stl/core/json.js +51 -0
- package/dist/formats/stl/core/json.js.map +1 -0
- package/dist/formats/stl/core/stl.js +544 -0
- package/dist/formats/stl/core/stl.js.map +1 -0
- package/dist/formats/stl/core/targets.js +163 -0
- package/dist/formats/stl/core/targets.js.map +1 -0
- package/dist/formats/stl/index.js +2 -0
- package/dist/formats/stl/index.js.map +1 -0
- package/dist/formats/tga/CjsTgaFormat.js +186 -0
- package/dist/formats/tga/CjsTgaFormat.js.map +1 -0
- package/dist/formats/tga/core/helpers.js +446 -0
- package/dist/formats/tga/core/helpers.js.map +1 -0
- package/dist/formats/tga/index.js +2 -0
- package/dist/formats/tga/index.js.map +1 -0
- package/dist/formats/wav/CjsWavFormat.js +186 -0
- package/dist/formats/wav/CjsWavFormat.js.map +1 -0
- package/dist/formats/wav/core/helpers.js +328 -0
- package/dist/formats/wav/core/helpers.js.map +1 -0
- package/dist/formats/wav/index.js +2 -0
- package/dist/formats/wav/index.js.map +1 -0
- package/dist/formats/webm/CjsWebmFormat.js +185 -0
- package/dist/formats/webm/CjsWebmFormat.js.map +1 -0
- package/dist/formats/webm/core/helpers.js +537 -0
- package/dist/formats/webm/core/helpers.js.map +1 -0
- package/dist/formats/webm/index.js +2 -0
- package/dist/formats/webm/index.js.map +1 -0
- package/dist/formats/webp/CjsWebpFormat.js +80 -0
- package/dist/formats/webp/CjsWebpFormat.js.map +1 -0
- package/dist/formats/webp/core/helpers.js +214 -0
- package/dist/formats/webp/core/helpers.js.map +1 -0
- package/dist/formats/webp/index.js +2 -0
- package/dist/formats/webp/index.js.map +1 -0
- package/dist/formats/wem/CjsWemFormat.js +197 -0
- package/dist/formats/wem/CjsWemFormat.js.map +1 -0
- package/dist/formats/wem/core/bitStream.js +259 -0
- package/dist/formats/wem/core/bitStream.js.map +1 -0
- package/dist/formats/wem/core/codebookLibrary.js +164 -0
- package/dist/formats/wem/core/codebookLibrary.js.map +1 -0
- package/dist/formats/wem/core/helpers.js +336 -0
- package/dist/formats/wem/core/helpers.js.map +1 -0
- package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -0
- package/dist/formats/wem/core/packedCodebooksAotuv603.js.map +1 -0
- package/dist/formats/wem/core/wemToOgg.js +485 -0
- package/dist/formats/wem/core/wemToOgg.js.map +1 -0
- package/dist/formats/wem/index.js +2 -0
- package/dist/formats/wem/index.js.map +1 -0
- package/dist/formats/yaml/CjsYamlFormat.js +77 -0
- package/dist/formats/yaml/CjsYamlFormat.js.map +1 -0
- package/dist/formats/yaml/core/CjsYamlReader.js +304 -0
- package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -0
- package/dist/formats/yaml/core/helpers.js +160 -0
- package/dist/formats/yaml/core/helpers.js.map +1 -0
- package/dist/formats/yaml/index.js +2 -0
- package/dist/formats/yaml/index.js.map +1 -0
- package/dist/generated/resources/AudioGeometryResData.js +47 -0
- package/dist/generated/resources/AudioGeometryResData.js.map +1 -0
- package/dist/generated/resources/CmfVertexReader.js +46 -0
- package/dist/generated/resources/CmfVertexReader.js.map +1 -0
- package/dist/generated/resources/GStateBindingCallbackData.js +31 -0
- package/dist/generated/resources/GStateBindingCallbackData.js.map +1 -0
- package/dist/generated/resources/MeshDecalData.js +37 -0
- package/dist/generated/resources/MeshDecalData.js.map +1 -0
- package/dist/generated/resources/MeshDecalLodData.js +34 -0
- package/dist/generated/resources/MeshDecalLodData.js.map +1 -0
- package/dist/generated/resources/Tr2AsyncSave.js +46 -0
- package/dist/generated/resources/Tr2AsyncSave.js.map +1 -0
- package/dist/generated/resources/Tr2CmfContents.js +37 -0
- package/dist/generated/resources/Tr2CmfContents.js.map +1 -0
- package/dist/generated/resources/Tr2GrannyIntersectionResult.js +58 -0
- package/dist/generated/resources/Tr2GrannyIntersectionResult.js.map +1 -0
- package/dist/generated/resources/Tr2LoadPrepareFence.js +37 -0
- package/dist/generated/resources/Tr2LoadPrepareFence.js.map +1 -0
- package/dist/generated/resources/Tr2MaterialArea.js +34 -0
- package/dist/generated/resources/Tr2MaterialArea.js.map +1 -0
- package/dist/generated/resources/Tr2MaterialMesh.js +31 -0
- package/dist/generated/resources/Tr2MaterialMesh.js.map +1 -0
- package/dist/generated/resources/Tr2MaterialRes.js +34 -0
- package/dist/generated/resources/Tr2MaterialRes.js.map +1 -0
- package/dist/generated/resources/Tr2ShaderPermutation.js +43 -0
- package/dist/generated/resources/Tr2ShaderPermutation.js.map +1 -0
- package/dist/generated/resources/Tr2TextureLodManager.js +60 -0
- package/dist/generated/resources/Tr2TextureLodManager.js.map +1 -0
- package/dist/generated/resources/Tr2TextureLodUpdateRequest.js +37 -0
- package/dist/generated/resources/Tr2TextureLodUpdateRequest.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePackChannel.js +37 -0
- package/dist/generated/resources/Tr2TexturePackChannel.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipeline.js +44 -0
- package/dist/generated/resources/Tr2TexturePipeline.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineParams.js +34 -0
- package/dist/generated/resources/Tr2TexturePipelineParams.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineStepCompress.js +40 -0
- package/dist/generated/resources/Tr2TexturePipelineStepCompress.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineStepLimitSize.js +34 -0
- package/dist/generated/resources/Tr2TexturePipelineStepLimitSize.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineStepLoad.js +31 -0
- package/dist/generated/resources/Tr2TexturePipelineStepLoad.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineStepPack.js +43 -0
- package/dist/generated/resources/Tr2TexturePipelineStepPack.js.map +1 -0
- package/dist/generated/resources/TriGeometryResAreaData.js +59 -0
- package/dist/generated/resources/TriGeometryResAreaData.js.map +1 -0
- package/dist/generated/resources/TriGeometryResJointData.js +38 -0
- package/dist/generated/resources/TriGeometryResJointData.js.map +1 -0
- package/dist/generated/resources/TriGeometryResLodData.js +88 -0
- package/dist/generated/resources/TriGeometryResLodData.js.map +1 -0
- package/dist/generated/resources/TriGeometryResMeshData.js +63 -0
- package/dist/generated/resources/TriGeometryResMeshData.js.map +1 -0
- package/dist/generated/resources/TriGeometryResSkeletonData.js +34 -0
- package/dist/generated/resources/TriGeometryResSkeletonData.js.map +1 -0
- package/dist/generated/resources/TriJointBinding.js +38 -0
- package/dist/generated/resources/TriJointBinding.js.map +1 -0
- package/dist/generated/resources/TriMorphTargetGeometryConstants.js +46 -0
- package/dist/generated/resources/TriMorphTargetGeometryConstants.js.map +1 -0
- package/dist/generated/resources/TriRtGeometryConstants.js +88 -0
- package/dist/generated/resources/TriRtGeometryConstants.js.map +1 -0
- package/dist/generated/resources/enums.js +18 -0
- package/dist/generated/resources/enums.js.map +1 -0
- package/dist/generated/resources/index.js +32 -0
- package/dist/generated/resources/index.js.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/resourcePath.js +18 -0
- package/dist/resourcePath.js.map +1 -0
- package/dist/resourceStates.js +9 -0
- package/dist/resourceStates.js.map +1 -0
- package/dist/resources/Tr2EffectRes.js +71 -0
- package/dist/resources/Tr2EffectRes.js.map +1 -0
- package/dist/resources/Tr2GrannyStateRes.js +44 -0
- package/dist/resources/Tr2GrannyStateRes.js.map +1 -0
- package/dist/resources/Tr2ImageRes.js +114 -0
- package/dist/resources/Tr2ImageRes.js.map +1 -0
- package/dist/resources/Tr2LightProfileRes.js +40 -0
- package/dist/resources/Tr2LightProfileRes.js.map +1 -0
- package/dist/resources/TriGeometryRes.js +216 -0
- package/dist/resources/TriGeometryRes.js.map +1 -0
- package/dist/resources/TriGrannyRes.js +43 -0
- package/dist/resources/TriGrannyRes.js.map +1 -0
- package/dist/resources/TriTextureRes.js +304 -0
- package/dist/resources/TriTextureRes.js.map +1 -0
- package/dist/resources/resourceBoundary.js +47 -0
- package/dist/resources/resourceBoundary.js.map +1 -0
- package/dist/texture/CjsTextureArrayRes.js +406 -0
- package/dist/texture/CjsTextureArrayRes.js.map +1 -0
- package/dist/texture/CjsTextureParameterProxy.js +133 -0
- package/dist/texture/CjsTextureParameterProxy.js.map +1 -0
- package/format-notices/black/LICENSE +21 -0
- package/format-notices/black/NOTICE +47 -0
- package/format-notices/bnk/LICENSE +21 -0
- package/format-notices/bnk/NOTICE +17 -0
- package/format-notices/cmf/LICENSE +21 -0
- package/format-notices/cmf/NOTICE +36 -0
- package/format-notices/dds/LICENSE +21 -0
- package/format-notices/dds/NOTICE +14 -0
- package/format-notices/fbx/LICENSE +21 -0
- package/format-notices/fbx/NOTICE +14 -0
- package/format-notices/flac/LICENSE +21 -0
- package/format-notices/flac/NOTICE +14 -0
- package/format-notices/gif/LICENSE +21 -0
- package/format-notices/gif/NOTICE +14 -0
- package/format-notices/gltf/LICENSE +21 -0
- package/format-notices/gltf/NOTICE +27 -0
- package/format-notices/jpeg/LICENSE +21 -0
- package/format-notices/jpeg/NOTICE +14 -0
- package/format-notices/mp3/LICENSE +21 -0
- package/format-notices/mp3/NOTICE +14 -0
- package/format-notices/mp4/LICENSE +21 -0
- package/format-notices/mp4/NOTICE +14 -0
- package/format-notices/obj/LICENSE +21 -0
- package/format-notices/obj/NOTICE +26 -0
- package/format-notices/ogg/LICENSE +21 -0
- package/format-notices/ogg/NOTICE +28 -0
- package/format-notices/png/LICENSE +21 -0
- package/format-notices/png/NOTICE +14 -0
- package/format-notices/red/LICENSE +21 -0
- package/format-notices/red/NOTICE +31 -0
- package/format-notices/stl/LICENSE +21 -0
- package/format-notices/stl/NOTICE +21 -0
- package/format-notices/tga/LICENSE +21 -0
- package/format-notices/tga/NOTICE +14 -0
- package/format-notices/wav/LICENSE +21 -0
- package/format-notices/wav/NOTICE +14 -0
- package/format-notices/webm/LICENSE +21 -0
- package/format-notices/webm/NOTICE +14 -0
- package/format-notices/webp/LICENSE +21 -0
- package/format-notices/webp/NOTICE +14 -0
- package/format-notices/wem/LICENSE +57 -0
- package/format-notices/wem/NOTICE +33 -0
- package/format-notices/yaml/LICENSE +21 -0
- package/format-notices/yaml/NOTICE +44 -0
- package/package.json +51 -0
- package/resource-lifecycle.md +487 -0
|
@@ -0,0 +1,666 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* glTF/GLB parser that emits the shared CarbonEngineJS geometry JSON shape.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const GLB_MAGIC = 0x46546c67;
|
|
6
|
+
const GLB_JSON = 0x4e4f534a;
|
|
7
|
+
const GLB_BIN = 0x004e4942;
|
|
8
|
+
const COMPONENT_SIZES = Object.freeze({
|
|
9
|
+
5120: 1,
|
|
10
|
+
5121: 1,
|
|
11
|
+
5122: 2,
|
|
12
|
+
5123: 2,
|
|
13
|
+
5125: 4,
|
|
14
|
+
5126: 4
|
|
15
|
+
});
|
|
16
|
+
const TYPE_WIDTHS = Object.freeze({
|
|
17
|
+
SCALAR: 1,
|
|
18
|
+
VEC2: 2,
|
|
19
|
+
VEC3: 3,
|
|
20
|
+
VEC4: 4,
|
|
21
|
+
MAT2: 4,
|
|
22
|
+
MAT3: 9,
|
|
23
|
+
MAT4: 16
|
|
24
|
+
});
|
|
25
|
+
const CHANNEL_TEMPLATE = Object.freeze({
|
|
26
|
+
position: null,
|
|
27
|
+
blendIndice: null,
|
|
28
|
+
tangent: null,
|
|
29
|
+
normal: null,
|
|
30
|
+
texcoord0: null,
|
|
31
|
+
texcoord1: null,
|
|
32
|
+
binormal: null,
|
|
33
|
+
blendWeight: null
|
|
34
|
+
});
|
|
35
|
+
function fr(value) {
|
|
36
|
+
return Number.isFinite(value) ? Math.fround(value) : 0;
|
|
37
|
+
}
|
|
38
|
+
function createVertexChannels() {
|
|
39
|
+
const channels = {};
|
|
40
|
+
for (const key of Object.keys(CHANNEL_TEMPLATE)) {
|
|
41
|
+
channels[key] = [];
|
|
42
|
+
}
|
|
43
|
+
return channels;
|
|
44
|
+
}
|
|
45
|
+
function toBytes(input) {
|
|
46
|
+
if (input instanceof Uint8Array) return input;
|
|
47
|
+
if (typeof ArrayBuffer !== "undefined" && input instanceof ArrayBuffer) return new Uint8Array(input);
|
|
48
|
+
if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView(input)) {
|
|
49
|
+
return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
50
|
+
}
|
|
51
|
+
throw new TypeError("CjsGltfFormat: input must be glTF JSON, GLB bytes, UTF-8 bytes, or a glTF object");
|
|
52
|
+
}
|
|
53
|
+
function toUtf8(bytes) {
|
|
54
|
+
return new TextDecoder().decode(bytes);
|
|
55
|
+
}
|
|
56
|
+
function isGlbBytes(bytes) {
|
|
57
|
+
return bytes.length >= 12 && new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(0, true) === GLB_MAGIC;
|
|
58
|
+
}
|
|
59
|
+
function isGlb(input) {
|
|
60
|
+
try {
|
|
61
|
+
return isGlbBytes(toBytes(input));
|
|
62
|
+
} catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function parseJsonText(text) {
|
|
67
|
+
const json = JSON.parse(text);
|
|
68
|
+
if (!json || typeof json !== "object" || !json.asset) {
|
|
69
|
+
throw new Error("CjsGltfFormat: JSON input is not a glTF asset");
|
|
70
|
+
}
|
|
71
|
+
return json;
|
|
72
|
+
}
|
|
73
|
+
function parseInput(input) {
|
|
74
|
+
if (input && typeof input === "object" && !(input instanceof ArrayBuffer) && !ArrayBuffer.isView(input)) {
|
|
75
|
+
if (!input.asset) throw new Error("CjsGltfFormat: object input is not a glTF asset");
|
|
76
|
+
return {
|
|
77
|
+
gltf: input,
|
|
78
|
+
binaryChunk: null,
|
|
79
|
+
format: "gltf"
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (typeof input === "string") {
|
|
83
|
+
return {
|
|
84
|
+
gltf: parseJsonText(input),
|
|
85
|
+
binaryChunk: null,
|
|
86
|
+
format: "gltf"
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const bytes = toBytes(input);
|
|
90
|
+
if (isGlbBytes(bytes)) return parseGlb(bytes);
|
|
91
|
+
return {
|
|
92
|
+
gltf: parseJsonText(toUtf8(bytes)),
|
|
93
|
+
binaryChunk: null,
|
|
94
|
+
format: "gltf"
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function parseGlb(bytes) {
|
|
98
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
99
|
+
const version = view.getUint32(4, true);
|
|
100
|
+
if (version !== 2) {
|
|
101
|
+
throw new Error(`CjsGltfFormat: unsupported GLB version ${version}`);
|
|
102
|
+
}
|
|
103
|
+
const totalLength = view.getUint32(8, true);
|
|
104
|
+
if (totalLength > bytes.byteLength) {
|
|
105
|
+
throw new Error("CjsGltfFormat: GLB length exceeds input length");
|
|
106
|
+
}
|
|
107
|
+
let offset = 12;
|
|
108
|
+
let json = null;
|
|
109
|
+
let binaryChunk = null;
|
|
110
|
+
while (offset + 8 <= totalLength) {
|
|
111
|
+
const chunkLength = view.getUint32(offset, true),
|
|
112
|
+
chunkType = view.getUint32(offset + 4, true),
|
|
113
|
+
chunkStart = offset + 8,
|
|
114
|
+
chunkEnd = chunkStart + chunkLength;
|
|
115
|
+
if (chunkEnd > totalLength) {
|
|
116
|
+
throw new Error("CjsGltfFormat: GLB chunk exceeds input length");
|
|
117
|
+
}
|
|
118
|
+
const chunk = bytes.subarray(chunkStart, chunkEnd);
|
|
119
|
+
if (chunkType === GLB_JSON) json = parseJsonText(toUtf8(chunk).trim());else if (chunkType === GLB_BIN) binaryChunk = chunk;
|
|
120
|
+
offset = chunkEnd + 3 & -4;
|
|
121
|
+
}
|
|
122
|
+
if (!json) throw new Error("CjsGltfFormat: GLB is missing a JSON chunk");
|
|
123
|
+
return {
|
|
124
|
+
gltf: json,
|
|
125
|
+
binaryChunk,
|
|
126
|
+
format: "glb"
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function decodeDataUri(uri) {
|
|
130
|
+
const match = /^data:([^,]*?),(.*)$/s.exec(uri);
|
|
131
|
+
if (!match) return null;
|
|
132
|
+
const meta = match[1],
|
|
133
|
+
data = match[2];
|
|
134
|
+
if (meta.includes(";base64")) {
|
|
135
|
+
if (typeof Buffer !== "undefined") return new Uint8Array(Buffer.from(data, "base64"));
|
|
136
|
+
const text = atob(data);
|
|
137
|
+
const bytes = new Uint8Array(text.length);
|
|
138
|
+
for (let i = 0; i < text.length; i++) bytes[i] = text.charCodeAt(i);
|
|
139
|
+
return bytes;
|
|
140
|
+
}
|
|
141
|
+
return new TextEncoder().encode(decodeURIComponent(data));
|
|
142
|
+
}
|
|
143
|
+
function normalizeBuffer(value) {
|
|
144
|
+
if (value === undefined || value === null) return null;
|
|
145
|
+
return toBytes(value);
|
|
146
|
+
}
|
|
147
|
+
function bufferFromOptions(options, index, uri) {
|
|
148
|
+
const {
|
|
149
|
+
buffers
|
|
150
|
+
} = options;
|
|
151
|
+
if (!buffers) return null;
|
|
152
|
+
if (Array.isArray(buffers)) return normalizeBuffer(buffers[index]);
|
|
153
|
+
if (buffers instanceof Map) return normalizeBuffer(buffers.get(uri) ?? buffers.get(index));
|
|
154
|
+
if (typeof buffers === "object") return normalizeBuffer(buffers[uri] ?? buffers[index]);
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
function resolveBuffers(gltf, binaryChunk, options) {
|
|
158
|
+
return (gltf.buffers || []).map((buffer, index) => {
|
|
159
|
+
if (buffer.uri) {
|
|
160
|
+
const dataUri = decodeDataUri(buffer.uri);
|
|
161
|
+
if (dataUri) return dataUri;
|
|
162
|
+
const fromOptions = bufferFromOptions(options, index, buffer.uri);
|
|
163
|
+
if (fromOptions) return fromOptions;
|
|
164
|
+
throw new Error(`CjsGltfFormat: external buffer ${JSON.stringify(buffer.uri)} was not provided`);
|
|
165
|
+
}
|
|
166
|
+
const fromOptions = bufferFromOptions(options, index, String(index));
|
|
167
|
+
if (fromOptions) return fromOptions;
|
|
168
|
+
if (index === 0 && binaryChunk) return binaryChunk;
|
|
169
|
+
throw new Error(`CjsGltfFormat: buffer ${index} has no uri and no GLB binary chunk`);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function readComponent(view, offset, componentType) {
|
|
173
|
+
switch (componentType) {
|
|
174
|
+
case 5120:
|
|
175
|
+
return view.getInt8(offset);
|
|
176
|
+
case 5121:
|
|
177
|
+
return view.getUint8(offset);
|
|
178
|
+
case 5122:
|
|
179
|
+
return view.getInt16(offset, true);
|
|
180
|
+
case 5123:
|
|
181
|
+
return view.getUint16(offset, true);
|
|
182
|
+
case 5125:
|
|
183
|
+
return view.getUint32(offset, true);
|
|
184
|
+
case 5126:
|
|
185
|
+
return view.getFloat32(offset, true);
|
|
186
|
+
default:
|
|
187
|
+
throw new Error(`CjsGltfFormat: unsupported componentType ${componentType}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function normalizeComponent(value, componentType) {
|
|
191
|
+
switch (componentType) {
|
|
192
|
+
case 5120:
|
|
193
|
+
return Math.max(value / 127, -1);
|
|
194
|
+
case 5121:
|
|
195
|
+
return value / 255;
|
|
196
|
+
case 5122:
|
|
197
|
+
return Math.max(value / 32767, -1);
|
|
198
|
+
case 5123:
|
|
199
|
+
return value / 65535;
|
|
200
|
+
default:
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function readAccessorRaw(gltf, buffers, accessorIndex, {
|
|
205
|
+
normalize = true
|
|
206
|
+
} = {}) {
|
|
207
|
+
const accessor = gltf.accessors && gltf.accessors[accessorIndex];
|
|
208
|
+
if (!accessor) throw new Error(`CjsGltfFormat: missing accessor ${accessorIndex}`);
|
|
209
|
+
const width = TYPE_WIDTHS[accessor.type],
|
|
210
|
+
componentSize = COMPONENT_SIZES[accessor.componentType];
|
|
211
|
+
if (!width) throw new Error(`CjsGltfFormat: unsupported accessor type ${accessor.type}`);
|
|
212
|
+
if (!componentSize) throw new Error(`CjsGltfFormat: unsupported componentType ${accessor.componentType}`);
|
|
213
|
+
const out = new Array(accessor.count * width).fill(0);
|
|
214
|
+
if (accessor.bufferView !== undefined) {
|
|
215
|
+
const bufferView = gltf.bufferViews && gltf.bufferViews[accessor.bufferView];
|
|
216
|
+
if (!bufferView) throw new Error(`CjsGltfFormat: missing bufferView ${accessor.bufferView}`);
|
|
217
|
+
const buffer = buffers[bufferView.buffer],
|
|
218
|
+
byteOffset = (bufferView.byteOffset || 0) + (accessor.byteOffset || 0),
|
|
219
|
+
byteStride = bufferView.byteStride || width * componentSize,
|
|
220
|
+
view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
221
|
+
for (let i = 0; i < accessor.count; i++) {
|
|
222
|
+
const elementOffset = byteOffset + i * byteStride;
|
|
223
|
+
for (let c = 0; c < width; c++) {
|
|
224
|
+
let value = readComponent(view, elementOffset + c * componentSize, accessor.componentType);
|
|
225
|
+
if (accessor.normalized && normalize) value = normalizeComponent(value, accessor.componentType);
|
|
226
|
+
out[i * width + c] = fr(value);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (accessor.sparse) {
|
|
231
|
+
applySparseAccessor(gltf, buffers, accessor, out, width, normalize);
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
values: out,
|
|
235
|
+
width,
|
|
236
|
+
accessor
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function applySparseAccessor(gltf, buffers, accessor, out, width, normalize) {
|
|
240
|
+
const sparse = accessor.sparse,
|
|
241
|
+
indicesView = gltf.bufferViews[sparse.indices.bufferView],
|
|
242
|
+
valuesView = gltf.bufferViews[sparse.values.bufferView],
|
|
243
|
+
indicesBuffer = buffers[indicesView.buffer],
|
|
244
|
+
valuesBuffer = buffers[valuesView.buffer],
|
|
245
|
+
indicesData = new DataView(indicesBuffer.buffer, indicesBuffer.byteOffset, indicesBuffer.byteLength),
|
|
246
|
+
valuesData = new DataView(valuesBuffer.buffer, valuesBuffer.byteOffset, valuesBuffer.byteLength),
|
|
247
|
+
indexOffset = (indicesView.byteOffset || 0) + (sparse.indices.byteOffset || 0),
|
|
248
|
+
valueOffset = (valuesView.byteOffset || 0) + (sparse.values.byteOffset || 0),
|
|
249
|
+
indexSize = COMPONENT_SIZES[sparse.indices.componentType],
|
|
250
|
+
valueSize = COMPONENT_SIZES[accessor.componentType];
|
|
251
|
+
for (let i = 0; i < sparse.count; i++) {
|
|
252
|
+
const outputIndex = readComponent(indicesData, indexOffset + i * indexSize, sparse.indices.componentType);
|
|
253
|
+
for (let c = 0; c < width; c++) {
|
|
254
|
+
let value = readComponent(valuesData, valueOffset + (i * width + c) * valueSize, accessor.componentType);
|
|
255
|
+
if (accessor.normalized && normalize) value = normalizeComponent(value, accessor.componentType);
|
|
256
|
+
out[outputIndex * width + c] = fr(value);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function readAccessor(gltf, buffers, accessorIndex, options) {
|
|
261
|
+
return readAccessorRaw(gltf, buffers, accessorIndex, options).values;
|
|
262
|
+
}
|
|
263
|
+
function readIndices(gltf, buffers, accessorIndex, vertexCount, mode) {
|
|
264
|
+
const raw = accessorIndex === undefined ? Array.from({
|
|
265
|
+
length: vertexCount
|
|
266
|
+
}, (_, i) => i) : readAccessor(gltf, buffers, accessorIndex, {
|
|
267
|
+
normalize: false
|
|
268
|
+
}).map(value => value >>> 0);
|
|
269
|
+
if (mode === undefined || mode === 4) return raw;
|
|
270
|
+
if (mode === 5) return triangulateStrip(raw);
|
|
271
|
+
if (mode === 6) return triangulateFan(raw);
|
|
272
|
+
throw new Error(`CjsGltfFormat: primitive mode ${mode} is not supported`);
|
|
273
|
+
}
|
|
274
|
+
function triangulateStrip(indices) {
|
|
275
|
+
const faces = [];
|
|
276
|
+
for (let i = 0; i < indices.length - 2; i++) {
|
|
277
|
+
if (i & 1) faces.push(indices[i + 1], indices[i], indices[i + 2]);else faces.push(indices[i], indices[i + 1], indices[i + 2]);
|
|
278
|
+
}
|
|
279
|
+
return faces;
|
|
280
|
+
}
|
|
281
|
+
function triangulateFan(indices) {
|
|
282
|
+
const faces = [];
|
|
283
|
+
for (let i = 1; i < indices.length - 1; i++) {
|
|
284
|
+
faces.push(indices[0], indices[i], indices[i + 1]);
|
|
285
|
+
}
|
|
286
|
+
return faces;
|
|
287
|
+
}
|
|
288
|
+
function copyAttribute(gltf, buffers, attributes, gltfKey) {
|
|
289
|
+
if (!attributes || attributes[gltfKey] === undefined) return [];
|
|
290
|
+
return readAccessor(gltf, buffers, attributes[gltfKey]);
|
|
291
|
+
}
|
|
292
|
+
function computeBounds(positions) {
|
|
293
|
+
if (!positions.length) return {
|
|
294
|
+
minBounds: [0, 0, 0],
|
|
295
|
+
maxBounds: [0, 0, 0]
|
|
296
|
+
};
|
|
297
|
+
const minBounds = [positions[0], positions[1], positions[2]];
|
|
298
|
+
const maxBounds = [positions[0], positions[1], positions[2]];
|
|
299
|
+
for (let i = 3; i < positions.length; i += 3) {
|
|
300
|
+
for (let c = 0; c < 3; c++) {
|
|
301
|
+
const value = positions[i + c];
|
|
302
|
+
if (value < minBounds[c]) minBounds[c] = value;
|
|
303
|
+
if (value > maxBounds[c]) maxBounds[c] = value;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
minBounds,
|
|
308
|
+
maxBounds
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
function meshName(gltf, meshIndex, primitiveIndex, nodeIndex) {
|
|
312
|
+
const node = nodeIndex === undefined ? null : gltf.nodes && gltf.nodes[nodeIndex],
|
|
313
|
+
mesh = gltf.meshes && gltf.meshes[meshIndex],
|
|
314
|
+
base = node && node.name || mesh && mesh.name || `mesh_${meshIndex}`;
|
|
315
|
+
return primitiveIndex ? `${base}_${primitiveIndex}` : base;
|
|
316
|
+
}
|
|
317
|
+
function materialName(gltf, primitive, primitiveIndex) {
|
|
318
|
+
if (primitive.material !== undefined) {
|
|
319
|
+
const material = gltf.materials && gltf.materials[primitive.material];
|
|
320
|
+
return material && material.name || `material_${primitive.material}`;
|
|
321
|
+
}
|
|
322
|
+
return `primitive_${primitiveIndex}`;
|
|
323
|
+
}
|
|
324
|
+
function buildMorphTargets(gltf, buffers, primitive, mesh) {
|
|
325
|
+
const targetNames = mesh.extras && mesh.extras.targetNames || [];
|
|
326
|
+
return (primitive.targets || []).map((target, index) => ({
|
|
327
|
+
name: targetNames[index] || `target_${index}`,
|
|
328
|
+
dataIsDeltas: true,
|
|
329
|
+
vertex: {
|
|
330
|
+
position: copyAttribute(gltf, buffers, target, "POSITION"),
|
|
331
|
+
blendIndice: [],
|
|
332
|
+
tangent: copyAttribute(gltf, buffers, target, "TANGENT"),
|
|
333
|
+
normal: copyAttribute(gltf, buffers, target, "NORMAL"),
|
|
334
|
+
texcoord0: [],
|
|
335
|
+
texcoord1: [],
|
|
336
|
+
binormal: [],
|
|
337
|
+
blendWeight: []
|
|
338
|
+
}
|
|
339
|
+
}));
|
|
340
|
+
}
|
|
341
|
+
function buildMeshPrimitive(gltf, buffers, meshIndex, primitiveIndex, nodeIndex, boneBindings) {
|
|
342
|
+
const mesh = gltf.meshes[meshIndex],
|
|
343
|
+
primitive = mesh.primitives[primitiveIndex],
|
|
344
|
+
vertex = createVertexChannels();
|
|
345
|
+
vertex.position = copyAttribute(gltf, buffers, primitive.attributes, "POSITION");
|
|
346
|
+
vertex.normal = copyAttribute(gltf, buffers, primitive.attributes, "NORMAL");
|
|
347
|
+
vertex.tangent = copyAttribute(gltf, buffers, primitive.attributes, "TANGENT");
|
|
348
|
+
vertex.texcoord0 = copyAttribute(gltf, buffers, primitive.attributes, "TEXCOORD_0");
|
|
349
|
+
vertex.texcoord1 = copyAttribute(gltf, buffers, primitive.attributes, "TEXCOORD_1");
|
|
350
|
+
vertex.blendIndice = copyAttribute(gltf, buffers, primitive.attributes, "JOINTS_0");
|
|
351
|
+
vertex.blendWeight = copyAttribute(gltf, buffers, primitive.attributes, "WEIGHTS_0");
|
|
352
|
+
const vertexCount = vertex.position.length / 3,
|
|
353
|
+
faces = readIndices(gltf, buffers, primitive.indices, vertexCount, primitive.mode),
|
|
354
|
+
bytesPerIndex = faces.some(index => index > 0xffff) ? 4 : 2,
|
|
355
|
+
{
|
|
356
|
+
minBounds,
|
|
357
|
+
maxBounds
|
|
358
|
+
} = computeBounds(vertex.position);
|
|
359
|
+
return {
|
|
360
|
+
name: meshName(gltf, meshIndex, primitiveIndex, nodeIndex),
|
|
361
|
+
morphTargets: buildMorphTargets(gltf, buffers, primitive, mesh),
|
|
362
|
+
minBounds,
|
|
363
|
+
maxBounds,
|
|
364
|
+
boneBindings,
|
|
365
|
+
vertex,
|
|
366
|
+
indices: [{
|
|
367
|
+
name: materialName(gltf, primitive, primitiveIndex),
|
|
368
|
+
bytesPerIndex,
|
|
369
|
+
faces
|
|
370
|
+
}]
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function parentMap(gltf) {
|
|
374
|
+
const parents = new Map();
|
|
375
|
+
for (let i = 0; i < (gltf.nodes || []).length; i++) {
|
|
376
|
+
for (const child of gltf.nodes[i].children || []) {
|
|
377
|
+
parents.set(child, i);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return parents;
|
|
381
|
+
}
|
|
382
|
+
function nodeName(gltf, nodeIndex) {
|
|
383
|
+
const node = gltf.nodes && gltf.nodes[nodeIndex];
|
|
384
|
+
return node && node.name || `node_${nodeIndex}`;
|
|
385
|
+
}
|
|
386
|
+
function nodeTransform(node) {
|
|
387
|
+
if (node.matrix) {
|
|
388
|
+
return decomposeMatrix(node.matrix);
|
|
389
|
+
}
|
|
390
|
+
const position = (node.translation || [0, 0, 0]).map(fr),
|
|
391
|
+
orientation = (node.rotation || [0, 0, 0, 1]).map(fr),
|
|
392
|
+
scale = node.scale || [1, 1, 1];
|
|
393
|
+
return {
|
|
394
|
+
position,
|
|
395
|
+
orientation,
|
|
396
|
+
scaleShear: [fr(scale[0]), 0, 0, 0, fr(scale[1]), 0, 0, 0, fr(scale[2])]
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
function decomposeMatrix(matrix) {
|
|
400
|
+
const position = [fr(matrix[12] || 0), fr(matrix[13] || 0), fr(matrix[14] || 0)],
|
|
401
|
+
sx = Math.hypot(matrix[0], matrix[1], matrix[2]) || 1,
|
|
402
|
+
sy = Math.hypot(matrix[4], matrix[5], matrix[6]) || 1,
|
|
403
|
+
sz = Math.hypot(matrix[8], matrix[9], matrix[10]) || 1;
|
|
404
|
+
return {
|
|
405
|
+
position,
|
|
406
|
+
orientation: [0, 0, 0, 1],
|
|
407
|
+
scaleShear: [fr(sx), 0, 0, 0, fr(sy), 0, 0, 0, fr(sz)]
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
function buildSkeleton(gltf, skinIndex, parents) {
|
|
411
|
+
const skin = gltf.skins[skinIndex],
|
|
412
|
+
joints = skin.joints || [],
|
|
413
|
+
jointLookup = new Map(joints.map((nodeIndex, index) => [nodeIndex, index]));
|
|
414
|
+
return {
|
|
415
|
+
name: skin.name || `skin_${skinIndex}`,
|
|
416
|
+
bones: joints.map(nodeIndex => {
|
|
417
|
+
const node = gltf.nodes[nodeIndex] || {},
|
|
418
|
+
parentIndex = jointLookup.has(parents.get(nodeIndex)) ? jointLookup.get(parents.get(nodeIndex)) : -1,
|
|
419
|
+
transform = nodeTransform(node);
|
|
420
|
+
return {
|
|
421
|
+
name: nodeName(gltf, nodeIndex),
|
|
422
|
+
parentIndex,
|
|
423
|
+
flag: 7,
|
|
424
|
+
position: transform.position,
|
|
425
|
+
orientation: transform.orientation,
|
|
426
|
+
scaleShear: transform.scaleShear,
|
|
427
|
+
extendedData: {
|
|
428
|
+
gltfNode: nodeIndex
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
})
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
function buildBoneBindings(skeleton) {
|
|
435
|
+
return skeleton.bones.map(bone => ({
|
|
436
|
+
name: bone.name,
|
|
437
|
+
minBounds: [0, 0, 0],
|
|
438
|
+
maxBounds: [0, 0, 0]
|
|
439
|
+
}));
|
|
440
|
+
}
|
|
441
|
+
function collectMeshNodes(gltf) {
|
|
442
|
+
const nodes = [];
|
|
443
|
+
for (let i = 0; i < (gltf.nodes || []).length; i++) {
|
|
444
|
+
if (gltf.nodes[i].mesh !== undefined) nodes.push(i);
|
|
445
|
+
}
|
|
446
|
+
if (nodes.length) return nodes;
|
|
447
|
+
return (gltf.meshes || []).map((_, index) => ({
|
|
448
|
+
meshIndex: index
|
|
449
|
+
}));
|
|
450
|
+
}
|
|
451
|
+
function makeCurve(path, dimension, knots, controls, interpolation, generated = false) {
|
|
452
|
+
return {
|
|
453
|
+
source: {
|
|
454
|
+
format: 1,
|
|
455
|
+
degree: interpolation === "STEP" ? 0 : 1,
|
|
456
|
+
interpolation,
|
|
457
|
+
path,
|
|
458
|
+
generated
|
|
459
|
+
},
|
|
460
|
+
uncompressed: {
|
|
461
|
+
dimension,
|
|
462
|
+
knots: knots.map(fr),
|
|
463
|
+
controls: controls.map(fr)
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
function identityCurve(path, duration) {
|
|
468
|
+
if (path === "position") {
|
|
469
|
+
return makeCurve(path, 3, [0, duration], [0, 0, 0, 0, 0, 0], "STEP", true);
|
|
470
|
+
}
|
|
471
|
+
if (path === "orientation") {
|
|
472
|
+
return makeCurve(path, 4, [0, duration], [0, 0, 0, 1, 0, 0, 0, 1], "STEP", true);
|
|
473
|
+
}
|
|
474
|
+
return makeCurve(path, 9, [0, duration], [1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], "STEP", true);
|
|
475
|
+
}
|
|
476
|
+
function scaleToScaleShear(values, interpolation) {
|
|
477
|
+
const controls = interpolation === "CUBICSPLINE" ? cubicSplineValues(values, 3) : values;
|
|
478
|
+
const out = [];
|
|
479
|
+
for (let i = 0; i < controls.length; i += 3) {
|
|
480
|
+
out.push(controls[i], 0, 0, 0, controls[i + 1], 0, 0, 0, controls[i + 2]);
|
|
481
|
+
}
|
|
482
|
+
return out;
|
|
483
|
+
}
|
|
484
|
+
function cubicSplineValues(values, dimension) {
|
|
485
|
+
const out = [];
|
|
486
|
+
for (let i = 0; i < values.length; i += dimension * 3) {
|
|
487
|
+
for (let c = 0; c < dimension; c++) {
|
|
488
|
+
out.push(values[i + dimension + c]);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return out;
|
|
492
|
+
}
|
|
493
|
+
function channelCurve(gltf, buffers, animation, channel) {
|
|
494
|
+
const sampler = animation.samplers[channel.sampler],
|
|
495
|
+
interpolation = sampler.interpolation || "LINEAR",
|
|
496
|
+
knots = readAccessor(gltf, buffers, sampler.input),
|
|
497
|
+
rawControls = readAccessor(gltf, buffers, sampler.output),
|
|
498
|
+
path = channel.target.path;
|
|
499
|
+
if (path === "translation") {
|
|
500
|
+
const controls = interpolation === "CUBICSPLINE" ? cubicSplineValues(rawControls, 3) : rawControls;
|
|
501
|
+
return {
|
|
502
|
+
path: "position",
|
|
503
|
+
curve: makeCurve("position", 3, knots, controls, interpolation)
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
if (path === "rotation") {
|
|
507
|
+
const controls = interpolation === "CUBICSPLINE" ? cubicSplineValues(rawControls, 4) : rawControls;
|
|
508
|
+
return {
|
|
509
|
+
path: "orientation",
|
|
510
|
+
curve: makeCurve("orientation", 4, knots, controls, interpolation)
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
if (path === "scale") {
|
|
514
|
+
return {
|
|
515
|
+
path: "scaleShear",
|
|
516
|
+
curve: makeCurve("scaleShear", 9, knots, scaleToScaleShear(rawControls, interpolation), interpolation)
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
return null;
|
|
520
|
+
}
|
|
521
|
+
function buildAnimations(gltf, buffers, modelTargets) {
|
|
522
|
+
return (gltf.animations || []).map((animation, animationIndex) => {
|
|
523
|
+
const duration = animationDuration(gltf, buffers, animation),
|
|
524
|
+
groups = new Map();
|
|
525
|
+
for (const channel of animation.channels || []) {
|
|
526
|
+
const mapped = modelTargets.get(channel.target.node);
|
|
527
|
+
if (!mapped) continue;
|
|
528
|
+
const curve = channelCurve(gltf, buffers, animation, channel);
|
|
529
|
+
if (!curve) continue;
|
|
530
|
+
for (const target of mapped) {
|
|
531
|
+
let group = groups.get(target.modelName);
|
|
532
|
+
if (!group) {
|
|
533
|
+
group = {
|
|
534
|
+
name: target.modelName,
|
|
535
|
+
tracks: new Map()
|
|
536
|
+
};
|
|
537
|
+
groups.set(target.modelName, group);
|
|
538
|
+
}
|
|
539
|
+
let track = group.tracks.get(target.boneName);
|
|
540
|
+
if (!track) {
|
|
541
|
+
track = {
|
|
542
|
+
name: target.boneName,
|
|
543
|
+
flags: 0
|
|
544
|
+
};
|
|
545
|
+
group.tracks.set(target.boneName, track);
|
|
546
|
+
}
|
|
547
|
+
track[curve.path] = curve.curve;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
return {
|
|
551
|
+
name: animation.name || `animation_${animationIndex}`,
|
|
552
|
+
duration,
|
|
553
|
+
timeStep: 0,
|
|
554
|
+
oversampling: 1,
|
|
555
|
+
defaultLoopCount: 0,
|
|
556
|
+
flags: 0,
|
|
557
|
+
trackGroups: Array.from(groups.values()).map(group => ({
|
|
558
|
+
name: group.name,
|
|
559
|
+
transformTracks: Array.from(group.tracks.values()).map(track => ({
|
|
560
|
+
name: track.name,
|
|
561
|
+
flags: track.flags,
|
|
562
|
+
orientation: track.orientation || identityCurve("orientation", duration),
|
|
563
|
+
position: track.position || identityCurve("position", duration),
|
|
564
|
+
scaleShear: track.scaleShear || identityCurve("scaleShear", duration)
|
|
565
|
+
}))
|
|
566
|
+
}))
|
|
567
|
+
};
|
|
568
|
+
}).filter(animation => animation.trackGroups.length);
|
|
569
|
+
}
|
|
570
|
+
function animationDuration(gltf, buffers, animation) {
|
|
571
|
+
let duration = 0;
|
|
572
|
+
for (const sampler of animation.samplers || []) {
|
|
573
|
+
const knots = readAccessor(gltf, buffers, sampler.input);
|
|
574
|
+
for (const knot of knots) {
|
|
575
|
+
if (knot > duration) duration = knot;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return fr(duration);
|
|
579
|
+
}
|
|
580
|
+
function registerModelTargets(modelTargets, model) {
|
|
581
|
+
for (const bone of model.skeleton.bones) {
|
|
582
|
+
const nodeIndex = bone.extendedData && bone.extendedData.gltfNode;
|
|
583
|
+
if (nodeIndex === undefined) continue;
|
|
584
|
+
const targets = modelTargets.get(nodeIndex) || [];
|
|
585
|
+
targets.push({
|
|
586
|
+
modelName: model.name,
|
|
587
|
+
boneName: bone.name
|
|
588
|
+
});
|
|
589
|
+
modelTargets.set(nodeIndex, targets);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
function parseGltfToJson(gltf, {
|
|
593
|
+
binaryChunk = null,
|
|
594
|
+
source = "memory",
|
|
595
|
+
buffers: providedBuffers = null
|
|
596
|
+
} = {}) {
|
|
597
|
+
if (!gltf.asset || !String(gltf.asset.version || "").startsWith("2")) {
|
|
598
|
+
throw new Error("CjsGltfFormat: only glTF 2.x assets are supported");
|
|
599
|
+
}
|
|
600
|
+
const buffers = resolveBuffers(gltf, binaryChunk, {
|
|
601
|
+
buffers: providedBuffers
|
|
602
|
+
}),
|
|
603
|
+
parents = parentMap(gltf),
|
|
604
|
+
root = {
|
|
605
|
+
grannyFileFormatRevision: 0,
|
|
606
|
+
grannyFileSource: source,
|
|
607
|
+
meshes: [],
|
|
608
|
+
models: [],
|
|
609
|
+
animations: []
|
|
610
|
+
},
|
|
611
|
+
modelTargets = new Map();
|
|
612
|
+
for (const meshNode of collectMeshNodes(gltf)) {
|
|
613
|
+
const nodeIndex = typeof meshNode === "number" ? meshNode : undefined,
|
|
614
|
+
node = nodeIndex === undefined ? null : gltf.nodes[nodeIndex],
|
|
615
|
+
meshIndex = node ? node.mesh : meshNode.meshIndex,
|
|
616
|
+
mesh = gltf.meshes && gltf.meshes[meshIndex],
|
|
617
|
+
skinIndex = node && node.skin,
|
|
618
|
+
skeleton = skinIndex === undefined ? null : buildSkeleton(gltf, skinIndex, parents),
|
|
619
|
+
boneBindings = skeleton ? buildBoneBindings(skeleton) : [],
|
|
620
|
+
meshBindings = [];
|
|
621
|
+
if (!mesh) continue;
|
|
622
|
+
for (let primitiveIndex = 0; primitiveIndex < mesh.primitives.length; primitiveIndex++) {
|
|
623
|
+
meshBindings.push(root.meshes.length);
|
|
624
|
+
root.meshes.push(buildMeshPrimitive(gltf, buffers, meshIndex, primitiveIndex, nodeIndex, boneBindings));
|
|
625
|
+
}
|
|
626
|
+
if (skeleton) {
|
|
627
|
+
const model = {
|
|
628
|
+
name: node && node.name || mesh.name || `model_${nodeIndex}`,
|
|
629
|
+
skeleton,
|
|
630
|
+
meshBindings
|
|
631
|
+
};
|
|
632
|
+
root.models.push(model);
|
|
633
|
+
registerModelTargets(modelTargets, model);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
root.animations = buildAnimations(gltf, buffers, modelTargets);
|
|
637
|
+
return root;
|
|
638
|
+
}
|
|
639
|
+
function inspectGltf(gltf, {
|
|
640
|
+
format = "gltf",
|
|
641
|
+
source = "memory"
|
|
642
|
+
} = {}) {
|
|
643
|
+
return {
|
|
644
|
+
source,
|
|
645
|
+
format,
|
|
646
|
+
assetVersion: gltf.asset && gltf.asset.version,
|
|
647
|
+
sceneCount: (gltf.scenes || []).length,
|
|
648
|
+
nodeCount: (gltf.nodes || []).length,
|
|
649
|
+
meshCount: (gltf.meshes || []).length,
|
|
650
|
+
skinCount: (gltf.skins || []).length,
|
|
651
|
+
animationCount: (gltf.animations || []).length,
|
|
652
|
+
materialCount: (gltf.materials || []).length,
|
|
653
|
+
meshes: (gltf.meshes || []).map((mesh, index) => ({
|
|
654
|
+
name: mesh.name || `mesh_${index}`,
|
|
655
|
+
primitiveCount: (mesh.primitives || []).length
|
|
656
|
+
})),
|
|
657
|
+
animations: (gltf.animations || []).map((animation, index) => ({
|
|
658
|
+
name: animation.name || `animation_${index}`,
|
|
659
|
+
channelCount: (animation.channels || []).length,
|
|
660
|
+
samplerCount: (animation.samplers || []).length
|
|
661
|
+
}))
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
export { inspectGltf, isGlb, parseGltfToJson, parseInput, toBytes };
|
|
666
|
+
//# sourceMappingURL=parser.js.map
|