@carbonenginejs/runtime-resource 0.13.0 → 0.15.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 -129
- package/dist/CjsMotherLode.js +1271 -1271
- package/dist/CjsResMan.js +3858 -3858
- 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 +265 -265
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -373
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js +182 -182
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +321 -321
- package/dist/format/carbonEffect/carbonEffectRecords.js +1147 -1147
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js +197 -197
- package/dist/format/compareUtf8.js +36 -36
- package/dist/format/effect/effectBodyInventory.js +146 -146
- package/dist/format/effect/effectPermutationGraph.js +257 -257
- 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 -310
- 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 -175
- package/dist/formats/bnk/core/busNodes.js +252 -252
- package/dist/formats/bnk/core/effectNodes.js +147 -147
- package/dist/formats/bnk/core/eventAction.js +416 -416
- package/dist/formats/bnk/core/globalSettings.js +215 -215
- package/dist/formats/bnk/core/graph.js +137 -137
- package/dist/formats/bnk/core/helpers.js +512 -512
- package/dist/formats/bnk/core/musicNodes.js +540 -540
- package/dist/formats/bnk/core/nodeBase.js +553 -553
- 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 +901 -862
- package/dist/formats/dds/core/helpers.js.map +1 -1
- package/dist/formats/dds/index.js +2 -2
- package/dist/formats/dxbc/CjsDxbcFormat.js +187 -142
- package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -1
- 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/disassemble.js +240 -0
- package/dist/formats/dxbc/core/disassemble.js.map +1 -0
- 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 +252 -290
- package/dist/formats/gltf/CjsGltfFormat.js.map +1 -1
- package/dist/formats/gltf/core/helpers.js +287 -307
- package/dist/formats/gltf/core/helpers.js.map +1 -1
- 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 +233 -254
- package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -1
- 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 -850
- package/dist/formats/hlsl/core/detailMapFamily.js +128 -128
- 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 -133
- 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 -320
- package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -33
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +423 -416
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -40
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +62 -62
- 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 -33
- 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 +232 -253
- package/dist/formats/obj/CjsObjFormat.js.map +1 -1
- package/dist/formats/obj/core/helpers.js +553 -573
- package/dist/formats/obj/core/helpers.js.map +1 -1
- 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 -214
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +551 -551
- package/dist/formats/pickle/index.js +2 -2
- 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 -71
- package/dist/formats/red/core/schema.js +4 -4
- package/dist/formats/red/index.js +2 -2
- package/dist/formats/stl/CjsStlFormat.js +320 -365
- package/dist/formats/stl/CjsStlFormat.js.map +1 -1
- package/dist/formats/stl/core/helpers.js +241 -261
- package/dist/formats/stl/core/helpers.js.map +1 -1
- 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 -199
- package/dist/formats/webgl/core/buildGlslEffectContainer.js +70 -70
- package/dist/formats/webgl/core/effectPackage.js +900 -900
- package/dist/formats/webgl/core/errors.js +27 -27
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2820 -2820
- package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -89
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +486 -486
- package/dist/formats/webgl/core/glsl/packedLightFixups.js +98 -98
- package/dist/formats/webgl/core/glslBackendBlock.js +552 -552
- package/dist/formats/webgl/core/glslBackendBodySet.js +243 -243
- package/dist/formats/webgl/core/glslEffectCompleteness.js +85 -85
- package/dist/formats/webgl/core/glslEffectCompleteness.js.map +1 -1
- package/dist/formats/webgl/core/helpers.js +167 -167
- package/dist/formats/webgl/core/inspectGlslEffectContainer.js +122 -122
- package/dist/formats/webgl/core/readGlslEffectContainer.js +202 -256
- package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -1
- package/dist/formats/webgl/index.js +2 -2
- package/dist/formats/webgpu/CjsWebgpuFormat.js +357 -357
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +89 -89
- package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js +354 -354
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js +355 -355
- package/dist/formats/webgpu/core/carbonWebgpu/validateContainer.js +90 -90
- package/dist/formats/webgpu/core/effectAnalysis.js +82 -82
- package/dist/formats/webgpu/core/effectBackendBodySet.js +306 -306
- package/dist/formats/webgpu/core/errors.js +20 -20
- package/dist/formats/webgpu/core/helpers.js +443 -443
- 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 -381
- package/dist/formats/webgpu/core/packageEffectSelection.js +164 -164
- 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/buildWgslBindingPlan.js +172 -172
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +325 -325
- 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/core/CjsYamlReader.js +400 -400
- package/dist/formats/yaml/core/helpers.js +196 -196
- package/dist/formats/yaml/index.js +2 -2
- package/dist/index.js +64 -64
- package/dist/resource/CjsLoadingObject.js +19 -19
- package/dist/resource/CjsResource.js +801 -801
- package/dist/resource/ResourceHandlerMode.js +14 -14
- 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 +570 -467
- package/dist/resource/geometry/TriGeometryRes.js.map +1 -1
- 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 -54
- package/dist/resource/resourceBoundary.js +64 -64
- package/dist/resource/shader/Tr2EffectRes.js +336 -336
- 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 -283
- package/dist/resource/shader/Tr2ShaderPermutation.js +43 -43
- package/dist/resource/shader/index.js +17 -17
- package/dist/resource/shader/reflection/Tr2EffectConstant.js +143 -143
- package/dist/resource/shader/reflection/Tr2EffectDefine.js +30 -30
- package/dist/resource/shader/reflection/Tr2EffectDescription.js +114 -114
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js +168 -168
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +125 -125
- package/dist/resource/shader/reflection/Tr2EffectResource.js +120 -120
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +372 -372
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js +78 -78
- package/dist/resource/shader/reflection/Tr2Pass.js +168 -168
- package/dist/resource/shader/reflection/carbonRecordFields.js +159 -159
- package/dist/resource/shader/reflection/shaderStage.js +22 -22
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js +135 -135
- 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 -89
- package/dist/worker/CjsResManWorker.js +218 -218
- package/dist/worker/CjsResManWorkerLoader.js +437 -437
- package/dist/worker/protocol.js +12 -12
- package/docs/README.md +98 -98
- package/docs/architecture.md +118 -118
- package/docs/concepts/resource-lifecycle.md +226 -226
- package/docs/concepts/shader-resource-model.md +111 -111
- package/docs/concepts/writing-an-engine-adapter.md +115 -115
- package/docs/formats/README.md +138 -138
- package/docs/formats/carbon-effect-container.md +553 -553
- package/docs/formats/dxbc/README.md +68 -68
- package/docs/formats/dxbc/architecture.md +80 -80
- package/docs/formats/dxbc/reference/api.md +105 -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 +66 -65
- package/docs/formats/hlsl/guides/hydrating-json-output.md +60 -60
- package/docs/formats/hlsl/guides/reading-effects.md +68 -64
- package/docs/formats/hlsl/reference/advanced-analysis.md +61 -61
- package/docs/formats/hlsl/reference/api.md +91 -92
- package/docs/formats/hlsl/reference/classes/README.md +11 -11
- package/docs/formats/hlsl/reference/json-graph.md +97 -97
- package/docs/formats/pickle.md +82 -82
- package/docs/formats/provenance.md +196 -196
- package/docs/formats/stl.md +37 -37
- package/docs/formats/webgl/README.md +115 -115
- package/docs/formats/webgl/architecture.md +69 -69
- 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 -890
- 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 -95
- package/docs/formats/webgpu/formats/carbon-webgpu.md +215 -215
- package/docs/formats/webgpu/guides/effect-packaging.md +189 -189
- package/docs/formats/webgpu/reference/api.md +196 -196
- package/docs/formats/webgpu/reference/classes/README.md +9 -9
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +1546 -1546
- package/docs/formats/wwise.md +146 -146
- package/docs/reference/classes/README.md +35 -35
- package/docs/reference/classes/audio.md +30 -30
- package/docs/reference/classes/core.md +216 -216
- package/docs/reference/classes/dropped.md +46 -46
- package/docs/reference/classes/formats.md +944 -944
- 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 -194
- 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 -142
- 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
|
@@ -1,320 +1,320 @@
|
|
|
1
|
-
import { asUint8Array } from '@carbonenginejs/runtime-utils/bytes';
|
|
2
|
-
import { HlslEffectStateManager } from '../../HlslEffectStateManager.js';
|
|
3
|
-
import { HlslShader } from '../shader/HlslShader.js';
|
|
4
|
-
import { HlslShaderBytecode } from '../../HlslShaderBytecode.js';
|
|
5
|
-
import { HlslShaderOption } from '../shader/HlslShaderOption.js';
|
|
6
|
-
import { HlslShaderPermutation } from './HlslShaderPermutation.js';
|
|
7
|
-
import { hlslShaderStageName } from '../HlslRenderContextEnum.js';
|
|
8
|
-
import { runtimeDescriptionFromCarbon } from '../../carbonDescriptionToRuntime.js';
|
|
9
|
-
import { CjsCarbonEffectReader } from '../../../../../format/carbonEffect/CjsCarbonEffectReader.js';
|
|
10
|
-
import { CARBON_EFFECT_MIN_DATA_VERSION } from '../../../../../format/carbonEffect/carbonEffectRecords.js';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Carbon/Trinity effect resource reader for compiled shader metadata.
|
|
14
|
-
*/
|
|
15
|
-
class HlslEffectRes {
|
|
16
|
-
static globalEffectOptions = [];
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Creates an empty effect resource ready to load a compiled `.sm_*` payload.
|
|
20
|
-
*/
|
|
21
|
-
constructor() {
|
|
22
|
-
this.m_data = new Uint8Array(0);
|
|
23
|
-
this.m_reader = null;
|
|
24
|
-
this.m_version = 0;
|
|
25
|
-
this.m_stringTable = new Uint8Array(0);
|
|
26
|
-
this.m_stringTableSize = 0;
|
|
27
|
-
this.m_offsets = [];
|
|
28
|
-
this.m_offsetCount = 0;
|
|
29
|
-
this.m_permutations = [];
|
|
30
|
-
this.m_shaders = new Map();
|
|
31
|
-
this.m_compilerVersion = null;
|
|
32
|
-
this.m_compilerVersionBytes = null;
|
|
33
|
-
this.m_hash = new Uint8Array(0);
|
|
34
|
-
this.sourcePath = "";
|
|
35
|
-
this.loadError = null;
|
|
36
|
-
this.effectStateManager = new HlslEffectStateManager();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Reads the effect header, string table, permutation axes, and body offsets.
|
|
41
|
-
*
|
|
42
|
-
* @param {ArrayBuffer|ArrayBufferView|Uint8Array} source Compiled effect bytes.
|
|
43
|
-
* @param {object} [options] Load metadata and dependency overrides.
|
|
44
|
-
* @param {string} [options.sourcePath] Source path used in reports.
|
|
45
|
-
* @param {string} [options.source] Alternate source label.
|
|
46
|
-
* @param {HlslEffectStateManager} [options.effectStateManager] Registry to receive decoded state.
|
|
47
|
-
* @returns {boolean} True when the header was decoded successfully.
|
|
48
|
-
*/
|
|
49
|
-
DoLoad(source, options = {}) {
|
|
50
|
-
this._reset();
|
|
51
|
-
this.sourcePath = options.sourcePath || options.source || "";
|
|
52
|
-
this.effectStateManager = options.effectStateManager || new HlslEffectStateManager();
|
|
53
|
-
try {
|
|
54
|
-
// Carbon owns a memcpy of the loaded resource. Keep the JS graph
|
|
55
|
-
// equally isolated from later caller mutation.
|
|
56
|
-
this.m_data = Uint8Array.from(asUint8Array(source));
|
|
57
|
-
|
|
58
|
-
// One header walk, for every accepted version. This header -
|
|
59
|
-
// version, compiler version and source hash where present, arena,
|
|
60
|
-
// permutation axes, offset table - is the layout
|
|
61
|
-
// `CjsCarbonEffectReader` parses, and two hand-written copies of
|
|
62
|
-
// one layout are two chances to disagree. Reading it there also
|
|
63
|
-
// brings three checks a local walk never had: the offset table
|
|
64
|
-
// must be dense and positionally indexed, and the body region must
|
|
65
|
-
// begin exactly where the header ends. Carbon indexes that table
|
|
66
|
-
// positionally without ever reading the stored index, so a sparse
|
|
67
|
-
// or misordered table does not fail there - it silently returns
|
|
68
|
-
// the wrong shader body, which is the failure class the container
|
|
69
|
-
// port exists to close.
|
|
70
|
-
const reader = new CjsCarbonEffectReader(this.m_data, {
|
|
71
|
-
source: this.sourcePath || "HlslEffectRes"
|
|
72
|
-
});
|
|
73
|
-
this.m_reader = reader;
|
|
74
|
-
this.m_version = reader.version;
|
|
75
|
-
if (reader.compilerVersion) {
|
|
76
|
-
this.m_compilerVersionBytes = reader.compilerVersion;
|
|
77
|
-
this.m_compilerVersion = new DataView(Uint8Array.from(reader.compilerVersion).buffer).getUint32(0, true);
|
|
78
|
-
}
|
|
79
|
-
this.m_hash = reader.sourceHash ?? new Uint8Array(0);
|
|
80
|
-
this.m_stringTableSize = reader.stringTableSize;
|
|
81
|
-
this.m_stringTable = reader.stringTableBytes;
|
|
82
|
-
for (const axis of reader.permutations) {
|
|
83
|
-
const permutation = new HlslShaderPermutation();
|
|
84
|
-
permutation.name = axis.name.value;
|
|
85
|
-
permutation.defaultOption = axis.defaultOption;
|
|
86
|
-
permutation.description = axis.description.value;
|
|
87
|
-
permutation.type = axis.type;
|
|
88
|
-
for (const option of axis.options) permutation.options.push(option.value);
|
|
89
|
-
this.m_permutations.push(permutation);
|
|
90
|
-
}
|
|
91
|
-
this.m_offsetCount = reader.records.length;
|
|
92
|
-
for (const record of reader.records) {
|
|
93
|
-
this.m_offsets.push({
|
|
94
|
-
index: record.index,
|
|
95
|
-
offset: record.offset,
|
|
96
|
-
size: record.size,
|
|
97
|
-
end: record.offset + record.size
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
return true;
|
|
101
|
-
} catch (error) {
|
|
102
|
-
this.loadError = error;
|
|
103
|
-
this.m_shaders.clear();
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Mirrors Carbon's prepare hook by clearing cached shader bodies.
|
|
110
|
-
*
|
|
111
|
-
* @returns {boolean} True when preparation completed.
|
|
112
|
-
*/
|
|
113
|
-
DoPrepare() {
|
|
114
|
-
this.m_shaders.clear();
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Resolves a permutation option set to a decoded `HlslShader`.
|
|
120
|
-
*
|
|
121
|
-
* @param {Array<HlslShaderOption|object>|Map<string, string>} [options] Local option choices.
|
|
122
|
-
* @param {number|null} [count] Number of local option entries to consider.
|
|
123
|
-
* @returns {HlslShader|null} Decoded shader or null when no matching body exists.
|
|
124
|
-
*/
|
|
125
|
-
GetShader(options = [], count = null) {
|
|
126
|
-
if (!this.IsGood()) {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
const normalizedOptions = normalizeShaderOptions(options);
|
|
130
|
-
const optionCount = Number.isInteger(count) ? Math.min(count, normalizedOptions.length) : normalizedOptions.length;
|
|
131
|
-
let multiplier = 1;
|
|
132
|
-
let index = 0;
|
|
133
|
-
for (const permutation of this.m_permutations) {
|
|
134
|
-
let value = permutation.defaultOption;
|
|
135
|
-
const globalOption = HlslEffectRes.globalEffectOptions.find(entry => entry.name === permutation.name);
|
|
136
|
-
const localOption = normalizedOptions.slice(0, optionCount).find(entry => entry.name === permutation.name);
|
|
137
|
-
const selected = globalOption || localOption;
|
|
138
|
-
if (selected) {
|
|
139
|
-
const selectedIndex = permutation.options.findIndex(option => option === selected.value);
|
|
140
|
-
if (selectedIndex >= 0) {
|
|
141
|
-
value = selectedIndex;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
index += value * multiplier;
|
|
145
|
-
multiplier *= permutation.options.length || 1;
|
|
146
|
-
}
|
|
147
|
-
return this.GetShaderByIndex(index);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Decodes the body at an exact permutation-table index without applying
|
|
152
|
-
* global or local option overrides.
|
|
153
|
-
*
|
|
154
|
-
* @param {number} index Exact zero-based permutation-table index.
|
|
155
|
-
* @returns {HlslShader|null} Decoded shader or null when the index/body is unavailable.
|
|
156
|
-
*/
|
|
157
|
-
GetShaderByIndex(index) {
|
|
158
|
-
if (!Number.isSafeInteger(index) || index < 0) {
|
|
159
|
-
throw new TypeError("HlslEffectRes body index must be a non-negative safe integer");
|
|
160
|
-
}
|
|
161
|
-
if (!this.IsGood()) {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
if (this.m_shaders.has(index)) {
|
|
165
|
-
return this.m_shaders.get(index);
|
|
166
|
-
}
|
|
167
|
-
const offset = this.m_offsets[index];
|
|
168
|
-
if (!offset || !this.m_reader) {
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// The retained container reader decodes the body's record tree - the
|
|
173
|
-
// single byte-reading implementation - and the corpus-proven adapter
|
|
174
|
-
// maps those records onto the runtime shape. The record tree is a
|
|
175
|
-
// transient internal handoff, never exposed or persisted.
|
|
176
|
-
try {
|
|
177
|
-
const records = this.m_reader.readDescription(index);
|
|
178
|
-
const built = runtimeDescriptionFromCarbon(records, {
|
|
179
|
-
effectName: this.sourcePath,
|
|
180
|
-
version: this.m_version,
|
|
181
|
-
effectStateManager: this.effectStateManager,
|
|
182
|
-
bytecodeFor: (stage, stageType) => new HlslShaderBytecode({
|
|
183
|
-
stageType,
|
|
184
|
-
stageName: hlslShaderStageName(stageType),
|
|
185
|
-
bytes: stage.shaderData.bytes,
|
|
186
|
-
shaderSize: stage.shaderData.size,
|
|
187
|
-
stringTableOffset: stage.shaderData.offset,
|
|
188
|
-
effectName: this.sourcePath
|
|
189
|
-
})
|
|
190
|
-
});
|
|
191
|
-
const shader = new HlslShader();
|
|
192
|
-
const description = shader.GetEffect();
|
|
193
|
-
description.version = this.m_version;
|
|
194
|
-
description.effectName = this.sourcePath;
|
|
195
|
-
description.effectStateManager = built.effectStateManager;
|
|
196
|
-
description.techniques = built.techniques;
|
|
197
|
-
description.annotations = built.annotations;
|
|
198
|
-
shader.ProcessEffect();
|
|
199
|
-
this.m_shaders.set(index, shader);
|
|
200
|
-
return shader;
|
|
201
|
-
} catch {
|
|
202
|
-
// Mirrors the historical reader contract: an undecodable body is
|
|
203
|
-
// reported as absent rather than thrown, and is not cached so a
|
|
204
|
-
// later caller sees the same result.
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Reports whether the effect header has been loaded without error.
|
|
211
|
-
*
|
|
212
|
-
* @returns {boolean} True when this resource has usable effect data.
|
|
213
|
-
*/
|
|
214
|
-
IsGood() {
|
|
215
|
-
return !this.loadError && this.m_data.length > 0 && this.m_version >= CARBON_EFFECT_MIN_DATA_VERSION;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Reports whether byte memory usage is known for this resource.
|
|
220
|
-
*
|
|
221
|
-
* @returns {boolean} Always true for byte-backed JavaScript resources.
|
|
222
|
-
*/
|
|
223
|
-
IsMemoryUsageKnown() {
|
|
224
|
-
return true;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Returns the byte size of the loaded effect payload.
|
|
229
|
-
*
|
|
230
|
-
* @returns {number} Loaded byte count.
|
|
231
|
-
*/
|
|
232
|
-
GetMemoryUsage() {
|
|
233
|
-
return this.m_data.length;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Clears decoded shader body caches while keeping the loaded header data.
|
|
238
|
-
*/
|
|
239
|
-
ReleaseResources() {
|
|
240
|
-
this.m_shaders.clear();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Returns JSON-safe permutation metadata for tooling and reports.
|
|
245
|
-
*
|
|
246
|
-
* @returns {object[]} Permutation descriptions.
|
|
247
|
-
*/
|
|
248
|
-
GetPermutationDescription() {
|
|
249
|
-
return this.m_permutations.map(permutation => permutation.toJSON());
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Returns a JSON-safe summary of the loaded effect resource.
|
|
254
|
-
*
|
|
255
|
-
* @returns {object} Serializable effect resource summary.
|
|
256
|
-
*/
|
|
257
|
-
toJSON() {
|
|
258
|
-
return {
|
|
259
|
-
version: this.m_version,
|
|
260
|
-
compilerVersion: this.m_compilerVersion,
|
|
261
|
-
compilerVersionBytes: this.m_compilerVersionBytes,
|
|
262
|
-
sourcePath: this.sourcePath,
|
|
263
|
-
stringTableSize: this.m_stringTableSize,
|
|
264
|
-
offsetCount: this.m_offsetCount,
|
|
265
|
-
permutations: this.m_permutations.map(entry => entry.toJSON()),
|
|
266
|
-
offsets: this.m_offsets.map(entry => ({
|
|
267
|
-
...entry
|
|
268
|
-
})),
|
|
269
|
-
loadError: this.loadError ? {
|
|
270
|
-
name: this.loadError.name,
|
|
271
|
-
message: this.loadError.message
|
|
272
|
-
} : null
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Resets loaded state before a new `DoLoad` attempt.
|
|
278
|
-
*
|
|
279
|
-
* @private
|
|
280
|
-
*/
|
|
281
|
-
_reset() {
|
|
282
|
-
this.m_data = new Uint8Array(0);
|
|
283
|
-
this.m_reader = null;
|
|
284
|
-
this.m_version = 0;
|
|
285
|
-
this.m_stringTable = new Uint8Array(0);
|
|
286
|
-
this.m_stringTableSize = 0;
|
|
287
|
-
this.m_offsets = [];
|
|
288
|
-
this.m_offsetCount = 0;
|
|
289
|
-
this.m_permutations = [];
|
|
290
|
-
this.m_shaders = new Map();
|
|
291
|
-
this.m_compilerVersion = null;
|
|
292
|
-
this.m_compilerVersionBytes = null;
|
|
293
|
-
this.m_hash = new Uint8Array(0);
|
|
294
|
-
this.loadError = null;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Converts supported option input shapes to `HlslShaderOption` instances.
|
|
300
|
-
*
|
|
301
|
-
* @param {Array<HlslShaderOption|object>|Map<string, string>} options Option input.
|
|
302
|
-
* @returns {HlslShaderOption[]} Normalized option list.
|
|
303
|
-
*/
|
|
304
|
-
function normalizeShaderOptions(options) {
|
|
305
|
-
if (options instanceof Map) {
|
|
306
|
-
return Array.from(options.entries()).map(([name, value]) => new HlslShaderOption(name, value));
|
|
307
|
-
}
|
|
308
|
-
if (!Array.isArray(options)) {
|
|
309
|
-
return [];
|
|
310
|
-
}
|
|
311
|
-
return options.map(entry => {
|
|
312
|
-
if (entry instanceof HlslShaderOption) {
|
|
313
|
-
return entry;
|
|
314
|
-
}
|
|
315
|
-
return new HlslShaderOption(entry?.name || "", entry?.value || "");
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
export { HlslEffectRes };
|
|
320
|
-
//# sourceMappingURL=HlslEffectRes.js.map
|
|
1
|
+
import { asUint8Array } from '@carbonenginejs/runtime-utils/bytes';
|
|
2
|
+
import { HlslEffectStateManager } from '../../HlslEffectStateManager.js';
|
|
3
|
+
import { HlslShader } from '../shader/HlslShader.js';
|
|
4
|
+
import { HlslShaderBytecode } from '../../HlslShaderBytecode.js';
|
|
5
|
+
import { HlslShaderOption } from '../shader/HlslShaderOption.js';
|
|
6
|
+
import { HlslShaderPermutation } from './HlslShaderPermutation.js';
|
|
7
|
+
import { hlslShaderStageName } from '../HlslRenderContextEnum.js';
|
|
8
|
+
import { runtimeDescriptionFromCarbon } from '../../carbonDescriptionToRuntime.js';
|
|
9
|
+
import { CjsCarbonEffectReader } from '../../../../../format/carbonEffect/CjsCarbonEffectReader.js';
|
|
10
|
+
import { CARBON_EFFECT_MIN_DATA_VERSION } from '../../../../../format/carbonEffect/carbonEffectRecords.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Carbon/Trinity effect resource reader for compiled shader metadata.
|
|
14
|
+
*/
|
|
15
|
+
class HlslEffectRes {
|
|
16
|
+
static globalEffectOptions = [];
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Creates an empty effect resource ready to load a compiled `.sm_*` payload.
|
|
20
|
+
*/
|
|
21
|
+
constructor() {
|
|
22
|
+
this.m_data = new Uint8Array(0);
|
|
23
|
+
this.m_reader = null;
|
|
24
|
+
this.m_version = 0;
|
|
25
|
+
this.m_stringTable = new Uint8Array(0);
|
|
26
|
+
this.m_stringTableSize = 0;
|
|
27
|
+
this.m_offsets = [];
|
|
28
|
+
this.m_offsetCount = 0;
|
|
29
|
+
this.m_permutations = [];
|
|
30
|
+
this.m_shaders = new Map();
|
|
31
|
+
this.m_compilerVersion = null;
|
|
32
|
+
this.m_compilerVersionBytes = null;
|
|
33
|
+
this.m_hash = new Uint8Array(0);
|
|
34
|
+
this.sourcePath = "";
|
|
35
|
+
this.loadError = null;
|
|
36
|
+
this.effectStateManager = new HlslEffectStateManager();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Reads the effect header, string table, permutation axes, and body offsets.
|
|
41
|
+
*
|
|
42
|
+
* @param {ArrayBuffer|ArrayBufferView|Uint8Array} source Compiled effect bytes.
|
|
43
|
+
* @param {object} [options] Load metadata and dependency overrides.
|
|
44
|
+
* @param {string} [options.sourcePath] Source path used in reports.
|
|
45
|
+
* @param {string} [options.source] Alternate source label.
|
|
46
|
+
* @param {HlslEffectStateManager} [options.effectStateManager] Registry to receive decoded state.
|
|
47
|
+
* @returns {boolean} True when the header was decoded successfully.
|
|
48
|
+
*/
|
|
49
|
+
DoLoad(source, options = {}) {
|
|
50
|
+
this._reset();
|
|
51
|
+
this.sourcePath = options.sourcePath || options.source || "";
|
|
52
|
+
this.effectStateManager = options.effectStateManager || new HlslEffectStateManager();
|
|
53
|
+
try {
|
|
54
|
+
// Carbon owns a memcpy of the loaded resource. Keep the JS graph
|
|
55
|
+
// equally isolated from later caller mutation.
|
|
56
|
+
this.m_data = Uint8Array.from(asUint8Array(source));
|
|
57
|
+
|
|
58
|
+
// One header walk, for every accepted version. This header -
|
|
59
|
+
// version, compiler version and source hash where present, arena,
|
|
60
|
+
// permutation axes, offset table - is the layout
|
|
61
|
+
// `CjsCarbonEffectReader` parses, and two hand-written copies of
|
|
62
|
+
// one layout are two chances to disagree. Reading it there also
|
|
63
|
+
// brings three checks a local walk never had: the offset table
|
|
64
|
+
// must be dense and positionally indexed, and the body region must
|
|
65
|
+
// begin exactly where the header ends. Carbon indexes that table
|
|
66
|
+
// positionally without ever reading the stored index, so a sparse
|
|
67
|
+
// or misordered table does not fail there - it silently returns
|
|
68
|
+
// the wrong shader body, which is the failure class the container
|
|
69
|
+
// port exists to close.
|
|
70
|
+
const reader = new CjsCarbonEffectReader(this.m_data, {
|
|
71
|
+
source: this.sourcePath || "HlslEffectRes"
|
|
72
|
+
});
|
|
73
|
+
this.m_reader = reader;
|
|
74
|
+
this.m_version = reader.version;
|
|
75
|
+
if (reader.compilerVersion) {
|
|
76
|
+
this.m_compilerVersionBytes = reader.compilerVersion;
|
|
77
|
+
this.m_compilerVersion = new DataView(Uint8Array.from(reader.compilerVersion).buffer).getUint32(0, true);
|
|
78
|
+
}
|
|
79
|
+
this.m_hash = reader.sourceHash ?? new Uint8Array(0);
|
|
80
|
+
this.m_stringTableSize = reader.stringTableSize;
|
|
81
|
+
this.m_stringTable = reader.stringTableBytes;
|
|
82
|
+
for (const axis of reader.permutations) {
|
|
83
|
+
const permutation = new HlslShaderPermutation();
|
|
84
|
+
permutation.name = axis.name.value;
|
|
85
|
+
permutation.defaultOption = axis.defaultOption;
|
|
86
|
+
permutation.description = axis.description.value;
|
|
87
|
+
permutation.type = axis.type;
|
|
88
|
+
for (const option of axis.options) permutation.options.push(option.value);
|
|
89
|
+
this.m_permutations.push(permutation);
|
|
90
|
+
}
|
|
91
|
+
this.m_offsetCount = reader.records.length;
|
|
92
|
+
for (const record of reader.records) {
|
|
93
|
+
this.m_offsets.push({
|
|
94
|
+
index: record.index,
|
|
95
|
+
offset: record.offset,
|
|
96
|
+
size: record.size,
|
|
97
|
+
end: record.offset + record.size
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
this.loadError = error;
|
|
103
|
+
this.m_shaders.clear();
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Mirrors Carbon's prepare hook by clearing cached shader bodies.
|
|
110
|
+
*
|
|
111
|
+
* @returns {boolean} True when preparation completed.
|
|
112
|
+
*/
|
|
113
|
+
DoPrepare() {
|
|
114
|
+
this.m_shaders.clear();
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Resolves a permutation option set to a decoded `HlslShader`.
|
|
120
|
+
*
|
|
121
|
+
* @param {Array<HlslShaderOption|object>|Map<string, string>} [options] Local option choices.
|
|
122
|
+
* @param {number|null} [count] Number of local option entries to consider.
|
|
123
|
+
* @returns {HlslShader|null} Decoded shader or null when no matching body exists.
|
|
124
|
+
*/
|
|
125
|
+
GetShader(options = [], count = null) {
|
|
126
|
+
if (!this.IsGood()) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const normalizedOptions = normalizeShaderOptions(options);
|
|
130
|
+
const optionCount = Number.isInteger(count) ? Math.min(count, normalizedOptions.length) : normalizedOptions.length;
|
|
131
|
+
let multiplier = 1;
|
|
132
|
+
let index = 0;
|
|
133
|
+
for (const permutation of this.m_permutations) {
|
|
134
|
+
let value = permutation.defaultOption;
|
|
135
|
+
const globalOption = HlslEffectRes.globalEffectOptions.find(entry => entry.name === permutation.name);
|
|
136
|
+
const localOption = normalizedOptions.slice(0, optionCount).find(entry => entry.name === permutation.name);
|
|
137
|
+
const selected = globalOption || localOption;
|
|
138
|
+
if (selected) {
|
|
139
|
+
const selectedIndex = permutation.options.findIndex(option => option === selected.value);
|
|
140
|
+
if (selectedIndex >= 0) {
|
|
141
|
+
value = selectedIndex;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
index += value * multiplier;
|
|
145
|
+
multiplier *= permutation.options.length || 1;
|
|
146
|
+
}
|
|
147
|
+
return this.GetShaderByIndex(index);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Decodes the body at an exact permutation-table index without applying
|
|
152
|
+
* global or local option overrides.
|
|
153
|
+
*
|
|
154
|
+
* @param {number} index Exact zero-based permutation-table index.
|
|
155
|
+
* @returns {HlslShader|null} Decoded shader or null when the index/body is unavailable.
|
|
156
|
+
*/
|
|
157
|
+
GetShaderByIndex(index) {
|
|
158
|
+
if (!Number.isSafeInteger(index) || index < 0) {
|
|
159
|
+
throw new TypeError("HlslEffectRes body index must be a non-negative safe integer");
|
|
160
|
+
}
|
|
161
|
+
if (!this.IsGood()) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
if (this.m_shaders.has(index)) {
|
|
165
|
+
return this.m_shaders.get(index);
|
|
166
|
+
}
|
|
167
|
+
const offset = this.m_offsets[index];
|
|
168
|
+
if (!offset || !this.m_reader) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// The retained container reader decodes the body's record tree - the
|
|
173
|
+
// single byte-reading implementation - and the corpus-proven adapter
|
|
174
|
+
// maps those records onto the runtime shape. The record tree is a
|
|
175
|
+
// transient internal handoff, never exposed or persisted.
|
|
176
|
+
try {
|
|
177
|
+
const records = this.m_reader.readDescription(index);
|
|
178
|
+
const built = runtimeDescriptionFromCarbon(records, {
|
|
179
|
+
effectName: this.sourcePath,
|
|
180
|
+
version: this.m_version,
|
|
181
|
+
effectStateManager: this.effectStateManager,
|
|
182
|
+
bytecodeFor: (stage, stageType) => new HlslShaderBytecode({
|
|
183
|
+
stageType,
|
|
184
|
+
stageName: hlslShaderStageName(stageType),
|
|
185
|
+
bytes: stage.shaderData.bytes,
|
|
186
|
+
shaderSize: stage.shaderData.size,
|
|
187
|
+
stringTableOffset: stage.shaderData.offset,
|
|
188
|
+
effectName: this.sourcePath
|
|
189
|
+
})
|
|
190
|
+
});
|
|
191
|
+
const shader = new HlslShader();
|
|
192
|
+
const description = shader.GetEffect();
|
|
193
|
+
description.version = this.m_version;
|
|
194
|
+
description.effectName = this.sourcePath;
|
|
195
|
+
description.effectStateManager = built.effectStateManager;
|
|
196
|
+
description.techniques = built.techniques;
|
|
197
|
+
description.annotations = built.annotations;
|
|
198
|
+
shader.ProcessEffect();
|
|
199
|
+
this.m_shaders.set(index, shader);
|
|
200
|
+
return shader;
|
|
201
|
+
} catch {
|
|
202
|
+
// Mirrors the historical reader contract: an undecodable body is
|
|
203
|
+
// reported as absent rather than thrown, and is not cached so a
|
|
204
|
+
// later caller sees the same result.
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Reports whether the effect header has been loaded without error.
|
|
211
|
+
*
|
|
212
|
+
* @returns {boolean} True when this resource has usable effect data.
|
|
213
|
+
*/
|
|
214
|
+
IsGood() {
|
|
215
|
+
return !this.loadError && this.m_data.length > 0 && this.m_version >= CARBON_EFFECT_MIN_DATA_VERSION;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Reports whether byte memory usage is known for this resource.
|
|
220
|
+
*
|
|
221
|
+
* @returns {boolean} Always true for byte-backed JavaScript resources.
|
|
222
|
+
*/
|
|
223
|
+
IsMemoryUsageKnown() {
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Returns the byte size of the loaded effect payload.
|
|
229
|
+
*
|
|
230
|
+
* @returns {number} Loaded byte count.
|
|
231
|
+
*/
|
|
232
|
+
GetMemoryUsage() {
|
|
233
|
+
return this.m_data.length;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Clears decoded shader body caches while keeping the loaded header data.
|
|
238
|
+
*/
|
|
239
|
+
ReleaseResources() {
|
|
240
|
+
this.m_shaders.clear();
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Returns JSON-safe permutation metadata for tooling and reports.
|
|
245
|
+
*
|
|
246
|
+
* @returns {object[]} Permutation descriptions.
|
|
247
|
+
*/
|
|
248
|
+
GetPermutationDescription() {
|
|
249
|
+
return this.m_permutations.map(permutation => permutation.toJSON());
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Returns a JSON-safe summary of the loaded effect resource.
|
|
254
|
+
*
|
|
255
|
+
* @returns {object} Serializable effect resource summary.
|
|
256
|
+
*/
|
|
257
|
+
toJSON() {
|
|
258
|
+
return {
|
|
259
|
+
version: this.m_version,
|
|
260
|
+
compilerVersion: this.m_compilerVersion,
|
|
261
|
+
compilerVersionBytes: this.m_compilerVersionBytes,
|
|
262
|
+
sourcePath: this.sourcePath,
|
|
263
|
+
stringTableSize: this.m_stringTableSize,
|
|
264
|
+
offsetCount: this.m_offsetCount,
|
|
265
|
+
permutations: this.m_permutations.map(entry => entry.toJSON()),
|
|
266
|
+
offsets: this.m_offsets.map(entry => ({
|
|
267
|
+
...entry
|
|
268
|
+
})),
|
|
269
|
+
loadError: this.loadError ? {
|
|
270
|
+
name: this.loadError.name,
|
|
271
|
+
message: this.loadError.message
|
|
272
|
+
} : null
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Resets loaded state before a new `DoLoad` attempt.
|
|
278
|
+
*
|
|
279
|
+
* @private
|
|
280
|
+
*/
|
|
281
|
+
_reset() {
|
|
282
|
+
this.m_data = new Uint8Array(0);
|
|
283
|
+
this.m_reader = null;
|
|
284
|
+
this.m_version = 0;
|
|
285
|
+
this.m_stringTable = new Uint8Array(0);
|
|
286
|
+
this.m_stringTableSize = 0;
|
|
287
|
+
this.m_offsets = [];
|
|
288
|
+
this.m_offsetCount = 0;
|
|
289
|
+
this.m_permutations = [];
|
|
290
|
+
this.m_shaders = new Map();
|
|
291
|
+
this.m_compilerVersion = null;
|
|
292
|
+
this.m_compilerVersionBytes = null;
|
|
293
|
+
this.m_hash = new Uint8Array(0);
|
|
294
|
+
this.loadError = null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Converts supported option input shapes to `HlslShaderOption` instances.
|
|
300
|
+
*
|
|
301
|
+
* @param {Array<HlslShaderOption|object>|Map<string, string>} options Option input.
|
|
302
|
+
* @returns {HlslShaderOption[]} Normalized option list.
|
|
303
|
+
*/
|
|
304
|
+
function normalizeShaderOptions(options) {
|
|
305
|
+
if (options instanceof Map) {
|
|
306
|
+
return Array.from(options.entries()).map(([name, value]) => new HlslShaderOption(name, value));
|
|
307
|
+
}
|
|
308
|
+
if (!Array.isArray(options)) {
|
|
309
|
+
return [];
|
|
310
|
+
}
|
|
311
|
+
return options.map(entry => {
|
|
312
|
+
if (entry instanceof HlslShaderOption) {
|
|
313
|
+
return entry;
|
|
314
|
+
}
|
|
315
|
+
return new HlslShaderOption(entry?.name || "", entry?.value || "");
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export { HlslEffectRes };
|
|
320
|
+
//# sourceMappingURL=HlslEffectRes.js.map
|