@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,287 @@
|
|
|
1
|
+
import { OUTPUT_NATIVE, OUTPUT_GR2, CLASS_KEYS, OUTPUT_RAW, OUTPUT_SHARED, OUTPUT_CMF, OUTPUT_CMF_JSON, OUTPUT_JSON } from './constants.js';
|
|
2
|
+
import { readCmf, inspectCmf } from './schema.js';
|
|
3
|
+
import { buildSharedFromCmf, buildCmfFromShared } from './shared.js';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_VALUES = Object.freeze({
|
|
6
|
+
emit: OUTPUT_NATIVE,
|
|
7
|
+
validateCrc: true,
|
|
8
|
+
decodeBuffers: true,
|
|
9
|
+
classes: {}
|
|
10
|
+
});
|
|
11
|
+
function normalizeValues(base = {}, options = {}) {
|
|
12
|
+
const values = {
|
|
13
|
+
...DEFAULT_VALUES,
|
|
14
|
+
...base,
|
|
15
|
+
...options,
|
|
16
|
+
classes: {
|
|
17
|
+
...(base.classes ?? {}),
|
|
18
|
+
...(options.classes ?? {})
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
values.emit = normalizeEmit(values.emit);
|
|
22
|
+
if (values.emit === OUTPUT_GR2 && !hasClasses(values.classes)) {
|
|
23
|
+
throw new TypeError("CMF emit \"gr2\" requires explicit classes");
|
|
24
|
+
}
|
|
25
|
+
validateClasses(values.classes);
|
|
26
|
+
values.decodeBuffers = !!values.decodeBuffers;
|
|
27
|
+
return values;
|
|
28
|
+
}
|
|
29
|
+
function normalizeEmit(emit) {
|
|
30
|
+
if (emit === undefined || emit === OUTPUT_NATIVE || emit === OUTPUT_CMF || emit === OUTPUT_CMF_JSON || emit === OUTPUT_JSON) {
|
|
31
|
+
return OUTPUT_CMF;
|
|
32
|
+
}
|
|
33
|
+
if (emit === OUTPUT_GR2 || emit === OUTPUT_RAW || emit === OUTPUT_SHARED) return emit;
|
|
34
|
+
throw new TypeError(`CMF emit must be "${OUTPUT_CMF}", "${OUTPUT_CMF_JSON}", "${OUTPUT_GR2}", "${OUTPUT_SHARED}", or "${OUTPUT_RAW}"`);
|
|
35
|
+
}
|
|
36
|
+
function hasClasses(classes) {
|
|
37
|
+
return !!classes && Object.values(classes).some(Class => typeof Class === "function");
|
|
38
|
+
}
|
|
39
|
+
function readRawInput(input, options = {}) {
|
|
40
|
+
if (input && typeof input === "object" && Array.isArray(input.sections) && Array.isArray(input.meshes)) {
|
|
41
|
+
return input;
|
|
42
|
+
}
|
|
43
|
+
return readCmf(input, options);
|
|
44
|
+
}
|
|
45
|
+
async function readRawInputAsync(input, options = {}) {
|
|
46
|
+
if (input && typeof input === "object" && Array.isArray(input.sections) && Array.isArray(input.meshes)) {
|
|
47
|
+
return input;
|
|
48
|
+
}
|
|
49
|
+
const {
|
|
50
|
+
readCmfAsync
|
|
51
|
+
} = await import('./schema.js');
|
|
52
|
+
return readCmfAsync(input, options);
|
|
53
|
+
}
|
|
54
|
+
function readWithValues(owner, input, values) {
|
|
55
|
+
const raw = readRawInput(input, values);
|
|
56
|
+
if (values.emit === OUTPUT_RAW) {
|
|
57
|
+
return raw;
|
|
58
|
+
}
|
|
59
|
+
return values.emit === OUTPUT_SHARED ? buildSharedFromCmf(raw, values.classes, {
|
|
60
|
+
source: values.source
|
|
61
|
+
}) : values.emit === OUTPUT_GR2 ? buildGr2FromCmf(raw, values.classes, {
|
|
62
|
+
source: values.source
|
|
63
|
+
}) : hydrateNativeRoot(raw, values.classes, {
|
|
64
|
+
source: values.source
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async function readWithValuesAsync(owner, input, values) {
|
|
68
|
+
const raw = await readRawInputAsync(input, values);
|
|
69
|
+
if (values.emit === OUTPUT_RAW) {
|
|
70
|
+
return raw;
|
|
71
|
+
}
|
|
72
|
+
return values.emit === OUTPUT_SHARED ? buildSharedFromCmf(raw, values.classes, {
|
|
73
|
+
source: values.source
|
|
74
|
+
}) : values.emit === OUTPUT_GR2 ? buildGr2FromCmf(raw, values.classes, {
|
|
75
|
+
source: values.source
|
|
76
|
+
}) : hydrateNativeRoot(raw, values.classes, {
|
|
77
|
+
source: values.source
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function loadSharedWithValues(input, values) {
|
|
81
|
+
const native = buildCmfFromShared(input);
|
|
82
|
+
return values.emit === OUTPUT_SHARED ? buildSharedFromCmf(native, values.classes, {
|
|
83
|
+
source: values.source
|
|
84
|
+
}) : values.emit === OUTPUT_GR2 ? buildGr2FromCmf(native, values.classes, {
|
|
85
|
+
source: values.source
|
|
86
|
+
}) : hydrateNativeRoot(native, values.classes, {
|
|
87
|
+
source: values.source
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function loadNativeWithValues(input, values) {
|
|
91
|
+
if (values.emit === OUTPUT_RAW) {
|
|
92
|
+
return input;
|
|
93
|
+
}
|
|
94
|
+
return values.emit === OUTPUT_SHARED ? buildSharedFromCmf(input, values.classes, {
|
|
95
|
+
source: values.source
|
|
96
|
+
}) : values.emit === OUTPUT_GR2 ? buildGr2FromCmf(input, values.classes, {
|
|
97
|
+
source: values.source
|
|
98
|
+
}) : hydrateNativeRoot(input, values.classes, {
|
|
99
|
+
source: values.source
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function inspectRawCmfResult(input, options = {}) {
|
|
103
|
+
return inspectCmf(readRawInput(input, {
|
|
104
|
+
...options,
|
|
105
|
+
decodeBuffers: false
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
function buildGr2FromCmf(raw, classes, hydrationOptions = {}) {
|
|
109
|
+
const hydrationClasses = createHydrationClasses(classes, hydrationOptions);
|
|
110
|
+
return hydrate("Root", {
|
|
111
|
+
grannyFileFormatRevision: raw.version,
|
|
112
|
+
grannyFileSource: "cmf",
|
|
113
|
+
meshes: raw.meshes.map(mesh => hydrateGr2Mesh(mesh, hydrationClasses)),
|
|
114
|
+
models: [],
|
|
115
|
+
animations: raw.animations.map(animation => hydrate("Animation", {
|
|
116
|
+
name: animation.name ?? "",
|
|
117
|
+
duration: animation.duration ?? 0,
|
|
118
|
+
timeStep: 0,
|
|
119
|
+
oversampling: 0,
|
|
120
|
+
defaultLoopCount: 0,
|
|
121
|
+
flags: 0,
|
|
122
|
+
trackGroups: []
|
|
123
|
+
}, hydrationClasses))
|
|
124
|
+
}, hydrationClasses, hydrationOptions);
|
|
125
|
+
}
|
|
126
|
+
function hydrateGr2Mesh(mesh, classes) {
|
|
127
|
+
return hydrate("Mesh", {
|
|
128
|
+
name: mesh.name,
|
|
129
|
+
morphTargets: (mesh.morphTargets?.targets ?? []).map(target => hydrate("MorphTarget", {
|
|
130
|
+
...target,
|
|
131
|
+
dataIsDeltas: true,
|
|
132
|
+
vertex: target.vertex ?? null
|
|
133
|
+
}, classes)),
|
|
134
|
+
minBounds: mesh.bounds?.min ?? [0, 0, 0],
|
|
135
|
+
maxBounds: mesh.bounds?.max ?? [0, 0, 0],
|
|
136
|
+
boneBindings: (mesh.boneBindings ?? []).map(binding => hydrate("BoneBinding", {
|
|
137
|
+
name: binding.name,
|
|
138
|
+
minBounds: binding.bounds?.min ?? [0, 0, 0],
|
|
139
|
+
maxBounds: binding.bounds?.max ?? [0, 0, 0]
|
|
140
|
+
}, classes)),
|
|
141
|
+
vertex: mesh.vertex ?? emptyGr2Vertex(),
|
|
142
|
+
indices: (mesh.indices ?? []).map(group => hydrate("IndexGroup", {
|
|
143
|
+
name: group.name ?? "",
|
|
144
|
+
bytesPerIndex: group.bytesPerIndex ?? 2,
|
|
145
|
+
faces: group.faces ?? []
|
|
146
|
+
}, classes))
|
|
147
|
+
}, classes);
|
|
148
|
+
}
|
|
149
|
+
function emptyGr2Vertex() {
|
|
150
|
+
return {
|
|
151
|
+
position: [],
|
|
152
|
+
normal: [],
|
|
153
|
+
tangent: [],
|
|
154
|
+
binormal: [],
|
|
155
|
+
texcoord0: [],
|
|
156
|
+
texcoord1: [],
|
|
157
|
+
blendIndice: [],
|
|
158
|
+
blendWeight: []
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function toJsonValue(value) {
|
|
162
|
+
if (value === null || value === undefined) {
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
if (Array.isArray(value)) {
|
|
166
|
+
return value.map(item => toJsonValue(item));
|
|
167
|
+
}
|
|
168
|
+
if (ArrayBuffer.isView(value)) {
|
|
169
|
+
return Array.from(value);
|
|
170
|
+
}
|
|
171
|
+
if (typeof value.toJSON === "function") {
|
|
172
|
+
return toJsonValue(value.toJSON());
|
|
173
|
+
}
|
|
174
|
+
if (typeof value === "object") {
|
|
175
|
+
const result = {};
|
|
176
|
+
for (const [key, child] of Object.entries(value)) {
|
|
177
|
+
result[key] = toJsonValue(child);
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
return value;
|
|
182
|
+
}
|
|
183
|
+
function validateClassKey(type) {
|
|
184
|
+
if (!CLASS_KEYS.includes(type)) {
|
|
185
|
+
throw new TypeError(`Unknown CMF class key "${type}"`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function validateClass(type, Class) {
|
|
189
|
+
validateClassKey(type);
|
|
190
|
+
if (typeof Class !== "function") {
|
|
191
|
+
throw new TypeError(`CMF class "${type}" must be a constructor`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function validateClasses(classes) {
|
|
195
|
+
for (const [type, Class] of Object.entries(classes ?? {})) {
|
|
196
|
+
validateClass(type, Class);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function hydrateNativeRoot(raw, classes, hydrationOptions = {}) {
|
|
200
|
+
const hydrationClasses = createHydrationClasses(classes, hydrationOptions);
|
|
201
|
+
return hydrate("Root", {
|
|
202
|
+
signature: raw.signature,
|
|
203
|
+
version: raw.version,
|
|
204
|
+
headerSize: raw.headerSize,
|
|
205
|
+
crc32: raw.crc32,
|
|
206
|
+
sections: (raw.sections ?? []).map(section => hydrate("Section", section, hydrationClasses)),
|
|
207
|
+
metadata: raw.metadata ? hydrateMetadata(raw.metadata, hydrationClasses) : null,
|
|
208
|
+
meshes: raw.meshes.map(mesh => hydrateMesh(mesh, hydrationClasses)),
|
|
209
|
+
skeletons: raw.skeletons.map(skeleton => hydrateSkeleton(skeleton, hydrationClasses)),
|
|
210
|
+
animations: raw.animations.map(animation => hydrateAnimation(animation, hydrationClasses))
|
|
211
|
+
}, hydrationClasses, hydrationOptions);
|
|
212
|
+
}
|
|
213
|
+
function hydrateMetadata(metadata, classes) {
|
|
214
|
+
return hydrate("Metadata", {
|
|
215
|
+
entries: metadata.entries.map(entry => hydrate("MetadataEntry", entry, classes))
|
|
216
|
+
}, classes);
|
|
217
|
+
}
|
|
218
|
+
function hydrateMesh(mesh, classes) {
|
|
219
|
+
return hydrate("Mesh", {
|
|
220
|
+
...mesh,
|
|
221
|
+
decl: mesh.decl.map(element => hydrate("VertexElement", element, classes)),
|
|
222
|
+
lods: mesh.lods.map(lod => hydrateMeshLod(lod, classes)),
|
|
223
|
+
areas: mesh.areas.map(area => hydrate("MeshArea", area, classes)),
|
|
224
|
+
boneBindings: mesh.boneBindings.map(binding => hydrate("BoneBinding", binding, classes)),
|
|
225
|
+
morphTargets: hydrateMorphTargets(mesh.morphTargets, classes),
|
|
226
|
+
audioOcclusionMesh: hydrate("AudioOcclusionMesh", mesh.audioOcclusionMesh, classes)
|
|
227
|
+
}, classes);
|
|
228
|
+
}
|
|
229
|
+
function hydrateMeshLod(lod, classes) {
|
|
230
|
+
return hydrate("MeshLod", {
|
|
231
|
+
...lod,
|
|
232
|
+
areas: lod.areas.map(area => hydrate("LodMeshArea", area, classes)),
|
|
233
|
+
morphTargets: lod.morphTargets.map(target => hydrate("LodMorphTarget", target, classes))
|
|
234
|
+
}, classes);
|
|
235
|
+
}
|
|
236
|
+
function hydrateMorphTargets(morphTargets, classes) {
|
|
237
|
+
return hydrate("MorphTargets", {
|
|
238
|
+
decl: morphTargets.decl.map(element => hydrate("VertexElement", element, classes)),
|
|
239
|
+
targets: morphTargets.targets.map(target => hydrate("MorphTarget", target, classes))
|
|
240
|
+
}, classes);
|
|
241
|
+
}
|
|
242
|
+
function hydrateSkeleton(skeleton, classes) {
|
|
243
|
+
return hydrate("Skeleton", {
|
|
244
|
+
...skeleton,
|
|
245
|
+
boneMasks: skeleton.boneMasks.map(mask => hydrate("BoneMask", {
|
|
246
|
+
...mask,
|
|
247
|
+
weights: mask.weights.map(weight => hydrate("BoneWeight", weight, classes))
|
|
248
|
+
}, classes))
|
|
249
|
+
}, classes);
|
|
250
|
+
}
|
|
251
|
+
function hydrateAnimation(animation, classes) {
|
|
252
|
+
return hydrate("Animation", {
|
|
253
|
+
...animation,
|
|
254
|
+
channels: animation.channels.map(channel => hydrate("AnimationChannel", channel, classes)),
|
|
255
|
+
curves: animation.curves.map(curve => hydrate("AnimationCurve", curve, classes))
|
|
256
|
+
}, classes);
|
|
257
|
+
}
|
|
258
|
+
function hydrate(type, fields, classes, hydrationOptions = {}) {
|
|
259
|
+
const Class = classes?.[type];
|
|
260
|
+
if (!Class) {
|
|
261
|
+
return fields;
|
|
262
|
+
}
|
|
263
|
+
const options = Object.keys(hydrationOptions).length > 0 ? hydrationOptions : classes?.__hydrationOptions || {};
|
|
264
|
+
return populate(new Class(), fields, options);
|
|
265
|
+
}
|
|
266
|
+
function populate(instance, fields, hydrationOptions = {}) {
|
|
267
|
+
if (!instance || typeof instance.SetValues !== "function") {
|
|
268
|
+
throw new TypeError("CjsCmfFormat class population requires classes to implement SetValues(values)");
|
|
269
|
+
}
|
|
270
|
+
instance.SetValues(fields, {
|
|
271
|
+
...hydrationOptions,
|
|
272
|
+
skipUpdate: true,
|
|
273
|
+
skipEvents: true
|
|
274
|
+
});
|
|
275
|
+
return instance;
|
|
276
|
+
}
|
|
277
|
+
function createHydrationClasses(classes, hydrationOptions) {
|
|
278
|
+
const map = Object.create(classes || null);
|
|
279
|
+
Object.defineProperty(map, "__hydrationOptions", {
|
|
280
|
+
value: hydrationOptions,
|
|
281
|
+
enumerable: false
|
|
282
|
+
});
|
|
283
|
+
return map;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export { CLASS_KEYS, DEFAULT_VALUES, OUTPUT_CMF, OUTPUT_CMF_JSON, OUTPUT_GR2, OUTPUT_JSON, OUTPUT_NATIVE, OUTPUT_RAW, OUTPUT_SHARED, inspectRawCmfResult, loadNativeWithValues, loadSharedWithValues, normalizeValues, readRawInput, readRawInputAsync, readWithValues, readWithValuesAsync, toJsonValue, validateClass, validateClassKey };
|
|
287
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../../../src/formats/cmf/core/helpers.js"],"sourcesContent":["import { CLASS_KEYS, OUTPUT_CMF, OUTPUT_CMF_JSON, OUTPUT_GR2, OUTPUT_JSON, OUTPUT_NATIVE, OUTPUT_RAW, OUTPUT_SHARED } from \"./constants.js\";\nimport { inspectCmf, readCmf } from \"./schema.js\";\nimport { buildCmfFromShared, buildSharedFromCmf } from \"./shared.js\";\n\nexport { CLASS_KEYS, OUTPUT_CMF, OUTPUT_CMF_JSON, OUTPUT_GR2, OUTPUT_JSON, OUTPUT_NATIVE, OUTPUT_RAW, OUTPUT_SHARED };\n\nexport const DEFAULT_VALUES = Object.freeze({\n emit: OUTPUT_NATIVE,\n validateCrc: true,\n decodeBuffers: true,\n classes: {}\n});\n\nexport function normalizeValues(base = {}, options = {})\n{\n const values = {\n ...DEFAULT_VALUES,\n ...base,\n ...options,\n classes: {\n ...(base.classes ?? {}),\n ...(options.classes ?? {})\n }\n };\n\n values.emit = normalizeEmit(values.emit);\n if (values.emit === OUTPUT_GR2 && !hasClasses(values.classes))\n {\n throw new TypeError(\"CMF emit \\\"gr2\\\" requires explicit classes\");\n }\n\n validateClasses(values.classes);\n values.decodeBuffers = !!values.decodeBuffers;\n return values;\n}\n\nfunction normalizeEmit(emit)\n{\n if (emit === undefined || emit === OUTPUT_NATIVE || emit === OUTPUT_CMF || emit === OUTPUT_CMF_JSON || emit === OUTPUT_JSON)\n {\n return OUTPUT_CMF;\n }\n if (emit === OUTPUT_GR2 || emit === OUTPUT_RAW || emit === OUTPUT_SHARED) return emit;\n throw new TypeError(`CMF emit must be \"${OUTPUT_CMF}\", \"${OUTPUT_CMF_JSON}\", \"${OUTPUT_GR2}\", \"${OUTPUT_SHARED}\", or \"${OUTPUT_RAW}\"`);\n}\n\nfunction hasClasses(classes)\n{\n return !!classes && Object.values(classes).some((Class) => typeof Class === \"function\");\n}\n\nexport function readRawInput(input, options = {})\n{\n if (input && typeof input === \"object\" && Array.isArray(input.sections) && Array.isArray(input.meshes))\n {\n return input;\n }\n\n return readCmf(input, options);\n}\n\nexport async function readRawInputAsync(input, options = {})\n{\n if (input && typeof input === \"object\" && Array.isArray(input.sections) && Array.isArray(input.meshes))\n {\n return input;\n }\n\n const { readCmfAsync } = await import(\"./schema.js\");\n return readCmfAsync(input, options);\n}\n\nexport function readWithValues(owner, input, values)\n{\n const raw = readRawInput(input, values);\n if (values.emit === OUTPUT_RAW)\n {\n return raw;\n }\n\n return values.emit === OUTPUT_SHARED\n ? buildSharedFromCmf(raw, values.classes, { source: values.source })\n : values.emit === OUTPUT_GR2\n ? buildGr2FromCmf(raw, values.classes, { source: values.source })\n : hydrateNativeRoot(raw, values.classes, { source: values.source });\n}\n\nexport async function readWithValuesAsync(owner, input, values)\n{\n const raw = await readRawInputAsync(input, values);\n if (values.emit === OUTPUT_RAW)\n {\n return raw;\n }\n\n return values.emit === OUTPUT_SHARED\n ? buildSharedFromCmf(raw, values.classes, { source: values.source })\n : values.emit === OUTPUT_GR2\n ? buildGr2FromCmf(raw, values.classes, { source: values.source })\n : hydrateNativeRoot(raw, values.classes, { source: values.source });\n}\n\nexport function loadSharedWithValues(input, values)\n{\n const native = buildCmfFromShared(input);\n return values.emit === OUTPUT_SHARED\n ? buildSharedFromCmf(native, values.classes, { source: values.source })\n : values.emit === OUTPUT_GR2\n ? buildGr2FromCmf(native, values.classes, { source: values.source })\n : hydrateNativeRoot(native, values.classes, { source: values.source });\n}\n\nexport function loadNativeWithValues(input, values)\n{\n if (values.emit === OUTPUT_RAW)\n {\n return input;\n }\n\n return values.emit === OUTPUT_SHARED\n ? buildSharedFromCmf(input, values.classes, { source: values.source })\n : values.emit === OUTPUT_GR2\n ? buildGr2FromCmf(input, values.classes, { source: values.source })\n : hydrateNativeRoot(input, values.classes, { source: values.source });\n}\n\nexport function inspectRawCmfResult(input, options = {})\n{\n return inspectCmf(readRawInput(input, { ...options, decodeBuffers: false }));\n}\n\nfunction buildGr2FromCmf(raw, classes, hydrationOptions = {})\n{\n const hydrationClasses = createHydrationClasses(classes, hydrationOptions);\n return hydrate(\"Root\", {\n grannyFileFormatRevision: raw.version,\n grannyFileSource: \"cmf\",\n meshes: raw.meshes.map((mesh) => hydrateGr2Mesh(mesh, hydrationClasses)),\n models: [],\n animations: raw.animations.map((animation) => hydrate(\"Animation\", {\n name: animation.name ?? \"\",\n duration: animation.duration ?? 0,\n timeStep: 0,\n oversampling: 0,\n defaultLoopCount: 0,\n flags: 0,\n trackGroups: []\n }, hydrationClasses))\n }, hydrationClasses, hydrationOptions);\n}\n\nfunction hydrateGr2Mesh(mesh, classes)\n{\n return hydrate(\"Mesh\", {\n name: mesh.name,\n morphTargets: (mesh.morphTargets?.targets ?? []).map((target) => hydrate(\"MorphTarget\", {\n ...target,\n dataIsDeltas: true,\n vertex: target.vertex ?? null\n }, classes)),\n minBounds: mesh.bounds?.min ?? [ 0, 0, 0 ],\n maxBounds: mesh.bounds?.max ?? [ 0, 0, 0 ],\n boneBindings: (mesh.boneBindings ?? []).map((binding) => hydrate(\"BoneBinding\", {\n name: binding.name,\n minBounds: binding.bounds?.min ?? [ 0, 0, 0 ],\n maxBounds: binding.bounds?.max ?? [ 0, 0, 0 ]\n }, classes)),\n vertex: mesh.vertex ?? emptyGr2Vertex(),\n indices: (mesh.indices ?? []).map((group) => hydrate(\"IndexGroup\", {\n name: group.name ?? \"\",\n bytesPerIndex: group.bytesPerIndex ?? 2,\n faces: group.faces ?? []\n }, classes))\n }, classes);\n}\n\nfunction emptyGr2Vertex()\n{\n return {\n position: [],\n normal: [],\n tangent: [],\n binormal: [],\n texcoord0: [],\n texcoord1: [],\n blendIndice: [],\n blendWeight: []\n };\n}\n\nexport function toJsonValue(value)\n{\n if (value === null || value === undefined)\n {\n return value;\n }\n\n if (Array.isArray(value))\n {\n return value.map((item) => toJsonValue(item));\n }\n\n if (ArrayBuffer.isView(value))\n {\n return Array.from(value);\n }\n\n if (typeof value.toJSON === \"function\")\n {\n return toJsonValue(value.toJSON());\n }\n\n if (typeof value === \"object\")\n {\n const result = {};\n for (const [ key, child ] of Object.entries(value))\n {\n result[key] = toJsonValue(child);\n }\n return result;\n }\n\n return value;\n}\n\nexport function validateClassKey(type)\n{\n if (!CLASS_KEYS.includes(type))\n {\n throw new TypeError(`Unknown CMF class key \"${type}\"`);\n }\n}\n\nexport function validateClass(type, Class)\n{\n validateClassKey(type);\n if (typeof Class !== \"function\")\n {\n throw new TypeError(`CMF class \"${type}\" must be a constructor`);\n }\n}\n\nfunction validateClasses(classes)\n{\n for (const [ type, Class ] of Object.entries(classes ?? {}))\n {\n validateClass(type, Class);\n }\n}\n\nfunction hydrateNativeRoot(raw, classes, hydrationOptions = {})\n{\n const hydrationClasses = createHydrationClasses(classes, hydrationOptions);\n return hydrate(\"Root\", {\n signature: raw.signature,\n version: raw.version,\n headerSize: raw.headerSize,\n crc32: raw.crc32,\n sections: (raw.sections ?? []).map((section) => hydrate(\"Section\", section, hydrationClasses)),\n metadata: raw.metadata ? hydrateMetadata(raw.metadata, hydrationClasses) : null,\n meshes: raw.meshes.map((mesh) => hydrateMesh(mesh, hydrationClasses)),\n skeletons: raw.skeletons.map((skeleton) => hydrateSkeleton(skeleton, hydrationClasses)),\n animations: raw.animations.map((animation) => hydrateAnimation(animation, hydrationClasses))\n }, hydrationClasses, hydrationOptions);\n}\n\nfunction hydrateMetadata(metadata, classes)\n{\n return hydrate(\"Metadata\", {\n entries: metadata.entries.map((entry) => hydrate(\"MetadataEntry\", entry, classes))\n }, classes);\n}\n\nfunction hydrateMesh(mesh, classes)\n{\n return hydrate(\"Mesh\", {\n ...mesh,\n decl: mesh.decl.map((element) => hydrate(\"VertexElement\", element, classes)),\n lods: mesh.lods.map((lod) => hydrateMeshLod(lod, classes)),\n areas: mesh.areas.map((area) => hydrate(\"MeshArea\", area, classes)),\n boneBindings: mesh.boneBindings.map((binding) => hydrate(\"BoneBinding\", binding, classes)),\n morphTargets: hydrateMorphTargets(mesh.morphTargets, classes),\n audioOcclusionMesh: hydrate(\"AudioOcclusionMesh\", mesh.audioOcclusionMesh, classes)\n }, classes);\n}\n\nfunction hydrateMeshLod(lod, classes)\n{\n return hydrate(\"MeshLod\", {\n ...lod,\n areas: lod.areas.map((area) => hydrate(\"LodMeshArea\", area, classes)),\n morphTargets: lod.morphTargets.map((target) => hydrate(\"LodMorphTarget\", target, classes))\n }, classes);\n}\n\nfunction hydrateMorphTargets(morphTargets, classes)\n{\n return hydrate(\"MorphTargets\", {\n decl: morphTargets.decl.map((element) => hydrate(\"VertexElement\", element, classes)),\n targets: morphTargets.targets.map((target) => hydrate(\"MorphTarget\", target, classes))\n }, classes);\n}\n\nfunction hydrateSkeleton(skeleton, classes)\n{\n return hydrate(\"Skeleton\", {\n ...skeleton,\n boneMasks: skeleton.boneMasks.map((mask) => hydrate(\"BoneMask\", {\n ...mask,\n weights: mask.weights.map((weight) => hydrate(\"BoneWeight\", weight, classes))\n }, classes))\n }, classes);\n}\n\nfunction hydrateAnimation(animation, classes)\n{\n return hydrate(\"Animation\", {\n ...animation,\n channels: animation.channels.map((channel) => hydrate(\"AnimationChannel\", channel, classes)),\n curves: animation.curves.map((curve) => hydrate(\"AnimationCurve\", curve, classes))\n }, classes);\n}\n\nfunction hydrate(type, fields, classes, hydrationOptions = {})\n{\n const Class = classes?.[type];\n if (!Class)\n {\n return fields;\n }\n\n const options = Object.keys(hydrationOptions).length > 0 ? hydrationOptions : classes?.__hydrationOptions || {};\n return populate(new Class(), fields, options);\n}\n\nfunction populate(instance, fields, hydrationOptions = {})\n{\n if (!instance || typeof instance.SetValues !== \"function\")\n {\n throw new TypeError(\"CjsCmfFormat class population requires classes to implement SetValues(values)\");\n }\n instance.SetValues(fields, { ...hydrationOptions, skipUpdate: true, skipEvents: true });\n return instance;\n}\n\nfunction createHydrationClasses(classes, hydrationOptions)\n{\n const map = Object.create(classes || null);\n Object.defineProperty(map, \"__hydrationOptions\", { value: hydrationOptions, enumerable: false });\n return map;\n}\n"],"names":["DEFAULT_VALUES","Object","freeze","emit","OUTPUT_NATIVE","validateCrc","decodeBuffers","classes","normalizeValues","base","options","values","normalizeEmit","OUTPUT_GR2","hasClasses","TypeError","validateClasses","undefined","OUTPUT_CMF","OUTPUT_CMF_JSON","OUTPUT_JSON","OUTPUT_RAW","OUTPUT_SHARED","some","Class","readRawInput","input","Array","isArray","sections","meshes","readCmf","readRawInputAsync","readCmfAsync","readWithValues","owner","raw","buildSharedFromCmf","source","buildGr2FromCmf","hydrateNativeRoot","readWithValuesAsync","loadSharedWithValues","native","buildCmfFromShared","loadNativeWithValues","inspectRawCmfResult","inspectCmf","hydrationOptions","hydrationClasses","createHydrationClasses","hydrate","grannyFileFormatRevision","version","grannyFileSource","map","mesh","hydrateGr2Mesh","models","animations","animation","name","duration","timeStep","oversampling","defaultLoopCount","flags","trackGroups","morphTargets","targets","target","dataIsDeltas","vertex","minBounds","bounds","min","maxBounds","max","boneBindings","binding","emptyGr2Vertex","indices","group","bytesPerIndex","faces","position","normal","tangent","binormal","texcoord0","texcoord1","blendIndice","blendWeight","toJsonValue","value","item","ArrayBuffer","isView","from","toJSON","result","key","child","entries","validateClassKey","type","CLASS_KEYS","includes","validateClass","signature","headerSize","crc32","section","metadata","hydrateMetadata","hydrateMesh","skeletons","skeleton","hydrateSkeleton","hydrateAnimation","entry","decl","element","lods","lod","hydrateMeshLod","areas","area","hydrateMorphTargets","audioOcclusionMesh","boneMasks","mask","weights","weight","channels","channel","curves","curve","fields","keys","length","__hydrationOptions","populate","instance","SetValues","skipUpdate","skipEvents","create","defineProperty","enumerable"],"mappings":"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"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GPU-buffer packing for CMF writing.
|
|
3
|
+
*
|
|
4
|
+
* `buildCmfFromShared` (and hand-built graphs) carry deinterleaved vertex
|
|
5
|
+
* channels and index groups but no GPU bytes. This packer interleaves each
|
|
6
|
+
* LOD's channels per the mesh declaration, packs index groups, assigns
|
|
7
|
+
* unique buffer indices across the whole graph, and returns a graph + buffer
|
|
8
|
+
* list ready for `writeCmf`. Skeletons and animations must already be
|
|
9
|
+
* CMF-native shaped; GR2-shaped skeletons are rejected with a clear error
|
|
10
|
+
* (GR2 bone/track conversion is a separate adapter).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const CHANNEL_NAMES = Object.freeze({
|
|
14
|
+
Position: "position",
|
|
15
|
+
Normal: "normal",
|
|
16
|
+
Tangent: "tangent",
|
|
17
|
+
Binormal: "binormal",
|
|
18
|
+
TexCoord: "texcoord",
|
|
19
|
+
Color: "color",
|
|
20
|
+
BoneIndices: "blendIndice",
|
|
21
|
+
BoneWeights: "blendWeight",
|
|
22
|
+
PackedTangent: "packedTangent",
|
|
23
|
+
PackedTangentLegacy: "packedTangentLegacy"
|
|
24
|
+
});
|
|
25
|
+
function packError(message) {
|
|
26
|
+
const error = new Error(`CMF pack: ${message}`);
|
|
27
|
+
error.code = "CJS_FORMAT_WRITE_ERROR";
|
|
28
|
+
return error;
|
|
29
|
+
}
|
|
30
|
+
function channelName(element) {
|
|
31
|
+
const base = CHANNEL_NAMES[element.usage];
|
|
32
|
+
if (!base) throw packError(`unknown vertex usage ${JSON.stringify(element.usage)}`);
|
|
33
|
+
if (element.usage === "TexCoord" || element.usage === "Color") return `${base}${element.usageIndex}`;
|
|
34
|
+
if (element.usageIndex > 0) return `${base}${element.usageIndex}`;
|
|
35
|
+
return base;
|
|
36
|
+
}
|
|
37
|
+
function elementTypeSize(type) {
|
|
38
|
+
switch (type) {
|
|
39
|
+
case "Float32":
|
|
40
|
+
return 4;
|
|
41
|
+
case "Float16":
|
|
42
|
+
case "UInt16Norm":
|
|
43
|
+
case "UInt16":
|
|
44
|
+
case "Int16Norm":
|
|
45
|
+
case "Int16":
|
|
46
|
+
return 2;
|
|
47
|
+
case "UInt8Norm":
|
|
48
|
+
case "UInt8":
|
|
49
|
+
case "Int8Norm":
|
|
50
|
+
case "Int8":
|
|
51
|
+
return 1;
|
|
52
|
+
default:
|
|
53
|
+
throw packError(`unsupported vertex element type ${JSON.stringify(type)}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function floatToHalf(value) {
|
|
57
|
+
if (Number.isNaN(value)) return 0x7e00;
|
|
58
|
+
if (value === Infinity) return 0x7c00;
|
|
59
|
+
if (value === -Infinity) return 0xfc00;
|
|
60
|
+
const sign = value < 0 || Object.is(value, -0) ? 0x8000 : 0;
|
|
61
|
+
let v = Math.abs(value);
|
|
62
|
+
if (v >= 65520) return sign | 0x7c00;
|
|
63
|
+
if (v < Math.pow(2, -24)) return sign;
|
|
64
|
+
if (v < Math.pow(2, -14)) {
|
|
65
|
+
return sign | Math.round(v / Math.pow(2, -24));
|
|
66
|
+
}
|
|
67
|
+
const exponent = Math.floor(Math.log2(v));
|
|
68
|
+
const mantissa = Math.round((v / Math.pow(2, exponent) - 1) * 1024);
|
|
69
|
+
if (mantissa === 1024) return sign | exponent + 16 << 10;
|
|
70
|
+
return sign | exponent + 15 << 10 | mantissa;
|
|
71
|
+
}
|
|
72
|
+
function writeComponent(view, offset, type, value) {
|
|
73
|
+
switch (type) {
|
|
74
|
+
case "Float32":
|
|
75
|
+
view.setFloat32(offset, value || 0, true);
|
|
76
|
+
break;
|
|
77
|
+
case "Float16":
|
|
78
|
+
view.setUint16(offset, floatToHalf(value || 0), true);
|
|
79
|
+
break;
|
|
80
|
+
case "UInt16Norm":
|
|
81
|
+
view.setUint16(offset, clampRound(value * 65535, 0, 65535), true);
|
|
82
|
+
break;
|
|
83
|
+
case "UInt16":
|
|
84
|
+
view.setUint16(offset, clampRound(value, 0, 65535), true);
|
|
85
|
+
break;
|
|
86
|
+
case "Int16Norm":
|
|
87
|
+
view.setInt16(offset, clampRound(value * 32767, -32767, 32767), true);
|
|
88
|
+
break;
|
|
89
|
+
case "Int16":
|
|
90
|
+
view.setInt16(offset, clampRound(value, -32768, 32767), true);
|
|
91
|
+
break;
|
|
92
|
+
case "UInt8Norm":
|
|
93
|
+
view.setUint8(offset, clampRound(value * 255, 0, 255));
|
|
94
|
+
break;
|
|
95
|
+
case "UInt8":
|
|
96
|
+
view.setUint8(offset, clampRound(value, 0, 255));
|
|
97
|
+
break;
|
|
98
|
+
case "Int8Norm":
|
|
99
|
+
view.setInt8(offset, clampRound(value * 127, -127, 127));
|
|
100
|
+
break;
|
|
101
|
+
case "Int8":
|
|
102
|
+
view.setInt8(offset, clampRound(value, -128, 127));
|
|
103
|
+
break;
|
|
104
|
+
default:
|
|
105
|
+
throw packError(`unsupported vertex element type ${JSON.stringify(type)}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function clampRound(value, min, max) {
|
|
109
|
+
const rounded = Math.round(value || 0);
|
|
110
|
+
return rounded < min ? min : rounded > max ? max : rounded;
|
|
111
|
+
}
|
|
112
|
+
function vertexCountFor(decl, vertex) {
|
|
113
|
+
let count = 0;
|
|
114
|
+
for (const element of decl) {
|
|
115
|
+
const channel = vertex[channelName(element)];
|
|
116
|
+
if (!Array.isArray(channel) || channel.length === 0) continue;
|
|
117
|
+
const channelCount = Math.floor(channel.length / element.elementCount);
|
|
118
|
+
count = count === 0 ? channelCount : Math.min(count, channelCount);
|
|
119
|
+
}
|
|
120
|
+
return count;
|
|
121
|
+
}
|
|
122
|
+
function strideFor(decl) {
|
|
123
|
+
return decl.reduce((stride, element) => Math.max(stride, (element.offset || 0) + element.elementCount * elementTypeSize(element.type)), 0);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Interleave deinterleaved channels into vertex-buffer bytes per `decl`.
|
|
128
|
+
*
|
|
129
|
+
* @param {Array<object>} decl Vertex declaration.
|
|
130
|
+
* @param {object} vertex Channel-name-keyed flat arrays.
|
|
131
|
+
* @returns {object} `{ bytes, stride, count }`.
|
|
132
|
+
*/
|
|
133
|
+
function packVertexBuffer(decl, vertex) {
|
|
134
|
+
const stride = strideFor(decl);
|
|
135
|
+
const count = vertexCountFor(decl, vertex || {});
|
|
136
|
+
const bytes = new Uint8Array(count * stride);
|
|
137
|
+
const view = new DataView(bytes.buffer);
|
|
138
|
+
for (const element of decl) {
|
|
139
|
+
const channel = (vertex || {})[channelName(element)];
|
|
140
|
+
if (!Array.isArray(channel) || channel.length === 0) continue;
|
|
141
|
+
const size = elementTypeSize(element.type);
|
|
142
|
+
for (let i = 0; i < count; i++) {
|
|
143
|
+
const base = i * stride + (element.offset || 0);
|
|
144
|
+
for (let component = 0; component < element.elementCount; component++) {
|
|
145
|
+
writeComponent(view, base + component * size, element.type, channel[i * element.elementCount + component]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
bytes,
|
|
151
|
+
stride,
|
|
152
|
+
count
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Concatenate index groups into index-buffer bytes.
|
|
158
|
+
*
|
|
159
|
+
* @param {Array<object>} groups Index groups with `faces` arrays.
|
|
160
|
+
* @returns {object} `{ bytes, stride, count }` (u16 unless any index needs u32).
|
|
161
|
+
*/
|
|
162
|
+
function packIndexBuffer(groups) {
|
|
163
|
+
const faces = [];
|
|
164
|
+
for (const group of groups || []) {
|
|
165
|
+
for (const index of group.faces || []) faces.push(index);
|
|
166
|
+
}
|
|
167
|
+
const wide = groups?.some(group => group.bytesPerIndex === 4) || faces.some(index => index > 0xffff);
|
|
168
|
+
const stride = wide ? 4 : 2;
|
|
169
|
+
const bytes = new Uint8Array(faces.length * stride);
|
|
170
|
+
const view = new DataView(bytes.buffer);
|
|
171
|
+
for (let i = 0; i < faces.length; i++) {
|
|
172
|
+
if (wide) view.setUint32(i * stride, faces[i], true);else view.setUint16(i * stride, faces[i], true);
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
bytes,
|
|
176
|
+
stride,
|
|
177
|
+
count: faces.length
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function assertCmfNativeSkeleton(skeleton) {
|
|
181
|
+
const bonesAreNames = Array.isArray(skeleton?.bones) && skeleton.bones.every(bone => typeof bone === "string");
|
|
182
|
+
if (!bonesAreNames) {
|
|
183
|
+
throw packError("skeletons must be CMF-native shaped (bones as name strings with parents/restTransforms); " + "GR2-shaped skeletons need conversion before writing");
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Pack a channel-carrying CMF-native graph into a writable graph + buffers.
|
|
189
|
+
*
|
|
190
|
+
* Buffer indices are reassigned uniquely across all meshes/LODs/morph
|
|
191
|
+
* targets; BufferViews are rebuilt from the packed bytes.
|
|
192
|
+
*
|
|
193
|
+
* @param {object} graph CMF-native graph carrying `vertex`/`indices` channel data.
|
|
194
|
+
* @returns {object} `{ graph, buffers }` ready for `writeCmf`.
|
|
195
|
+
*/
|
|
196
|
+
function packGraphBuffers(graph) {
|
|
197
|
+
const buffers = [null];
|
|
198
|
+
const allocate = bytes => {
|
|
199
|
+
const index = buffers.length;
|
|
200
|
+
buffers.push({
|
|
201
|
+
index,
|
|
202
|
+
data: bytes
|
|
203
|
+
});
|
|
204
|
+
return index;
|
|
205
|
+
};
|
|
206
|
+
for (const skeleton of graph.skeletons || []) assertCmfNativeSkeleton(skeleton);
|
|
207
|
+
const meshes = (graph.meshes || []).map(mesh => {
|
|
208
|
+
const decl = mesh.decl || [];
|
|
209
|
+
const morphDecl = mesh.morphTargets?.decl || [];
|
|
210
|
+
const lods = (mesh.lods || []).map(lod => {
|
|
211
|
+
const vertexSource = lod.vertex ?? mesh.vertex ?? {};
|
|
212
|
+
const indexSource = lod.indices ?? mesh.indices ?? [];
|
|
213
|
+
const packedVb = packVertexBuffer(decl, vertexSource);
|
|
214
|
+
const packedIb = packIndexBuffer(indexSource);
|
|
215
|
+
const vb = packedVb.count ? {
|
|
216
|
+
index: allocate(packedVb.bytes),
|
|
217
|
+
offset: 0,
|
|
218
|
+
size: packedVb.bytes.byteLength,
|
|
219
|
+
stride: packedVb.stride
|
|
220
|
+
} : {
|
|
221
|
+
index: 0,
|
|
222
|
+
offset: 0,
|
|
223
|
+
size: 0,
|
|
224
|
+
stride: 0
|
|
225
|
+
};
|
|
226
|
+
const ib = packedIb.count ? {
|
|
227
|
+
index: allocate(packedIb.bytes),
|
|
228
|
+
offset: 0,
|
|
229
|
+
size: packedIb.bytes.byteLength,
|
|
230
|
+
stride: packedIb.stride
|
|
231
|
+
} : {
|
|
232
|
+
index: 0,
|
|
233
|
+
offset: 0,
|
|
234
|
+
size: 0,
|
|
235
|
+
stride: 0
|
|
236
|
+
};
|
|
237
|
+
const morphTargets = (lod.morphTargets || []).map(target => {
|
|
238
|
+
const packed = packVertexBuffer(morphDecl, target.vertex || {});
|
|
239
|
+
return {
|
|
240
|
+
vb: packed.count ? {
|
|
241
|
+
index: allocate(packed.bytes),
|
|
242
|
+
offset: 0,
|
|
243
|
+
size: packed.bytes.byteLength,
|
|
244
|
+
stride: packed.stride
|
|
245
|
+
} : {
|
|
246
|
+
index: 0,
|
|
247
|
+
offset: 0,
|
|
248
|
+
size: 0,
|
|
249
|
+
stride: 0
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
return {
|
|
254
|
+
vb,
|
|
255
|
+
ib,
|
|
256
|
+
areas: lod.areas || [],
|
|
257
|
+
morphTargets,
|
|
258
|
+
threshold: lod.threshold ?? 0xffffffff
|
|
259
|
+
};
|
|
260
|
+
});
|
|
261
|
+
return {
|
|
262
|
+
...mesh,
|
|
263
|
+
lods
|
|
264
|
+
};
|
|
265
|
+
});
|
|
266
|
+
return {
|
|
267
|
+
graph: {
|
|
268
|
+
...graph,
|
|
269
|
+
meshes
|
|
270
|
+
},
|
|
271
|
+
buffers
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export { packGraphBuffers, packIndexBuffer, packVertexBuffer };
|
|
276
|
+
//# sourceMappingURL=pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sources":["../../../../../src/formats/cmf/core/pack.js"],"sourcesContent":["/**\n * GPU-buffer packing for CMF writing.\n *\n * `buildCmfFromShared` (and hand-built graphs) carry deinterleaved vertex\n * channels and index groups but no GPU bytes. This packer interleaves each\n * LOD's channels per the mesh declaration, packs index groups, assigns\n * unique buffer indices across the whole graph, and returns a graph + buffer\n * list ready for `writeCmf`. Skeletons and animations must already be\n * CMF-native shaped; GR2-shaped skeletons are rejected with a clear error\n * (GR2 bone/track conversion is a separate adapter).\n */\n\nconst CHANNEL_NAMES = Object.freeze({\n Position: \"position\",\n Normal: \"normal\",\n Tangent: \"tangent\",\n Binormal: \"binormal\",\n TexCoord: \"texcoord\",\n Color: \"color\",\n BoneIndices: \"blendIndice\",\n BoneWeights: \"blendWeight\",\n PackedTangent: \"packedTangent\",\n PackedTangentLegacy: \"packedTangentLegacy\"\n});\n\nfunction packError(message)\n{\n const error = new Error(`CMF pack: ${message}`);\n error.code = \"CJS_FORMAT_WRITE_ERROR\";\n return error;\n}\n\nfunction channelName(element)\n{\n const base = CHANNEL_NAMES[element.usage];\n if (!base) throw packError(`unknown vertex usage ${JSON.stringify(element.usage)}`);\n if (element.usage === \"TexCoord\" || element.usage === \"Color\") return `${base}${element.usageIndex}`;\n if (element.usageIndex > 0) return `${base}${element.usageIndex}`;\n return base;\n}\n\nfunction elementTypeSize(type)\n{\n switch (type)\n {\n case \"Float32\": return 4;\n case \"Float16\":\n case \"UInt16Norm\":\n case \"UInt16\":\n case \"Int16Norm\":\n case \"Int16\": return 2;\n case \"UInt8Norm\":\n case \"UInt8\":\n case \"Int8Norm\":\n case \"Int8\": return 1;\n default: throw packError(`unsupported vertex element type ${JSON.stringify(type)}`);\n }\n}\n\nfunction floatToHalf(value)\n{\n if (Number.isNaN(value)) return 0x7e00;\n if (value === Infinity) return 0x7c00;\n if (value === -Infinity) return 0xfc00;\n const sign = value < 0 || Object.is(value, -0) ? 0x8000 : 0;\n let v = Math.abs(value);\n if (v >= 65520) return sign | 0x7c00;\n if (v < Math.pow(2, -24)) return sign;\n if (v < Math.pow(2, -14))\n {\n return sign | Math.round(v / Math.pow(2, -24));\n }\n const exponent = Math.floor(Math.log2(v));\n const mantissa = Math.round((v / Math.pow(2, exponent) - 1) * 1024);\n if (mantissa === 1024) return sign | ((exponent + 16) << 10);\n return sign | ((exponent + 15) << 10) | mantissa;\n}\n\nfunction writeComponent(view, offset, type, value)\n{\n switch (type)\n {\n case \"Float32\": view.setFloat32(offset, value || 0, true); break;\n case \"Float16\": view.setUint16(offset, floatToHalf(value || 0), true); break;\n case \"UInt16Norm\": view.setUint16(offset, clampRound(value * 65535, 0, 65535), true); break;\n case \"UInt16\": view.setUint16(offset, clampRound(value, 0, 65535), true); break;\n case \"Int16Norm\": view.setInt16(offset, clampRound(value * 32767, -32767, 32767), true); break;\n case \"Int16\": view.setInt16(offset, clampRound(value, -32768, 32767), true); break;\n case \"UInt8Norm\": view.setUint8(offset, clampRound(value * 255, 0, 255)); break;\n case \"UInt8\": view.setUint8(offset, clampRound(value, 0, 255)); break;\n case \"Int8Norm\": view.setInt8(offset, clampRound(value * 127, -127, 127)); break;\n case \"Int8\": view.setInt8(offset, clampRound(value, -128, 127)); break;\n default: throw packError(`unsupported vertex element type ${JSON.stringify(type)}`);\n }\n}\n\nfunction clampRound(value, min, max)\n{\n const rounded = Math.round(value || 0);\n return rounded < min ? min : rounded > max ? max : rounded;\n}\n\nfunction vertexCountFor(decl, vertex)\n{\n let count = 0;\n for (const element of decl)\n {\n const channel = vertex[channelName(element)];\n if (!Array.isArray(channel) || channel.length === 0) continue;\n const channelCount = Math.floor(channel.length / element.elementCount);\n count = count === 0 ? channelCount : Math.min(count, channelCount);\n }\n return count;\n}\n\nfunction strideFor(decl)\n{\n return decl.reduce((stride, element) => Math.max(stride, (element.offset || 0) + element.elementCount * elementTypeSize(element.type)), 0);\n}\n\n/**\n * Interleave deinterleaved channels into vertex-buffer bytes per `decl`.\n *\n * @param {Array<object>} decl Vertex declaration.\n * @param {object} vertex Channel-name-keyed flat arrays.\n * @returns {object} `{ bytes, stride, count }`.\n */\nexport function packVertexBuffer(decl, vertex)\n{\n const stride = strideFor(decl);\n const count = vertexCountFor(decl, vertex || {});\n const bytes = new Uint8Array(count * stride);\n const view = new DataView(bytes.buffer);\n\n for (const element of decl)\n {\n const channel = (vertex || {})[channelName(element)];\n if (!Array.isArray(channel) || channel.length === 0) continue;\n const size = elementTypeSize(element.type);\n for (let i = 0; i < count; i++)\n {\n const base = i * stride + (element.offset || 0);\n for (let component = 0; component < element.elementCount; component++)\n {\n writeComponent(view, base + component * size, element.type, channel[i * element.elementCount + component]);\n }\n }\n }\n return { bytes, stride, count };\n}\n\n/**\n * Concatenate index groups into index-buffer bytes.\n *\n * @param {Array<object>} groups Index groups with `faces` arrays.\n * @returns {object} `{ bytes, stride, count }` (u16 unless any index needs u32).\n */\nexport function packIndexBuffer(groups)\n{\n const faces = [];\n for (const group of groups || [])\n {\n for (const index of group.faces || []) faces.push(index);\n }\n const wide = groups?.some((group) => group.bytesPerIndex === 4) || faces.some((index) => index > 0xffff);\n const stride = wide ? 4 : 2;\n const bytes = new Uint8Array(faces.length * stride);\n const view = new DataView(bytes.buffer);\n for (let i = 0; i < faces.length; i++)\n {\n if (wide) view.setUint32(i * stride, faces[i], true);\n else view.setUint16(i * stride, faces[i], true);\n }\n return { bytes, stride, count: faces.length };\n}\n\nfunction assertCmfNativeSkeleton(skeleton)\n{\n const bonesAreNames = Array.isArray(skeleton?.bones) &&\n skeleton.bones.every((bone) => typeof bone === \"string\");\n if (!bonesAreNames)\n {\n throw packError(\n \"skeletons must be CMF-native shaped (bones as name strings with parents/restTransforms); \" +\n \"GR2-shaped skeletons need conversion before writing\"\n );\n }\n}\n\n/**\n * Pack a channel-carrying CMF-native graph into a writable graph + buffers.\n *\n * Buffer indices are reassigned uniquely across all meshes/LODs/morph\n * targets; BufferViews are rebuilt from the packed bytes.\n *\n * @param {object} graph CMF-native graph carrying `vertex`/`indices` channel data.\n * @returns {object} `{ graph, buffers }` ready for `writeCmf`.\n */\nexport function packGraphBuffers(graph)\n{\n const buffers = [ null ];\n const allocate = (bytes) =>\n {\n const index = buffers.length;\n buffers.push({ index, data: bytes });\n return index;\n };\n\n for (const skeleton of graph.skeletons || []) assertCmfNativeSkeleton(skeleton);\n\n const meshes = (graph.meshes || []).map((mesh) =>\n {\n const decl = mesh.decl || [];\n const morphDecl = mesh.morphTargets?.decl || [];\n const lods = (mesh.lods || []).map((lod) =>\n {\n const vertexSource = lod.vertex ?? mesh.vertex ?? {};\n const indexSource = lod.indices ?? mesh.indices ?? [];\n const packedVb = packVertexBuffer(decl, vertexSource);\n const packedIb = packIndexBuffer(indexSource);\n\n const vb = packedVb.count\n ? { index: allocate(packedVb.bytes), offset: 0, size: packedVb.bytes.byteLength, stride: packedVb.stride }\n : { index: 0, offset: 0, size: 0, stride: 0 };\n const ib = packedIb.count\n ? { index: allocate(packedIb.bytes), offset: 0, size: packedIb.bytes.byteLength, stride: packedIb.stride }\n : { index: 0, offset: 0, size: 0, stride: 0 };\n\n const morphTargets = (lod.morphTargets || []).map((target) =>\n {\n const packed = packVertexBuffer(morphDecl, target.vertex || {});\n return {\n vb: packed.count\n ? { index: allocate(packed.bytes), offset: 0, size: packed.bytes.byteLength, stride: packed.stride }\n : { index: 0, offset: 0, size: 0, stride: 0 }\n };\n });\n\n return {\n vb,\n ib,\n areas: lod.areas || [],\n morphTargets,\n threshold: lod.threshold ?? 0xffffffff\n };\n });\n return { ...mesh, lods };\n });\n\n return {\n graph: { ...graph, meshes },\n buffers\n };\n}\n"],"names":["CHANNEL_NAMES","Object","freeze","Position","Normal","Tangent","Binormal","TexCoord","Color","BoneIndices","BoneWeights","PackedTangent","PackedTangentLegacy","packError","message","error","Error","code","channelName","element","base","usage","JSON","stringify","usageIndex","elementTypeSize","type","floatToHalf","value","Number","isNaN","Infinity","sign","is","v","Math","abs","pow","round","exponent","floor","log2","mantissa","writeComponent","view","offset","setFloat32","setUint16","clampRound","setInt16","setUint8","setInt8","min","max","rounded","vertexCountFor","decl","vertex","count","channel","Array","isArray","length","channelCount","elementCount","strideFor","reduce","stride","packVertexBuffer","bytes","Uint8Array","DataView","buffer","size","i","component","packIndexBuffer","groups","faces","group","index","push","wide","some","bytesPerIndex","setUint32","assertCmfNativeSkeleton","skeleton","bonesAreNames","bones","every","bone","packGraphBuffers","graph","buffers","allocate","data","skeletons","meshes","map","mesh","morphDecl","morphTargets","lods","lod","vertexSource","indexSource","indices","packedVb","packedIb","vb","byteLength","ib","target","packed","areas","threshold"],"mappings":"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"}
|