@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,517 @@
|
|
|
1
|
+
import { MeshoptEncoder } from 'meshoptimizer/encoder';
|
|
2
|
+
import { STRUCT_SIZE, FILE_SIGNATURE, FILE_VERSION, SectionType, SectionCompression, MeshTopology, AnimationChannelTargetType, Interpolation, ElementType, Usage } from './constants.js';
|
|
3
|
+
import { crc32 } from './binary.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Binary CMF v1 writer.
|
|
7
|
+
*
|
|
8
|
+
* Mirrors CarbonEngine's `cmf::BuildFile`: the object graph is flattened into
|
|
9
|
+
* the Data section as structs with self-relative tagged span offsets
|
|
10
|
+
* (depth-first in member order, 8-byte chunk alignment, identical leaf chunks
|
|
11
|
+
* deduplicated), GPU buffers referenced by BufferViews become one section
|
|
12
|
+
* each (remapped to section indices in first-encounter order, meshoptimizer
|
|
13
|
+
* compressed by default), optional metadata flattens into a trailing section,
|
|
14
|
+
* and the header CRC covers everything after the crc32 field.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const textEncoder = new TextEncoder();
|
|
18
|
+
let encoderReady = false;
|
|
19
|
+
MeshoptEncoder.ready.then(() => {
|
|
20
|
+
encoderReady = true;
|
|
21
|
+
});
|
|
22
|
+
function writeError(message) {
|
|
23
|
+
const error = new Error(`CMF write: ${message}`);
|
|
24
|
+
error.code = "CJS_FORMAT_WRITE_ERROR";
|
|
25
|
+
return error;
|
|
26
|
+
}
|
|
27
|
+
function enumValue(names, value, label) {
|
|
28
|
+
if (typeof value === "number") return value;
|
|
29
|
+
const index = names.indexOf(value);
|
|
30
|
+
if (index >= 0) return index;
|
|
31
|
+
const unknown = /^Unknown\((\d+)\)$/u.exec(String(value ?? ""));
|
|
32
|
+
if (unknown) return Number(unknown[1]);
|
|
33
|
+
throw writeError(`unknown ${label} value ${JSON.stringify(value)}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Growable little-endian struct buffer with tagged span support.
|
|
38
|
+
*/
|
|
39
|
+
class Flattener {
|
|
40
|
+
#bytes = new Uint8Array(1024);
|
|
41
|
+
#view = new DataView(this.#bytes.buffer);
|
|
42
|
+
#chunkCache = new Map();
|
|
43
|
+
size = 0;
|
|
44
|
+
#ensure(capacity) {
|
|
45
|
+
if (capacity <= this.#bytes.length) return;
|
|
46
|
+
let next = this.#bytes.length * 2;
|
|
47
|
+
while (next < capacity) next *= 2;
|
|
48
|
+
const grown = new Uint8Array(next);
|
|
49
|
+
grown.set(this.#bytes.subarray(0, this.size));
|
|
50
|
+
this.#bytes = grown;
|
|
51
|
+
this.#view = new DataView(grown.buffer);
|
|
52
|
+
}
|
|
53
|
+
reserve(byteLength) {
|
|
54
|
+
const offset = this.size;
|
|
55
|
+
this.#ensure(offset + byteLength);
|
|
56
|
+
this.#bytes.fill(0, offset, offset + byteLength);
|
|
57
|
+
this.size = offset + byteLength;
|
|
58
|
+
return offset;
|
|
59
|
+
}
|
|
60
|
+
reserveAligned(byteLength, alignment = 8) {
|
|
61
|
+
const padded = Math.ceil(this.size / alignment) * alignment;
|
|
62
|
+
this.#ensure(padded);
|
|
63
|
+
this.#bytes.fill(0, this.size, padded);
|
|
64
|
+
this.size = padded;
|
|
65
|
+
return this.reserve(byteLength);
|
|
66
|
+
}
|
|
67
|
+
u8(offset, value) {
|
|
68
|
+
this.#view.setUint8(offset, value);
|
|
69
|
+
}
|
|
70
|
+
u16(offset, value) {
|
|
71
|
+
this.#view.setUint16(offset, value, true);
|
|
72
|
+
}
|
|
73
|
+
u32(offset, value) {
|
|
74
|
+
this.#view.setUint32(offset, value >>> 0, true);
|
|
75
|
+
}
|
|
76
|
+
f32(offset, value) {
|
|
77
|
+
this.#view.setFloat32(offset, value || 0, true);
|
|
78
|
+
}
|
|
79
|
+
i64(offset, value) {
|
|
80
|
+
this.#view.setBigInt64(offset, BigInt(value), true);
|
|
81
|
+
}
|
|
82
|
+
u64(offset, value) {
|
|
83
|
+
this.#view.setBigUint64(offset, BigInt(value), true);
|
|
84
|
+
}
|
|
85
|
+
setBytes(offset, bytes) {
|
|
86
|
+
this.#bytes.set(bytes, offset);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Write a span field and append its element chunk.
|
|
91
|
+
*
|
|
92
|
+
* `writeElement(flattener, offset, element)` may itself append nested
|
|
93
|
+
* chunks; leaf chunks (`dedup: true`) are shared when byte-identical,
|
|
94
|
+
* matching the reference writer.
|
|
95
|
+
*/
|
|
96
|
+
span(fieldOffset, elements, elementSize, writeElement, {
|
|
97
|
+
dedup = false
|
|
98
|
+
} = {}) {
|
|
99
|
+
const count = elements ? elements.length : 0;
|
|
100
|
+
const byteSize = count * elementSize;
|
|
101
|
+
if (byteSize === 0) {
|
|
102
|
+
// tagged self-relative offset of 0 keeps span pointers valid
|
|
103
|
+
this.i64(fieldOffset, 1);
|
|
104
|
+
this.u64(fieldOffset + 8, 0);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (dedup) {
|
|
108
|
+
const scratch = new Flattener();
|
|
109
|
+
const scratchOffset = scratch.reserve(byteSize);
|
|
110
|
+
for (let i = 0; i < count; i++) writeElement(scratch, scratchOffset + i * elementSize, elements[i]);
|
|
111
|
+
const chunk = scratch.bytes();
|
|
112
|
+
const key = chunkKey(chunk);
|
|
113
|
+
const cached = this.#chunkCache.get(key);
|
|
114
|
+
if (cached !== undefined && bytesEqual(this.#bytes, cached, chunk)) {
|
|
115
|
+
this.i64(fieldOffset, cached - fieldOffset | 1);
|
|
116
|
+
this.u64(fieldOffset + 8, byteSize);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const chunkOffset = this.reserveAligned(byteSize);
|
|
120
|
+
this.setBytes(chunkOffset, chunk);
|
|
121
|
+
this.#chunkCache.set(key, chunkOffset);
|
|
122
|
+
this.i64(fieldOffset, chunkOffset - fieldOffset | 1);
|
|
123
|
+
this.u64(fieldOffset + 8, byteSize);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const chunkOffset = this.reserveAligned(byteSize);
|
|
127
|
+
this.i64(fieldOffset, chunkOffset - fieldOffset | 1);
|
|
128
|
+
this.u64(fieldOffset + 8, byteSize);
|
|
129
|
+
for (let i = 0; i < count; i++) writeElement(this, chunkOffset + i * elementSize, elements[i]);
|
|
130
|
+
}
|
|
131
|
+
string(fieldOffset, value) {
|
|
132
|
+
const encoded = textEncoder.encode(value || "");
|
|
133
|
+
this.span(fieldOffset, encoded, 1, (buffer, offset, byte) => buffer.u8(offset, byte), {
|
|
134
|
+
dedup: true
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
bytes() {
|
|
138
|
+
return this.#bytes.slice(0, this.size);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function chunkKey(bytes) {
|
|
142
|
+
let hash = 2166136261 >>> 0;
|
|
143
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
144
|
+
hash = Math.imul(hash, 16777619) >>> 0;
|
|
145
|
+
hash = (hash ^ bytes[i]) >>> 0;
|
|
146
|
+
}
|
|
147
|
+
return `${bytes.length}:${hash}`;
|
|
148
|
+
}
|
|
149
|
+
function bytesEqual(target, offset, chunk) {
|
|
150
|
+
for (let i = 0; i < chunk.length; i++) {
|
|
151
|
+
if (target[offset + i] !== chunk[i]) return false;
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
function writeBounds(buffer, offset, bounds) {
|
|
156
|
+
const min = bounds?.min || [0, 0, 0];
|
|
157
|
+
const max = bounds?.max || [0, 0, 0];
|
|
158
|
+
for (let i = 0; i < 3; i++) buffer.f32(offset + i * 4, min[i]);
|
|
159
|
+
for (let i = 0; i < 3; i++) buffer.f32(offset + 12 + i * 4, max[i]);
|
|
160
|
+
}
|
|
161
|
+
function writeBufferView(buffer, offset, view, remap) {
|
|
162
|
+
const size = view?.size || 0;
|
|
163
|
+
const index = view?.index || 0;
|
|
164
|
+
buffer.u32(offset, size === 0 ? index : remap.get(index) ?? index);
|
|
165
|
+
buffer.u32(offset + 4, view?.offset || 0);
|
|
166
|
+
buffer.u32(offset + 8, size);
|
|
167
|
+
buffer.u32(offset + 12, view?.stride || 0);
|
|
168
|
+
}
|
|
169
|
+
function writeVertexElement(buffer, offset, element) {
|
|
170
|
+
buffer.u8(offset, enumValue(Usage, element.usage, "vertex usage"));
|
|
171
|
+
buffer.u8(offset + 1, element.usageIndex || 0);
|
|
172
|
+
buffer.u8(offset + 2, enumValue(ElementType, element.type, "element type"));
|
|
173
|
+
buffer.u8(offset + 3, element.elementCount || 0);
|
|
174
|
+
buffer.u32(offset + 4, element.offset || 0);
|
|
175
|
+
}
|
|
176
|
+
function writeData(buffer, offset, graph, remap) {
|
|
177
|
+
const writeMesh = (target, meshOffset, mesh) => {
|
|
178
|
+
target.string(meshOffset, mesh.name);
|
|
179
|
+
target.span(meshOffset + 16, mesh.decl || [], STRUCT_SIZE.VertexElement, writeVertexElement, {
|
|
180
|
+
dedup: true
|
|
181
|
+
});
|
|
182
|
+
target.span(meshOffset + 32, mesh.lods || [], STRUCT_SIZE.MeshLod, (lodTarget, lodOffset, lod) => {
|
|
183
|
+
writeBufferView(lodTarget, lodOffset, lod.vb, remap);
|
|
184
|
+
writeBufferView(lodTarget, lodOffset + 16, lod.ib, remap);
|
|
185
|
+
lodTarget.span(lodOffset + 32, lod.areas || [], STRUCT_SIZE.LodMeshArea, (areaTarget, areaOffset, area) => {
|
|
186
|
+
areaTarget.u32(areaOffset, area.firstElement || 0);
|
|
187
|
+
areaTarget.u32(areaOffset + 4, area.elementCount || 0);
|
|
188
|
+
}, {
|
|
189
|
+
dedup: true
|
|
190
|
+
});
|
|
191
|
+
lodTarget.span(lodOffset + 48, lod.morphTargets || [], STRUCT_SIZE.LodMorphTarget, (morphTarget, morphOffset, morph) => {
|
|
192
|
+
writeBufferView(morphTarget, morphOffset, morph.vb, remap);
|
|
193
|
+
});
|
|
194
|
+
lodTarget.u32(lodOffset + 64, lod.threshold ?? 0xffffffff);
|
|
195
|
+
});
|
|
196
|
+
target.span(meshOffset + 48, mesh.areas || [], STRUCT_SIZE.MeshArea, (areaTarget, areaOffset, area) => {
|
|
197
|
+
areaTarget.string(areaOffset, area.name);
|
|
198
|
+
writeBounds(areaTarget, areaOffset + 16, area.bounds);
|
|
199
|
+
areaTarget.span(areaOffset + 40, area.bones || [], 2, (boneTarget, boneOffset, bone) => boneTarget.u16(boneOffset, bone), {
|
|
200
|
+
dedup: true
|
|
201
|
+
});
|
|
202
|
+
areaTarget.u8(areaOffset + 56, area.affectedByBones ? 1 : 0);
|
|
203
|
+
areaTarget.u8(areaOffset + 57, area.affectedByMorphTargets ? 1 : 0);
|
|
204
|
+
});
|
|
205
|
+
target.span(meshOffset + 64, mesh.boneBindings || [], STRUCT_SIZE.BoneBinding, (bindingTarget, bindingOffset, binding) => {
|
|
206
|
+
bindingTarget.string(bindingOffset, binding.name);
|
|
207
|
+
writeBounds(bindingTarget, bindingOffset + 16, binding.bounds);
|
|
208
|
+
});
|
|
209
|
+
target.span(meshOffset + 80, mesh.morphTargets?.decl || [], STRUCT_SIZE.VertexElement, writeVertexElement, {
|
|
210
|
+
dedup: true
|
|
211
|
+
});
|
|
212
|
+
target.span(meshOffset + 96, mesh.morphTargets?.targets || [], STRUCT_SIZE.MorphTarget, (morphTarget, morphOffset, morph) => {
|
|
213
|
+
morphTarget.string(morphOffset, morph.name);
|
|
214
|
+
morphTarget.f32(morphOffset + 16, morph.maxDisplacement || 0);
|
|
215
|
+
});
|
|
216
|
+
target.span(meshOffset + 112, mesh.uvDensities || [], 4, (densityTarget, densityOffset, value) => densityTarget.f32(densityOffset, value), {
|
|
217
|
+
dedup: true
|
|
218
|
+
});
|
|
219
|
+
writeBounds(target, meshOffset + 128, mesh.bounds);
|
|
220
|
+
const occlusion = mesh.audioOcclusionMesh || {};
|
|
221
|
+
target.span(meshOffset + 152, occlusion.vertices || [], 12, (vertexTarget, vertexOffset, vertex) => {
|
|
222
|
+
for (let i = 0; i < 3; i++) vertexTarget.f32(vertexOffset + i * 4, vertex[i]);
|
|
223
|
+
}, {
|
|
224
|
+
dedup: true
|
|
225
|
+
});
|
|
226
|
+
target.span(meshOffset + 168, occlusion.indices || [], 2, (indexTarget, indexOffset, index) => indexTarget.u16(indexOffset, index), {
|
|
227
|
+
dedup: true
|
|
228
|
+
});
|
|
229
|
+
writeBounds(target, meshOffset + 184, occlusion.bounds);
|
|
230
|
+
target.u8(meshOffset + 208, enumValue(MeshTopology, mesh.topology ?? "TriangleList", "topology"));
|
|
231
|
+
target.u8(meshOffset + 209, mesh.skeleton === null || mesh.skeleton === undefined ? 0xff : mesh.skeleton);
|
|
232
|
+
};
|
|
233
|
+
const writeSkeleton = (target, skeletonOffset, skeleton) => {
|
|
234
|
+
if ((skeleton.bones || []).some(bone => typeof bone !== "string")) {
|
|
235
|
+
throw writeError("skeleton bones must be name strings; GR2-shaped skeletons need conversion (use writeShared) before writing");
|
|
236
|
+
}
|
|
237
|
+
target.string(skeletonOffset, skeleton.name);
|
|
238
|
+
target.span(skeletonOffset + 16, skeleton.bones || [], 16, (boneTarget, boneOffset, bone) => boneTarget.string(boneOffset, bone));
|
|
239
|
+
target.span(skeletonOffset + 32, skeleton.parents || [], 4, (parentTarget, parentOffset, parent) => parentTarget.u32(parentOffset, parent), {
|
|
240
|
+
dedup: true
|
|
241
|
+
});
|
|
242
|
+
target.span(skeletonOffset + 48, skeleton.restTransforms || [], STRUCT_SIZE.Transform, (transformTarget, transformOffset, transform) => {
|
|
243
|
+
const position = transform.position || [0, 0, 0];
|
|
244
|
+
const rotation = transform.rotation || [0, 0, 0, 1];
|
|
245
|
+
const scale = transform.scale || [1, 1, 1];
|
|
246
|
+
for (let i = 0; i < 3; i++) transformTarget.f32(transformOffset + i * 4, position[i]);
|
|
247
|
+
for (let i = 0; i < 4; i++) transformTarget.f32(transformOffset + 12 + i * 4, rotation[i]);
|
|
248
|
+
for (let i = 0; i < 3; i++) transformTarget.f32(transformOffset + 28 + i * 4, scale[i]);
|
|
249
|
+
}, {
|
|
250
|
+
dedup: true
|
|
251
|
+
});
|
|
252
|
+
target.span(skeletonOffset + 64, skeleton.invBindTransforms || [], 64, (matrixTarget, matrixOffset, matrix) => {
|
|
253
|
+
for (let i = 0; i < 16; i++) matrixTarget.f32(matrixOffset + i * 4, matrix[i]);
|
|
254
|
+
}, {
|
|
255
|
+
dedup: true
|
|
256
|
+
});
|
|
257
|
+
target.span(skeletonOffset + 80, skeleton.boneMasks || [], STRUCT_SIZE.BoneMask, (maskTarget, maskOffset, mask) => {
|
|
258
|
+
maskTarget.string(maskOffset, mask.name);
|
|
259
|
+
maskTarget.span(maskOffset + 16, mask.weights || [], STRUCT_SIZE.BoneWeight, (weightTarget, weightOffset, weight) => {
|
|
260
|
+
weightTarget.u32(weightOffset, weight.index || 0);
|
|
261
|
+
weightTarget.f32(weightOffset + 4, weight.weight ?? 1);
|
|
262
|
+
}, {
|
|
263
|
+
dedup: true
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
};
|
|
267
|
+
const writeAnimation = (target, animationOffset, animation) => {
|
|
268
|
+
target.string(animationOffset, animation.name);
|
|
269
|
+
target.span(animationOffset + 16, animation.channels || [], STRUCT_SIZE.AnimationChannel, (channelTarget, channelOffset, channel) => {
|
|
270
|
+
channelTarget.string(channelOffset, channel.target);
|
|
271
|
+
channelTarget.u8(channelOffset + 16, enumValue(AnimationChannelTargetType, channel.targetType, "channel target type"));
|
|
272
|
+
channelTarget.u32(channelOffset + 20, channel.curveIndex || 0);
|
|
273
|
+
});
|
|
274
|
+
target.span(animationOffset + 32, animation.curves || [], STRUCT_SIZE.AnimationCurve, (curveTarget, curveOffset, curve) => {
|
|
275
|
+
curveTarget.u8(curveOffset, curve.valueDimension || 0);
|
|
276
|
+
curveTarget.u8(curveOffset + 1, enumValue(Interpolation, curve.interpolation, "interpolation"));
|
|
277
|
+
curveTarget.u8(curveOffset + 2, enumValue(ElementType, curve.knotType, "knot type"));
|
|
278
|
+
curveTarget.u8(curveOffset + 3, enumValue(ElementType, curve.valueType, "value type"));
|
|
279
|
+
curveTarget.u32(curveOffset + 4, curve.knotCount || 0);
|
|
280
|
+
curveTarget.span(curveOffset + 8, curve.knots || [], 1, (knotTarget, knotOffset, knot) => knotTarget.u8(knotOffset, knot), {
|
|
281
|
+
dedup: true
|
|
282
|
+
});
|
|
283
|
+
curveTarget.span(curveOffset + 24, curve.values || [], 1, (valueTarget, valueOffset, value) => valueTarget.u8(valueOffset, value), {
|
|
284
|
+
dedup: true
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
target.f32(animationOffset + 48, animation.duration || 0);
|
|
288
|
+
};
|
|
289
|
+
buffer.span(offset, graph.meshes || [], STRUCT_SIZE.Mesh, writeMesh);
|
|
290
|
+
buffer.span(offset + 16, graph.skeletons || [], STRUCT_SIZE.Skeleton, writeSkeleton);
|
|
291
|
+
buffer.span(offset + 32, graph.animations || [], STRUCT_SIZE.Animation, writeAnimation);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Collect BufferView usage in reference-writer order and decide per-buffer
|
|
296
|
+
* compression (conflicting stride/kind across views falls back to None).
|
|
297
|
+
*/
|
|
298
|
+
function collectBufferRecords(graph, compress) {
|
|
299
|
+
const records = [];
|
|
300
|
+
const recordsByIndex = new Map();
|
|
301
|
+
const visit = (view, compression) => {
|
|
302
|
+
if (!view || !view.size) return;
|
|
303
|
+
const existing = recordsByIndex.get(view.index);
|
|
304
|
+
if (!existing) {
|
|
305
|
+
const record = {
|
|
306
|
+
index: view.index,
|
|
307
|
+
stride: view.stride || 0,
|
|
308
|
+
compression: compress ? compression : "None"
|
|
309
|
+
};
|
|
310
|
+
records.push(record);
|
|
311
|
+
recordsByIndex.set(view.index, record);
|
|
312
|
+
} else if (existing.stride !== (view.stride || 0) || (compress ? compression : "None") !== existing.compression) {
|
|
313
|
+
existing.stride = 0;
|
|
314
|
+
existing.compression = "None";
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
for (const mesh of graph.meshes || []) {
|
|
318
|
+
for (const lod of mesh.lods || []) {
|
|
319
|
+
visit(lod.vb, "MeshOptimizerVertexBuffer");
|
|
320
|
+
visit(lod.ib, "MeshOptimizerIndexBuffer");
|
|
321
|
+
for (const morph of lod.morphTargets || []) {
|
|
322
|
+
visit(morph.vb, "MeshOptimizerVertexBuffer");
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return records;
|
|
327
|
+
}
|
|
328
|
+
function resolveBufferBytes(graph, record) {
|
|
329
|
+
const buffers = graph.buffers || [];
|
|
330
|
+
const entry = buffers.find?.(buffer => buffer && buffer.index === record.index) ?? buffers[record.index];
|
|
331
|
+
const data = entry?.data ?? (entry instanceof Uint8Array ? entry : null);
|
|
332
|
+
if (!data) {
|
|
333
|
+
throw writeError(`no buffer data supplied for BufferView index ${record.index}`);
|
|
334
|
+
}
|
|
335
|
+
return data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
336
|
+
}
|
|
337
|
+
function compressBuffer(bytes, record) {
|
|
338
|
+
if (record.compression === "None" || bytes.byteLength === 0) {
|
|
339
|
+
return {
|
|
340
|
+
data: bytes,
|
|
341
|
+
compression: "None",
|
|
342
|
+
gpuAlignment: record.stride
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
if (!encoderReady) {
|
|
346
|
+
throw writeError("compressed output requires writeAsync/WriteAsync so meshoptimizer can initialize (or pass compress: false)");
|
|
347
|
+
}
|
|
348
|
+
if (record.compression === "MeshOptimizerVertexBuffer") {
|
|
349
|
+
if (record.stride === 0 || bytes.byteLength % record.stride !== 0) {
|
|
350
|
+
return {
|
|
351
|
+
data: bytes,
|
|
352
|
+
compression: "None",
|
|
353
|
+
gpuAlignment: record.stride
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
const count = bytes.byteLength / record.stride;
|
|
357
|
+
const data = MeshoptEncoder.encodeVertexBuffer(bytes, count, record.stride);
|
|
358
|
+
return {
|
|
359
|
+
data,
|
|
360
|
+
compression: "MeshOptimizerVertexBuffer",
|
|
361
|
+
gpuAlignment: record.stride
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// index buffers: meshopt encodes triangle lists of u32; u16 sources widen
|
|
366
|
+
const stride = record.stride;
|
|
367
|
+
if (stride !== 2 && stride !== 4 || bytes.byteLength % stride !== 0) {
|
|
368
|
+
return {
|
|
369
|
+
data: bytes,
|
|
370
|
+
compression: "None",
|
|
371
|
+
gpuAlignment: stride
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
const count = bytes.byteLength / stride;
|
|
375
|
+
if (count % 3 !== 0) {
|
|
376
|
+
return {
|
|
377
|
+
data: bytes,
|
|
378
|
+
compression: "None",
|
|
379
|
+
gpuAlignment: stride
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
let source = bytes;
|
|
383
|
+
if (stride === 2) {
|
|
384
|
+
const wide = new Uint32Array(count);
|
|
385
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
386
|
+
for (let i = 0; i < count; i++) wide[i] = view.getUint16(i * 2, true);
|
|
387
|
+
source = new Uint8Array(wide.buffer);
|
|
388
|
+
}
|
|
389
|
+
const data = MeshoptEncoder.encodeIndexBuffer(source, count, 4);
|
|
390
|
+
return {
|
|
391
|
+
data,
|
|
392
|
+
compression: "MeshOptimizerIndexBuffer",
|
|
393
|
+
gpuAlignment: stride
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Serialize a CMF-native graph into .cmf bytes.
|
|
399
|
+
*
|
|
400
|
+
* @param {object} graph Native graph: `{ meshes, skeletons, animations, metadata?, buffers? }`
|
|
401
|
+
* where `buffers` supplies uncompressed GPU bytes for each BufferView
|
|
402
|
+
* `index` (as `{ index, data }` entries or an index-keyed array).
|
|
403
|
+
* @param {object} [options] `compress` (default false for the sync writer)
|
|
404
|
+
* enables meshoptimizer vertex/index compression.
|
|
405
|
+
* @returns {Uint8Array} Complete .cmf file bytes.
|
|
406
|
+
*/
|
|
407
|
+
function writeCmf(graph, options = {}) {
|
|
408
|
+
if (!graph || typeof graph !== "object") {
|
|
409
|
+
throw writeError("input graph must be an object");
|
|
410
|
+
}
|
|
411
|
+
const compress = options.compress === true;
|
|
412
|
+
const records = collectBufferRecords(graph, compress);
|
|
413
|
+
const compressed = records.map(record => {
|
|
414
|
+
const bytes = resolveBufferBytes(graph, record);
|
|
415
|
+
return {
|
|
416
|
+
record,
|
|
417
|
+
...compressBuffer(bytes, record),
|
|
418
|
+
uncompressedSize: bytes.byteLength
|
|
419
|
+
};
|
|
420
|
+
});
|
|
421
|
+
const remap = new Map(records.map((record, position) => [record.index, position + 1]));
|
|
422
|
+
const data = new Flattener();
|
|
423
|
+
data.reserve(STRUCT_SIZE.Data);
|
|
424
|
+
writeData(data, 0, graph, remap);
|
|
425
|
+
const dataBytes = data.bytes();
|
|
426
|
+
let metadataBytes = null;
|
|
427
|
+
if (graph.metadata && (graph.metadata.entries || []).length) {
|
|
428
|
+
const metadata = new Flattener();
|
|
429
|
+
metadata.reserve(STRUCT_SIZE.Metadata);
|
|
430
|
+
metadata.span(0, graph.metadata.entries, STRUCT_SIZE.MetadataEntry, (target, offset, entry) => {
|
|
431
|
+
target.string(offset, entry.key);
|
|
432
|
+
target.string(offset + 16, entry.value);
|
|
433
|
+
});
|
|
434
|
+
metadataBytes = metadata.bytes();
|
|
435
|
+
}
|
|
436
|
+
const sections = [{
|
|
437
|
+
type: "Data",
|
|
438
|
+
compression: "None",
|
|
439
|
+
gpuAlignment: 0,
|
|
440
|
+
compressedSize: dataBytes.byteLength,
|
|
441
|
+
uncompressedSize: dataBytes.byteLength,
|
|
442
|
+
data: dataBytes
|
|
443
|
+
}];
|
|
444
|
+
for (const entry of compressed) {
|
|
445
|
+
sections.push({
|
|
446
|
+
type: "GpuBuffer",
|
|
447
|
+
compression: entry.compression,
|
|
448
|
+
gpuAlignment: entry.gpuAlignment,
|
|
449
|
+
compressedSize: entry.data.byteLength,
|
|
450
|
+
uncompressedSize: entry.uncompressedSize,
|
|
451
|
+
data: entry.data
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
if (metadataBytes) {
|
|
455
|
+
sections.push({
|
|
456
|
+
type: "Metadata",
|
|
457
|
+
compression: "None",
|
|
458
|
+
gpuAlignment: 0,
|
|
459
|
+
compressedSize: metadataBytes.byteLength,
|
|
460
|
+
uncompressedSize: metadataBytes.byteLength,
|
|
461
|
+
data: metadataBytes
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
const header = new Flattener();
|
|
465
|
+
header.reserve(STRUCT_SIZE.Header);
|
|
466
|
+
header.u32(0, FILE_SIGNATURE);
|
|
467
|
+
header.u32(4, FILE_VERSION);
|
|
468
|
+
header.span(16, sections, STRUCT_SIZE.Section, () => {});
|
|
469
|
+
const headerSize = header.size;
|
|
470
|
+
header.u32(8, headerSize);
|
|
471
|
+
let offset = headerSize;
|
|
472
|
+
const sectionOffsets = sections.map(section => {
|
|
473
|
+
offset = Math.ceil(offset / 8) * 8;
|
|
474
|
+
const sectionOffset = offset;
|
|
475
|
+
offset += section.compressedSize;
|
|
476
|
+
return sectionOffset;
|
|
477
|
+
});
|
|
478
|
+
const sectionsChunk = headerSize - sections.length * STRUCT_SIZE.Section;
|
|
479
|
+
sections.forEach((section, index) => {
|
|
480
|
+
const base = sectionsChunk + index * STRUCT_SIZE.Section;
|
|
481
|
+
header.u32(base, sectionOffsets[index]);
|
|
482
|
+
header.u32(base + 4, section.compressedSize);
|
|
483
|
+
header.u32(base + 8, section.uncompressedSize);
|
|
484
|
+
header.u16(base + 12, section.gpuAlignment || 0);
|
|
485
|
+
header.u8(base + 14, enumValue(SectionType, section.type, "section type"));
|
|
486
|
+
header.u8(base + 15, enumValue(SectionCompression, section.compression, "section compression"));
|
|
487
|
+
});
|
|
488
|
+
const total = offset;
|
|
489
|
+
const file = new Uint8Array(total);
|
|
490
|
+
file.set(header.bytes(), 0);
|
|
491
|
+
sections.forEach((section, index) => {
|
|
492
|
+
file.set(section.data, sectionOffsets[index]);
|
|
493
|
+
});
|
|
494
|
+
const checksum = crc32(file, 16, file.byteLength);
|
|
495
|
+
new DataView(file.buffer).setUint32(12, checksum, true);
|
|
496
|
+
return file;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Serialize a CMF-native graph asynchronously with compression enabled by
|
|
501
|
+
* default (awaits meshoptimizer encoder initialization).
|
|
502
|
+
*
|
|
503
|
+
* @param {object} graph Native graph (see `writeCmf`).
|
|
504
|
+
* @param {object} [options] `compress` defaults to true.
|
|
505
|
+
* @returns {Promise<Uint8Array>} Complete .cmf file bytes.
|
|
506
|
+
*/
|
|
507
|
+
async function writeCmfAsync(graph, options = {}) {
|
|
508
|
+
await MeshoptEncoder.ready;
|
|
509
|
+
encoderReady = true;
|
|
510
|
+
return writeCmf(graph, {
|
|
511
|
+
...options,
|
|
512
|
+
compress: options.compress !== false
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
export { writeCmf, writeCmfAsync };
|
|
517
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sources":["../../../../../src/formats/cmf/core/writer.js"],"sourcesContent":["import { MeshoptEncoder } from \"meshoptimizer/encoder\";\nimport {\n AnimationChannelTargetType,\n ElementType,\n FILE_SIGNATURE,\n FILE_VERSION,\n Interpolation,\n MeshTopology,\n STRUCT_SIZE,\n SectionCompression,\n SectionType,\n Usage\n} from \"./constants.js\";\nimport { crc32 } from \"./binary.js\";\n\n/**\n * Binary CMF v1 writer.\n *\n * Mirrors CarbonEngine's `cmf::BuildFile`: the object graph is flattened into\n * the Data section as structs with self-relative tagged span offsets\n * (depth-first in member order, 8-byte chunk alignment, identical leaf chunks\n * deduplicated), GPU buffers referenced by BufferViews become one section\n * each (remapped to section indices in first-encounter order, meshoptimizer\n * compressed by default), optional metadata flattens into a trailing section,\n * and the header CRC covers everything after the crc32 field.\n */\n\nconst textEncoder = new TextEncoder();\n\nlet encoderReady = false;\nMeshoptEncoder.ready.then(() => { encoderReady = true; });\n\nfunction writeError(message)\n{\n const error = new Error(`CMF write: ${message}`);\n error.code = \"CJS_FORMAT_WRITE_ERROR\";\n return error;\n}\n\nfunction enumValue(names, value, label)\n{\n if (typeof value === \"number\") return value;\n const index = names.indexOf(value);\n if (index >= 0) return index;\n const unknown = /^Unknown\\((\\d+)\\)$/u.exec(String(value ?? \"\"));\n if (unknown) return Number(unknown[1]);\n throw writeError(`unknown ${label} value ${JSON.stringify(value)}`);\n}\n\n/**\n * Growable little-endian struct buffer with tagged span support.\n */\nclass Flattener\n{\n #bytes = new Uint8Array(1024);\n #view = new DataView(this.#bytes.buffer);\n #chunkCache = new Map();\n size = 0;\n\n #ensure(capacity)\n {\n if (capacity <= this.#bytes.length) return;\n let next = this.#bytes.length * 2;\n while (next < capacity) next *= 2;\n const grown = new Uint8Array(next);\n grown.set(this.#bytes.subarray(0, this.size));\n this.#bytes = grown;\n this.#view = new DataView(grown.buffer);\n }\n\n reserve(byteLength)\n {\n const offset = this.size;\n this.#ensure(offset + byteLength);\n this.#bytes.fill(0, offset, offset + byteLength);\n this.size = offset + byteLength;\n return offset;\n }\n\n reserveAligned(byteLength, alignment = 8)\n {\n const padded = Math.ceil(this.size / alignment) * alignment;\n this.#ensure(padded);\n this.#bytes.fill(0, this.size, padded);\n this.size = padded;\n return this.reserve(byteLength);\n }\n\n u8(offset, value) { this.#view.setUint8(offset, value); }\n u16(offset, value) { this.#view.setUint16(offset, value, true); }\n u32(offset, value) { this.#view.setUint32(offset, value >>> 0, true); }\n f32(offset, value) { this.#view.setFloat32(offset, value || 0, true); }\n i64(offset, value) { this.#view.setBigInt64(offset, BigInt(value), true); }\n u64(offset, value) { this.#view.setBigUint64(offset, BigInt(value), true); }\n\n setBytes(offset, bytes)\n {\n this.#bytes.set(bytes, offset);\n }\n\n /**\n * Write a span field and append its element chunk.\n *\n * `writeElement(flattener, offset, element)` may itself append nested\n * chunks; leaf chunks (`dedup: true`) are shared when byte-identical,\n * matching the reference writer.\n */\n span(fieldOffset, elements, elementSize, writeElement, { dedup = false } = {})\n {\n const count = elements ? elements.length : 0;\n const byteSize = count * elementSize;\n if (byteSize === 0)\n {\n // tagged self-relative offset of 0 keeps span pointers valid\n this.i64(fieldOffset, 1);\n this.u64(fieldOffset + 8, 0);\n return;\n }\n\n if (dedup)\n {\n const scratch = new Flattener();\n const scratchOffset = scratch.reserve(byteSize);\n for (let i = 0; i < count; i++) writeElement(scratch, scratchOffset + i * elementSize, elements[i]);\n const chunk = scratch.bytes();\n const key = chunkKey(chunk);\n const cached = this.#chunkCache.get(key);\n if (cached !== undefined && bytesEqual(this.#bytes, cached, chunk))\n {\n this.i64(fieldOffset, ((cached - fieldOffset) | 1));\n this.u64(fieldOffset + 8, byteSize);\n return;\n }\n const chunkOffset = this.reserveAligned(byteSize);\n this.setBytes(chunkOffset, chunk);\n this.#chunkCache.set(key, chunkOffset);\n this.i64(fieldOffset, ((chunkOffset - fieldOffset) | 1));\n this.u64(fieldOffset + 8, byteSize);\n return;\n }\n\n const chunkOffset = this.reserveAligned(byteSize);\n this.i64(fieldOffset, ((chunkOffset - fieldOffset) | 1));\n this.u64(fieldOffset + 8, byteSize);\n for (let i = 0; i < count; i++) writeElement(this, chunkOffset + i * elementSize, elements[i]);\n }\n\n string(fieldOffset, value)\n {\n const encoded = textEncoder.encode(value || \"\");\n this.span(fieldOffset, encoded, 1, (buffer, offset, byte) => buffer.u8(offset, byte), { dedup: true });\n }\n\n bytes()\n {\n return this.#bytes.slice(0, this.size);\n }\n}\n\nfunction chunkKey(bytes)\n{\n let hash = 2166136261 >>> 0;\n for (let i = 0; i < bytes.length; i++)\n {\n hash = Math.imul(hash, 16777619) >>> 0;\n hash = (hash ^ bytes[i]) >>> 0;\n }\n return `${bytes.length}:${hash}`;\n}\n\nfunction bytesEqual(target, offset, chunk)\n{\n for (let i = 0; i < chunk.length; i++)\n {\n if (target[offset + i] !== chunk[i]) return false;\n }\n return true;\n}\n\nfunction writeBounds(buffer, offset, bounds)\n{\n const min = bounds?.min || [ 0, 0, 0 ];\n const max = bounds?.max || [ 0, 0, 0 ];\n for (let i = 0; i < 3; i++) buffer.f32(offset + i * 4, min[i]);\n for (let i = 0; i < 3; i++) buffer.f32(offset + 12 + i * 4, max[i]);\n}\n\nfunction writeBufferView(buffer, offset, view, remap)\n{\n const size = view?.size || 0;\n const index = view?.index || 0;\n buffer.u32(offset, size === 0 ? index : (remap.get(index) ?? index));\n buffer.u32(offset + 4, view?.offset || 0);\n buffer.u32(offset + 8, size);\n buffer.u32(offset + 12, view?.stride || 0);\n}\n\nfunction writeVertexElement(buffer, offset, element)\n{\n buffer.u8(offset, enumValue(Usage, element.usage, \"vertex usage\"));\n buffer.u8(offset + 1, element.usageIndex || 0);\n buffer.u8(offset + 2, enumValue(ElementType, element.type, \"element type\"));\n buffer.u8(offset + 3, element.elementCount || 0);\n buffer.u32(offset + 4, element.offset || 0);\n}\n\nfunction writeData(buffer, offset, graph, remap)\n{\n const writeMesh = (target, meshOffset, mesh) =>\n {\n target.string(meshOffset, mesh.name);\n target.span(meshOffset + 16, mesh.decl || [], STRUCT_SIZE.VertexElement, writeVertexElement, { dedup: true });\n target.span(meshOffset + 32, mesh.lods || [], STRUCT_SIZE.MeshLod, (lodTarget, lodOffset, lod) =>\n {\n writeBufferView(lodTarget, lodOffset, lod.vb, remap);\n writeBufferView(lodTarget, lodOffset + 16, lod.ib, remap);\n lodTarget.span(lodOffset + 32, lod.areas || [], STRUCT_SIZE.LodMeshArea, (areaTarget, areaOffset, area) =>\n {\n areaTarget.u32(areaOffset, area.firstElement || 0);\n areaTarget.u32(areaOffset + 4, area.elementCount || 0);\n }, { dedup: true });\n lodTarget.span(lodOffset + 48, lod.morphTargets || [], STRUCT_SIZE.LodMorphTarget, (morphTarget, morphOffset, morph) =>\n {\n writeBufferView(morphTarget, morphOffset, morph.vb, remap);\n });\n lodTarget.u32(lodOffset + 64, lod.threshold ?? 0xffffffff);\n });\n target.span(meshOffset + 48, mesh.areas || [], STRUCT_SIZE.MeshArea, (areaTarget, areaOffset, area) =>\n {\n areaTarget.string(areaOffset, area.name);\n writeBounds(areaTarget, areaOffset + 16, area.bounds);\n areaTarget.span(areaOffset + 40, area.bones || [], 2, (boneTarget, boneOffset, bone) => boneTarget.u16(boneOffset, bone), { dedup: true });\n areaTarget.u8(areaOffset + 56, area.affectedByBones ? 1 : 0);\n areaTarget.u8(areaOffset + 57, area.affectedByMorphTargets ? 1 : 0);\n });\n target.span(meshOffset + 64, mesh.boneBindings || [], STRUCT_SIZE.BoneBinding, (bindingTarget, bindingOffset, binding) =>\n {\n bindingTarget.string(bindingOffset, binding.name);\n writeBounds(bindingTarget, bindingOffset + 16, binding.bounds);\n });\n target.span(meshOffset + 80, mesh.morphTargets?.decl || [], STRUCT_SIZE.VertexElement, writeVertexElement, { dedup: true });\n target.span(meshOffset + 96, mesh.morphTargets?.targets || [], STRUCT_SIZE.MorphTarget, (morphTarget, morphOffset, morph) =>\n {\n morphTarget.string(morphOffset, morph.name);\n morphTarget.f32(morphOffset + 16, morph.maxDisplacement || 0);\n });\n target.span(meshOffset + 112, mesh.uvDensities || [], 4, (densityTarget, densityOffset, value) => densityTarget.f32(densityOffset, value), { dedup: true });\n writeBounds(target, meshOffset + 128, mesh.bounds);\n const occlusion = mesh.audioOcclusionMesh || {};\n target.span(meshOffset + 152, occlusion.vertices || [], 12, (vertexTarget, vertexOffset, vertex) =>\n {\n for (let i = 0; i < 3; i++) vertexTarget.f32(vertexOffset + i * 4, vertex[i]);\n }, { dedup: true });\n target.span(meshOffset + 168, occlusion.indices || [], 2, (indexTarget, indexOffset, index) => indexTarget.u16(indexOffset, index), { dedup: true });\n writeBounds(target, meshOffset + 184, occlusion.bounds);\n target.u8(meshOffset + 208, enumValue(MeshTopology, mesh.topology ?? \"TriangleList\", \"topology\"));\n target.u8(meshOffset + 209, mesh.skeleton === null || mesh.skeleton === undefined ? 0xff : mesh.skeleton);\n };\n\n const writeSkeleton = (target, skeletonOffset, skeleton) =>\n {\n if ((skeleton.bones || []).some((bone) => typeof bone !== \"string\"))\n {\n throw writeError(\n \"skeleton bones must be name strings; GR2-shaped skeletons need conversion (use writeShared) before writing\"\n );\n }\n target.string(skeletonOffset, skeleton.name);\n target.span(skeletonOffset + 16, skeleton.bones || [], 16, (boneTarget, boneOffset, bone) => boneTarget.string(boneOffset, bone));\n target.span(skeletonOffset + 32, skeleton.parents || [], 4, (parentTarget, parentOffset, parent) => parentTarget.u32(parentOffset, parent), { dedup: true });\n target.span(skeletonOffset + 48, skeleton.restTransforms || [], STRUCT_SIZE.Transform, (transformTarget, transformOffset, transform) =>\n {\n const position = transform.position || [ 0, 0, 0 ];\n const rotation = transform.rotation || [ 0, 0, 0, 1 ];\n const scale = transform.scale || [ 1, 1, 1 ];\n for (let i = 0; i < 3; i++) transformTarget.f32(transformOffset + i * 4, position[i]);\n for (let i = 0; i < 4; i++) transformTarget.f32(transformOffset + 12 + i * 4, rotation[i]);\n for (let i = 0; i < 3; i++) transformTarget.f32(transformOffset + 28 + i * 4, scale[i]);\n }, { dedup: true });\n target.span(skeletonOffset + 64, skeleton.invBindTransforms || [], 64, (matrixTarget, matrixOffset, matrix) =>\n {\n for (let i = 0; i < 16; i++) matrixTarget.f32(matrixOffset + i * 4, matrix[i]);\n }, { dedup: true });\n target.span(skeletonOffset + 80, skeleton.boneMasks || [], STRUCT_SIZE.BoneMask, (maskTarget, maskOffset, mask) =>\n {\n maskTarget.string(maskOffset, mask.name);\n maskTarget.span(maskOffset + 16, mask.weights || [], STRUCT_SIZE.BoneWeight, (weightTarget, weightOffset, weight) =>\n {\n weightTarget.u32(weightOffset, weight.index || 0);\n weightTarget.f32(weightOffset + 4, weight.weight ?? 1);\n }, { dedup: true });\n });\n };\n\n const writeAnimation = (target, animationOffset, animation) =>\n {\n target.string(animationOffset, animation.name);\n target.span(animationOffset + 16, animation.channels || [], STRUCT_SIZE.AnimationChannel, (channelTarget, channelOffset, channel) =>\n {\n channelTarget.string(channelOffset, channel.target);\n channelTarget.u8(channelOffset + 16, enumValue(AnimationChannelTargetType, channel.targetType, \"channel target type\"));\n channelTarget.u32(channelOffset + 20, channel.curveIndex || 0);\n });\n target.span(animationOffset + 32, animation.curves || [], STRUCT_SIZE.AnimationCurve, (curveTarget, curveOffset, curve) =>\n {\n curveTarget.u8(curveOffset, curve.valueDimension || 0);\n curveTarget.u8(curveOffset + 1, enumValue(Interpolation, curve.interpolation, \"interpolation\"));\n curveTarget.u8(curveOffset + 2, enumValue(ElementType, curve.knotType, \"knot type\"));\n curveTarget.u8(curveOffset + 3, enumValue(ElementType, curve.valueType, \"value type\"));\n curveTarget.u32(curveOffset + 4, curve.knotCount || 0);\n curveTarget.span(curveOffset + 8, curve.knots || [], 1, (knotTarget, knotOffset, knot) => knotTarget.u8(knotOffset, knot), { dedup: true });\n curveTarget.span(curveOffset + 24, curve.values || [], 1, (valueTarget, valueOffset, value) => valueTarget.u8(valueOffset, value), { dedup: true });\n });\n target.f32(animationOffset + 48, animation.duration || 0);\n };\n\n buffer.span(offset, graph.meshes || [], STRUCT_SIZE.Mesh, writeMesh);\n buffer.span(offset + 16, graph.skeletons || [], STRUCT_SIZE.Skeleton, writeSkeleton);\n buffer.span(offset + 32, graph.animations || [], STRUCT_SIZE.Animation, writeAnimation);\n}\n\n/**\n * Collect BufferView usage in reference-writer order and decide per-buffer\n * compression (conflicting stride/kind across views falls back to None).\n */\nfunction collectBufferRecords(graph, compress)\n{\n const records = [];\n const recordsByIndex = new Map();\n const visit = (view, compression) =>\n {\n if (!view || !view.size) return;\n const existing = recordsByIndex.get(view.index);\n if (!existing)\n {\n const record = {\n index: view.index,\n stride: view.stride || 0,\n compression: compress ? compression : \"None\"\n };\n records.push(record);\n recordsByIndex.set(view.index, record);\n }\n else if (existing.stride !== (view.stride || 0) || (compress ? compression : \"None\") !== existing.compression)\n {\n existing.stride = 0;\n existing.compression = \"None\";\n }\n };\n\n for (const mesh of graph.meshes || [])\n {\n for (const lod of mesh.lods || [])\n {\n visit(lod.vb, \"MeshOptimizerVertexBuffer\");\n visit(lod.ib, \"MeshOptimizerIndexBuffer\");\n for (const morph of lod.morphTargets || [])\n {\n visit(morph.vb, \"MeshOptimizerVertexBuffer\");\n }\n }\n }\n return records;\n}\n\nfunction resolveBufferBytes(graph, record)\n{\n const buffers = graph.buffers || [];\n const entry = buffers.find?.((buffer) => buffer && buffer.index === record.index) ?? buffers[record.index];\n const data = entry?.data ?? (entry instanceof Uint8Array ? entry : null);\n if (!data)\n {\n throw writeError(`no buffer data supplied for BufferView index ${record.index}`);\n }\n return data instanceof Uint8Array ? data : new Uint8Array(data);\n}\n\nfunction compressBuffer(bytes, record)\n{\n if (record.compression === \"None\" || bytes.byteLength === 0)\n {\n return { data: bytes, compression: \"None\", gpuAlignment: record.stride };\n }\n if (!encoderReady)\n {\n throw writeError(\"compressed output requires writeAsync/WriteAsync so meshoptimizer can initialize (or pass compress: false)\");\n }\n\n if (record.compression === \"MeshOptimizerVertexBuffer\")\n {\n if (record.stride === 0 || bytes.byteLength % record.stride !== 0)\n {\n return { data: bytes, compression: \"None\", gpuAlignment: record.stride };\n }\n const count = bytes.byteLength / record.stride;\n const data = MeshoptEncoder.encodeVertexBuffer(bytes, count, record.stride);\n return { data, compression: \"MeshOptimizerVertexBuffer\", gpuAlignment: record.stride };\n }\n\n // index buffers: meshopt encodes triangle lists of u32; u16 sources widen\n const stride = record.stride;\n if ((stride !== 2 && stride !== 4) || bytes.byteLength % stride !== 0)\n {\n return { data: bytes, compression: \"None\", gpuAlignment: stride };\n }\n const count = bytes.byteLength / stride;\n if (count % 3 !== 0)\n {\n return { data: bytes, compression: \"None\", gpuAlignment: stride };\n }\n let source = bytes;\n if (stride === 2)\n {\n const wide = new Uint32Array(count);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n for (let i = 0; i < count; i++) wide[i] = view.getUint16(i * 2, true);\n source = new Uint8Array(wide.buffer);\n }\n const data = MeshoptEncoder.encodeIndexBuffer(source, count, 4);\n return { data, compression: \"MeshOptimizerIndexBuffer\", gpuAlignment: stride };\n}\n\n/**\n * Serialize a CMF-native graph into .cmf bytes.\n *\n * @param {object} graph Native graph: `{ meshes, skeletons, animations, metadata?, buffers? }`\n * where `buffers` supplies uncompressed GPU bytes for each BufferView\n * `index` (as `{ index, data }` entries or an index-keyed array).\n * @param {object} [options] `compress` (default false for the sync writer)\n * enables meshoptimizer vertex/index compression.\n * @returns {Uint8Array} Complete .cmf file bytes.\n */\nexport function writeCmf(graph, options = {})\n{\n if (!graph || typeof graph !== \"object\")\n {\n throw writeError(\"input graph must be an object\");\n }\n const compress = options.compress === true;\n\n const records = collectBufferRecords(graph, compress);\n const compressed = records.map((record) =>\n {\n const bytes = resolveBufferBytes(graph, record);\n return { record, ...compressBuffer(bytes, record), uncompressedSize: bytes.byteLength };\n });\n const remap = new Map(records.map((record, position) => [ record.index, position + 1 ]));\n\n const data = new Flattener();\n data.reserve(STRUCT_SIZE.Data);\n writeData(data, 0, graph, remap);\n const dataBytes = data.bytes();\n\n let metadataBytes = null;\n if (graph.metadata && (graph.metadata.entries || []).length)\n {\n const metadata = new Flattener();\n metadata.reserve(STRUCT_SIZE.Metadata);\n metadata.span(0, graph.metadata.entries, STRUCT_SIZE.MetadataEntry, (target, offset, entry) =>\n {\n target.string(offset, entry.key);\n target.string(offset + 16, entry.value);\n });\n metadataBytes = metadata.bytes();\n }\n\n const sections = [\n { type: \"Data\", compression: \"None\", gpuAlignment: 0, compressedSize: dataBytes.byteLength, uncompressedSize: dataBytes.byteLength, data: dataBytes }\n ];\n for (const entry of compressed)\n {\n sections.push({\n type: \"GpuBuffer\",\n compression: entry.compression,\n gpuAlignment: entry.gpuAlignment,\n compressedSize: entry.data.byteLength,\n uncompressedSize: entry.uncompressedSize,\n data: entry.data\n });\n }\n if (metadataBytes)\n {\n sections.push({ type: \"Metadata\", compression: \"None\", gpuAlignment: 0, compressedSize: metadataBytes.byteLength, uncompressedSize: metadataBytes.byteLength, data: metadataBytes });\n }\n\n const header = new Flattener();\n header.reserve(STRUCT_SIZE.Header);\n header.u32(0, FILE_SIGNATURE);\n header.u32(4, FILE_VERSION);\n header.span(16, sections, STRUCT_SIZE.Section, () => {});\n const headerSize = header.size;\n header.u32(8, headerSize);\n\n let offset = headerSize;\n const sectionOffsets = sections.map((section) =>\n {\n offset = Math.ceil(offset / 8) * 8;\n const sectionOffset = offset;\n offset += section.compressedSize;\n return sectionOffset;\n });\n\n const sectionsChunk = headerSize - sections.length * STRUCT_SIZE.Section;\n sections.forEach((section, index) =>\n {\n const base = sectionsChunk + index * STRUCT_SIZE.Section;\n header.u32(base, sectionOffsets[index]);\n header.u32(base + 4, section.compressedSize);\n header.u32(base + 8, section.uncompressedSize);\n header.u16(base + 12, section.gpuAlignment || 0);\n header.u8(base + 14, enumValue(SectionType, section.type, \"section type\"));\n header.u8(base + 15, enumValue(SectionCompression, section.compression, \"section compression\"));\n });\n\n const total = offset;\n const file = new Uint8Array(total);\n file.set(header.bytes(), 0);\n sections.forEach((section, index) =>\n {\n file.set(section.data, sectionOffsets[index]);\n });\n\n const checksum = crc32(file, 16, file.byteLength);\n new DataView(file.buffer).setUint32(12, checksum, true);\n return file;\n}\n\n/**\n * Serialize a CMF-native graph asynchronously with compression enabled by\n * default (awaits meshoptimizer encoder initialization).\n *\n * @param {object} graph Native graph (see `writeCmf`).\n * @param {object} [options] `compress` defaults to true.\n * @returns {Promise<Uint8Array>} Complete .cmf file bytes.\n */\nexport async function writeCmfAsync(graph, options = {})\n{\n await MeshoptEncoder.ready;\n encoderReady = true;\n return writeCmf(graph, { ...options, compress: options.compress !== false });\n}\n"],"names":["textEncoder","TextEncoder","encoderReady","MeshoptEncoder","ready","then","writeError","message","error","Error","code","enumValue","names","value","label","index","indexOf","unknown","exec","String","Number","JSON","stringify","Flattener","Uint8Array","DataView","buffer","Map","size","#ensure","capacity","length","next","grown","set","subarray","reserve","byteLength","offset","fill","reserveAligned","alignment","padded","Math","ceil","u8","setUint8","u16","setUint16","u32","setUint32","f32","setFloat32","i64","setBigInt64","BigInt","u64","setBigUint64","setBytes","bytes","span","fieldOffset","elements","elementSize","writeElement","dedup","count","byteSize","scratch","scratchOffset","i","chunk","key","chunkKey","cached","get","undefined","bytesEqual","chunkOffset","string","encoded","encode","byte","slice","hash","imul","target","writeBounds","bounds","min","max","writeBufferView","view","remap","stride","writeVertexElement","element","Usage","usage","usageIndex","ElementType","type","elementCount","writeData","graph","writeMesh","meshOffset","mesh","name","decl","STRUCT_SIZE","VertexElement","lods","MeshLod","lodTarget","lodOffset","lod","vb","ib","areas","LodMeshArea","areaTarget","areaOffset","area","firstElement","morphTargets","LodMorphTarget","morphTarget","morphOffset","morph","threshold","MeshArea","bones","boneTarget","boneOffset","bone","affectedByBones","affectedByMorphTargets","boneBindings","BoneBinding","bindingTarget","bindingOffset","binding","targets","MorphTarget","maxDisplacement","uvDensities","densityTarget","densityOffset","occlusion","audioOcclusionMesh","vertices","vertexTarget","vertexOffset","vertex","indices","indexTarget","indexOffset","MeshTopology","topology","skeleton","writeSkeleton","skeletonOffset","some","parents","parentTarget","parentOffset","parent","restTransforms","Transform","transformTarget","transformOffset","transform","position","rotation","scale","invBindTransforms","matrixTarget","matrixOffset","matrix","boneMasks","BoneMask","maskTarget","maskOffset","mask","weights","BoneWeight","weightTarget","weightOffset","weight","writeAnimation","animationOffset","animation","channels","AnimationChannel","channelTarget","channelOffset","channel","AnimationChannelTargetType","targetType","curveIndex","curves","AnimationCurve","curveTarget","curveOffset","curve","valueDimension","Interpolation","interpolation","knotType","valueType","knotCount","knots","knotTarget","knotOffset","knot","values","valueTarget","valueOffset","duration","meshes","Mesh","skeletons","Skeleton","animations","Animation","collectBufferRecords","compress","records","recordsByIndex","visit","compression","existing","record","push","resolveBufferBytes","buffers","entry","find","data","compressBuffer","gpuAlignment","encodeVertexBuffer","source","wide","Uint32Array","byteOffset","getUint16","encodeIndexBuffer","writeCmf","options","compressed","map","uncompressedSize","Data","dataBytes","metadataBytes","metadata","entries","Metadata","MetadataEntry","sections","compressedSize","header","Header","FILE_SIGNATURE","FILE_VERSION","Section","headerSize","sectionOffsets","section","sectionOffset","sectionsChunk","forEach","base","SectionType","SectionCompression","total","file","checksum","crc32","writeCmfAsync"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|