@carbonenginejs/runtime-resource 0.12.1 → 0.13.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/LICENSE +21 -21
- package/NOTICE +32 -32
- package/README.md +129 -108
- package/dist/CjsMotherLode.js +1271 -1271
- package/dist/CjsResMan.js +3858 -3494
- package/dist/CjsResMan.js.map +1 -1
- package/dist/CjsResManFetchProvider.js +94 -94
- package/dist/CjsResManWorkQueue.js +301 -301
- package/dist/_virtual/_rollupPluginBabelHelpers.js +150 -150
- package/dist/format/CjsBlueReader.js +358 -358
- package/dist/format/CjsByteReader.js +310 -310
- package/dist/format/CjsByteWriter.js +242 -242
- package/dist/format/CjsFormat.js +223 -223
- package/dist/format/CjsFormatError.js +41 -41
- package/dist/format/CjsReader.js +22 -22
- package/dist/format/CjsResourceProbe.js +279 -279
- package/dist/format/CjsStringTable.js +268 -268
- package/dist/format/carbonEffect/CjsCarbonEffectReader.js +408 -361
- package/dist/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -1
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -373
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js +182 -0
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js.map +1 -0
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +321 -427
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectRecords.js +1147 -955
- package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js +197 -0
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -0
- package/dist/format/compareUtf8.js +36 -36
- package/dist/format/effect/effectBodyInventory.js +146 -0
- package/dist/format/effect/effectBodyInventory.js.map +1 -0
- package/dist/format/effect/effectPermutationGraph.js +257 -257
- package/dist/format/effect/effectPermutationGraph.js.map +1 -1
- package/dist/format/effect/sha256.js +114 -114
- package/dist/format/index.js +11 -11
- package/dist/format/payloadContract.js +193 -193
- package/dist/formats/black/CjsBlackFormat.js +310 -292
- package/dist/formats/black/CjsBlackFormat.js.map +1 -1
- package/dist/formats/black/core/CjsBlackBinaryReader.js +260 -260
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +448 -448
- package/dist/formats/black/core/CjsBlackReader.js +764 -764
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +540 -540
- package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js +4 -4
- package/dist/formats/black/core/blackConstants.js +7 -7
- package/dist/formats/black/core/blackDefinitions.js +10 -10
- package/dist/formats/black/core/blackEnums.js +6 -6
- package/dist/formats/black/core/blackSchema.js +3 -3
- package/dist/formats/black/core/blackVersion.js +22 -22
- package/dist/formats/black/core/helpers.js +199 -199
- package/dist/formats/black/core/schema.js +4 -4
- package/dist/formats/black/index.js +2 -2
- package/dist/formats/bnk/CjsBnkFormat.js +175 -156
- package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
- package/dist/formats/bnk/core/busNodes.js +252 -0
- package/dist/formats/bnk/core/busNodes.js.map +1 -0
- package/dist/formats/bnk/core/effectNodes.js +147 -0
- package/dist/formats/bnk/core/effectNodes.js.map +1 -0
- package/dist/formats/bnk/core/eventAction.js +416 -305
- package/dist/formats/bnk/core/eventAction.js.map +1 -1
- package/dist/formats/bnk/core/globalSettings.js +215 -0
- package/dist/formats/bnk/core/globalSettings.js.map +1 -0
- package/dist/formats/bnk/core/graph.js +137 -137
- package/dist/formats/bnk/core/helpers.js +512 -480
- package/dist/formats/bnk/core/helpers.js.map +1 -1
- package/dist/formats/bnk/core/musicNodes.js +533 -509
- package/dist/formats/bnk/core/musicNodes.js.map +1 -1
- package/dist/formats/bnk/core/nodeBase.js +553 -532
- package/dist/formats/bnk/core/nodeBase.js.map +1 -1
- package/dist/formats/bnk/core/sfxNodes.js +632 -632
- package/dist/formats/bnk/core/soundbanksInfo.js +209 -209
- package/dist/formats/bnk/index.js +2 -2
- package/dist/formats/cmf/CjsCmfFormat.js +497 -497
- package/dist/formats/cmf/core/binary.js +194 -194
- package/dist/formats/cmf/core/buffers.js +237 -237
- package/dist/formats/cmf/core/constants.js +47 -47
- package/dist/formats/cmf/core/gr2Anim.js +453 -453
- package/dist/formats/cmf/core/helpers.js +318 -318
- package/dist/formats/cmf/core/pack.js +276 -276
- package/dist/formats/cmf/core/schema.js +374 -374
- package/dist/formats/cmf/core/shared.js +277 -277
- package/dist/formats/cmf/core/writer.js +571 -571
- package/dist/formats/cmf/index.js +2 -2
- package/dist/formats/dds/CjsDdsFormat.js +200 -200
- package/dist/formats/dds/core/bc6h.js +298 -298
- package/dist/formats/dds/core/bc7.js +272 -272
- package/dist/formats/dds/core/helpers.js +862 -862
- package/dist/formats/dds/index.js +2 -2
- package/dist/formats/dxbc/CjsDxbcFormat.js +142 -142
- package/dist/formats/dxbc/core/DxbcReader.js +266 -266
- package/dist/formats/dxbc/core/container.js +169 -169
- package/dist/formats/dxbc/core/decoder.js +789 -789
- package/dist/formats/dxbc/core/errors.js +19 -19
- package/dist/formats/dxbc/core/helpers.js +220 -220
- package/dist/formats/dxbc/core/opcodes.js +45 -45
- package/dist/formats/dxbc/core/program.js +91 -91
- package/dist/formats/dxbc/core/signature.js +172 -172
- package/dist/formats/dxbc/index.js +2 -2
- package/dist/formats/fbx/CjsFbxFormat.js +266 -266
- package/dist/formats/fbx/core/helpers.js +3932 -3932
- package/dist/formats/fbx/index.js +2 -2
- package/dist/formats/flac/CjsFlacFormat.js +142 -142
- package/dist/formats/flac/core/helpers.js +315 -315
- package/dist/formats/flac/index.js +2 -2
- package/dist/formats/gif/CjsGifFormat.js +141 -141
- package/dist/formats/gif/core/helpers.js +380 -380
- package/dist/formats/gif/index.js +2 -2
- package/dist/formats/gltf/CjsGltfFormat.js +290 -290
- package/dist/formats/gltf/core/helpers.js +307 -307
- package/dist/formats/gltf/core/json.js +79 -79
- package/dist/formats/gltf/core/parser.js +679 -679
- package/dist/formats/gltf/core/targets.js +173 -173
- package/dist/formats/gltf/index.js +2 -2
- package/dist/formats/gr2/CjsGr2Format.js +289 -289
- package/dist/formats/gr2/core/bitknit2.js +282 -282
- package/dist/formats/gr2/core/curves.js +1047 -1047
- package/dist/formats/gr2/core/gsf.js +72 -72
- package/dist/formats/gr2/core/helpers.js +352 -352
- package/dist/formats/gr2/core/json.js +622 -622
- package/dist/formats/gr2/core/oodle1.js +388 -388
- package/dist/formats/gr2/core/tangents.js +48 -48
- package/dist/formats/gr2/core/targets.js +361 -361
- package/dist/formats/gr2/index.js +2 -2
- package/dist/formats/hlsl/CjsHlslFormat.js +254 -254
- package/dist/formats/hlsl/core/HlslBinaryUtils.js +15 -15
- package/dist/formats/hlsl/core/HlslEffectReadError.js +19 -19
- package/dist/formats/hlsl/core/HlslEffectStateManager.js +130 -130
- package/dist/formats/hlsl/core/HlslRenderStateSetup.js +37 -37
- package/dist/formats/hlsl/core/HlslResourceSetDescription.js +94 -94
- package/dist/formats/hlsl/core/HlslShaderBytecode.js +44 -44
- package/dist/formats/hlsl/core/analysis.js +51 -51
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +850 -781
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
- package/dist/formats/hlsl/core/detailMapFamily.js +128 -0
- package/dist/formats/hlsl/core/detailMapFamily.js.map +1 -0
- package/dist/formats/hlsl/core/helpers.js +270 -270
- package/dist/formats/hlsl/core/json.js +284 -284
- package/dist/formats/hlsl/core/localLightFamily.js +133 -0
- package/dist/formats/hlsl/core/localLightFamily.js.map +1 -0
- package/dist/formats/hlsl/core/metadata.js +327 -327
- package/dist/formats/hlsl/core/render-states.js +280 -280
- package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js +43 -43
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +320 -314
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -33
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +416 -416
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -40
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +62 -742
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js +52 -52
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js +38 -38
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js +50 -50
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +86 -86
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js +31 -31
- package/dist/formats/hlsl/core/tr2/shader/HlslPass.js +42 -42
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js +55 -55
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js +29 -29
- package/dist/formats/hlsl/core/tr2/shader/HlslShader.js +220 -220
- package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js +30 -30
- package/dist/formats/hlsl/index.js +3 -3
- package/dist/formats/index.js +33 -31
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/jpeg/CjsJpegFormat.js +212 -212
- package/dist/formats/jpeg/core/helpers.js +402 -402
- package/dist/formats/jpeg/core/jpeg.js +480 -480
- package/dist/formats/jpeg/index.js +2 -2
- package/dist/formats/mp3/CjsMp3Format.js +197 -197
- package/dist/formats/mp3/core/helpers.js +375 -375
- package/dist/formats/mp3/index.js +2 -2
- package/dist/formats/mp4/CjsMp4Format.js +197 -197
- package/dist/formats/mp4/core/helpers.js +484 -484
- package/dist/formats/mp4/index.js +2 -2
- package/dist/formats/obj/CjsObjFormat.js +253 -253
- package/dist/formats/obj/core/helpers.js +573 -573
- package/dist/formats/obj/core/json.js +64 -64
- package/dist/formats/obj/core/parser.js +321 -321
- package/dist/formats/obj/index.js +2 -2
- package/dist/formats/ogg/CjsOggFormat.js +143 -143
- package/dist/formats/ogg/core/helpers.js +410 -410
- package/dist/formats/ogg/core/imdct.js +178 -178
- package/dist/formats/ogg/core/vorbis.js +1017 -1017
- package/dist/formats/ogg/index.js +2 -2
- package/dist/formats/pickle/CjsPickleFormat.js +214 -0
- package/dist/formats/pickle/CjsPickleFormat.js.map +1 -0
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +551 -0
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js.map +1 -0
- package/dist/formats/pickle/index.js +2 -0
- package/dist/formats/pickle/index.js.map +1 -0
- package/dist/formats/png/CjsPngFormat.js +201 -201
- package/dist/formats/png/core/helpers.js +635 -635
- package/dist/formats/png/index.js +2 -2
- package/dist/formats/red/CjsRedFormat.js +263 -263
- package/dist/formats/red/core/CjsRedReader.js +246 -246
- package/dist/formats/red/core/blackDefinitions.js +3 -3
- package/dist/formats/red/core/helpers.js +158 -158
- package/dist/formats/red/core/redGraph.js +71 -68
- package/dist/formats/red/core/redGraph.js.map +1 -1
- package/dist/formats/red/core/schema.js +4 -4
- package/dist/formats/red/index.js +2 -2
- package/dist/formats/stl/CjsStlFormat.js +365 -365
- package/dist/formats/stl/core/helpers.js +261 -261
- package/dist/formats/stl/core/json.js +51 -51
- package/dist/formats/stl/core/stl.js +642 -642
- package/dist/formats/stl/core/targets.js +173 -173
- package/dist/formats/stl/index.js +2 -2
- package/dist/formats/tga/CjsTgaFormat.js +197 -197
- package/dist/formats/tga/core/helpers.js +493 -493
- package/dist/formats/tga/index.js +2 -2
- package/dist/formats/wav/CjsWavFormat.js +198 -198
- package/dist/formats/wav/core/helpers.js +365 -365
- package/dist/formats/wav/index.js +2 -2
- package/dist/formats/webgl/CjsWebglFormat.js +199 -221
- package/dist/formats/webgl/CjsWebglFormat.js.map +1 -1
- package/dist/formats/webgl/core/buildGlslEffectContainer.js +70 -0
- package/dist/formats/webgl/core/buildGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/core/effectPackage.js +900 -792
- package/dist/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/formats/webgl/core/errors.js +27 -27
- package/dist/formats/webgl/core/errors.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2820 -2678
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -89
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +486 -428
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -1
- package/dist/formats/webgl/core/glsl/packedLightFixups.js +98 -0
- package/dist/formats/webgl/core/glsl/packedLightFixups.js.map +1 -0
- package/dist/formats/webgl/core/glslBackendBlock.js +552 -0
- package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -0
- package/dist/formats/webgl/core/glslBackendBodySet.js +243 -0
- package/dist/formats/webgl/core/glslBackendBodySet.js.map +1 -0
- package/dist/formats/webgl/core/{cewgCompleteness.js → glslEffectCompleteness.js} +85 -81
- package/dist/formats/webgl/core/glslEffectCompleteness.js.map +1 -0
- package/dist/formats/webgl/core/helpers.js +167 -306
- package/dist/formats/webgl/core/helpers.js.map +1 -1
- package/dist/formats/webgl/core/inspectGlslEffectContainer.js +122 -0
- package/dist/formats/webgl/core/inspectGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/core/readGlslEffectContainer.js +303 -0
- package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/index.js +2 -2
- package/dist/formats/webgpu/CjsWebgpuFormat.js +357 -357
- package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +89 -197
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -1
- package/dist/formats/webgpu/core/{cewgpu/CewgpuContainer.js → carbonWebgpu/CarbonWebgpuContainer.js} +354 -368
- package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js.map +1 -0
- package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/containerViews.js +355 -355
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js.map +1 -0
- package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/validateContainer.js +90 -90
- package/dist/formats/webgpu/core/carbonWebgpu/validateContainer.js.map +1 -0
- package/dist/formats/webgpu/core/effectAnalysis.js +82 -82
- package/dist/formats/webgpu/core/effectBackendBodySet.js +289 -289
- package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
- package/dist/formats/webgpu/core/errors.js +20 -20
- package/dist/formats/webgpu/core/errors.js.map +1 -1
- package/dist/formats/webgpu/core/helpers.js +443 -443
- package/dist/formats/webgpu/core/helpers.js.map +1 -1
- package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +212 -212
- package/dist/formats/webgpu/core/ir/buildControlFlow.js +220 -220
- package/dist/formats/webgpu/core/ir/indexableTemps.js +137 -137
- package/dist/formats/webgpu/core/ir/inferValueTypes.js +449 -449
- package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js +494 -494
- package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js +177 -177
- package/dist/formats/webgpu/core/ir/sourceLanes.js +61 -61
- package/dist/formats/webgpu/core/packageEffect.js +381 -385
- package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
- package/dist/formats/webgpu/core/packageEffectSelection.js +164 -164
- package/dist/formats/webgpu/core/packageEffectSelection.js.map +1 -1
- package/dist/formats/webgpu/core/packageMetadata.js +17 -17
- package/dist/formats/webgpu/core/schema.js +4 -4
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +263 -263
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +172 -172
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +320 -320
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/emitWgsl.js +356 -356
- package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js +77 -77
- package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js +451 -451
- package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +735 -735
- package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +457 -457
- package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js +1572 -1572
- package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js +659 -659
- package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js +734 -734
- package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js +583 -583
- package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js +621 -621
- package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js +824 -824
- package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js +697 -697
- package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js +559 -559
- package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js +1328 -1328
- package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js +110 -110
- package/dist/formats/webgpu/core/wgsl/precisionControls.js +55 -55
- package/dist/formats/webgpu/core/wgsl/selectionPlans.js +717 -717
- package/dist/formats/webgpu/core/wgsl/uniformity.js +78 -78
- package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js +196 -196
- package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js +37 -37
- package/dist/formats/webgpu/index.js +2 -2
- package/dist/formats/webm/CjsWebmFormat.js +197 -197
- package/dist/formats/webm/core/helpers.js +572 -572
- package/dist/formats/webm/index.js +2 -2
- package/dist/formats/webp/CjsWebpFormat.js +140 -140
- package/dist/formats/webp/core/helpers.js +237 -237
- package/dist/formats/webp/index.js +2 -2
- package/dist/formats/wem/CjsWemFormat.js +250 -250
- package/dist/formats/wem/core/bitStream.js +261 -261
- package/dist/formats/wem/core/codebookLibrary.js +164 -164
- package/dist/formats/wem/core/helpers.js +437 -437
- package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
- package/dist/formats/wem/core/ptadpcm.js +77 -77
- package/dist/formats/wem/core/resolve.js +121 -121
- package/dist/formats/wem/core/wemToOgg.js +485 -485
- package/dist/formats/wem/index.js +2 -2
- package/dist/formats/yaml/CjsYamlFormat.js +134 -134
- package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
- package/dist/formats/yaml/core/CjsYamlReader.js +400 -402
- package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
- package/dist/formats/yaml/core/helpers.js +196 -170
- package/dist/formats/yaml/core/helpers.js.map +1 -1
- package/dist/formats/yaml/index.js +2 -2
- package/dist/index.js +64 -62
- package/dist/index.js.map +1 -1
- package/dist/resource/CjsLoadingObject.js +19 -0
- package/dist/resource/CjsLoadingObject.js.map +1 -0
- package/dist/resource/CjsResource.js +801 -797
- package/dist/resource/CjsResource.js.map +1 -1
- package/dist/resource/ResourceHandlerMode.js +14 -0
- package/dist/resource/ResourceHandlerMode.js.map +1 -0
- package/dist/resource/Tr2LightProfileRes.js +32 -32
- package/dist/resource/audio/AudioGeometryResData.js +47 -47
- package/dist/resource/audio/CjsAudioBufferRes.js +86 -86
- package/dist/resource/audio/CjsAudioRes.js +213 -213
- package/dist/resource/audio/index.js +4 -4
- package/dist/resource/geometry/MeshDecalData.js +37 -37
- package/dist/resource/geometry/MeshDecalLodData.js +34 -34
- package/dist/resource/geometry/TriGeometryRes.js +675 -675
- package/dist/resource/geometry/TriGeometryResAreaData.js +59 -59
- package/dist/resource/geometry/TriGeometryResJointData.js +38 -38
- package/dist/resource/geometry/TriGeometryResLodData.js +88 -88
- package/dist/resource/geometry/TriGeometryResMeshData.js +63 -63
- package/dist/resource/geometry/TriGeometryResSkeletonData.js +34 -34
- package/dist/resource/geometry/TriJointBinding.js +38 -38
- package/dist/resource/geometry/TriMorphTargetGeometryConstants.js +46 -46
- package/dist/resource/geometry/TriRtGeometryConstants.js +88 -88
- package/dist/resource/geometry/granny/GStateBindingCallbackData.js +31 -31
- package/dist/resource/geometry/granny/Tr2GrannyIntersectionResult.js +60 -60
- package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +36 -36
- package/dist/resource/geometry/granny/TriGrannyRes.js +35 -35
- package/dist/resource/geometry/granny/enums.js +10 -10
- package/dist/resource/geometry/granny/index.js +6 -6
- package/dist/resource/geometry/index.js +17 -17
- package/dist/resource/index.js +54 -52
- package/dist/resource/index.js.map +1 -1
- package/dist/resource/resourceBoundary.js +64 -64
- package/dist/resource/shader/Tr2EffectRes.js +336 -431
- package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
- package/dist/resource/shader/Tr2MaterialArea.js +31 -31
- package/dist/resource/shader/Tr2MaterialMesh.js +27 -27
- package/dist/resource/shader/Tr2MaterialRes.js +31 -31
- package/dist/resource/shader/Tr2Shader.js +283 -261
- package/dist/resource/shader/Tr2Shader.js.map +1 -1
- package/dist/resource/shader/Tr2ShaderPermutation.js +43 -43
- package/dist/resource/shader/index.js +17 -17
- package/dist/resource/shader/reflection/Tr2EffectConstant.js +143 -135
- package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectDefine.js +30 -30
- package/dist/resource/shader/reflection/Tr2EffectDescription.js +114 -109
- package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js +168 -147
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +125 -105
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectResource.js +120 -86
- package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +372 -241
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js +78 -68
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2Pass.js +168 -111
- package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
- package/dist/resource/shader/reflection/carbonRecordFields.js +159 -0
- package/dist/resource/shader/reflection/carbonRecordFields.js.map +1 -0
- package/dist/resource/shader/reflection/shaderStage.js +22 -0
- package/dist/resource/shader/reflection/shaderStage.js.map +1 -0
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js +135 -77
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
- package/dist/resource/texture/CjsTextureArrayRes.js +472 -472
- package/dist/resource/texture/CjsTextureArrayResParameterProxy.js +179 -179
- package/dist/resource/texture/Tr2ImageRes.js +120 -120
- package/dist/resource/texture/Tr2TextureLodManager.js +82 -82
- package/dist/resource/texture/Tr2TextureLodUpdateRequest.js +37 -37
- package/dist/resource/texture/Tr2TexturePackChannel.js +37 -37
- package/dist/resource/texture/Tr2TexturePipeline.js +54 -54
- package/dist/resource/texture/Tr2TexturePipelineParams.js +34 -34
- package/dist/resource/texture/Tr2TexturePipelineStepCompress.js +40 -40
- package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js +22 -22
- package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js +34 -34
- package/dist/resource/texture/Tr2TexturePipelineStepLoad.js +31 -31
- package/dist/resource/texture/Tr2TexturePipelineStepPack.js +43 -43
- package/dist/resource/texture/TriTextureRes.js +359 -359
- package/dist/resource/texture/index.js +15 -15
- package/dist/resource/texture/texturePipelineBehavior.js +308 -308
- package/dist/worker/CjsResManMainThreadLoader.js +89 -87
- package/dist/worker/CjsResManMainThreadLoader.js.map +1 -1
- package/dist/worker/CjsResManWorker.js +218 -217
- package/dist/worker/CjsResManWorker.js.map +1 -1
- package/dist/worker/CjsResManWorkerLoader.js +437 -434
- package/dist/worker/CjsResManWorkerLoader.js.map +1 -1
- package/dist/worker/protocol.js +12 -12
- package/docs/README.md +98 -98
- package/docs/architecture.md +118 -109
- package/docs/concepts/resource-lifecycle.md +226 -225
- package/docs/concepts/shader-resource-model.md +111 -114
- package/docs/concepts/writing-an-engine-adapter.md +115 -115
- package/docs/formats/README.md +138 -136
- package/docs/formats/carbon-effect-container.md +553 -452
- package/docs/formats/dxbc/README.md +68 -68
- package/docs/formats/dxbc/architecture.md +80 -80
- package/docs/formats/dxbc/reference/api.md +77 -77
- package/docs/formats/dxbc/reference/classes/README.md +9 -9
- package/docs/formats/dxbc/reference/decoded-output.md +122 -122
- package/docs/formats/gr2.md +160 -160
- package/docs/formats/hlsl/README.md +54 -54
- package/docs/formats/hlsl/architecture.md +65 -67
- package/docs/formats/hlsl/guides/hydrating-json-output.md +60 -62
- package/docs/formats/hlsl/guides/reading-effects.md +64 -64
- package/docs/formats/hlsl/reference/advanced-analysis.md +61 -66
- package/docs/formats/hlsl/reference/api.md +92 -98
- package/docs/formats/hlsl/reference/classes/README.md +11 -11
- package/docs/formats/hlsl/reference/json-graph.md +97 -100
- package/docs/formats/pickle.md +82 -0
- package/docs/formats/provenance.md +196 -196
- package/docs/formats/stl.md +37 -37
- package/docs/formats/webgl/README.md +115 -57
- package/docs/formats/webgl/architecture.md +69 -70
- package/docs/formats/webgl/carbon-constant-layouts.md +326 -326
- package/docs/formats/webgl/decl-io.md +1234 -1234
- package/docs/formats/webgl/memory-structured.md +890 -871
- package/docs/formats/webgl/reference/classes/README.md +9 -9
- package/docs/formats/webgl/texture-sample.md +964 -964
- package/docs/formats/webgpu/README.md +84 -84
- package/docs/formats/webgpu/architecture.md +95 -96
- package/docs/formats/webgpu/formats/{cewgpu.md → carbon-webgpu.md} +215 -216
- package/docs/formats/webgpu/guides/effect-packaging.md +189 -191
- package/docs/formats/webgpu/reference/api.md +196 -197
- package/docs/formats/webgpu/reference/classes/README.md +9 -9
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +1546 -1543
- package/docs/formats/wwise.md +146 -85
- package/docs/reference/classes/README.md +35 -35
- package/docs/reference/classes/audio.md +30 -30
- package/docs/reference/classes/core.md +216 -206
- package/docs/reference/classes/dropped.md +46 -46
- package/docs/reference/classes/formats.md +944 -952
- package/docs/reference/classes/resources.md +456 -456
- package/docs/reference/classes/texture.md +26 -26
- package/docs/reference/events.md +117 -117
- package/docs/reference/motherlode-cache.md +275 -275
- package/docs/reference/queues.md +194 -110
- package/docs/reference/reload.md +107 -107
- package/docs/reference/texture-arrays.md +113 -113
- package/docs/reference/texture-pipeline.md +53 -53
- package/docs/reference/workers.md +142 -135
- package/docs/roadmap.md +150 -150
- package/format-notices/black/LICENSE +21 -21
- package/format-notices/black/NOTICE +47 -47
- package/format-notices/bnk/LICENSE +21 -21
- package/format-notices/bnk/NOTICE +21 -21
- package/format-notices/cmf/LICENSE +21 -21
- package/format-notices/cmf/NOTICE +36 -36
- package/format-notices/dds/LICENSE +21 -21
- package/format-notices/dds/NOTICE +14 -14
- package/format-notices/dxbc/LICENSE +21 -21
- package/format-notices/dxbc/NOTICE +20 -20
- package/format-notices/fbx/LICENSE +21 -21
- package/format-notices/fbx/NOTICE +14 -14
- package/format-notices/flac/LICENSE +21 -21
- package/format-notices/flac/NOTICE +14 -14
- package/format-notices/gif/LICENSE +21 -21
- package/format-notices/gif/NOTICE +14 -14
- package/format-notices/gltf/LICENSE +21 -21
- package/format-notices/gltf/NOTICE +27 -27
- package/format-notices/gr2/LICENSE +21 -21
- package/format-notices/gr2/NOTICE +60 -60
- package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -93
- package/format-notices/hlsl/LICENSE +21 -21
- package/format-notices/hlsl/NOTICE +25 -25
- package/format-notices/jpeg/LICENSE +21 -21
- package/format-notices/jpeg/NOTICE +14 -14
- package/format-notices/mp3/LICENSE +21 -21
- package/format-notices/mp3/NOTICE +14 -14
- package/format-notices/mp4/LICENSE +21 -21
- package/format-notices/mp4/NOTICE +14 -14
- package/format-notices/obj/LICENSE +21 -21
- package/format-notices/obj/NOTICE +26 -26
- package/format-notices/ogg/LICENSE +21 -21
- package/format-notices/ogg/NOTICE +28 -28
- package/format-notices/png/LICENSE +21 -21
- package/format-notices/png/NOTICE +14 -14
- package/format-notices/red/LICENSE +21 -21
- package/format-notices/red/NOTICE +31 -31
- package/format-notices/stl/LICENSE +21 -21
- package/format-notices/stl/NOTICE +21 -21
- package/format-notices/tga/LICENSE +21 -21
- package/format-notices/tga/NOTICE +14 -14
- package/format-notices/wav/LICENSE +21 -21
- package/format-notices/wav/NOTICE +14 -14
- package/format-notices/webgl/LICENSE +21 -21
- package/format-notices/webgl/NOTICE +35 -35
- package/format-notices/webgpu/LICENSE +21 -21
- package/format-notices/webgpu/NOTICE +31 -31
- package/format-notices/webm/LICENSE +21 -21
- package/format-notices/webm/NOTICE +14 -14
- package/format-notices/webp/LICENSE +21 -21
- package/format-notices/webp/NOTICE +14 -14
- package/format-notices/wem/LICENSE +57 -57
- package/format-notices/wem/NOTICE +33 -33
- package/format-notices/yaml/LICENSE +21 -21
- package/format-notices/yaml/NOTICE +44 -44
- package/package.json +63 -63
- package/dist/format/carbonEffect/carbonDescriptionFromPortable.js +0 -372
- package/dist/format/carbonEffect/carbonDescriptionFromPortable.js.map +0 -1
- package/dist/format/effect/effectReflectionPackage.js +0 -636
- package/dist/format/effect/effectReflectionPackage.js.map +0 -1
- package/dist/formats/hlsl/core/HlslReader.js +0 -16
- package/dist/formats/hlsl/core/HlslReader.js.map +0 -1
- package/dist/formats/hlsl/core/portableReflection.js +0 -848
- package/dist/formats/hlsl/core/portableReflection.js.map +0 -1
- package/dist/formats/hlsl/portable.js +0 -2
- package/dist/formats/hlsl/portable.js.map +0 -1
- package/dist/formats/webgl/core/cewg/CewgPackage.js +0 -340
- package/dist/formats/webgl/core/cewg/CewgPackage.js.map +0 -1
- package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js +0 -104
- package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js.map +0 -1
- package/dist/formats/webgl/core/cewg/binary.js +0 -19
- package/dist/formats/webgl/core/cewg/binary.js.map +0 -1
- package/dist/formats/webgl/core/cewgCompleteness.js.map +0 -1
- package/dist/formats/webgl/core/effectPackageValidation.js +0 -331
- package/dist/formats/webgl/core/effectPackageValidation.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/containerViews.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/validateContainer.js.map +0 -1
- package/dist/resource/shader/portable.js +0 -33
- package/dist/resource/shader/portable.js.map +0 -1
- package/docs/formats/hlsl/reference/portable-reflection.md +0 -141
- package/docs/formats/webgl/effect-reflection.md +0 -127
|
@@ -1,373 +1,373 @@
|
|
|
1
|
-
import { CjsByteWriter } from '../CjsByteWriter.js';
|
|
2
|
-
import { CjsStringTable } from '../CjsStringTable.js';
|
|
3
|
-
import { CjsFormatWriteError } from '../CjsFormatError.js';
|
|
4
|
-
import { writeEffectDescription, collectArena, internArena, CARBON_EFFECT_DATA_VERSION } from './carbonEffectRecords.js';
|
|
5
|
-
import { CARBON_EFFECT_SOURCE_HASH_BYTES } from './CjsCarbonEffectReader.js';
|
|
6
|
-
export { CARBON_EFFECT_RECORD_BYTES } from './CjsCarbonEffectReader.js';
|
|
7
|
-
|
|
8
|
-
// Source: trinity/shadercompiler/ShaderCompiler.cpp:717-845 (alias dedupe, file assembly)
|
|
9
|
-
|
|
10
|
-
const textEncoder = new TextEncoder();
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Byte count of one permutation record's fixed part: `u32 name`,
|
|
14
|
-
* `u8 defaultOption`, `u32 description`, `u8 type`, `u8 optionCount`
|
|
15
|
-
* (`ShaderCompiler.cpp:757-761`).
|
|
16
|
-
*/
|
|
17
|
-
const PERMUTATION_FIXED_BYTES = 11;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* FNV-1a over every byte, used to bucket body-dedupe candidates.
|
|
21
|
-
*
|
|
22
|
-
* @param {Uint8Array} bytes Byte run to hash.
|
|
23
|
-
* @returns {number} 32-bit hash.
|
|
24
|
-
*/
|
|
25
|
-
function hashBytes(bytes) {
|
|
26
|
-
let hash = 0x811c9dc5;
|
|
27
|
-
for (let index = 0; index < bytes.length; index += 1) {
|
|
28
|
-
hash ^= bytes[index];
|
|
29
|
-
hash = Math.imul(hash, 0x01000193);
|
|
30
|
-
}
|
|
31
|
-
return hash >>> 0;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Reports whether two byte runs are identical.
|
|
36
|
-
*
|
|
37
|
-
* @param {Uint8Array} a First byte run.
|
|
38
|
-
* @param {Uint8Array} b Second byte run.
|
|
39
|
-
* @returns {boolean} True when the runs match exactly.
|
|
40
|
-
*/
|
|
41
|
-
function bytesEqual(a, b) {
|
|
42
|
-
if (a.length !== b.length) return false;
|
|
43
|
-
for (let index = 0; index < a.length; index += 1) {
|
|
44
|
-
if (a[index] !== b[index]) return false;
|
|
45
|
-
}
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Normalises a source hash to the 32 ASCII bytes the header slot holds.
|
|
51
|
-
*
|
|
52
|
-
* @param {string|ArrayBufferView|Uint8Array} value 32 hex characters or 32 bytes.
|
|
53
|
-
* @returns {Uint8Array} Exactly 32 bytes.
|
|
54
|
-
*/
|
|
55
|
-
function normalizeSourceHash(value) {
|
|
56
|
-
const bytes = typeof value === "string" ? textEncoder.encode(value) : value instanceof Uint8Array ? value : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
57
|
-
if (bytes.length !== CARBON_EFFECT_SOURCE_HASH_BYTES) {
|
|
58
|
-
throw new CjsFormatWriteError(`Source hash must be exactly ${CARBON_EFFECT_SOURCE_HASH_BYTES} bytes`, {
|
|
59
|
-
byteLength: bytes.length
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
return bytes;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Normalises a compiler version to the four bytes the header slot holds.
|
|
67
|
-
*
|
|
68
|
-
* The slot is `uint8_t[4]` — `{major, minor, patch, tweak}` from
|
|
69
|
-
* `ShaderCompilerConfig.h.in:5`, of which Carbon's rebuild check compares only
|
|
70
|
-
* the first three (`ModifiedTime.cpp:77`). Carbon's own runtime skips the field
|
|
71
|
-
* entirely (`Tr2EffectRes.cpp:246-249`).
|
|
72
|
-
*
|
|
73
|
-
* @param {number[]|ArrayBufferView|Uint8Array} value Four version components.
|
|
74
|
-
* @returns {Uint8Array} Exactly 4 bytes.
|
|
75
|
-
*/
|
|
76
|
-
function normalizeCompilerVersion(value) {
|
|
77
|
-
const bytes = Array.isArray(value) ? Uint8Array.from(value, part => Number(part) & 0xff) : value instanceof Uint8Array ? value : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
78
|
-
if (bytes.length !== 4) {
|
|
79
|
-
throw new CjsFormatWriteError("Compiler version must be exactly 4 bytes", {
|
|
80
|
-
byteLength: bytes.length
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
return bytes;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Assembles a Carbon compiled-effect container from fully resolved parts.
|
|
88
|
-
*
|
|
89
|
-
* This is the low-level primitive: every arena reference in `permutationRows`
|
|
90
|
-
* is already a byte offset and every body is already serialised, so the
|
|
91
|
-
* function reproduces exactly Carbon's header order, alias dedupe and
|
|
92
|
-
* body-offset arithmetic and nothing else. Re-emitting a file through this
|
|
93
|
-
* function with its own arena and body bytes must reproduce it byte for byte.
|
|
94
|
-
*
|
|
95
|
-
* Body-offset base is `4 + 4 + 32 + headerSize + stringTable.GetSize()`
|
|
96
|
-
* (`ShaderCompiler.cpp:801`), where `headerSize` is the byte size of the
|
|
97
|
-
* permutation block plus the offset table (`:765`) and `GetSize()` includes the
|
|
98
|
-
* arena's own `u32` length prefix (`StringTable.cpp:82-85`).
|
|
99
|
-
*
|
|
100
|
-
* @param {object} parts Resolved container parts.
|
|
101
|
-
* @param {number[]|Uint8Array} parts.compilerVersion Four version bytes.
|
|
102
|
-
* @param {string|Uint8Array} parts.sourceHash 32 ASCII hash bytes.
|
|
103
|
-
* @param {Uint8Array} parts.stringTableBytes Arena payload, without its prefix.
|
|
104
|
-
* @param {object[]} parts.permutationRows Permutation axes with resolved offsets.
|
|
105
|
-
* @param {Array<{index:number, bytes:Uint8Array}>} parts.bodies Serialised bodies.
|
|
106
|
-
* @returns {Uint8Array} Container bytes.
|
|
107
|
-
*/
|
|
108
|
-
function writeCarbonEffectFile(parts) {
|
|
109
|
-
const compilerVersion = normalizeCompilerVersion(parts.compilerVersion ?? [0, 0, 0, 0]);
|
|
110
|
-
const sourceHash = normalizeSourceHash(parts.sourceHash ?? "0".repeat(CARBON_EFFECT_SOURCE_HASH_BYTES));
|
|
111
|
-
const stringTableBytes = parts.stringTableBytes ?? new Uint8Array(0);
|
|
112
|
-
const permutationRows = parts.permutationRows ?? [];
|
|
113
|
-
const bodies = parts.bodies ?? [];
|
|
114
|
-
if (bodies.length === 0) {
|
|
115
|
-
throw new CjsFormatWriteError("A Carbon effect container needs at least one body");
|
|
116
|
-
}
|
|
117
|
-
if (permutationRows.length > 0xff) {
|
|
118
|
-
throw new CjsFormatWriteError("Permutation axis count does not fit in a u8", {
|
|
119
|
-
count: permutationRows.length
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
const ordered = bodies.slice().sort((a, b) => a.index - b.index);
|
|
123
|
-
for (let position = 0; position < ordered.length; position += 1) {
|
|
124
|
-
if (ordered[position].index !== position) {
|
|
125
|
-
throw new CjsFormatWriteError("Carbon effect bodies must be dense and start at index 0; the reader indexes the offset table positionally", {
|
|
126
|
-
position,
|
|
127
|
-
index: ordered[position].index
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
let permutationBytes = 1;
|
|
132
|
-
for (const row of permutationRows) {
|
|
133
|
-
if (row.options.length > 0xff) {
|
|
134
|
-
throw new CjsFormatWriteError("Permutation option count does not fit in a u8", {
|
|
135
|
-
name: row.name,
|
|
136
|
-
count: row.options.length
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
permutationBytes += PERMUTATION_FIXED_BYTES + row.options.length * 4;
|
|
140
|
-
}
|
|
141
|
-
const headerSize = (ordered.length * 3 + 1) * 4 + permutationBytes;
|
|
142
|
-
const base = 4 + 4 + CARBON_EFFECT_SOURCE_HASH_BYTES + headerSize + (stringTableBytes.length + 4);
|
|
143
|
-
|
|
144
|
-
// Carbon compares packed bodies pairwise and points a duplicate's row at the
|
|
145
|
-
// surviving twin, so the offset table stays dense while the file stores each
|
|
146
|
-
// distinct body once (`ShaderCompiler.cpp:717-744`, `:804-820`). Keying the
|
|
147
|
-
// first occurrence by content reaches the same rows in one pass.
|
|
148
|
-
const byContent = new Map();
|
|
149
|
-
const records = [];
|
|
150
|
-
const uniqueBodies = [];
|
|
151
|
-
let cursor = base;
|
|
152
|
-
for (const body of ordered) {
|
|
153
|
-
const key = hashBytes(body.bytes);
|
|
154
|
-
const candidates = byContent.get(key);
|
|
155
|
-
const existing = candidates?.find(candidate => bytesEqual(candidate.bytes, body.bytes));
|
|
156
|
-
if (existing) {
|
|
157
|
-
records.push({
|
|
158
|
-
index: body.index,
|
|
159
|
-
offset: existing.offset,
|
|
160
|
-
size: existing.size
|
|
161
|
-
});
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
const record = {
|
|
165
|
-
index: body.index,
|
|
166
|
-
offset: cursor,
|
|
167
|
-
size: body.bytes.length
|
|
168
|
-
};
|
|
169
|
-
if (candidates) candidates.push({
|
|
170
|
-
bytes: body.bytes,
|
|
171
|
-
...record
|
|
172
|
-
});else byContent.set(key, [{
|
|
173
|
-
bytes: body.bytes,
|
|
174
|
-
...record
|
|
175
|
-
}]);
|
|
176
|
-
records.push(record);
|
|
177
|
-
uniqueBodies.push(body.bytes);
|
|
178
|
-
cursor += body.bytes.length;
|
|
179
|
-
}
|
|
180
|
-
const writer = new CjsByteWriter(cursor);
|
|
181
|
-
writer.u32(CARBON_EFFECT_DATA_VERSION);
|
|
182
|
-
writer.bytes(compilerVersion);
|
|
183
|
-
writer.bytes(sourceHash);
|
|
184
|
-
writer.u32(stringTableBytes.length);
|
|
185
|
-
if (stringTableBytes.length > 0) writer.bytes(stringTableBytes);
|
|
186
|
-
writer.u8(permutationRows.length);
|
|
187
|
-
for (const row of permutationRows) {
|
|
188
|
-
writer.u32(row.nameOffset);
|
|
189
|
-
writer.u8(row.defaultOption);
|
|
190
|
-
writer.u32(row.descriptionOffset);
|
|
191
|
-
writer.u8(row.type);
|
|
192
|
-
writer.u8(row.options.length);
|
|
193
|
-
for (const optionOffset of row.options) {
|
|
194
|
-
writer.u32(optionOffset);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
writer.u32(records.length);
|
|
198
|
-
for (const record of records) {
|
|
199
|
-
writer.u32(record.index);
|
|
200
|
-
writer.u32(record.offset);
|
|
201
|
-
writer.u32(record.size);
|
|
202
|
-
}
|
|
203
|
-
if (writer.length !== base) {
|
|
204
|
-
throw new CjsFormatWriteError("Carbon effect header size arithmetic disagrees with the bytes written", {
|
|
205
|
-
written: writer.length,
|
|
206
|
-
expected: base,
|
|
207
|
-
headerSize,
|
|
208
|
-
permutationBytes
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
for (const bytes of uniqueBodies) {
|
|
212
|
-
writer.bytes(bytes);
|
|
213
|
-
}
|
|
214
|
-
return writer.toBytes();
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Builder for a Carbon compiled-effect container.
|
|
219
|
-
*
|
|
220
|
-
* Interning and emission are two passes over the same records, in that order,
|
|
221
|
-
* because an arena offset is only stable once every entry is present: adding
|
|
222
|
-
* after an offset has been handed out would shift every offset already written.
|
|
223
|
-
* `collectArena` runs the first pass and `internArena` the second, and because
|
|
224
|
-
* both drive the same `writeEffectDescription` walk they cannot fall out of
|
|
225
|
-
* step with each other.
|
|
226
|
-
*/
|
|
227
|
-
class CjsCarbonEffectWriter {
|
|
228
|
-
#table;
|
|
229
|
-
#permutations = [];
|
|
230
|
-
#bodies = [];
|
|
231
|
-
#compilerVersion;
|
|
232
|
-
#sourceHash;
|
|
233
|
-
#backend;
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Creates an empty container builder.
|
|
237
|
-
*
|
|
238
|
-
* @param {object} [options] Builder options.
|
|
239
|
-
* @param {number[]|Uint8Array} [options.compilerVersion] Four version bytes.
|
|
240
|
-
* @param {string|Uint8Array} [options.sourceHash] 32 ASCII hash bytes.
|
|
241
|
-
* @param {CjsStringTable} [options.stringTable] Arena to intern into.
|
|
242
|
-
* @param {boolean} [options.backend] Emit the optional trailing block per pass.
|
|
243
|
-
*/
|
|
244
|
-
constructor(options = {}) {
|
|
245
|
-
this.#table = options.stringTable ?? new CjsStringTable();
|
|
246
|
-
this.#compilerVersion = options.compilerVersion ?? [0, 0, 0, 0];
|
|
247
|
-
this.#sourceHash = options.sourceHash ?? "0".repeat(CARBON_EFFECT_SOURCE_HASH_BYTES);
|
|
248
|
-
this.#backend = options.backend === true;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Returns the arena this builder interns into.
|
|
253
|
-
*
|
|
254
|
-
* @returns {CjsStringTable} String table.
|
|
255
|
-
*/
|
|
256
|
-
get stringTable() {
|
|
257
|
-
return this.#table;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Adds a permutation axis.
|
|
262
|
-
*
|
|
263
|
-
* @param {object} axis Axis description.
|
|
264
|
-
* @param {string} axis.name Axis name.
|
|
265
|
-
* @param {number} [axis.defaultOption] Index of the default option.
|
|
266
|
-
* @param {string} [axis.description] Axis description text.
|
|
267
|
-
* @param {number} [axis.type] Axis type byte.
|
|
268
|
-
* @param {string[]} axis.options Option names.
|
|
269
|
-
* @returns {CjsCarbonEffectWriter} This builder.
|
|
270
|
-
*/
|
|
271
|
-
addPermutation(axis) {
|
|
272
|
-
this.#permutations.push({
|
|
273
|
-
name: String(axis.name ?? ""),
|
|
274
|
-
defaultOption: axis.defaultOption ?? 0,
|
|
275
|
-
description: String(axis.description ?? ""),
|
|
276
|
-
type: axis.type ?? 0,
|
|
277
|
-
options: (axis.options ?? []).map(option => String(option))
|
|
278
|
-
});
|
|
279
|
-
return this;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Adds one permutation's description record tree.
|
|
284
|
-
*
|
|
285
|
-
* @param {number} index Permutation index.
|
|
286
|
-
* @param {object} description Description record tree.
|
|
287
|
-
* @returns {CjsCarbonEffectWriter} This builder.
|
|
288
|
-
*/
|
|
289
|
-
addBody(index, description) {
|
|
290
|
-
this.#bodies.push({
|
|
291
|
-
index,
|
|
292
|
-
description,
|
|
293
|
-
bytes: null
|
|
294
|
-
});
|
|
295
|
-
return this;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Adds one permutation's already-serialised description bytes.
|
|
300
|
-
*
|
|
301
|
-
* Used when re-emitting a file whose arena is being reused verbatim: the
|
|
302
|
-
* bytes already carry resolved offsets into that arena, so they must not be
|
|
303
|
-
* re-interned.
|
|
304
|
-
*
|
|
305
|
-
* @param {number} index Permutation index.
|
|
306
|
-
* @param {Uint8Array} bytes Serialised description blob.
|
|
307
|
-
* @returns {CjsCarbonEffectWriter} This builder.
|
|
308
|
-
*/
|
|
309
|
-
addRawBody(index, bytes) {
|
|
310
|
-
this.#bodies.push({
|
|
311
|
-
index,
|
|
312
|
-
description: null,
|
|
313
|
-
bytes: Uint8Array.from(bytes)
|
|
314
|
-
});
|
|
315
|
-
return this;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Interns, serialises and assembles the container.
|
|
320
|
-
*
|
|
321
|
-
* @returns {Uint8Array} Container bytes.
|
|
322
|
-
*/
|
|
323
|
-
toBytes() {
|
|
324
|
-
for (const axis of this.#permutations) {
|
|
325
|
-
axis.nameRef = this.#table.addString(axis.name);
|
|
326
|
-
axis.descriptionRef = this.#table.addString(axis.description);
|
|
327
|
-
axis.optionRefs = axis.options.map(option => this.#table.addString(option));
|
|
328
|
-
}
|
|
329
|
-
for (const body of this.#bodies) {
|
|
330
|
-
if (body.description) {
|
|
331
|
-
writeEffectDescription(new CjsByteWriter(), body.description, {
|
|
332
|
-
arena: collectArena(this.#table),
|
|
333
|
-
backend: this.#backend
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
this.#table.finish();
|
|
338
|
-
const arena = internArena(this.#table);
|
|
339
|
-
const bodies = this.#bodies.map(body => {
|
|
340
|
-
if (body.bytes) return {
|
|
341
|
-
index: body.index,
|
|
342
|
-
bytes: body.bytes
|
|
343
|
-
};
|
|
344
|
-
const writer = new CjsByteWriter();
|
|
345
|
-
writeEffectDescription(writer, body.description, {
|
|
346
|
-
arena,
|
|
347
|
-
backend: this.#backend
|
|
348
|
-
});
|
|
349
|
-
return {
|
|
350
|
-
index: body.index,
|
|
351
|
-
bytes: writer.toBytes()
|
|
352
|
-
};
|
|
353
|
-
});
|
|
354
|
-
const permutationRows = this.#permutations.map(axis => ({
|
|
355
|
-
name: axis.name,
|
|
356
|
-
nameOffset: this.#table.offsetOf(axis.nameRef),
|
|
357
|
-
defaultOption: axis.defaultOption,
|
|
358
|
-
descriptionOffset: this.#table.offsetOf(axis.descriptionRef),
|
|
359
|
-
type: axis.type,
|
|
360
|
-
options: axis.optionRefs.map(reference => this.#table.offsetOf(reference))
|
|
361
|
-
}));
|
|
362
|
-
return writeCarbonEffectFile({
|
|
363
|
-
compilerVersion: this.#compilerVersion,
|
|
364
|
-
sourceHash: this.#sourceHash,
|
|
365
|
-
stringTableBytes: this.#table.toBytes(),
|
|
366
|
-
permutationRows,
|
|
367
|
-
bodies
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
export { CARBON_EFFECT_SOURCE_HASH_BYTES, CjsCarbonEffectWriter, writeCarbonEffectFile };
|
|
373
|
-
//# sourceMappingURL=CjsCarbonEffectWriter.js.map
|
|
1
|
+
import { CjsByteWriter } from '../CjsByteWriter.js';
|
|
2
|
+
import { CjsStringTable } from '../CjsStringTable.js';
|
|
3
|
+
import { CjsFormatWriteError } from '../CjsFormatError.js';
|
|
4
|
+
import { writeEffectDescription, collectArena, internArena, CARBON_EFFECT_DATA_VERSION } from './carbonEffectRecords.js';
|
|
5
|
+
import { CARBON_EFFECT_SOURCE_HASH_BYTES } from './CjsCarbonEffectReader.js';
|
|
6
|
+
export { CARBON_EFFECT_RECORD_BYTES } from './CjsCarbonEffectReader.js';
|
|
7
|
+
|
|
8
|
+
// Source: trinity/shadercompiler/ShaderCompiler.cpp:717-845 (alias dedupe, file assembly)
|
|
9
|
+
|
|
10
|
+
const textEncoder = new TextEncoder();
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Byte count of one permutation record's fixed part: `u32 name`,
|
|
14
|
+
* `u8 defaultOption`, `u32 description`, `u8 type`, `u8 optionCount`
|
|
15
|
+
* (`ShaderCompiler.cpp:757-761`).
|
|
16
|
+
*/
|
|
17
|
+
const PERMUTATION_FIXED_BYTES = 11;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* FNV-1a over every byte, used to bucket body-dedupe candidates.
|
|
21
|
+
*
|
|
22
|
+
* @param {Uint8Array} bytes Byte run to hash.
|
|
23
|
+
* @returns {number} 32-bit hash.
|
|
24
|
+
*/
|
|
25
|
+
function hashBytes(bytes) {
|
|
26
|
+
let hash = 0x811c9dc5;
|
|
27
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
28
|
+
hash ^= bytes[index];
|
|
29
|
+
hash = Math.imul(hash, 0x01000193);
|
|
30
|
+
}
|
|
31
|
+
return hash >>> 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Reports whether two byte runs are identical.
|
|
36
|
+
*
|
|
37
|
+
* @param {Uint8Array} a First byte run.
|
|
38
|
+
* @param {Uint8Array} b Second byte run.
|
|
39
|
+
* @returns {boolean} True when the runs match exactly.
|
|
40
|
+
*/
|
|
41
|
+
function bytesEqual(a, b) {
|
|
42
|
+
if (a.length !== b.length) return false;
|
|
43
|
+
for (let index = 0; index < a.length; index += 1) {
|
|
44
|
+
if (a[index] !== b[index]) return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Normalises a source hash to the 32 ASCII bytes the header slot holds.
|
|
51
|
+
*
|
|
52
|
+
* @param {string|ArrayBufferView|Uint8Array} value 32 hex characters or 32 bytes.
|
|
53
|
+
* @returns {Uint8Array} Exactly 32 bytes.
|
|
54
|
+
*/
|
|
55
|
+
function normalizeSourceHash(value) {
|
|
56
|
+
const bytes = typeof value === "string" ? textEncoder.encode(value) : value instanceof Uint8Array ? value : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
57
|
+
if (bytes.length !== CARBON_EFFECT_SOURCE_HASH_BYTES) {
|
|
58
|
+
throw new CjsFormatWriteError(`Source hash must be exactly ${CARBON_EFFECT_SOURCE_HASH_BYTES} bytes`, {
|
|
59
|
+
byteLength: bytes.length
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return bytes;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Normalises a compiler version to the four bytes the header slot holds.
|
|
67
|
+
*
|
|
68
|
+
* The slot is `uint8_t[4]` — `{major, minor, patch, tweak}` from
|
|
69
|
+
* `ShaderCompilerConfig.h.in:5`, of which Carbon's rebuild check compares only
|
|
70
|
+
* the first three (`ModifiedTime.cpp:77`). Carbon's own runtime skips the field
|
|
71
|
+
* entirely (`Tr2EffectRes.cpp:246-249`).
|
|
72
|
+
*
|
|
73
|
+
* @param {number[]|ArrayBufferView|Uint8Array} value Four version components.
|
|
74
|
+
* @returns {Uint8Array} Exactly 4 bytes.
|
|
75
|
+
*/
|
|
76
|
+
function normalizeCompilerVersion(value) {
|
|
77
|
+
const bytes = Array.isArray(value) ? Uint8Array.from(value, part => Number(part) & 0xff) : value instanceof Uint8Array ? value : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
78
|
+
if (bytes.length !== 4) {
|
|
79
|
+
throw new CjsFormatWriteError("Compiler version must be exactly 4 bytes", {
|
|
80
|
+
byteLength: bytes.length
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return bytes;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Assembles a Carbon compiled-effect container from fully resolved parts.
|
|
88
|
+
*
|
|
89
|
+
* This is the low-level primitive: every arena reference in `permutationRows`
|
|
90
|
+
* is already a byte offset and every body is already serialised, so the
|
|
91
|
+
* function reproduces exactly Carbon's header order, alias dedupe and
|
|
92
|
+
* body-offset arithmetic and nothing else. Re-emitting a file through this
|
|
93
|
+
* function with its own arena and body bytes must reproduce it byte for byte.
|
|
94
|
+
*
|
|
95
|
+
* Body-offset base is `4 + 4 + 32 + headerSize + stringTable.GetSize()`
|
|
96
|
+
* (`ShaderCompiler.cpp:801`), where `headerSize` is the byte size of the
|
|
97
|
+
* permutation block plus the offset table (`:765`) and `GetSize()` includes the
|
|
98
|
+
* arena's own `u32` length prefix (`StringTable.cpp:82-85`).
|
|
99
|
+
*
|
|
100
|
+
* @param {object} parts Resolved container parts.
|
|
101
|
+
* @param {number[]|Uint8Array} parts.compilerVersion Four version bytes.
|
|
102
|
+
* @param {string|Uint8Array} parts.sourceHash 32 ASCII hash bytes.
|
|
103
|
+
* @param {Uint8Array} parts.stringTableBytes Arena payload, without its prefix.
|
|
104
|
+
* @param {object[]} parts.permutationRows Permutation axes with resolved offsets.
|
|
105
|
+
* @param {Array<{index:number, bytes:Uint8Array}>} parts.bodies Serialised bodies.
|
|
106
|
+
* @returns {Uint8Array} Container bytes.
|
|
107
|
+
*/
|
|
108
|
+
function writeCarbonEffectFile(parts) {
|
|
109
|
+
const compilerVersion = normalizeCompilerVersion(parts.compilerVersion ?? [0, 0, 0, 0]);
|
|
110
|
+
const sourceHash = normalizeSourceHash(parts.sourceHash ?? "0".repeat(CARBON_EFFECT_SOURCE_HASH_BYTES));
|
|
111
|
+
const stringTableBytes = parts.stringTableBytes ?? new Uint8Array(0);
|
|
112
|
+
const permutationRows = parts.permutationRows ?? [];
|
|
113
|
+
const bodies = parts.bodies ?? [];
|
|
114
|
+
if (bodies.length === 0) {
|
|
115
|
+
throw new CjsFormatWriteError("A Carbon effect container needs at least one body");
|
|
116
|
+
}
|
|
117
|
+
if (permutationRows.length > 0xff) {
|
|
118
|
+
throw new CjsFormatWriteError("Permutation axis count does not fit in a u8", {
|
|
119
|
+
count: permutationRows.length
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const ordered = bodies.slice().sort((a, b) => a.index - b.index);
|
|
123
|
+
for (let position = 0; position < ordered.length; position += 1) {
|
|
124
|
+
if (ordered[position].index !== position) {
|
|
125
|
+
throw new CjsFormatWriteError("Carbon effect bodies must be dense and start at index 0; the reader indexes the offset table positionally", {
|
|
126
|
+
position,
|
|
127
|
+
index: ordered[position].index
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
let permutationBytes = 1;
|
|
132
|
+
for (const row of permutationRows) {
|
|
133
|
+
if (row.options.length > 0xff) {
|
|
134
|
+
throw new CjsFormatWriteError("Permutation option count does not fit in a u8", {
|
|
135
|
+
name: row.name,
|
|
136
|
+
count: row.options.length
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
permutationBytes += PERMUTATION_FIXED_BYTES + row.options.length * 4;
|
|
140
|
+
}
|
|
141
|
+
const headerSize = (ordered.length * 3 + 1) * 4 + permutationBytes;
|
|
142
|
+
const base = 4 + 4 + CARBON_EFFECT_SOURCE_HASH_BYTES + headerSize + (stringTableBytes.length + 4);
|
|
143
|
+
|
|
144
|
+
// Carbon compares packed bodies pairwise and points a duplicate's row at the
|
|
145
|
+
// surviving twin, so the offset table stays dense while the file stores each
|
|
146
|
+
// distinct body once (`ShaderCompiler.cpp:717-744`, `:804-820`). Keying the
|
|
147
|
+
// first occurrence by content reaches the same rows in one pass.
|
|
148
|
+
const byContent = new Map();
|
|
149
|
+
const records = [];
|
|
150
|
+
const uniqueBodies = [];
|
|
151
|
+
let cursor = base;
|
|
152
|
+
for (const body of ordered) {
|
|
153
|
+
const key = hashBytes(body.bytes);
|
|
154
|
+
const candidates = byContent.get(key);
|
|
155
|
+
const existing = candidates?.find(candidate => bytesEqual(candidate.bytes, body.bytes));
|
|
156
|
+
if (existing) {
|
|
157
|
+
records.push({
|
|
158
|
+
index: body.index,
|
|
159
|
+
offset: existing.offset,
|
|
160
|
+
size: existing.size
|
|
161
|
+
});
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const record = {
|
|
165
|
+
index: body.index,
|
|
166
|
+
offset: cursor,
|
|
167
|
+
size: body.bytes.length
|
|
168
|
+
};
|
|
169
|
+
if (candidates) candidates.push({
|
|
170
|
+
bytes: body.bytes,
|
|
171
|
+
...record
|
|
172
|
+
});else byContent.set(key, [{
|
|
173
|
+
bytes: body.bytes,
|
|
174
|
+
...record
|
|
175
|
+
}]);
|
|
176
|
+
records.push(record);
|
|
177
|
+
uniqueBodies.push(body.bytes);
|
|
178
|
+
cursor += body.bytes.length;
|
|
179
|
+
}
|
|
180
|
+
const writer = new CjsByteWriter(cursor);
|
|
181
|
+
writer.u32(CARBON_EFFECT_DATA_VERSION);
|
|
182
|
+
writer.bytes(compilerVersion);
|
|
183
|
+
writer.bytes(sourceHash);
|
|
184
|
+
writer.u32(stringTableBytes.length);
|
|
185
|
+
if (stringTableBytes.length > 0) writer.bytes(stringTableBytes);
|
|
186
|
+
writer.u8(permutationRows.length);
|
|
187
|
+
for (const row of permutationRows) {
|
|
188
|
+
writer.u32(row.nameOffset);
|
|
189
|
+
writer.u8(row.defaultOption);
|
|
190
|
+
writer.u32(row.descriptionOffset);
|
|
191
|
+
writer.u8(row.type);
|
|
192
|
+
writer.u8(row.options.length);
|
|
193
|
+
for (const optionOffset of row.options) {
|
|
194
|
+
writer.u32(optionOffset);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
writer.u32(records.length);
|
|
198
|
+
for (const record of records) {
|
|
199
|
+
writer.u32(record.index);
|
|
200
|
+
writer.u32(record.offset);
|
|
201
|
+
writer.u32(record.size);
|
|
202
|
+
}
|
|
203
|
+
if (writer.length !== base) {
|
|
204
|
+
throw new CjsFormatWriteError("Carbon effect header size arithmetic disagrees with the bytes written", {
|
|
205
|
+
written: writer.length,
|
|
206
|
+
expected: base,
|
|
207
|
+
headerSize,
|
|
208
|
+
permutationBytes
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
for (const bytes of uniqueBodies) {
|
|
212
|
+
writer.bytes(bytes);
|
|
213
|
+
}
|
|
214
|
+
return writer.toBytes();
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Builder for a Carbon compiled-effect container.
|
|
219
|
+
*
|
|
220
|
+
* Interning and emission are two passes over the same records, in that order,
|
|
221
|
+
* because an arena offset is only stable once every entry is present: adding
|
|
222
|
+
* after an offset has been handed out would shift every offset already written.
|
|
223
|
+
* `collectArena` runs the first pass and `internArena` the second, and because
|
|
224
|
+
* both drive the same `writeEffectDescription` walk they cannot fall out of
|
|
225
|
+
* step with each other.
|
|
226
|
+
*/
|
|
227
|
+
class CjsCarbonEffectWriter {
|
|
228
|
+
#table;
|
|
229
|
+
#permutations = [];
|
|
230
|
+
#bodies = [];
|
|
231
|
+
#compilerVersion;
|
|
232
|
+
#sourceHash;
|
|
233
|
+
#backend;
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Creates an empty container builder.
|
|
237
|
+
*
|
|
238
|
+
* @param {object} [options] Builder options.
|
|
239
|
+
* @param {number[]|Uint8Array} [options.compilerVersion] Four version bytes.
|
|
240
|
+
* @param {string|Uint8Array} [options.sourceHash] 32 ASCII hash bytes.
|
|
241
|
+
* @param {CjsStringTable} [options.stringTable] Arena to intern into.
|
|
242
|
+
* @param {boolean} [options.backend] Emit the optional trailing block per pass.
|
|
243
|
+
*/
|
|
244
|
+
constructor(options = {}) {
|
|
245
|
+
this.#table = options.stringTable ?? new CjsStringTable();
|
|
246
|
+
this.#compilerVersion = options.compilerVersion ?? [0, 0, 0, 0];
|
|
247
|
+
this.#sourceHash = options.sourceHash ?? "0".repeat(CARBON_EFFECT_SOURCE_HASH_BYTES);
|
|
248
|
+
this.#backend = options.backend === true;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Returns the arena this builder interns into.
|
|
253
|
+
*
|
|
254
|
+
* @returns {CjsStringTable} String table.
|
|
255
|
+
*/
|
|
256
|
+
get stringTable() {
|
|
257
|
+
return this.#table;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Adds a permutation axis.
|
|
262
|
+
*
|
|
263
|
+
* @param {object} axis Axis description.
|
|
264
|
+
* @param {string} axis.name Axis name.
|
|
265
|
+
* @param {number} [axis.defaultOption] Index of the default option.
|
|
266
|
+
* @param {string} [axis.description] Axis description text.
|
|
267
|
+
* @param {number} [axis.type] Axis type byte.
|
|
268
|
+
* @param {string[]} axis.options Option names.
|
|
269
|
+
* @returns {CjsCarbonEffectWriter} This builder.
|
|
270
|
+
*/
|
|
271
|
+
addPermutation(axis) {
|
|
272
|
+
this.#permutations.push({
|
|
273
|
+
name: String(axis.name ?? ""),
|
|
274
|
+
defaultOption: axis.defaultOption ?? 0,
|
|
275
|
+
description: String(axis.description ?? ""),
|
|
276
|
+
type: axis.type ?? 0,
|
|
277
|
+
options: (axis.options ?? []).map(option => String(option))
|
|
278
|
+
});
|
|
279
|
+
return this;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Adds one permutation's description record tree.
|
|
284
|
+
*
|
|
285
|
+
* @param {number} index Permutation index.
|
|
286
|
+
* @param {object} description Description record tree.
|
|
287
|
+
* @returns {CjsCarbonEffectWriter} This builder.
|
|
288
|
+
*/
|
|
289
|
+
addBody(index, description) {
|
|
290
|
+
this.#bodies.push({
|
|
291
|
+
index,
|
|
292
|
+
description,
|
|
293
|
+
bytes: null
|
|
294
|
+
});
|
|
295
|
+
return this;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Adds one permutation's already-serialised description bytes.
|
|
300
|
+
*
|
|
301
|
+
* Used when re-emitting a file whose arena is being reused verbatim: the
|
|
302
|
+
* bytes already carry resolved offsets into that arena, so they must not be
|
|
303
|
+
* re-interned.
|
|
304
|
+
*
|
|
305
|
+
* @param {number} index Permutation index.
|
|
306
|
+
* @param {Uint8Array} bytes Serialised description blob.
|
|
307
|
+
* @returns {CjsCarbonEffectWriter} This builder.
|
|
308
|
+
*/
|
|
309
|
+
addRawBody(index, bytes) {
|
|
310
|
+
this.#bodies.push({
|
|
311
|
+
index,
|
|
312
|
+
description: null,
|
|
313
|
+
bytes: Uint8Array.from(bytes)
|
|
314
|
+
});
|
|
315
|
+
return this;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Interns, serialises and assembles the container.
|
|
320
|
+
*
|
|
321
|
+
* @returns {Uint8Array} Container bytes.
|
|
322
|
+
*/
|
|
323
|
+
toBytes() {
|
|
324
|
+
for (const axis of this.#permutations) {
|
|
325
|
+
axis.nameRef = this.#table.addString(axis.name);
|
|
326
|
+
axis.descriptionRef = this.#table.addString(axis.description);
|
|
327
|
+
axis.optionRefs = axis.options.map(option => this.#table.addString(option));
|
|
328
|
+
}
|
|
329
|
+
for (const body of this.#bodies) {
|
|
330
|
+
if (body.description) {
|
|
331
|
+
writeEffectDescription(new CjsByteWriter(), body.description, {
|
|
332
|
+
arena: collectArena(this.#table),
|
|
333
|
+
backend: this.#backend
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
this.#table.finish();
|
|
338
|
+
const arena = internArena(this.#table);
|
|
339
|
+
const bodies = this.#bodies.map(body => {
|
|
340
|
+
if (body.bytes) return {
|
|
341
|
+
index: body.index,
|
|
342
|
+
bytes: body.bytes
|
|
343
|
+
};
|
|
344
|
+
const writer = new CjsByteWriter();
|
|
345
|
+
writeEffectDescription(writer, body.description, {
|
|
346
|
+
arena,
|
|
347
|
+
backend: this.#backend
|
|
348
|
+
});
|
|
349
|
+
return {
|
|
350
|
+
index: body.index,
|
|
351
|
+
bytes: writer.toBytes()
|
|
352
|
+
};
|
|
353
|
+
});
|
|
354
|
+
const permutationRows = this.#permutations.map(axis => ({
|
|
355
|
+
name: axis.name,
|
|
356
|
+
nameOffset: this.#table.offsetOf(axis.nameRef),
|
|
357
|
+
defaultOption: axis.defaultOption,
|
|
358
|
+
descriptionOffset: this.#table.offsetOf(axis.descriptionRef),
|
|
359
|
+
type: axis.type,
|
|
360
|
+
options: axis.optionRefs.map(reference => this.#table.offsetOf(reference))
|
|
361
|
+
}));
|
|
362
|
+
return writeCarbonEffectFile({
|
|
363
|
+
compilerVersion: this.#compilerVersion,
|
|
364
|
+
sourceHash: this.#sourceHash,
|
|
365
|
+
stringTableBytes: this.#table.toBytes(),
|
|
366
|
+
permutationRows,
|
|
367
|
+
bodies
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
export { CARBON_EFFECT_SOURCE_HASH_BYTES, CjsCarbonEffectWriter, writeCarbonEffectFile };
|
|
373
|
+
//# sourceMappingURL=CjsCarbonEffectWriter.js.map
|