@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,282 +1,282 @@
|
|
|
1
|
-
// Clean-room BitKnit2 (Granny .gr2 section format 4) decompressor.
|
|
2
|
-
//
|
|
3
|
-
// Original CarbonEngineJS implementation written solely from the published
|
|
4
|
-
// format specification (docs/formats/bitknit2.md) by an isolated agent with
|
|
5
|
-
// no access to any other BitKnit implementation, then validated byte-exact
|
|
6
|
-
// against 539 real EVE .gr2 BitKnit2 streams (sections and pointer-fixup
|
|
7
|
-
// blocks) plus synthetic raw-quantum streams. Replaced the prior EUPL-derived
|
|
8
|
-
// port on 2026-07-24; see THIRD-PARTY-NOTICES.md.
|
|
9
|
-
|
|
10
|
-
const TOTAL = 0x8000;
|
|
11
|
-
const QUANTUM_BYTES = 0x10000;
|
|
12
|
-
const MAGIC = 0x75B1;
|
|
13
|
-
|
|
14
|
-
// Powers of two as exact doubles, indexed 0..32. All entropy-state values are
|
|
15
|
-
// unsigned 32-bit; floor division by these avoids signed-shift pitfalls.
|
|
16
|
-
const POW2 = new Float64Array(33);
|
|
17
|
-
for (let i = 0; i <= 32; i++) {
|
|
18
|
-
POW2[i] = Math.pow(2, i);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* One adaptive frequency model with 15-bit precision (TOTAL = 0x8000).
|
|
23
|
-
* Holds a cumulative table cum[0..V] (cum[V] = TOTAL), per-symbol
|
|
24
|
-
* accumulators, and a 1024-entry lookup table for fast symbol search.
|
|
25
|
-
*/
|
|
26
|
-
class FrequencyModel {
|
|
27
|
-
/**
|
|
28
|
-
* @param {number} symbolCount Total symbols V.
|
|
29
|
-
* @param {number} minProbCount Trailing minimum-probability symbols M.
|
|
30
|
-
*/
|
|
31
|
-
constructor(symbolCount, minProbCount) {
|
|
32
|
-
const V = symbolCount;
|
|
33
|
-
const E = V - minProbCount;
|
|
34
|
-
const cum = new Uint16Array(V + 1);
|
|
35
|
-
for (let i = 0; i < E; i++) {
|
|
36
|
-
cum[i] = Math.floor((TOTAL - minProbCount) * i / E);
|
|
37
|
-
}
|
|
38
|
-
for (let i = E; i <= V; i++) {
|
|
39
|
-
cum[i] = TOTAL - V + i;
|
|
40
|
-
}
|
|
41
|
-
this.symbolCount = V;
|
|
42
|
-
this.cum = cum;
|
|
43
|
-
this.acc = new Uint16Array(V).fill(1);
|
|
44
|
-
this.tick = 0;
|
|
45
|
-
this.inc = Math.floor((TOTAL - V) / 1024);
|
|
46
|
-
this.lastInc = 1 + TOTAL - V - this.inc * 1024;
|
|
47
|
-
this.lookup = new Uint16Array(1024);
|
|
48
|
-
this.rebuildLookup();
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** Rebuilds lookup used by the current GR2 format reader. */
|
|
52
|
-
rebuildLookup() {
|
|
53
|
-
const cum = this.cum;
|
|
54
|
-
const lookup = this.lookup;
|
|
55
|
-
let s = 0;
|
|
56
|
-
for (let k = 0; k < 1024; k++) {
|
|
57
|
-
const threshold = k * 32;
|
|
58
|
-
while (threshold >= cum[s + 1]) {
|
|
59
|
-
s++;
|
|
60
|
-
}
|
|
61
|
-
lookup[k] = s;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Record one decoded symbol; every 1024th observation folds the
|
|
67
|
-
* accumulators halfway into the cumulative table and resets them.
|
|
68
|
-
* @param {number} sym
|
|
69
|
-
*/
|
|
70
|
-
observe(sym) {
|
|
71
|
-
const acc = this.acc;
|
|
72
|
-
acc[sym] += this.inc;
|
|
73
|
-
this.tick = this.tick + 1 & 1023;
|
|
74
|
-
if (this.tick === 0) {
|
|
75
|
-
acc[sym] += this.lastInc;
|
|
76
|
-
const cum = this.cum;
|
|
77
|
-
const V = this.symbolCount;
|
|
78
|
-
let run = 0;
|
|
79
|
-
for (let i = 1; i <= V; i++) {
|
|
80
|
-
run += acc[i - 1];
|
|
81
|
-
cum[i] += run - cum[i] >> 1;
|
|
82
|
-
acc[i - 1] = 1;
|
|
83
|
-
}
|
|
84
|
-
this.rebuildLookup();
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Decompress a BitKnit2 stream (Granny .gr2 section format 4).
|
|
91
|
-
*
|
|
92
|
-
* The stream is a sequence of little-endian uint16 words beginning with the
|
|
93
|
-
* magic 0x75B1, producing output in 65,536-byte quanta that are either raw
|
|
94
|
-
* (word-aligned byte copies) or entropy-coded with two interleaved 32-bit
|
|
95
|
-
* range states driving adaptive literal/match commands.
|
|
96
|
-
*
|
|
97
|
-
* @param {Uint8Array} bytes Compressed stream bytes.
|
|
98
|
-
* @param {number} expandedSize Exact decompressed byte length.
|
|
99
|
-
* @returns {Uint8Array} Decompressed output of exactly expandedSize bytes.
|
|
100
|
-
* @throws {Error} On bad magic, word-stream underflow, a match reaching
|
|
101
|
-
* before output offset 0, or a coded quantum ending with neither entropy
|
|
102
|
-
* state equal to 0x10000.
|
|
103
|
-
*/
|
|
104
|
-
function decompressBitKnit2(bytes, expandedSize) {
|
|
105
|
-
const out = new Uint8Array(expandedSize);
|
|
106
|
-
if (expandedSize === 0) {
|
|
107
|
-
return out;
|
|
108
|
-
}
|
|
109
|
-
const wordCount = bytes.length >>> 1;
|
|
110
|
-
let wordIndex = 0;
|
|
111
|
-
function nextWord() {
|
|
112
|
-
if (wordIndex >= wordCount) {
|
|
113
|
-
throw new Error("BitKnit2: source underflow");
|
|
114
|
-
}
|
|
115
|
-
const p = wordIndex * 2;
|
|
116
|
-
wordIndex++;
|
|
117
|
-
return bytes[p] | bytes[p + 1] << 8;
|
|
118
|
-
}
|
|
119
|
-
if (nextWord() !== MAGIC) {
|
|
120
|
-
throw new Error("BitKnit2: bad magic word");
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Nine adaptive models, all created at stream start; they persist and
|
|
124
|
-
// keep adapting across quantum boundaries.
|
|
125
|
-
const commandModels = [new FrequencyModel(300, 36), new FrequencyModel(300, 36), new FrequencyModel(300, 36), new FrequencyModel(300, 36)];
|
|
126
|
-
const cacheRefModels = [new FrequencyModel(40, 0), new FrequencyModel(40, 0), new FrequencyModel(40, 0), new FrequencyModel(40, 0)];
|
|
127
|
-
const exponentModel = new FrequencyModel(21, 0);
|
|
128
|
-
|
|
129
|
-
// Recent-offset cache: eight entries plus a packed 4-bit-per-rank order
|
|
130
|
-
// word (nibble at bit 4r = slot holding rank r; rank 0 = most recent).
|
|
131
|
-
const recentOffsets = new Float64Array(8).fill(1);
|
|
132
|
-
let recentOrder = 0x76543210;
|
|
133
|
-
|
|
134
|
-
// Distance used by literal deltas; replaced by every match distance.
|
|
135
|
-
let deltaOffset = 1;
|
|
136
|
-
|
|
137
|
-
// Two interleaved entropy states; swapped after every operation.
|
|
138
|
-
let stateA = 0;
|
|
139
|
-
let stateB = 0;
|
|
140
|
-
function initEntropyStates() {
|
|
141
|
-
let merged = nextWord() * 0x10000 + nextWord();
|
|
142
|
-
const split = merged & 15;
|
|
143
|
-
merged = Math.floor(merged / 16);
|
|
144
|
-
if (merged < 0x10000) {
|
|
145
|
-
merged = merged * 0x10000 + nextWord();
|
|
146
|
-
}
|
|
147
|
-
stateA = split === 0 ? merged : Math.floor(merged / POW2[split]);
|
|
148
|
-
if (stateA < 0x10000) {
|
|
149
|
-
stateA = stateA * 0x10000 + nextWord();
|
|
150
|
-
}
|
|
151
|
-
const modulus = POW2[16 + split];
|
|
152
|
-
stateB = (merged % 0x10000 * 0x10000 + nextWord()) % modulus + modulus;
|
|
153
|
-
}
|
|
154
|
-
function popBits(n) {
|
|
155
|
-
const value = stateA % POW2[n];
|
|
156
|
-
stateA = Math.floor(stateA / POW2[n]);
|
|
157
|
-
if (stateA < 0x10000) {
|
|
158
|
-
stateA = stateA * 0x10000 + nextWord();
|
|
159
|
-
}
|
|
160
|
-
const t = stateA;
|
|
161
|
-
stateA = stateB;
|
|
162
|
-
stateB = t;
|
|
163
|
-
return value;
|
|
164
|
-
}
|
|
165
|
-
function popSymbol(model) {
|
|
166
|
-
const cum = model.cum;
|
|
167
|
-
const code = stateA & TOTAL - 1;
|
|
168
|
-
let sym = model.lookup[code >>> 5];
|
|
169
|
-
while (code >= cum[sym + 1]) {
|
|
170
|
-
sym++;
|
|
171
|
-
}
|
|
172
|
-
stateA = Math.floor(stateA / TOTAL) * (cum[sym + 1] - cum[sym]) + (code - cum[sym]);
|
|
173
|
-
if (stateA < 0x10000) {
|
|
174
|
-
stateA = stateA * 0x10000 + nextWord();
|
|
175
|
-
}
|
|
176
|
-
model.observe(sym);
|
|
177
|
-
const t = stateA;
|
|
178
|
-
stateA = stateB;
|
|
179
|
-
stateB = t;
|
|
180
|
-
return sym;
|
|
181
|
-
}
|
|
182
|
-
let offset = 0;
|
|
183
|
-
while (offset < expandedSize) {
|
|
184
|
-
const quantumEnd = Math.min(expandedSize, offset - offset % QUANTUM_BYTES + QUANTUM_BYTES);
|
|
185
|
-
if (wordIndex >= wordCount) {
|
|
186
|
-
throw new Error("BitKnit2: source underflow");
|
|
187
|
-
}
|
|
188
|
-
const peekPos = wordIndex * 2;
|
|
189
|
-
const peek = bytes[peekPos] | bytes[peekPos + 1] << 8;
|
|
190
|
-
if (peek === 0) {
|
|
191
|
-
// Raw quantum: consume the zero word, then copy bytes straight
|
|
192
|
-
// from the word stream in stream order.
|
|
193
|
-
wordIndex++;
|
|
194
|
-
const remainingWords = wordCount - wordIndex;
|
|
195
|
-
const quantumRemaining = quantumEnd - offset;
|
|
196
|
-
const length = Math.min(remainingWords * 2, quantumRemaining);
|
|
197
|
-
const start = wordIndex * 2;
|
|
198
|
-
out.set(bytes.subarray(start, start + length), offset);
|
|
199
|
-
offset += length;
|
|
200
|
-
// When length is odd, the final word's high byte is NOT consumed
|
|
201
|
-
// and the next quantum begins at that same word.
|
|
202
|
-
wordIndex += length >> 1;
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Coded quantum.
|
|
207
|
-
initEntropyStates();
|
|
208
|
-
if (offset === 0) {
|
|
209
|
-
out[0] = popBits(8);
|
|
210
|
-
offset = 1;
|
|
211
|
-
}
|
|
212
|
-
while (offset < quantumEnd) {
|
|
213
|
-
const phase = offset & 3;
|
|
214
|
-
const command = popSymbol(commandModels[phase]);
|
|
215
|
-
if (command < 256) {
|
|
216
|
-
// Literal: byte delta against the byte one last-match-distance
|
|
217
|
-
// behind.
|
|
218
|
-
out[offset] = command + out[offset - deltaOffset] & 0xFF;
|
|
219
|
-
offset++;
|
|
220
|
-
continue;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Match length.
|
|
224
|
-
let copyLength;
|
|
225
|
-
if (command < 288) {
|
|
226
|
-
copyLength = command - 254;
|
|
227
|
-
} else {
|
|
228
|
-
const n = command - 287;
|
|
229
|
-
copyLength = POW2[n] + popBits(n) + 32;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Match distance.
|
|
233
|
-
const ref = popSymbol(cacheRefModels[phase]);
|
|
234
|
-
let copyOffset;
|
|
235
|
-
if (ref < 8) {
|
|
236
|
-
// Recent-offset cache hit at rank `ref`, then promote to
|
|
237
|
-
// rank 0 (ranks 0..ref-1 shift up one nibble).
|
|
238
|
-
const shift = 4 * ref;
|
|
239
|
-
const slot = recentOrder >>> shift & 15;
|
|
240
|
-
copyOffset = recentOffsets[slot];
|
|
241
|
-
if (ref === 7) {
|
|
242
|
-
recentOrder = (recentOrder << 4 | slot) >>> 0;
|
|
243
|
-
} else if (ref > 0) {
|
|
244
|
-
const mask = (16 << shift) - 1;
|
|
245
|
-
recentOrder = (recentOrder & ~mask | (recentOrder << 4 | slot) & mask) >>> 0;
|
|
246
|
-
}
|
|
247
|
-
} else {
|
|
248
|
-
// Explicit distance: exponent symbol, extra mantissa bits,
|
|
249
|
-
// optionally one raw word appended as the LOW 16 bits.
|
|
250
|
-
const n = popSymbol(exponentModel);
|
|
251
|
-
let extra = popBits(n & 15);
|
|
252
|
-
if (n >= 16) {
|
|
253
|
-
extra = extra * 0x10000 + nextWord();
|
|
254
|
-
}
|
|
255
|
-
copyOffset = 32 * POW2[n] + extra * 32 + ref - 39;
|
|
256
|
-
// Insert: rank-7 slot takes the rank-6 slot's value, then the
|
|
257
|
-
// rank-6 slot takes the new distance; order is unchanged.
|
|
258
|
-
const slot7 = recentOrder >>> 28 & 15;
|
|
259
|
-
const slot6 = recentOrder >>> 24 & 15;
|
|
260
|
-
recentOffsets[slot7] = recentOffsets[slot6];
|
|
261
|
-
recentOffsets[slot6] = copyOffset;
|
|
262
|
-
}
|
|
263
|
-
deltaOffset = copyOffset;
|
|
264
|
-
const src = offset - copyOffset;
|
|
265
|
-
if (src < 0) {
|
|
266
|
-
throw new Error("BitKnit2: match source before output start");
|
|
267
|
-
}
|
|
268
|
-
// Byte-by-byte ascending copy; self-overlap replicates.
|
|
269
|
-
for (let i = 0; i < copyLength; i++) {
|
|
270
|
-
out[offset + i] = out[src + i];
|
|
271
|
-
}
|
|
272
|
-
offset += copyLength;
|
|
273
|
-
}
|
|
274
|
-
if (stateA !== 0x10000 && stateB !== 0x10000) {
|
|
275
|
-
throw new Error("BitKnit2: corrupt quantum end state");
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
return out;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
export { decompressBitKnit2 };
|
|
282
|
-
//# sourceMappingURL=bitknit2.js.map
|
|
1
|
+
// Clean-room BitKnit2 (Granny .gr2 section format 4) decompressor.
|
|
2
|
+
//
|
|
3
|
+
// Original CarbonEngineJS implementation written solely from the published
|
|
4
|
+
// format specification (docs/formats/bitknit2.md) by an isolated agent with
|
|
5
|
+
// no access to any other BitKnit implementation, then validated byte-exact
|
|
6
|
+
// against 539 real EVE .gr2 BitKnit2 streams (sections and pointer-fixup
|
|
7
|
+
// blocks) plus synthetic raw-quantum streams. Replaced the prior EUPL-derived
|
|
8
|
+
// port on 2026-07-24; see THIRD-PARTY-NOTICES.md.
|
|
9
|
+
|
|
10
|
+
const TOTAL = 0x8000;
|
|
11
|
+
const QUANTUM_BYTES = 0x10000;
|
|
12
|
+
const MAGIC = 0x75B1;
|
|
13
|
+
|
|
14
|
+
// Powers of two as exact doubles, indexed 0..32. All entropy-state values are
|
|
15
|
+
// unsigned 32-bit; floor division by these avoids signed-shift pitfalls.
|
|
16
|
+
const POW2 = new Float64Array(33);
|
|
17
|
+
for (let i = 0; i <= 32; i++) {
|
|
18
|
+
POW2[i] = Math.pow(2, i);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* One adaptive frequency model with 15-bit precision (TOTAL = 0x8000).
|
|
23
|
+
* Holds a cumulative table cum[0..V] (cum[V] = TOTAL), per-symbol
|
|
24
|
+
* accumulators, and a 1024-entry lookup table for fast symbol search.
|
|
25
|
+
*/
|
|
26
|
+
class FrequencyModel {
|
|
27
|
+
/**
|
|
28
|
+
* @param {number} symbolCount Total symbols V.
|
|
29
|
+
* @param {number} minProbCount Trailing minimum-probability symbols M.
|
|
30
|
+
*/
|
|
31
|
+
constructor(symbolCount, minProbCount) {
|
|
32
|
+
const V = symbolCount;
|
|
33
|
+
const E = V - minProbCount;
|
|
34
|
+
const cum = new Uint16Array(V + 1);
|
|
35
|
+
for (let i = 0; i < E; i++) {
|
|
36
|
+
cum[i] = Math.floor((TOTAL - minProbCount) * i / E);
|
|
37
|
+
}
|
|
38
|
+
for (let i = E; i <= V; i++) {
|
|
39
|
+
cum[i] = TOTAL - V + i;
|
|
40
|
+
}
|
|
41
|
+
this.symbolCount = V;
|
|
42
|
+
this.cum = cum;
|
|
43
|
+
this.acc = new Uint16Array(V).fill(1);
|
|
44
|
+
this.tick = 0;
|
|
45
|
+
this.inc = Math.floor((TOTAL - V) / 1024);
|
|
46
|
+
this.lastInc = 1 + TOTAL - V - this.inc * 1024;
|
|
47
|
+
this.lookup = new Uint16Array(1024);
|
|
48
|
+
this.rebuildLookup();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Rebuilds lookup used by the current GR2 format reader. */
|
|
52
|
+
rebuildLookup() {
|
|
53
|
+
const cum = this.cum;
|
|
54
|
+
const lookup = this.lookup;
|
|
55
|
+
let s = 0;
|
|
56
|
+
for (let k = 0; k < 1024; k++) {
|
|
57
|
+
const threshold = k * 32;
|
|
58
|
+
while (threshold >= cum[s + 1]) {
|
|
59
|
+
s++;
|
|
60
|
+
}
|
|
61
|
+
lookup[k] = s;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Record one decoded symbol; every 1024th observation folds the
|
|
67
|
+
* accumulators halfway into the cumulative table and resets them.
|
|
68
|
+
* @param {number} sym
|
|
69
|
+
*/
|
|
70
|
+
observe(sym) {
|
|
71
|
+
const acc = this.acc;
|
|
72
|
+
acc[sym] += this.inc;
|
|
73
|
+
this.tick = this.tick + 1 & 1023;
|
|
74
|
+
if (this.tick === 0) {
|
|
75
|
+
acc[sym] += this.lastInc;
|
|
76
|
+
const cum = this.cum;
|
|
77
|
+
const V = this.symbolCount;
|
|
78
|
+
let run = 0;
|
|
79
|
+
for (let i = 1; i <= V; i++) {
|
|
80
|
+
run += acc[i - 1];
|
|
81
|
+
cum[i] += run - cum[i] >> 1;
|
|
82
|
+
acc[i - 1] = 1;
|
|
83
|
+
}
|
|
84
|
+
this.rebuildLookup();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Decompress a BitKnit2 stream (Granny .gr2 section format 4).
|
|
91
|
+
*
|
|
92
|
+
* The stream is a sequence of little-endian uint16 words beginning with the
|
|
93
|
+
* magic 0x75B1, producing output in 65,536-byte quanta that are either raw
|
|
94
|
+
* (word-aligned byte copies) or entropy-coded with two interleaved 32-bit
|
|
95
|
+
* range states driving adaptive literal/match commands.
|
|
96
|
+
*
|
|
97
|
+
* @param {Uint8Array} bytes Compressed stream bytes.
|
|
98
|
+
* @param {number} expandedSize Exact decompressed byte length.
|
|
99
|
+
* @returns {Uint8Array} Decompressed output of exactly expandedSize bytes.
|
|
100
|
+
* @throws {Error} On bad magic, word-stream underflow, a match reaching
|
|
101
|
+
* before output offset 0, or a coded quantum ending with neither entropy
|
|
102
|
+
* state equal to 0x10000.
|
|
103
|
+
*/
|
|
104
|
+
function decompressBitKnit2(bytes, expandedSize) {
|
|
105
|
+
const out = new Uint8Array(expandedSize);
|
|
106
|
+
if (expandedSize === 0) {
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
const wordCount = bytes.length >>> 1;
|
|
110
|
+
let wordIndex = 0;
|
|
111
|
+
function nextWord() {
|
|
112
|
+
if (wordIndex >= wordCount) {
|
|
113
|
+
throw new Error("BitKnit2: source underflow");
|
|
114
|
+
}
|
|
115
|
+
const p = wordIndex * 2;
|
|
116
|
+
wordIndex++;
|
|
117
|
+
return bytes[p] | bytes[p + 1] << 8;
|
|
118
|
+
}
|
|
119
|
+
if (nextWord() !== MAGIC) {
|
|
120
|
+
throw new Error("BitKnit2: bad magic word");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Nine adaptive models, all created at stream start; they persist and
|
|
124
|
+
// keep adapting across quantum boundaries.
|
|
125
|
+
const commandModels = [new FrequencyModel(300, 36), new FrequencyModel(300, 36), new FrequencyModel(300, 36), new FrequencyModel(300, 36)];
|
|
126
|
+
const cacheRefModels = [new FrequencyModel(40, 0), new FrequencyModel(40, 0), new FrequencyModel(40, 0), new FrequencyModel(40, 0)];
|
|
127
|
+
const exponentModel = new FrequencyModel(21, 0);
|
|
128
|
+
|
|
129
|
+
// Recent-offset cache: eight entries plus a packed 4-bit-per-rank order
|
|
130
|
+
// word (nibble at bit 4r = slot holding rank r; rank 0 = most recent).
|
|
131
|
+
const recentOffsets = new Float64Array(8).fill(1);
|
|
132
|
+
let recentOrder = 0x76543210;
|
|
133
|
+
|
|
134
|
+
// Distance used by literal deltas; replaced by every match distance.
|
|
135
|
+
let deltaOffset = 1;
|
|
136
|
+
|
|
137
|
+
// Two interleaved entropy states; swapped after every operation.
|
|
138
|
+
let stateA = 0;
|
|
139
|
+
let stateB = 0;
|
|
140
|
+
function initEntropyStates() {
|
|
141
|
+
let merged = nextWord() * 0x10000 + nextWord();
|
|
142
|
+
const split = merged & 15;
|
|
143
|
+
merged = Math.floor(merged / 16);
|
|
144
|
+
if (merged < 0x10000) {
|
|
145
|
+
merged = merged * 0x10000 + nextWord();
|
|
146
|
+
}
|
|
147
|
+
stateA = split === 0 ? merged : Math.floor(merged / POW2[split]);
|
|
148
|
+
if (stateA < 0x10000) {
|
|
149
|
+
stateA = stateA * 0x10000 + nextWord();
|
|
150
|
+
}
|
|
151
|
+
const modulus = POW2[16 + split];
|
|
152
|
+
stateB = (merged % 0x10000 * 0x10000 + nextWord()) % modulus + modulus;
|
|
153
|
+
}
|
|
154
|
+
function popBits(n) {
|
|
155
|
+
const value = stateA % POW2[n];
|
|
156
|
+
stateA = Math.floor(stateA / POW2[n]);
|
|
157
|
+
if (stateA < 0x10000) {
|
|
158
|
+
stateA = stateA * 0x10000 + nextWord();
|
|
159
|
+
}
|
|
160
|
+
const t = stateA;
|
|
161
|
+
stateA = stateB;
|
|
162
|
+
stateB = t;
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
function popSymbol(model) {
|
|
166
|
+
const cum = model.cum;
|
|
167
|
+
const code = stateA & TOTAL - 1;
|
|
168
|
+
let sym = model.lookup[code >>> 5];
|
|
169
|
+
while (code >= cum[sym + 1]) {
|
|
170
|
+
sym++;
|
|
171
|
+
}
|
|
172
|
+
stateA = Math.floor(stateA / TOTAL) * (cum[sym + 1] - cum[sym]) + (code - cum[sym]);
|
|
173
|
+
if (stateA < 0x10000) {
|
|
174
|
+
stateA = stateA * 0x10000 + nextWord();
|
|
175
|
+
}
|
|
176
|
+
model.observe(sym);
|
|
177
|
+
const t = stateA;
|
|
178
|
+
stateA = stateB;
|
|
179
|
+
stateB = t;
|
|
180
|
+
return sym;
|
|
181
|
+
}
|
|
182
|
+
let offset = 0;
|
|
183
|
+
while (offset < expandedSize) {
|
|
184
|
+
const quantumEnd = Math.min(expandedSize, offset - offset % QUANTUM_BYTES + QUANTUM_BYTES);
|
|
185
|
+
if (wordIndex >= wordCount) {
|
|
186
|
+
throw new Error("BitKnit2: source underflow");
|
|
187
|
+
}
|
|
188
|
+
const peekPos = wordIndex * 2;
|
|
189
|
+
const peek = bytes[peekPos] | bytes[peekPos + 1] << 8;
|
|
190
|
+
if (peek === 0) {
|
|
191
|
+
// Raw quantum: consume the zero word, then copy bytes straight
|
|
192
|
+
// from the word stream in stream order.
|
|
193
|
+
wordIndex++;
|
|
194
|
+
const remainingWords = wordCount - wordIndex;
|
|
195
|
+
const quantumRemaining = quantumEnd - offset;
|
|
196
|
+
const length = Math.min(remainingWords * 2, quantumRemaining);
|
|
197
|
+
const start = wordIndex * 2;
|
|
198
|
+
out.set(bytes.subarray(start, start + length), offset);
|
|
199
|
+
offset += length;
|
|
200
|
+
// When length is odd, the final word's high byte is NOT consumed
|
|
201
|
+
// and the next quantum begins at that same word.
|
|
202
|
+
wordIndex += length >> 1;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Coded quantum.
|
|
207
|
+
initEntropyStates();
|
|
208
|
+
if (offset === 0) {
|
|
209
|
+
out[0] = popBits(8);
|
|
210
|
+
offset = 1;
|
|
211
|
+
}
|
|
212
|
+
while (offset < quantumEnd) {
|
|
213
|
+
const phase = offset & 3;
|
|
214
|
+
const command = popSymbol(commandModels[phase]);
|
|
215
|
+
if (command < 256) {
|
|
216
|
+
// Literal: byte delta against the byte one last-match-distance
|
|
217
|
+
// behind.
|
|
218
|
+
out[offset] = command + out[offset - deltaOffset] & 0xFF;
|
|
219
|
+
offset++;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Match length.
|
|
224
|
+
let copyLength;
|
|
225
|
+
if (command < 288) {
|
|
226
|
+
copyLength = command - 254;
|
|
227
|
+
} else {
|
|
228
|
+
const n = command - 287;
|
|
229
|
+
copyLength = POW2[n] + popBits(n) + 32;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Match distance.
|
|
233
|
+
const ref = popSymbol(cacheRefModels[phase]);
|
|
234
|
+
let copyOffset;
|
|
235
|
+
if (ref < 8) {
|
|
236
|
+
// Recent-offset cache hit at rank `ref`, then promote to
|
|
237
|
+
// rank 0 (ranks 0..ref-1 shift up one nibble).
|
|
238
|
+
const shift = 4 * ref;
|
|
239
|
+
const slot = recentOrder >>> shift & 15;
|
|
240
|
+
copyOffset = recentOffsets[slot];
|
|
241
|
+
if (ref === 7) {
|
|
242
|
+
recentOrder = (recentOrder << 4 | slot) >>> 0;
|
|
243
|
+
} else if (ref > 0) {
|
|
244
|
+
const mask = (16 << shift) - 1;
|
|
245
|
+
recentOrder = (recentOrder & ~mask | (recentOrder << 4 | slot) & mask) >>> 0;
|
|
246
|
+
}
|
|
247
|
+
} else {
|
|
248
|
+
// Explicit distance: exponent symbol, extra mantissa bits,
|
|
249
|
+
// optionally one raw word appended as the LOW 16 bits.
|
|
250
|
+
const n = popSymbol(exponentModel);
|
|
251
|
+
let extra = popBits(n & 15);
|
|
252
|
+
if (n >= 16) {
|
|
253
|
+
extra = extra * 0x10000 + nextWord();
|
|
254
|
+
}
|
|
255
|
+
copyOffset = 32 * POW2[n] + extra * 32 + ref - 39;
|
|
256
|
+
// Insert: rank-7 slot takes the rank-6 slot's value, then the
|
|
257
|
+
// rank-6 slot takes the new distance; order is unchanged.
|
|
258
|
+
const slot7 = recentOrder >>> 28 & 15;
|
|
259
|
+
const slot6 = recentOrder >>> 24 & 15;
|
|
260
|
+
recentOffsets[slot7] = recentOffsets[slot6];
|
|
261
|
+
recentOffsets[slot6] = copyOffset;
|
|
262
|
+
}
|
|
263
|
+
deltaOffset = copyOffset;
|
|
264
|
+
const src = offset - copyOffset;
|
|
265
|
+
if (src < 0) {
|
|
266
|
+
throw new Error("BitKnit2: match source before output start");
|
|
267
|
+
}
|
|
268
|
+
// Byte-by-byte ascending copy; self-overlap replicates.
|
|
269
|
+
for (let i = 0; i < copyLength; i++) {
|
|
270
|
+
out[offset + i] = out[src + i];
|
|
271
|
+
}
|
|
272
|
+
offset += copyLength;
|
|
273
|
+
}
|
|
274
|
+
if (stateA !== 0x10000 && stateB !== 0x10000) {
|
|
275
|
+
throw new Error("BitKnit2: corrupt quantum end state");
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return out;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export { decompressBitKnit2 };
|
|
282
|
+
//# sourceMappingURL=bitknit2.js.map
|