@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,764 +1,764 @@
|
|
|
1
|
-
import { CjsCarbonDocument } from '@carbonenginejs/runtime-utils/document';
|
|
2
|
-
import { CjsSchema } from '@carbonenginejs/runtime-utils/schema';
|
|
3
|
-
import { CjsBlueReader } from '../../../format/CjsBlueReader.js';
|
|
4
|
-
import { CJS_BLACK_FOURCC, CJS_BLACK_VERSION, CJS_BLACK_FORMAT_ID } from './blackConstants.js';
|
|
5
|
-
import { CjsBlackBinaryReader } from './CjsBlackBinaryReader.js';
|
|
6
|
-
import { CjsBlackPropertyReaders } from './CjsBlackPropertyReaders.js';
|
|
7
|
-
import { CjsBlackSchemaRegistry } from './CjsBlackSchemaRegistry.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Reads a `.black` stream into a payload/document/runtime graph.
|
|
11
|
-
*
|
|
12
|
-
* This transport owns the binary buffer, string tables, numeric references,
|
|
13
|
-
* and binary read cursor. `ResetReadState()` clears only per-read graph state;
|
|
14
|
-
* each read entrypoint separately restores the cursor to `dataOffset`.
|
|
15
|
-
*/
|
|
16
|
-
class CjsBlackReader extends CjsBlueReader {
|
|
17
|
-
/**
|
|
18
|
-
* Creates a CjsBlackReader over caller-provided Black bytes and reader
|
|
19
|
-
* options.
|
|
20
|
-
*/
|
|
21
|
-
constructor(input, options = {}) {
|
|
22
|
-
super(options, {
|
|
23
|
-
schemaRegistry: CjsBlackSchemaRegistry,
|
|
24
|
-
defaultRegistry: CjsSchema,
|
|
25
|
-
includeShapeContext: true,
|
|
26
|
-
includeSourceShape: true,
|
|
27
|
-
includeEmptyPayloadType: true,
|
|
28
|
-
requirePayloadReferenceTarget: true
|
|
29
|
-
});
|
|
30
|
-
this.reader = CjsBlackBinaryReader.from(input, this);
|
|
31
|
-
this.references = new Map();
|
|
32
|
-
this.nodes = [];
|
|
33
|
-
this.nextNodeId = 1;
|
|
34
|
-
this.info = null;
|
|
35
|
-
this.readMode = "payload";
|
|
36
|
-
this.payloadDepth = 0;
|
|
37
|
-
this.payloadRootFields = null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Returns structural metadata without materializing the decoded payload for
|
|
42
|
-
* the Black object-graph reader.
|
|
43
|
-
*/
|
|
44
|
-
Inspect() {
|
|
45
|
-
if (this.info) return this.info;
|
|
46
|
-
const reader = this.reader;
|
|
47
|
-
reader.ExpectU32(CJS_BLACK_FOURCC, "Invalid Black FOURCC");
|
|
48
|
-
const version = reader.ReadU32();
|
|
49
|
-
if (version !== CJS_BLACK_VERSION) {
|
|
50
|
-
throw new RangeError(`Unsupported Black version: ${version}`);
|
|
51
|
-
}
|
|
52
|
-
const strings = CjsBlackReader.readStringTable(reader);
|
|
53
|
-
const wideStrings = CjsBlackReader.readWideStringTable(reader);
|
|
54
|
-
this.info = {
|
|
55
|
-
format: {
|
|
56
|
-
id: CJS_BLACK_FORMAT_ID,
|
|
57
|
-
version
|
|
58
|
-
},
|
|
59
|
-
byteLength: reader.data.byteLength,
|
|
60
|
-
dataOffset: reader.offset,
|
|
61
|
-
strings,
|
|
62
|
-
wideStrings
|
|
63
|
-
};
|
|
64
|
-
return this.info;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Reads the primary public payload representation from the supplied input
|
|
69
|
-
* for the Black object-graph reader.
|
|
70
|
-
*/
|
|
71
|
-
Read() {
|
|
72
|
-
return this.ReadPayload();
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/** Reads document from the current Black object-graph reader. */
|
|
76
|
-
ReadDocument() {
|
|
77
|
-
const info = this.Inspect();
|
|
78
|
-
this.ResetReadState();
|
|
79
|
-
this.readMode = "document";
|
|
80
|
-
this.reader.offset = info.dataOffset;
|
|
81
|
-
const rootRef = this.ReadObject(this.reader);
|
|
82
|
-
if (!CjsCarbonDocument.isRef(rootRef)) {
|
|
83
|
-
throw new TypeError("Black root object is null");
|
|
84
|
-
}
|
|
85
|
-
this.reader.ExpectEnd("Black object graph did not read to end");
|
|
86
|
-
const includeRefIndex = this.ShouldIncludeRefIndex();
|
|
87
|
-
const refs = {};
|
|
88
|
-
if (includeRefIndex) {
|
|
89
|
-
for (const node of this.nodes) {
|
|
90
|
-
refs[String(node.id)] = {
|
|
91
|
-
kind: node.kind
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return CjsCarbonDocument.create({
|
|
96
|
-
format: info.format,
|
|
97
|
-
roots: [{
|
|
98
|
-
name: this.options.rootName || "default",
|
|
99
|
-
ref: rootRef
|
|
100
|
-
}],
|
|
101
|
-
nodes: this.nodes,
|
|
102
|
-
refs: includeRefIndex ? refs : null,
|
|
103
|
-
metadata: this.CreateDocumentMetadata(info),
|
|
104
|
-
reports: this.reports
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/** Reads runtime from the current Black object-graph reader. */
|
|
109
|
-
ReadRuntime() {
|
|
110
|
-
const info = this.Inspect();
|
|
111
|
-
this.ResetReadState();
|
|
112
|
-
this.readMode = "runtime";
|
|
113
|
-
this.reader.offset = info.dataOffset;
|
|
114
|
-
const root = this.ReadObject(this.reader);
|
|
115
|
-
if (root === null) {
|
|
116
|
-
throw new TypeError("Black root object is null");
|
|
117
|
-
}
|
|
118
|
-
this.reader.ExpectEnd("Black object graph did not read to end");
|
|
119
|
-
this.FinalizeRuntimeInstances();
|
|
120
|
-
return {
|
|
121
|
-
root,
|
|
122
|
-
format: info.format,
|
|
123
|
-
reports: this.reports
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/** Reads payload from the current Black object-graph reader. */
|
|
128
|
-
ReadPayload() {
|
|
129
|
-
const info = this.Inspect();
|
|
130
|
-
this.ResetReadState();
|
|
131
|
-
this.readMode = "payload";
|
|
132
|
-
this.ValidatePayloadConfiguration();
|
|
133
|
-
this.reader.offset = info.dataOffset;
|
|
134
|
-
const object = this.ReadObject(this.reader);
|
|
135
|
-
if (object === null) {
|
|
136
|
-
throw new TypeError("Black root object is null");
|
|
137
|
-
}
|
|
138
|
-
this.reader.ExpectEnd("Black object graph did not read to end");
|
|
139
|
-
const payload = {
|
|
140
|
-
comments: this.reports,
|
|
141
|
-
object
|
|
142
|
-
};
|
|
143
|
-
if (this.ShouldIncludeDocumentMetadata()) {
|
|
144
|
-
payload.metadata = this.CreateDocumentMetadata(info);
|
|
145
|
-
}
|
|
146
|
-
return payload;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/** Reads object from the current Black object-graph reader. */
|
|
150
|
-
ReadObject(reader) {
|
|
151
|
-
if (this.readMode === "runtime") return this.ReadRuntimeObject(reader);
|
|
152
|
-
if (this.readMode === "payload") return this.ReadPayloadObject(reader);
|
|
153
|
-
const blackReference = reader.ReadU32();
|
|
154
|
-
if (blackReference === 0) return null;
|
|
155
|
-
const existing = this.references.get(blackReference);
|
|
156
|
-
if (existing) return CjsCarbonDocument.createRef(existing);
|
|
157
|
-
return this.ReadObjectPayload(reader, {
|
|
158
|
-
blackReference,
|
|
159
|
-
embedded: false
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/** Reads embedded object from the current Black object-graph reader. */
|
|
164
|
-
ReadEmbeddedObject(reader) {
|
|
165
|
-
if (this.readMode === "runtime") return this.ReadRuntimeObjectPayload(reader, {
|
|
166
|
-
blackReference: null,
|
|
167
|
-
embedded: true
|
|
168
|
-
});
|
|
169
|
-
if (this.readMode === "payload") return this.ReadPayloadObjectPayload(reader, {
|
|
170
|
-
blackReference: null,
|
|
171
|
-
embedded: true
|
|
172
|
-
});
|
|
173
|
-
return this.ReadObjectPayload(reader, {
|
|
174
|
-
blackReference: null,
|
|
175
|
-
embedded: true
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/** Reads object payload from the current Black object-graph reader. */
|
|
180
|
-
ReadObjectPayload(reader, options) {
|
|
181
|
-
const payloadSize = reader.ReadU32();
|
|
182
|
-
const objectReader = reader.ReadBinaryReader(payloadSize);
|
|
183
|
-
const kind = objectReader.ReadStringRef();
|
|
184
|
-
const shape = this.ResolveSourceShape(kind);
|
|
185
|
-
const includeClassMetadata = this.ShouldIncludeClassMetadata();
|
|
186
|
-
const includeFieldTrace = this.ShouldIncludeFieldTrace();
|
|
187
|
-
const node = {
|
|
188
|
-
id: this.nextNodeId++,
|
|
189
|
-
kind,
|
|
190
|
-
fields: {},
|
|
191
|
-
...(includeClassMetadata ? {
|
|
192
|
-
source: shape?.source || {},
|
|
193
|
-
meta: {
|
|
194
|
-
family: shape?.family || null,
|
|
195
|
-
hashes: shape?.hashes || null,
|
|
196
|
-
blue: shape?.blue || null
|
|
197
|
-
}
|
|
198
|
-
} : {}),
|
|
199
|
-
...(includeFieldTrace ? {
|
|
200
|
-
meta: {
|
|
201
|
-
...(includeClassMetadata ? {
|
|
202
|
-
family: shape?.family || null,
|
|
203
|
-
hashes: shape?.hashes || null,
|
|
204
|
-
blue: shape?.blue || null
|
|
205
|
-
} : {}),
|
|
206
|
-
black: {
|
|
207
|
-
reference: options.blackReference,
|
|
208
|
-
embedded: options.embedded,
|
|
209
|
-
payloadSize,
|
|
210
|
-
fields: {}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
} : {}),
|
|
214
|
-
raw: null
|
|
215
|
-
};
|
|
216
|
-
this.nodes.push(node);
|
|
217
|
-
if (options.blackReference !== null) {
|
|
218
|
-
this.references.set(options.blackReference, node.id);
|
|
219
|
-
}
|
|
220
|
-
let previousBlackName = null;
|
|
221
|
-
while (!objectReader.AtEnd()) {
|
|
222
|
-
const blackName = objectReader.ReadStringRef();
|
|
223
|
-
const target = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
|
|
224
|
-
const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, target);
|
|
225
|
-
this.AssignFieldValue(node, target, value);
|
|
226
|
-
previousBlackName = blackName;
|
|
227
|
-
}
|
|
228
|
-
objectReader.ExpectEnd(`${kind} did not read to end`);
|
|
229
|
-
return CjsCarbonDocument.createRef(node.id);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/** Reads runtime object from the current Black object-graph reader. */
|
|
233
|
-
ReadRuntimeObject(reader) {
|
|
234
|
-
const blackReference = reader.ReadU32();
|
|
235
|
-
if (blackReference === 0) return null;
|
|
236
|
-
if (this.references.has(blackReference)) {
|
|
237
|
-
return this.references.get(blackReference);
|
|
238
|
-
}
|
|
239
|
-
return this.ReadRuntimeObjectPayload(reader, {
|
|
240
|
-
blackReference,
|
|
241
|
-
embedded: false
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/** Reads runtime object payload from the current Black object-graph reader. */
|
|
246
|
-
ReadRuntimeObjectPayload(reader, options) {
|
|
247
|
-
const payloadSize = reader.ReadU32();
|
|
248
|
-
const objectReader = reader.ReadBinaryReader(payloadSize);
|
|
249
|
-
const kind = objectReader.ReadStringRef();
|
|
250
|
-
const shape = this.ResolveSourceShape(kind);
|
|
251
|
-
const target = this.CreateRuntimeTarget(kind, shape);
|
|
252
|
-
if (options.blackReference !== null) {
|
|
253
|
-
this.references.set(options.blackReference, target);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Accumulate this object's fields into a plain values map, then hand
|
|
257
|
-
// the whole map to the hydration adapter. The adapter (default:
|
|
258
|
-
// Object.assign) decides how the caller's class receives its values -
|
|
259
|
-
// direct assignment, SetValues, etc. The target instance is already
|
|
260
|
-
// registered above, so back-references resolve to it while its values
|
|
261
|
-
// are still being collected (the adapter must mutate in place).
|
|
262
|
-
const values = {};
|
|
263
|
-
let previousBlackName = null;
|
|
264
|
-
while (!objectReader.AtEnd()) {
|
|
265
|
-
const blackName = objectReader.ReadStringRef();
|
|
266
|
-
const fieldTarget = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
|
|
267
|
-
const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, fieldTarget);
|
|
268
|
-
this.AssignRuntimeFieldValue(values, fieldTarget, value);
|
|
269
|
-
previousBlackName = blackName;
|
|
270
|
-
}
|
|
271
|
-
objectReader.ExpectEnd(`${kind} did not read to end`);
|
|
272
|
-
this.ApplyRuntimeValues(target, values, kind, shape);
|
|
273
|
-
return target;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/** Reads payload object from the current Black object-graph reader. */
|
|
277
|
-
ReadPayloadObject(reader) {
|
|
278
|
-
const blackReference = reader.ReadU32();
|
|
279
|
-
if (blackReference === 0) return null;
|
|
280
|
-
if (this.references.has(blackReference)) {
|
|
281
|
-
return this.CreatePayloadReference(this.references.get(blackReference), blackReference);
|
|
282
|
-
}
|
|
283
|
-
return this.ReadPayloadObjectPayload(reader, {
|
|
284
|
-
blackReference,
|
|
285
|
-
embedded: false
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/** Reads payload object payload from the current Black object-graph reader. */
|
|
290
|
-
ReadPayloadObjectPayload(reader, options) {
|
|
291
|
-
const payloadSize = reader.ReadU32();
|
|
292
|
-
const objectReader = reader.ReadBinaryReader(payloadSize);
|
|
293
|
-
const kind = objectReader.ReadStringRef();
|
|
294
|
-
const shape = this.ResolveSourceShape(kind);
|
|
295
|
-
const target = this.CreatePayloadTarget(kind);
|
|
296
|
-
if (options.blackReference !== null) {
|
|
297
|
-
this.references.set(options.blackReference, target);
|
|
298
|
-
}
|
|
299
|
-
this.payloadDepth++;
|
|
300
|
-
try {
|
|
301
|
-
let previousBlackName = null;
|
|
302
|
-
while (!objectReader.AtEnd()) {
|
|
303
|
-
const blackName = objectReader.ReadStringRef();
|
|
304
|
-
const fieldTarget = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
|
|
305
|
-
if (this.ShouldSkipPayloadField(fieldTarget)) {
|
|
306
|
-
this.SkipFieldValue(objectReader, fieldTarget);
|
|
307
|
-
previousBlackName = blackName;
|
|
308
|
-
continue;
|
|
309
|
-
}
|
|
310
|
-
const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, fieldTarget);
|
|
311
|
-
this.AssignPayloadFieldValue(target, fieldTarget, value);
|
|
312
|
-
previousBlackName = blackName;
|
|
313
|
-
}
|
|
314
|
-
} finally {
|
|
315
|
-
this.payloadDepth--;
|
|
316
|
-
}
|
|
317
|
-
objectReader.ExpectEnd(`${kind} did not read to end`);
|
|
318
|
-
return target;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/** Creates skipped payload target for the current Black object-graph reader. */
|
|
322
|
-
CreateSkippedPayloadTarget() {
|
|
323
|
-
return {};
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/** Returns payload root fields from the current Black object-graph reader. */
|
|
327
|
-
GetPayloadRootFields() {
|
|
328
|
-
if (this.payloadRootFields !== null) return this.payloadRootFields;
|
|
329
|
-
const fields = this.options.payloadRootFields ?? this.options.rootFields ?? null;
|
|
330
|
-
if (!fields) {
|
|
331
|
-
this.payloadRootFields = false;
|
|
332
|
-
return this.payloadRootFields;
|
|
333
|
-
}
|
|
334
|
-
this.payloadRootFields = new Set((Array.isArray(fields) ? fields : [fields]).map(String));
|
|
335
|
-
return this.payloadRootFields;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Reports whether skip payload field is enabled by the current Black
|
|
340
|
-
* object-graph reader.
|
|
341
|
-
*/
|
|
342
|
-
ShouldSkipPayloadField(target) {
|
|
343
|
-
if (this.readMode !== "payload" || this.payloadDepth !== 1) return false;
|
|
344
|
-
const rootFields = this.GetPayloadRootFields();
|
|
345
|
-
if (!rootFields) return false;
|
|
346
|
-
const fieldName = target.unknown ? target.blackName : target.field.name;
|
|
347
|
-
return !rootFields.has(fieldName);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/** Advances past field value in the current Black object-graph reader. */
|
|
351
|
-
SkipFieldValue(reader, target) {
|
|
352
|
-
if (target.unknown) {
|
|
353
|
-
this.ReadUnknownFieldValue(reader, null, target.blackName);
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
CjsBlackPropertyReaders.skipValue(reader, target.field);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/** Advances past object in the current Black object-graph reader. */
|
|
360
|
-
SkipObject(reader) {
|
|
361
|
-
const blackReference = reader.ReadU32();
|
|
362
|
-
if (blackReference === 0) return;
|
|
363
|
-
if (this.references.has(blackReference)) return;
|
|
364
|
-
this.references.set(blackReference, this.CreateSkippedPayloadTarget());
|
|
365
|
-
this.SkipObjectPayload(reader);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
/** Advances past embedded object in the current Black object-graph reader. */
|
|
369
|
-
SkipEmbeddedObject(reader) {
|
|
370
|
-
this.SkipObjectPayload(reader);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
/** Advances past object payload in the current Black object-graph reader. */
|
|
374
|
-
SkipObjectPayload(reader) {
|
|
375
|
-
const payloadSize = reader.ReadU32();
|
|
376
|
-
const objectReader = reader.ReadBinaryReader(payloadSize);
|
|
377
|
-
const kind = objectReader.ReadStringRef();
|
|
378
|
-
const shape = this.ResolveSourceShape(kind);
|
|
379
|
-
while (!objectReader.AtEnd()) {
|
|
380
|
-
const blackName = objectReader.ReadStringRef();
|
|
381
|
-
const fieldTarget = this.ResolveFieldTarget(kind, shape, blackName);
|
|
382
|
-
this.SkipFieldValue(objectReader, fieldTarget);
|
|
383
|
-
}
|
|
384
|
-
objectReader.ExpectEnd(`${kind} did not read to end`);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Reports whether include class metadata is enabled by the current Black
|
|
389
|
-
* object-graph reader.
|
|
390
|
-
*/
|
|
391
|
-
ShouldIncludeClassMetadata() {
|
|
392
|
-
return Boolean(this.options.includeClassMetadata || this.options.trace || this.options.debug);
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* Reports whether include field trace is enabled by the current Black
|
|
397
|
-
* object-graph reader.
|
|
398
|
-
*/
|
|
399
|
-
ShouldIncludeFieldTrace() {
|
|
400
|
-
return Boolean(this.options.includeFieldTrace || this.options.trace || this.options.debug);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* Reports whether include document metadata is enabled by the current Black
|
|
405
|
-
* object-graph reader.
|
|
406
|
-
*/
|
|
407
|
-
ShouldIncludeDocumentMetadata() {
|
|
408
|
-
return Boolean(this.options.includeMetadata || this.options.trace || this.options.debug || this.options.metadata);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
* Reports whether include ref index is enabled by the current Black
|
|
413
|
-
* object-graph reader.
|
|
414
|
-
*/
|
|
415
|
-
ShouldIncludeRefIndex() {
|
|
416
|
-
return Boolean(this.options.includeRefIndex || this.options.trace || this.options.debug);
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
/** Creates document metadata for the current Black object-graph reader. */
|
|
420
|
-
CreateDocumentMetadata(info) {
|
|
421
|
-
if (!this.ShouldIncludeDocumentMetadata()) return this.options.metadata || null;
|
|
422
|
-
return {
|
|
423
|
-
black: {
|
|
424
|
-
stringCount: info.strings.length,
|
|
425
|
-
wideStringCount: info.wideStrings.length,
|
|
426
|
-
wideStrings: info.wideStrings.slice()
|
|
427
|
-
},
|
|
428
|
-
...(this.options.metadata || {})
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
/**
|
|
433
|
-
* Resolves field target with context against the current Black object-graph
|
|
434
|
-
* reader.
|
|
435
|
-
*/
|
|
436
|
-
ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName = null) {
|
|
437
|
-
try {
|
|
438
|
-
return this.ResolveFieldTarget(kind, shape, blackName);
|
|
439
|
-
} catch (error) {
|
|
440
|
-
error.message = `${kind}.${blackName} after ${previousBlackName || "<start>"}: ${error.message}`;
|
|
441
|
-
throw error;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
/** Reads field value with context from the current Black object-graph reader. */
|
|
446
|
-
ReadFieldValueWithContext(reader, kind, blackName, target) {
|
|
447
|
-
try {
|
|
448
|
-
return target.unknown ? this.ReadUnknownFieldValue(reader, kind, blackName) : CjsBlackPropertyReaders.readValue(reader, target.field);
|
|
449
|
-
} catch (error) {
|
|
450
|
-
error.message = `${kind}.${blackName}: ${error.message}`;
|
|
451
|
-
throw error;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
/**
|
|
456
|
-
* Assigns field value while preserving the current Black object-graph reader
|
|
457
|
-
* contract.
|
|
458
|
-
*/
|
|
459
|
-
AssignFieldValue(node, target, value) {
|
|
460
|
-
if (target.unknown) {
|
|
461
|
-
node.raw = node.raw || {};
|
|
462
|
-
node.raw[target.blackName] = value;
|
|
463
|
-
this.AssignFieldTrace(node, target);
|
|
464
|
-
return;
|
|
465
|
-
}
|
|
466
|
-
if (target.indexed) {
|
|
467
|
-
let current = node.fields[target.field.name];
|
|
468
|
-
if (!current || typeof current !== "object" || CjsCarbonDocument.isRef(current)) {
|
|
469
|
-
current = Number.isInteger(target.index) ? [] : {};
|
|
470
|
-
node.fields[target.field.name] = current;
|
|
471
|
-
}
|
|
472
|
-
current[target.key] = value;
|
|
473
|
-
} else {
|
|
474
|
-
node.fields[target.field.name] = value;
|
|
475
|
-
}
|
|
476
|
-
this.AssignFieldTrace(node, target);
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/**
|
|
480
|
-
* Assigns field trace while preserving the current Black object-graph reader
|
|
481
|
-
* contract.
|
|
482
|
-
*/
|
|
483
|
-
AssignFieldTrace(node, target) {
|
|
484
|
-
if (!this.ShouldIncludeFieldTrace()) return;
|
|
485
|
-
node.meta.black.fields[target.blackName] = {
|
|
486
|
-
field: target.field.name,
|
|
487
|
-
cppName: target.field.cppName || null,
|
|
488
|
-
member: target.member,
|
|
489
|
-
indexed: target.indexed,
|
|
490
|
-
indexToken: target.indexToken,
|
|
491
|
-
key: target.key
|
|
492
|
-
};
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/** Resolves field target against the current Black object-graph reader. */
|
|
496
|
-
ResolveFieldTarget(kind, shape, blackName) {
|
|
497
|
-
if (!shape) {
|
|
498
|
-
throw new TypeError(`No source shape registered for Black type ${kind}`);
|
|
499
|
-
}
|
|
500
|
-
const fields = shape.fields || [];
|
|
501
|
-
const blackField = (shape.black?.fields || []).find(item => CjsBlackSchemaRegistry.matchesBlackFieldName(item, blackName));
|
|
502
|
-
if (blackField) {
|
|
503
|
-
return this.ResolveBlackFieldTarget(blackName, blackField, fields);
|
|
504
|
-
}
|
|
505
|
-
const field = fields.find(item => item.name === blackName || item.cppName === blackName);
|
|
506
|
-
if (field) {
|
|
507
|
-
return {
|
|
508
|
-
blackName,
|
|
509
|
-
wireName: blackName,
|
|
510
|
-
field,
|
|
511
|
-
member: blackName,
|
|
512
|
-
indexed: false,
|
|
513
|
-
indexToken: null,
|
|
514
|
-
index: null,
|
|
515
|
-
key: null
|
|
516
|
-
};
|
|
517
|
-
}
|
|
518
|
-
const indexed = CjsBlackReader.parseIndexedMember(blackName);
|
|
519
|
-
if (indexed) {
|
|
520
|
-
const indexedField = fields.find(item => item.cppName === indexed.member || item.name === CjsBlackReader.toJsFieldName(indexed.member));
|
|
521
|
-
if (indexedField) {
|
|
522
|
-
const key = CjsBlackReader.normalizeIndexedKey(indexed.indexToken, indexedField);
|
|
523
|
-
return {
|
|
524
|
-
blackName,
|
|
525
|
-
wireName: blackName,
|
|
526
|
-
field: indexedField,
|
|
527
|
-
member: blackName,
|
|
528
|
-
indexed: true,
|
|
529
|
-
indexToken: indexed.indexToken,
|
|
530
|
-
index: Number.isInteger(key) ? key : null,
|
|
531
|
-
key
|
|
532
|
-
};
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
if (this.ShouldCaptureUnknownField(blackName, kind, shape)) {
|
|
536
|
-
return this.ResolveUnknownFieldTarget(kind, shape, blackName);
|
|
537
|
-
}
|
|
538
|
-
throw new TypeError(`Unknown Black property ${blackName} for ${kind}`);
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
/** Reads unknown field value from the current Black object-graph reader. */
|
|
542
|
-
ReadUnknownFieldValue(reader, kind, blackName) {
|
|
543
|
-
const readers = this.GetUnknownFieldReaders(blackName);
|
|
544
|
-
const errors = [];
|
|
545
|
-
for (const readValue of readers) {
|
|
546
|
-
const startOffset = reader.offset;
|
|
547
|
-
try {
|
|
548
|
-
return readValue(reader);
|
|
549
|
-
} catch (error) {
|
|
550
|
-
reader.offset = startOffset;
|
|
551
|
-
errors.push(error);
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
this.reports.push({
|
|
555
|
-
level: "warning",
|
|
556
|
-
code: "unknown-black-property-unreadable",
|
|
557
|
-
kind,
|
|
558
|
-
blackName
|
|
559
|
-
});
|
|
560
|
-
throw errors[0] || new TypeError(`Unable to read unknown Black field ${blackName} for ${kind}`);
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
/** Returns unknown field readers from the current Black object-graph reader. */
|
|
564
|
-
GetUnknownFieldReaders(blackName) {
|
|
565
|
-
const readers = [];
|
|
566
|
-
const readByKind = (kind, options = null) => {
|
|
567
|
-
const field = options ? {
|
|
568
|
-
...options,
|
|
569
|
-
kind
|
|
570
|
-
} : {
|
|
571
|
-
kind
|
|
572
|
-
};
|
|
573
|
-
readers.push(streamReader => CjsBlackPropertyReaders.readValue(streamReader, field));
|
|
574
|
-
};
|
|
575
|
-
const readByDescriptor = (descriptor = {}) => {
|
|
576
|
-
readers.push(streamReader => CjsBlackPropertyReaders.readValue(streamReader, descriptor));
|
|
577
|
-
};
|
|
578
|
-
if (this.options.allowUnknownStringFallback) {
|
|
579
|
-
readByKind("string");
|
|
580
|
-
readByKind("path");
|
|
581
|
-
}
|
|
582
|
-
const name = String(blackName || "");
|
|
583
|
-
if (name.endsWith(".dds") || name.endsWith(".png") || name.endsWith(".jpg") || /^res:\//.test(name)) {
|
|
584
|
-
readers.unshift(streamReader => CjsBlackPropertyReaders.readValue(streamReader, {
|
|
585
|
-
kind: "path"
|
|
586
|
-
}));
|
|
587
|
-
readByKind("uint32");
|
|
588
|
-
readByKind("float32");
|
|
589
|
-
}
|
|
590
|
-
if (!this.options.allowUnknownStringFallback) {
|
|
591
|
-
readByKind("path");
|
|
592
|
-
readByKind("string");
|
|
593
|
-
}
|
|
594
|
-
readByKind("objectRef");
|
|
595
|
-
readByKind("boolean");
|
|
596
|
-
readByKind("float32");
|
|
597
|
-
readByKind("float64");
|
|
598
|
-
readByKind("int32");
|
|
599
|
-
readByKind("uint32");
|
|
600
|
-
readByKind("int16");
|
|
601
|
-
readByKind("uint16");
|
|
602
|
-
readByKind("int8");
|
|
603
|
-
readByKind("uint8");
|
|
604
|
-
readByDescriptor({
|
|
605
|
-
kind: "vector3"
|
|
606
|
-
});
|
|
607
|
-
readByDescriptor({
|
|
608
|
-
kind: "vector4"
|
|
609
|
-
});
|
|
610
|
-
readByDescriptor({
|
|
611
|
-
kind: "array",
|
|
612
|
-
elementType: {
|
|
613
|
-
kind: "uint32"
|
|
614
|
-
}
|
|
615
|
-
});
|
|
616
|
-
return readers;
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
/** Resolves black field target against the current Black object-graph reader. */
|
|
620
|
-
ResolveBlackFieldTarget(blackName, blackField, fields) {
|
|
621
|
-
const sourceField = fields.find(item => item.name === blackField.fieldName || item.name === blackField.name || item.cppName === blackField.cppName || item.cppName === blackField.memberPath || item.cppName === blackField.memberRoot);
|
|
622
|
-
const fieldName = blackField.fieldName || sourceField?.name || blackField.name || CjsBlackReader.toJsFieldName(blackName);
|
|
623
|
-
Boolean(blackField.name && blackField.name !== blackField.fieldName);
|
|
624
|
-
const field = {
|
|
625
|
-
...(sourceField || {}),
|
|
626
|
-
name: fieldName,
|
|
627
|
-
cppName: blackField.cppName || sourceField?.cppName || null,
|
|
628
|
-
cppType: blackField.cppType || sourceField?.cppType || null,
|
|
629
|
-
black: blackField
|
|
630
|
-
};
|
|
631
|
-
const hasIndex = Boolean(blackField.indexToken || blackField.indexKey !== undefined);
|
|
632
|
-
const storageKey = hasIndex ? blackField.indexKey ?? CjsBlackReader.normalizeIndexedKey(blackField.indexToken, field) : null;
|
|
633
|
-
const indexed = Boolean(hasIndex);
|
|
634
|
-
return {
|
|
635
|
-
blackName,
|
|
636
|
-
wireName: blackName,
|
|
637
|
-
field,
|
|
638
|
-
member: blackField.member || blackName,
|
|
639
|
-
indexed,
|
|
640
|
-
indexToken: blackField.indexToken || null,
|
|
641
|
-
index: Number.isInteger(storageKey) ? storageKey : null,
|
|
642
|
-
key: storageKey
|
|
643
|
-
};
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
/**
|
|
647
|
-
* Resolves unknown field target against the current Black object-graph
|
|
648
|
-
* reader.
|
|
649
|
-
*/
|
|
650
|
-
ResolveUnknownFieldTarget(_kind, _shape, blackName) {
|
|
651
|
-
return {
|
|
652
|
-
blackName,
|
|
653
|
-
wireName: blackName,
|
|
654
|
-
field: {
|
|
655
|
-
name: "__blackUnknown",
|
|
656
|
-
cppName: null,
|
|
657
|
-
cppType: null,
|
|
658
|
-
black: {
|
|
659
|
-
fieldName: "__blackUnknown",
|
|
660
|
-
name: blackName,
|
|
661
|
-
memberPath: blackName,
|
|
662
|
-
memberRoot: blackName,
|
|
663
|
-
beType: "UNKNOWN"
|
|
664
|
-
}
|
|
665
|
-
},
|
|
666
|
-
member: blackName,
|
|
667
|
-
indexed: false,
|
|
668
|
-
indexToken: null,
|
|
669
|
-
index: null,
|
|
670
|
-
key: blackName,
|
|
671
|
-
unknown: true
|
|
672
|
-
};
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
/**
|
|
676
|
-
* Reports whether capture unknown field is enabled by the current Black
|
|
677
|
-
* object-graph reader.
|
|
678
|
-
*/
|
|
679
|
-
ShouldCaptureUnknownField(blackName, _kind, shape) {
|
|
680
|
-
if (this.options.captureUnknownBlackFields) return true;
|
|
681
|
-
if (this.options.captureUnknownResourceFields && /^res:\//.test(String(blackName || ""))) return true;
|
|
682
|
-
if (this.options.captureUnknownWhenNoBlackFields && (!shape?.black || !shape.black.fields || !shape.black.fields.length)) return true;
|
|
683
|
-
return false;
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
/** Resolves class against the current Black object-graph reader. */
|
|
687
|
-
ResolveClass(kind) {
|
|
688
|
-
const classes = this.options.classes || {};
|
|
689
|
-
const Schema = this.options.registry || CjsSchema;
|
|
690
|
-
return classes[kind] || Schema.GetConstructor(kind);
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
/** Clears read state before reusing the current Black object-graph reader. */
|
|
694
|
-
ResetReadState() {
|
|
695
|
-
super.ResetBlueReadState();
|
|
696
|
-
this.references = new Map();
|
|
697
|
-
this.nodes = [];
|
|
698
|
-
this.nextNodeId = this.options.firstId || 1;
|
|
699
|
-
this.payloadDepth = 0;
|
|
700
|
-
this.payloadRootFields = null;
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
/** Reads string table from the current Black object-graph reader. */
|
|
704
|
-
static readStringTable(reader) {
|
|
705
|
-
const stringsReader = reader.ReadBinaryReader(reader.ReadU32());
|
|
706
|
-
const count = stringsReader.ReadU16();
|
|
707
|
-
const strings = [];
|
|
708
|
-
for (let i = 0; i < count; i++) {
|
|
709
|
-
strings[i] = stringsReader.ReadCString();
|
|
710
|
-
}
|
|
711
|
-
stringsReader.ExpectEnd("Black string table did not read to end");
|
|
712
|
-
return strings;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
/** Reads wide string table from the current Black object-graph reader. */
|
|
716
|
-
static readWideStringTable(reader) {
|
|
717
|
-
const wideStringsReader = reader.ReadBinaryReader(reader.ReadU32());
|
|
718
|
-
const count = wideStringsReader.ReadU16();
|
|
719
|
-
const wideStrings = [];
|
|
720
|
-
for (let i = 0; i < count; i++) {
|
|
721
|
-
wideStrings[i] = wideStringsReader.ReadCWString();
|
|
722
|
-
}
|
|
723
|
-
wideStringsReader.ExpectEnd("Black wide string table did not read to end");
|
|
724
|
-
return wideStrings;
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
/**
|
|
728
|
-
* Converts indexed key into the canonical Black object-graph reader
|
|
729
|
-
* representation.
|
|
730
|
-
*/
|
|
731
|
-
static normalizeIndexedKey(indexToken, field) {
|
|
732
|
-
const number = Number(indexToken);
|
|
733
|
-
if (Number.isInteger(number) && String(indexToken).trim() === String(number)) return number;
|
|
734
|
-
let text = String(indexToken || "").trim();
|
|
735
|
-
text = text.replace(/^.*::/, "");
|
|
736
|
-
text = text.replace(/^TYPE_/, "");
|
|
737
|
-
const pascal = text.split(/[^A-Za-z0-9]+/).filter(Boolean).map(part => CJS_BLACK_INDEX_TOKEN_NAMES[part] || (part === "FX" ? "FX" : part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())).join("");
|
|
738
|
-
if (field?.jsType?.kind === "objectRef") {
|
|
739
|
-
return pascal ? pascal.charAt(0).toLowerCase() + pascal.slice(1) : text;
|
|
740
|
-
}
|
|
741
|
-
return pascal || text;
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
/** Parses indexed member from the current Black object-graph reader. */
|
|
745
|
-
static parseIndexedMember(value) {
|
|
746
|
-
const match = String(value || "").match(/^(.+)\[([^\]]+)\]$/);
|
|
747
|
-
if (!match) return null;
|
|
748
|
-
return {
|
|
749
|
-
member: match[1],
|
|
750
|
-
indexToken: match[2]
|
|
751
|
-
};
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
/** Converts the current Black object-graph reader value to JS field name. */
|
|
755
|
-
static toJsFieldName(value) {
|
|
756
|
-
return String(value || "").replace(/^m_/, "");
|
|
757
|
-
}
|
|
758
|
-
}
|
|
759
|
-
const CJS_BLACK_INDEX_TOKEN_NAMES = Object.freeze({
|
|
760
|
-
SIMPLEPRIMARY: "SimplePrimary"
|
|
761
|
-
});
|
|
762
|
-
|
|
763
|
-
export { CjsBlackReader };
|
|
764
|
-
//# sourceMappingURL=CjsBlackReader.js.map
|
|
1
|
+
import { CjsCarbonDocument } from '@carbonenginejs/runtime-utils/document';
|
|
2
|
+
import { CjsSchema } from '@carbonenginejs/runtime-utils/schema';
|
|
3
|
+
import { CjsBlueReader } from '../../../format/CjsBlueReader.js';
|
|
4
|
+
import { CJS_BLACK_FOURCC, CJS_BLACK_VERSION, CJS_BLACK_FORMAT_ID } from './blackConstants.js';
|
|
5
|
+
import { CjsBlackBinaryReader } from './CjsBlackBinaryReader.js';
|
|
6
|
+
import { CjsBlackPropertyReaders } from './CjsBlackPropertyReaders.js';
|
|
7
|
+
import { CjsBlackSchemaRegistry } from './CjsBlackSchemaRegistry.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Reads a `.black` stream into a payload/document/runtime graph.
|
|
11
|
+
*
|
|
12
|
+
* This transport owns the binary buffer, string tables, numeric references,
|
|
13
|
+
* and binary read cursor. `ResetReadState()` clears only per-read graph state;
|
|
14
|
+
* each read entrypoint separately restores the cursor to `dataOffset`.
|
|
15
|
+
*/
|
|
16
|
+
class CjsBlackReader extends CjsBlueReader {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a CjsBlackReader over caller-provided Black bytes and reader
|
|
19
|
+
* options.
|
|
20
|
+
*/
|
|
21
|
+
constructor(input, options = {}) {
|
|
22
|
+
super(options, {
|
|
23
|
+
schemaRegistry: CjsBlackSchemaRegistry,
|
|
24
|
+
defaultRegistry: CjsSchema,
|
|
25
|
+
includeShapeContext: true,
|
|
26
|
+
includeSourceShape: true,
|
|
27
|
+
includeEmptyPayloadType: true,
|
|
28
|
+
requirePayloadReferenceTarget: true
|
|
29
|
+
});
|
|
30
|
+
this.reader = CjsBlackBinaryReader.from(input, this);
|
|
31
|
+
this.references = new Map();
|
|
32
|
+
this.nodes = [];
|
|
33
|
+
this.nextNodeId = 1;
|
|
34
|
+
this.info = null;
|
|
35
|
+
this.readMode = "payload";
|
|
36
|
+
this.payloadDepth = 0;
|
|
37
|
+
this.payloadRootFields = null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns structural metadata without materializing the decoded payload for
|
|
42
|
+
* the Black object-graph reader.
|
|
43
|
+
*/
|
|
44
|
+
Inspect() {
|
|
45
|
+
if (this.info) return this.info;
|
|
46
|
+
const reader = this.reader;
|
|
47
|
+
reader.ExpectU32(CJS_BLACK_FOURCC, "Invalid Black FOURCC");
|
|
48
|
+
const version = reader.ReadU32();
|
|
49
|
+
if (version !== CJS_BLACK_VERSION) {
|
|
50
|
+
throw new RangeError(`Unsupported Black version: ${version}`);
|
|
51
|
+
}
|
|
52
|
+
const strings = CjsBlackReader.readStringTable(reader);
|
|
53
|
+
const wideStrings = CjsBlackReader.readWideStringTable(reader);
|
|
54
|
+
this.info = {
|
|
55
|
+
format: {
|
|
56
|
+
id: CJS_BLACK_FORMAT_ID,
|
|
57
|
+
version
|
|
58
|
+
},
|
|
59
|
+
byteLength: reader.data.byteLength,
|
|
60
|
+
dataOffset: reader.offset,
|
|
61
|
+
strings,
|
|
62
|
+
wideStrings
|
|
63
|
+
};
|
|
64
|
+
return this.info;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Reads the primary public payload representation from the supplied input
|
|
69
|
+
* for the Black object-graph reader.
|
|
70
|
+
*/
|
|
71
|
+
Read() {
|
|
72
|
+
return this.ReadPayload();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Reads document from the current Black object-graph reader. */
|
|
76
|
+
ReadDocument() {
|
|
77
|
+
const info = this.Inspect();
|
|
78
|
+
this.ResetReadState();
|
|
79
|
+
this.readMode = "document";
|
|
80
|
+
this.reader.offset = info.dataOffset;
|
|
81
|
+
const rootRef = this.ReadObject(this.reader);
|
|
82
|
+
if (!CjsCarbonDocument.isRef(rootRef)) {
|
|
83
|
+
throw new TypeError("Black root object is null");
|
|
84
|
+
}
|
|
85
|
+
this.reader.ExpectEnd("Black object graph did not read to end");
|
|
86
|
+
const includeRefIndex = this.ShouldIncludeRefIndex();
|
|
87
|
+
const refs = {};
|
|
88
|
+
if (includeRefIndex) {
|
|
89
|
+
for (const node of this.nodes) {
|
|
90
|
+
refs[String(node.id)] = {
|
|
91
|
+
kind: node.kind
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return CjsCarbonDocument.create({
|
|
96
|
+
format: info.format,
|
|
97
|
+
roots: [{
|
|
98
|
+
name: this.options.rootName || "default",
|
|
99
|
+
ref: rootRef
|
|
100
|
+
}],
|
|
101
|
+
nodes: this.nodes,
|
|
102
|
+
refs: includeRefIndex ? refs : null,
|
|
103
|
+
metadata: this.CreateDocumentMetadata(info),
|
|
104
|
+
reports: this.reports
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Reads runtime from the current Black object-graph reader. */
|
|
109
|
+
ReadRuntime() {
|
|
110
|
+
const info = this.Inspect();
|
|
111
|
+
this.ResetReadState();
|
|
112
|
+
this.readMode = "runtime";
|
|
113
|
+
this.reader.offset = info.dataOffset;
|
|
114
|
+
const root = this.ReadObject(this.reader);
|
|
115
|
+
if (root === null) {
|
|
116
|
+
throw new TypeError("Black root object is null");
|
|
117
|
+
}
|
|
118
|
+
this.reader.ExpectEnd("Black object graph did not read to end");
|
|
119
|
+
this.FinalizeRuntimeInstances();
|
|
120
|
+
return {
|
|
121
|
+
root,
|
|
122
|
+
format: info.format,
|
|
123
|
+
reports: this.reports
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Reads payload from the current Black object-graph reader. */
|
|
128
|
+
ReadPayload() {
|
|
129
|
+
const info = this.Inspect();
|
|
130
|
+
this.ResetReadState();
|
|
131
|
+
this.readMode = "payload";
|
|
132
|
+
this.ValidatePayloadConfiguration();
|
|
133
|
+
this.reader.offset = info.dataOffset;
|
|
134
|
+
const object = this.ReadObject(this.reader);
|
|
135
|
+
if (object === null) {
|
|
136
|
+
throw new TypeError("Black root object is null");
|
|
137
|
+
}
|
|
138
|
+
this.reader.ExpectEnd("Black object graph did not read to end");
|
|
139
|
+
const payload = {
|
|
140
|
+
comments: this.reports,
|
|
141
|
+
object
|
|
142
|
+
};
|
|
143
|
+
if (this.ShouldIncludeDocumentMetadata()) {
|
|
144
|
+
payload.metadata = this.CreateDocumentMetadata(info);
|
|
145
|
+
}
|
|
146
|
+
return payload;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Reads object from the current Black object-graph reader. */
|
|
150
|
+
ReadObject(reader) {
|
|
151
|
+
if (this.readMode === "runtime") return this.ReadRuntimeObject(reader);
|
|
152
|
+
if (this.readMode === "payload") return this.ReadPayloadObject(reader);
|
|
153
|
+
const blackReference = reader.ReadU32();
|
|
154
|
+
if (blackReference === 0) return null;
|
|
155
|
+
const existing = this.references.get(blackReference);
|
|
156
|
+
if (existing) return CjsCarbonDocument.createRef(existing);
|
|
157
|
+
return this.ReadObjectPayload(reader, {
|
|
158
|
+
blackReference,
|
|
159
|
+
embedded: false
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Reads embedded object from the current Black object-graph reader. */
|
|
164
|
+
ReadEmbeddedObject(reader) {
|
|
165
|
+
if (this.readMode === "runtime") return this.ReadRuntimeObjectPayload(reader, {
|
|
166
|
+
blackReference: null,
|
|
167
|
+
embedded: true
|
|
168
|
+
});
|
|
169
|
+
if (this.readMode === "payload") return this.ReadPayloadObjectPayload(reader, {
|
|
170
|
+
blackReference: null,
|
|
171
|
+
embedded: true
|
|
172
|
+
});
|
|
173
|
+
return this.ReadObjectPayload(reader, {
|
|
174
|
+
blackReference: null,
|
|
175
|
+
embedded: true
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Reads object payload from the current Black object-graph reader. */
|
|
180
|
+
ReadObjectPayload(reader, options) {
|
|
181
|
+
const payloadSize = reader.ReadU32();
|
|
182
|
+
const objectReader = reader.ReadBinaryReader(payloadSize);
|
|
183
|
+
const kind = objectReader.ReadStringRef();
|
|
184
|
+
const shape = this.ResolveSourceShape(kind);
|
|
185
|
+
const includeClassMetadata = this.ShouldIncludeClassMetadata();
|
|
186
|
+
const includeFieldTrace = this.ShouldIncludeFieldTrace();
|
|
187
|
+
const node = {
|
|
188
|
+
id: this.nextNodeId++,
|
|
189
|
+
kind,
|
|
190
|
+
fields: {},
|
|
191
|
+
...(includeClassMetadata ? {
|
|
192
|
+
source: shape?.source || {},
|
|
193
|
+
meta: {
|
|
194
|
+
family: shape?.family || null,
|
|
195
|
+
hashes: shape?.hashes || null,
|
|
196
|
+
blue: shape?.blue || null
|
|
197
|
+
}
|
|
198
|
+
} : {}),
|
|
199
|
+
...(includeFieldTrace ? {
|
|
200
|
+
meta: {
|
|
201
|
+
...(includeClassMetadata ? {
|
|
202
|
+
family: shape?.family || null,
|
|
203
|
+
hashes: shape?.hashes || null,
|
|
204
|
+
blue: shape?.blue || null
|
|
205
|
+
} : {}),
|
|
206
|
+
black: {
|
|
207
|
+
reference: options.blackReference,
|
|
208
|
+
embedded: options.embedded,
|
|
209
|
+
payloadSize,
|
|
210
|
+
fields: {}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
} : {}),
|
|
214
|
+
raw: null
|
|
215
|
+
};
|
|
216
|
+
this.nodes.push(node);
|
|
217
|
+
if (options.blackReference !== null) {
|
|
218
|
+
this.references.set(options.blackReference, node.id);
|
|
219
|
+
}
|
|
220
|
+
let previousBlackName = null;
|
|
221
|
+
while (!objectReader.AtEnd()) {
|
|
222
|
+
const blackName = objectReader.ReadStringRef();
|
|
223
|
+
const target = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
|
|
224
|
+
const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, target);
|
|
225
|
+
this.AssignFieldValue(node, target, value);
|
|
226
|
+
previousBlackName = blackName;
|
|
227
|
+
}
|
|
228
|
+
objectReader.ExpectEnd(`${kind} did not read to end`);
|
|
229
|
+
return CjsCarbonDocument.createRef(node.id);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Reads runtime object from the current Black object-graph reader. */
|
|
233
|
+
ReadRuntimeObject(reader) {
|
|
234
|
+
const blackReference = reader.ReadU32();
|
|
235
|
+
if (blackReference === 0) return null;
|
|
236
|
+
if (this.references.has(blackReference)) {
|
|
237
|
+
return this.references.get(blackReference);
|
|
238
|
+
}
|
|
239
|
+
return this.ReadRuntimeObjectPayload(reader, {
|
|
240
|
+
blackReference,
|
|
241
|
+
embedded: false
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** Reads runtime object payload from the current Black object-graph reader. */
|
|
246
|
+
ReadRuntimeObjectPayload(reader, options) {
|
|
247
|
+
const payloadSize = reader.ReadU32();
|
|
248
|
+
const objectReader = reader.ReadBinaryReader(payloadSize);
|
|
249
|
+
const kind = objectReader.ReadStringRef();
|
|
250
|
+
const shape = this.ResolveSourceShape(kind);
|
|
251
|
+
const target = this.CreateRuntimeTarget(kind, shape);
|
|
252
|
+
if (options.blackReference !== null) {
|
|
253
|
+
this.references.set(options.blackReference, target);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Accumulate this object's fields into a plain values map, then hand
|
|
257
|
+
// the whole map to the hydration adapter. The adapter (default:
|
|
258
|
+
// Object.assign) decides how the caller's class receives its values -
|
|
259
|
+
// direct assignment, SetValues, etc. The target instance is already
|
|
260
|
+
// registered above, so back-references resolve to it while its values
|
|
261
|
+
// are still being collected (the adapter must mutate in place).
|
|
262
|
+
const values = {};
|
|
263
|
+
let previousBlackName = null;
|
|
264
|
+
while (!objectReader.AtEnd()) {
|
|
265
|
+
const blackName = objectReader.ReadStringRef();
|
|
266
|
+
const fieldTarget = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
|
|
267
|
+
const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, fieldTarget);
|
|
268
|
+
this.AssignRuntimeFieldValue(values, fieldTarget, value);
|
|
269
|
+
previousBlackName = blackName;
|
|
270
|
+
}
|
|
271
|
+
objectReader.ExpectEnd(`${kind} did not read to end`);
|
|
272
|
+
this.ApplyRuntimeValues(target, values, kind, shape);
|
|
273
|
+
return target;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Reads payload object from the current Black object-graph reader. */
|
|
277
|
+
ReadPayloadObject(reader) {
|
|
278
|
+
const blackReference = reader.ReadU32();
|
|
279
|
+
if (blackReference === 0) return null;
|
|
280
|
+
if (this.references.has(blackReference)) {
|
|
281
|
+
return this.CreatePayloadReference(this.references.get(blackReference), blackReference);
|
|
282
|
+
}
|
|
283
|
+
return this.ReadPayloadObjectPayload(reader, {
|
|
284
|
+
blackReference,
|
|
285
|
+
embedded: false
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/** Reads payload object payload from the current Black object-graph reader. */
|
|
290
|
+
ReadPayloadObjectPayload(reader, options) {
|
|
291
|
+
const payloadSize = reader.ReadU32();
|
|
292
|
+
const objectReader = reader.ReadBinaryReader(payloadSize);
|
|
293
|
+
const kind = objectReader.ReadStringRef();
|
|
294
|
+
const shape = this.ResolveSourceShape(kind);
|
|
295
|
+
const target = this.CreatePayloadTarget(kind);
|
|
296
|
+
if (options.blackReference !== null) {
|
|
297
|
+
this.references.set(options.blackReference, target);
|
|
298
|
+
}
|
|
299
|
+
this.payloadDepth++;
|
|
300
|
+
try {
|
|
301
|
+
let previousBlackName = null;
|
|
302
|
+
while (!objectReader.AtEnd()) {
|
|
303
|
+
const blackName = objectReader.ReadStringRef();
|
|
304
|
+
const fieldTarget = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
|
|
305
|
+
if (this.ShouldSkipPayloadField(fieldTarget)) {
|
|
306
|
+
this.SkipFieldValue(objectReader, fieldTarget);
|
|
307
|
+
previousBlackName = blackName;
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, fieldTarget);
|
|
311
|
+
this.AssignPayloadFieldValue(target, fieldTarget, value);
|
|
312
|
+
previousBlackName = blackName;
|
|
313
|
+
}
|
|
314
|
+
} finally {
|
|
315
|
+
this.payloadDepth--;
|
|
316
|
+
}
|
|
317
|
+
objectReader.ExpectEnd(`${kind} did not read to end`);
|
|
318
|
+
return target;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Creates skipped payload target for the current Black object-graph reader. */
|
|
322
|
+
CreateSkippedPayloadTarget() {
|
|
323
|
+
return {};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/** Returns payload root fields from the current Black object-graph reader. */
|
|
327
|
+
GetPayloadRootFields() {
|
|
328
|
+
if (this.payloadRootFields !== null) return this.payloadRootFields;
|
|
329
|
+
const fields = this.options.payloadRootFields ?? this.options.rootFields ?? null;
|
|
330
|
+
if (!fields) {
|
|
331
|
+
this.payloadRootFields = false;
|
|
332
|
+
return this.payloadRootFields;
|
|
333
|
+
}
|
|
334
|
+
this.payloadRootFields = new Set((Array.isArray(fields) ? fields : [fields]).map(String));
|
|
335
|
+
return this.payloadRootFields;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Reports whether skip payload field is enabled by the current Black
|
|
340
|
+
* object-graph reader.
|
|
341
|
+
*/
|
|
342
|
+
ShouldSkipPayloadField(target) {
|
|
343
|
+
if (this.readMode !== "payload" || this.payloadDepth !== 1) return false;
|
|
344
|
+
const rootFields = this.GetPayloadRootFields();
|
|
345
|
+
if (!rootFields) return false;
|
|
346
|
+
const fieldName = target.unknown ? target.blackName : target.field.name;
|
|
347
|
+
return !rootFields.has(fieldName);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/** Advances past field value in the current Black object-graph reader. */
|
|
351
|
+
SkipFieldValue(reader, target) {
|
|
352
|
+
if (target.unknown) {
|
|
353
|
+
this.ReadUnknownFieldValue(reader, null, target.blackName);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
CjsBlackPropertyReaders.skipValue(reader, target.field);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/** Advances past object in the current Black object-graph reader. */
|
|
360
|
+
SkipObject(reader) {
|
|
361
|
+
const blackReference = reader.ReadU32();
|
|
362
|
+
if (blackReference === 0) return;
|
|
363
|
+
if (this.references.has(blackReference)) return;
|
|
364
|
+
this.references.set(blackReference, this.CreateSkippedPayloadTarget());
|
|
365
|
+
this.SkipObjectPayload(reader);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/** Advances past embedded object in the current Black object-graph reader. */
|
|
369
|
+
SkipEmbeddedObject(reader) {
|
|
370
|
+
this.SkipObjectPayload(reader);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/** Advances past object payload in the current Black object-graph reader. */
|
|
374
|
+
SkipObjectPayload(reader) {
|
|
375
|
+
const payloadSize = reader.ReadU32();
|
|
376
|
+
const objectReader = reader.ReadBinaryReader(payloadSize);
|
|
377
|
+
const kind = objectReader.ReadStringRef();
|
|
378
|
+
const shape = this.ResolveSourceShape(kind);
|
|
379
|
+
while (!objectReader.AtEnd()) {
|
|
380
|
+
const blackName = objectReader.ReadStringRef();
|
|
381
|
+
const fieldTarget = this.ResolveFieldTarget(kind, shape, blackName);
|
|
382
|
+
this.SkipFieldValue(objectReader, fieldTarget);
|
|
383
|
+
}
|
|
384
|
+
objectReader.ExpectEnd(`${kind} did not read to end`);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Reports whether include class metadata is enabled by the current Black
|
|
389
|
+
* object-graph reader.
|
|
390
|
+
*/
|
|
391
|
+
ShouldIncludeClassMetadata() {
|
|
392
|
+
return Boolean(this.options.includeClassMetadata || this.options.trace || this.options.debug);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Reports whether include field trace is enabled by the current Black
|
|
397
|
+
* object-graph reader.
|
|
398
|
+
*/
|
|
399
|
+
ShouldIncludeFieldTrace() {
|
|
400
|
+
return Boolean(this.options.includeFieldTrace || this.options.trace || this.options.debug);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Reports whether include document metadata is enabled by the current Black
|
|
405
|
+
* object-graph reader.
|
|
406
|
+
*/
|
|
407
|
+
ShouldIncludeDocumentMetadata() {
|
|
408
|
+
return Boolean(this.options.includeMetadata || this.options.trace || this.options.debug || this.options.metadata);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Reports whether include ref index is enabled by the current Black
|
|
413
|
+
* object-graph reader.
|
|
414
|
+
*/
|
|
415
|
+
ShouldIncludeRefIndex() {
|
|
416
|
+
return Boolean(this.options.includeRefIndex || this.options.trace || this.options.debug);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/** Creates document metadata for the current Black object-graph reader. */
|
|
420
|
+
CreateDocumentMetadata(info) {
|
|
421
|
+
if (!this.ShouldIncludeDocumentMetadata()) return this.options.metadata || null;
|
|
422
|
+
return {
|
|
423
|
+
black: {
|
|
424
|
+
stringCount: info.strings.length,
|
|
425
|
+
wideStringCount: info.wideStrings.length,
|
|
426
|
+
wideStrings: info.wideStrings.slice()
|
|
427
|
+
},
|
|
428
|
+
...(this.options.metadata || {})
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Resolves field target with context against the current Black object-graph
|
|
434
|
+
* reader.
|
|
435
|
+
*/
|
|
436
|
+
ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName = null) {
|
|
437
|
+
try {
|
|
438
|
+
return this.ResolveFieldTarget(kind, shape, blackName);
|
|
439
|
+
} catch (error) {
|
|
440
|
+
error.message = `${kind}.${blackName} after ${previousBlackName || "<start>"}: ${error.message}`;
|
|
441
|
+
throw error;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/** Reads field value with context from the current Black object-graph reader. */
|
|
446
|
+
ReadFieldValueWithContext(reader, kind, blackName, target) {
|
|
447
|
+
try {
|
|
448
|
+
return target.unknown ? this.ReadUnknownFieldValue(reader, kind, blackName) : CjsBlackPropertyReaders.readValue(reader, target.field);
|
|
449
|
+
} catch (error) {
|
|
450
|
+
error.message = `${kind}.${blackName}: ${error.message}`;
|
|
451
|
+
throw error;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Assigns field value while preserving the current Black object-graph reader
|
|
457
|
+
* contract.
|
|
458
|
+
*/
|
|
459
|
+
AssignFieldValue(node, target, value) {
|
|
460
|
+
if (target.unknown) {
|
|
461
|
+
node.raw = node.raw || {};
|
|
462
|
+
node.raw[target.blackName] = value;
|
|
463
|
+
this.AssignFieldTrace(node, target);
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
if (target.indexed) {
|
|
467
|
+
let current = node.fields[target.field.name];
|
|
468
|
+
if (!current || typeof current !== "object" || CjsCarbonDocument.isRef(current)) {
|
|
469
|
+
current = Number.isInteger(target.index) ? [] : {};
|
|
470
|
+
node.fields[target.field.name] = current;
|
|
471
|
+
}
|
|
472
|
+
current[target.key] = value;
|
|
473
|
+
} else {
|
|
474
|
+
node.fields[target.field.name] = value;
|
|
475
|
+
}
|
|
476
|
+
this.AssignFieldTrace(node, target);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Assigns field trace while preserving the current Black object-graph reader
|
|
481
|
+
* contract.
|
|
482
|
+
*/
|
|
483
|
+
AssignFieldTrace(node, target) {
|
|
484
|
+
if (!this.ShouldIncludeFieldTrace()) return;
|
|
485
|
+
node.meta.black.fields[target.blackName] = {
|
|
486
|
+
field: target.field.name,
|
|
487
|
+
cppName: target.field.cppName || null,
|
|
488
|
+
member: target.member,
|
|
489
|
+
indexed: target.indexed,
|
|
490
|
+
indexToken: target.indexToken,
|
|
491
|
+
key: target.key
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/** Resolves field target against the current Black object-graph reader. */
|
|
496
|
+
ResolveFieldTarget(kind, shape, blackName) {
|
|
497
|
+
if (!shape) {
|
|
498
|
+
throw new TypeError(`No source shape registered for Black type ${kind}`);
|
|
499
|
+
}
|
|
500
|
+
const fields = shape.fields || [];
|
|
501
|
+
const blackField = (shape.black?.fields || []).find(item => CjsBlackSchemaRegistry.matchesBlackFieldName(item, blackName));
|
|
502
|
+
if (blackField) {
|
|
503
|
+
return this.ResolveBlackFieldTarget(blackName, blackField, fields);
|
|
504
|
+
}
|
|
505
|
+
const field = fields.find(item => item.name === blackName || item.cppName === blackName);
|
|
506
|
+
if (field) {
|
|
507
|
+
return {
|
|
508
|
+
blackName,
|
|
509
|
+
wireName: blackName,
|
|
510
|
+
field,
|
|
511
|
+
member: blackName,
|
|
512
|
+
indexed: false,
|
|
513
|
+
indexToken: null,
|
|
514
|
+
index: null,
|
|
515
|
+
key: null
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
const indexed = CjsBlackReader.parseIndexedMember(blackName);
|
|
519
|
+
if (indexed) {
|
|
520
|
+
const indexedField = fields.find(item => item.cppName === indexed.member || item.name === CjsBlackReader.toJsFieldName(indexed.member));
|
|
521
|
+
if (indexedField) {
|
|
522
|
+
const key = CjsBlackReader.normalizeIndexedKey(indexed.indexToken, indexedField);
|
|
523
|
+
return {
|
|
524
|
+
blackName,
|
|
525
|
+
wireName: blackName,
|
|
526
|
+
field: indexedField,
|
|
527
|
+
member: blackName,
|
|
528
|
+
indexed: true,
|
|
529
|
+
indexToken: indexed.indexToken,
|
|
530
|
+
index: Number.isInteger(key) ? key : null,
|
|
531
|
+
key
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (this.ShouldCaptureUnknownField(blackName, kind, shape)) {
|
|
536
|
+
return this.ResolveUnknownFieldTarget(kind, shape, blackName);
|
|
537
|
+
}
|
|
538
|
+
throw new TypeError(`Unknown Black property ${blackName} for ${kind}`);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/** Reads unknown field value from the current Black object-graph reader. */
|
|
542
|
+
ReadUnknownFieldValue(reader, kind, blackName) {
|
|
543
|
+
const readers = this.GetUnknownFieldReaders(blackName);
|
|
544
|
+
const errors = [];
|
|
545
|
+
for (const readValue of readers) {
|
|
546
|
+
const startOffset = reader.offset;
|
|
547
|
+
try {
|
|
548
|
+
return readValue(reader);
|
|
549
|
+
} catch (error) {
|
|
550
|
+
reader.offset = startOffset;
|
|
551
|
+
errors.push(error);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
this.reports.push({
|
|
555
|
+
level: "warning",
|
|
556
|
+
code: "unknown-black-property-unreadable",
|
|
557
|
+
kind,
|
|
558
|
+
blackName
|
|
559
|
+
});
|
|
560
|
+
throw errors[0] || new TypeError(`Unable to read unknown Black field ${blackName} for ${kind}`);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/** Returns unknown field readers from the current Black object-graph reader. */
|
|
564
|
+
GetUnknownFieldReaders(blackName) {
|
|
565
|
+
const readers = [];
|
|
566
|
+
const readByKind = (kind, options = null) => {
|
|
567
|
+
const field = options ? {
|
|
568
|
+
...options,
|
|
569
|
+
kind
|
|
570
|
+
} : {
|
|
571
|
+
kind
|
|
572
|
+
};
|
|
573
|
+
readers.push(streamReader => CjsBlackPropertyReaders.readValue(streamReader, field));
|
|
574
|
+
};
|
|
575
|
+
const readByDescriptor = (descriptor = {}) => {
|
|
576
|
+
readers.push(streamReader => CjsBlackPropertyReaders.readValue(streamReader, descriptor));
|
|
577
|
+
};
|
|
578
|
+
if (this.options.allowUnknownStringFallback) {
|
|
579
|
+
readByKind("string");
|
|
580
|
+
readByKind("path");
|
|
581
|
+
}
|
|
582
|
+
const name = String(blackName || "");
|
|
583
|
+
if (name.endsWith(".dds") || name.endsWith(".png") || name.endsWith(".jpg") || /^res:\//.test(name)) {
|
|
584
|
+
readers.unshift(streamReader => CjsBlackPropertyReaders.readValue(streamReader, {
|
|
585
|
+
kind: "path"
|
|
586
|
+
}));
|
|
587
|
+
readByKind("uint32");
|
|
588
|
+
readByKind("float32");
|
|
589
|
+
}
|
|
590
|
+
if (!this.options.allowUnknownStringFallback) {
|
|
591
|
+
readByKind("path");
|
|
592
|
+
readByKind("string");
|
|
593
|
+
}
|
|
594
|
+
readByKind("objectRef");
|
|
595
|
+
readByKind("boolean");
|
|
596
|
+
readByKind("float32");
|
|
597
|
+
readByKind("float64");
|
|
598
|
+
readByKind("int32");
|
|
599
|
+
readByKind("uint32");
|
|
600
|
+
readByKind("int16");
|
|
601
|
+
readByKind("uint16");
|
|
602
|
+
readByKind("int8");
|
|
603
|
+
readByKind("uint8");
|
|
604
|
+
readByDescriptor({
|
|
605
|
+
kind: "vector3"
|
|
606
|
+
});
|
|
607
|
+
readByDescriptor({
|
|
608
|
+
kind: "vector4"
|
|
609
|
+
});
|
|
610
|
+
readByDescriptor({
|
|
611
|
+
kind: "array",
|
|
612
|
+
elementType: {
|
|
613
|
+
kind: "uint32"
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
return readers;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/** Resolves black field target against the current Black object-graph reader. */
|
|
620
|
+
ResolveBlackFieldTarget(blackName, blackField, fields) {
|
|
621
|
+
const sourceField = fields.find(item => item.name === blackField.fieldName || item.name === blackField.name || item.cppName === blackField.cppName || item.cppName === blackField.memberPath || item.cppName === blackField.memberRoot);
|
|
622
|
+
const fieldName = blackField.fieldName || sourceField?.name || blackField.name || CjsBlackReader.toJsFieldName(blackName);
|
|
623
|
+
Boolean(blackField.name && blackField.name !== blackField.fieldName);
|
|
624
|
+
const field = {
|
|
625
|
+
...(sourceField || {}),
|
|
626
|
+
name: fieldName,
|
|
627
|
+
cppName: blackField.cppName || sourceField?.cppName || null,
|
|
628
|
+
cppType: blackField.cppType || sourceField?.cppType || null,
|
|
629
|
+
black: blackField
|
|
630
|
+
};
|
|
631
|
+
const hasIndex = Boolean(blackField.indexToken || blackField.indexKey !== undefined);
|
|
632
|
+
const storageKey = hasIndex ? blackField.indexKey ?? CjsBlackReader.normalizeIndexedKey(blackField.indexToken, field) : null;
|
|
633
|
+
const indexed = Boolean(hasIndex);
|
|
634
|
+
return {
|
|
635
|
+
blackName,
|
|
636
|
+
wireName: blackName,
|
|
637
|
+
field,
|
|
638
|
+
member: blackField.member || blackName,
|
|
639
|
+
indexed,
|
|
640
|
+
indexToken: blackField.indexToken || null,
|
|
641
|
+
index: Number.isInteger(storageKey) ? storageKey : null,
|
|
642
|
+
key: storageKey
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Resolves unknown field target against the current Black object-graph
|
|
648
|
+
* reader.
|
|
649
|
+
*/
|
|
650
|
+
ResolveUnknownFieldTarget(_kind, _shape, blackName) {
|
|
651
|
+
return {
|
|
652
|
+
blackName,
|
|
653
|
+
wireName: blackName,
|
|
654
|
+
field: {
|
|
655
|
+
name: "__blackUnknown",
|
|
656
|
+
cppName: null,
|
|
657
|
+
cppType: null,
|
|
658
|
+
black: {
|
|
659
|
+
fieldName: "__blackUnknown",
|
|
660
|
+
name: blackName,
|
|
661
|
+
memberPath: blackName,
|
|
662
|
+
memberRoot: blackName,
|
|
663
|
+
beType: "UNKNOWN"
|
|
664
|
+
}
|
|
665
|
+
},
|
|
666
|
+
member: blackName,
|
|
667
|
+
indexed: false,
|
|
668
|
+
indexToken: null,
|
|
669
|
+
index: null,
|
|
670
|
+
key: blackName,
|
|
671
|
+
unknown: true
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
* Reports whether capture unknown field is enabled by the current Black
|
|
677
|
+
* object-graph reader.
|
|
678
|
+
*/
|
|
679
|
+
ShouldCaptureUnknownField(blackName, _kind, shape) {
|
|
680
|
+
if (this.options.captureUnknownBlackFields) return true;
|
|
681
|
+
if (this.options.captureUnknownResourceFields && /^res:\//.test(String(blackName || ""))) return true;
|
|
682
|
+
if (this.options.captureUnknownWhenNoBlackFields && (!shape?.black || !shape.black.fields || !shape.black.fields.length)) return true;
|
|
683
|
+
return false;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/** Resolves class against the current Black object-graph reader. */
|
|
687
|
+
ResolveClass(kind) {
|
|
688
|
+
const classes = this.options.classes || {};
|
|
689
|
+
const Schema = this.options.registry || CjsSchema;
|
|
690
|
+
return classes[kind] || Schema.GetConstructor(kind);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/** Clears read state before reusing the current Black object-graph reader. */
|
|
694
|
+
ResetReadState() {
|
|
695
|
+
super.ResetBlueReadState();
|
|
696
|
+
this.references = new Map();
|
|
697
|
+
this.nodes = [];
|
|
698
|
+
this.nextNodeId = this.options.firstId || 1;
|
|
699
|
+
this.payloadDepth = 0;
|
|
700
|
+
this.payloadRootFields = null;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/** Reads string table from the current Black object-graph reader. */
|
|
704
|
+
static readStringTable(reader) {
|
|
705
|
+
const stringsReader = reader.ReadBinaryReader(reader.ReadU32());
|
|
706
|
+
const count = stringsReader.ReadU16();
|
|
707
|
+
const strings = [];
|
|
708
|
+
for (let i = 0; i < count; i++) {
|
|
709
|
+
strings[i] = stringsReader.ReadCString();
|
|
710
|
+
}
|
|
711
|
+
stringsReader.ExpectEnd("Black string table did not read to end");
|
|
712
|
+
return strings;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/** Reads wide string table from the current Black object-graph reader. */
|
|
716
|
+
static readWideStringTable(reader) {
|
|
717
|
+
const wideStringsReader = reader.ReadBinaryReader(reader.ReadU32());
|
|
718
|
+
const count = wideStringsReader.ReadU16();
|
|
719
|
+
const wideStrings = [];
|
|
720
|
+
for (let i = 0; i < count; i++) {
|
|
721
|
+
wideStrings[i] = wideStringsReader.ReadCWString();
|
|
722
|
+
}
|
|
723
|
+
wideStringsReader.ExpectEnd("Black wide string table did not read to end");
|
|
724
|
+
return wideStrings;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/**
|
|
728
|
+
* Converts indexed key into the canonical Black object-graph reader
|
|
729
|
+
* representation.
|
|
730
|
+
*/
|
|
731
|
+
static normalizeIndexedKey(indexToken, field) {
|
|
732
|
+
const number = Number(indexToken);
|
|
733
|
+
if (Number.isInteger(number) && String(indexToken).trim() === String(number)) return number;
|
|
734
|
+
let text = String(indexToken || "").trim();
|
|
735
|
+
text = text.replace(/^.*::/, "");
|
|
736
|
+
text = text.replace(/^TYPE_/, "");
|
|
737
|
+
const pascal = text.split(/[^A-Za-z0-9]+/).filter(Boolean).map(part => CJS_BLACK_INDEX_TOKEN_NAMES[part] || (part === "FX" ? "FX" : part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())).join("");
|
|
738
|
+
if (field?.jsType?.kind === "objectRef") {
|
|
739
|
+
return pascal ? pascal.charAt(0).toLowerCase() + pascal.slice(1) : text;
|
|
740
|
+
}
|
|
741
|
+
return pascal || text;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/** Parses indexed member from the current Black object-graph reader. */
|
|
745
|
+
static parseIndexedMember(value) {
|
|
746
|
+
const match = String(value || "").match(/^(.+)\[([^\]]+)\]$/);
|
|
747
|
+
if (!match) return null;
|
|
748
|
+
return {
|
|
749
|
+
member: match[1],
|
|
750
|
+
indexToken: match[2]
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/** Converts the current Black object-graph reader value to JS field name. */
|
|
755
|
+
static toJsFieldName(value) {
|
|
756
|
+
return String(value || "").replace(/^m_/, "");
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
const CJS_BLACK_INDEX_TOKEN_NAMES = Object.freeze({
|
|
760
|
+
SIMPLEPRIMARY: "SimplePrimary"
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
export { CjsBlackReader };
|
|
764
|
+
//# sourceMappingURL=CjsBlackReader.js.map
|