@carbonenginejs/runtime-resource 0.11.1 → 0.12.1
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/dist/CjsResMan.js +4 -4
- package/dist/CjsResMan.js.map +1 -1
- package/dist/_virtual/_rollupPluginBabelHelpers.js +1 -4
- package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
- package/dist/format/CjsByteReader.js +310 -0
- package/dist/format/CjsByteReader.js.map +1 -0
- package/dist/format/CjsByteWriter.js +242 -0
- package/dist/format/CjsByteWriter.js.map +1 -0
- package/dist/format/CjsFormatError.js +41 -0
- package/dist/format/CjsFormatError.js.map +1 -0
- package/dist/format/CjsStringTable.js +268 -0
- package/dist/format/CjsStringTable.js.map +1 -0
- package/dist/format/carbonEffect/CjsCarbonEffectReader.js +361 -0
- package/dist/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -0
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -0
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js.map +1 -0
- package/dist/format/carbonEffect/carbonDescriptionFromPortable.js +372 -0
- package/dist/format/carbonEffect/carbonDescriptionFromPortable.js.map +1 -0
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +427 -0
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -0
- package/dist/format/carbonEffect/carbonEffectRecords.js +955 -0
- package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -0
- package/dist/format/compareUtf8.js +36 -0
- package/dist/format/compareUtf8.js.map +1 -0
- package/dist/format/index.js +11 -0
- package/dist/format/index.js.map +1 -0
- package/dist/formats/bnk/CjsBnkFormat.js +18 -2
- package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
- package/dist/formats/bnk/core/eventAction.js +305 -0
- package/dist/formats/bnk/core/eventAction.js.map +1 -0
- package/dist/formats/bnk/core/graph.js +3 -6
- package/dist/formats/bnk/core/graph.js.map +1 -1
- package/dist/formats/bnk/core/helpers.js +62 -11
- package/dist/formats/bnk/core/helpers.js.map +1 -1
- package/dist/formats/bnk/core/nodeBase.js +532 -0
- package/dist/formats/bnk/core/nodeBase.js.map +1 -0
- package/dist/formats/bnk/core/sfxNodes.js +632 -0
- package/dist/formats/bnk/core/sfxNodes.js.map +1 -0
- package/dist/formats/bnk/core/soundbanksInfo.js +59 -51
- package/dist/formats/bnk/core/soundbanksInfo.js.map +1 -1
- package/dist/formats/gr2/CjsGr2Format.js +256 -13
- package/dist/formats/gr2/CjsGr2Format.js.map +1 -1
- package/dist/formats/gr2/core/helpers.js +15 -15
- package/dist/formats/gr2/core/helpers.js.map +1 -1
- package/dist/formats/gr2/core/json.js +1 -1
- package/dist/formats/gr2/core/json.js.map +1 -1
- package/dist/formats/gr2/core/targets.js +1 -1
- package/dist/formats/gr2/core/targets.js.map +1 -1
- package/dist/formats/gr2/index.js +0 -1
- package/dist/formats/gr2/index.js.map +1 -1
- package/dist/formats/hlsl/core/HlslReader.js +7 -257
- package/dist/formats/hlsl/core/HlslReader.js.map +1 -1
- package/dist/formats/hlsl/core/analysis.js +1 -1
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +781 -0
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +21 -1
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -1
- package/dist/formats/hlsl/index.js +1 -0
- package/dist/formats/hlsl/index.js.map +1 -1
- package/dist/formats/index.js +3 -6
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/webgl/core/cewg/CewgPackage.js +2 -1
- package/dist/formats/webgl/core/cewg/CewgPackage.js.map +1 -1
- package/dist/formats/webgl/core/cewg/binary.js +11 -93
- package/dist/formats/webgl/core/cewg/binary.js.map +1 -1
- package/dist/formats/webgl/core/effectPackage.js +4 -1
- package/dist/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/formats/webgl/core/errors.js +3 -3
- package/dist/formats/webgl/core/errors.js.map +1 -1
- package/dist/formats/webgpu/CjsWebgpuFormat.js +4 -23
- package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +197 -0
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -0
- package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js +368 -0
- package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js.map +1 -0
- package/dist/formats/webgpu/core/cewgpu/containerViews.js +355 -0
- package/dist/formats/webgpu/core/cewgpu/containerViews.js.map +1 -0
- package/dist/formats/webgpu/core/cewgpu/validateContainer.js +90 -0
- package/dist/formats/webgpu/core/cewgpu/validateContainer.js.map +1 -0
- package/dist/formats/webgpu/core/effectBackendBodySet.js +21 -20
- package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
- package/dist/formats/webgpu/core/helpers.js +87 -92
- package/dist/formats/webgpu/core/helpers.js.map +1 -1
- package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +14 -13
- package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js.map +1 -1
- package/dist/formats/webgpu/core/ir/inferValueTypes.js +10 -8
- package/dist/formats/webgpu/core/ir/inferValueTypes.js.map +1 -1
- package/dist/formats/webgpu/core/packageEffect.js +94 -9
- package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
- package/dist/formats/webgpu/core/packageMetadata.js +10 -1
- package/dist/formats/webgpu/core/packageMetadata.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +17 -15
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +13 -12
- package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +9 -8
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +23 -22
- package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/selectionPlans.js +46 -44
- package/dist/formats/webgpu/core/wgsl/selectionPlans.js.map +1 -1
- package/dist/resource/CjsResource.js +700 -684
- package/dist/resource/CjsResource.js.map +1 -1
- package/dist/resource/Tr2LightProfileRes.js +18 -27
- package/dist/resource/Tr2LightProfileRes.js.map +1 -1
- package/dist/resource/audio/CjsAudioBufferRes.js +2 -2
- package/dist/resource/audio/CjsAudioBufferRes.js.map +1 -1
- package/dist/resource/audio/CjsAudioRes.js +2 -2
- package/dist/resource/audio/CjsAudioRes.js.map +1 -1
- package/dist/resource/geometry/TriGeometryRes.js +605 -586
- package/dist/resource/geometry/TriGeometryRes.js.map +1 -1
- package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +21 -30
- package/dist/resource/geometry/granny/Tr2GrannyStateRes.js.map +1 -1
- package/dist/resource/geometry/granny/TriGrannyRes.js +21 -30
- package/dist/resource/geometry/granny/TriGrannyRes.js.map +1 -1
- package/dist/resource/shader/Tr2EffectRes.js +9 -7
- package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
- package/dist/resource/shader/Tr2MaterialArea.js +5 -3
- package/dist/resource/shader/Tr2MaterialArea.js.map +1 -1
- package/dist/resource/shader/Tr2MaterialMesh.js +4 -2
- package/dist/resource/shader/Tr2MaterialMesh.js.map +1 -1
- package/dist/resource/shader/Tr2MaterialRes.js +5 -3
- package/dist/resource/shader/Tr2MaterialRes.js.map +1 -1
- package/dist/resource/shader/Tr2Shader.js +26 -21
- package/dist/resource/shader/Tr2Shader.js.map +1 -1
- package/dist/resource/shader/Tr2ShaderPermutation.js +8 -6
- package/dist/resource/shader/Tr2ShaderPermutation.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectDefine.js +5 -3
- package/dist/resource/shader/reflection/Tr2EffectDefine.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectDescription.js +5 -3
- package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js +17 -15
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +11 -9
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectResource.js +8 -6
- package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +15 -13
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js +7 -5
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2Pass.js +11 -9
- package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js +8 -6
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
- package/dist/resource/texture/CjsTextureArrayRes.js +400 -411
- package/dist/resource/texture/CjsTextureArrayRes.js.map +1 -1
- package/dist/resource/texture/Tr2ImageRes.js +99 -95
- package/dist/resource/texture/Tr2ImageRes.js.map +1 -1
- package/dist/resource/texture/TriTextureRes.js +312 -273
- package/dist/resource/texture/TriTextureRes.js.map +1 -1
- package/docs/README.md +13 -1
- package/docs/architecture.md +3 -3
- package/docs/concepts/resource-lifecycle.md +9 -2
- package/docs/concepts/shader-resource-model.md +114 -0
- package/docs/concepts/writing-an-engine-adapter.md +115 -0
- package/docs/formats/README.md +24 -1
- package/docs/formats/carbon-effect-container.md +452 -0
- package/docs/formats/dxbc/README.md +68 -0
- package/docs/formats/dxbc/architecture.md +80 -0
- package/docs/formats/dxbc/reference/api.md +77 -0
- package/docs/formats/dxbc/reference/classes/README.md +9 -0
- package/docs/formats/dxbc/reference/decoded-output.md +122 -0
- package/docs/formats/gr2.md +3 -4
- package/docs/formats/hlsl/README.md +54 -0
- package/docs/formats/hlsl/architecture.md +67 -0
- package/docs/formats/hlsl/guides/hydrating-json-output.md +62 -0
- package/docs/formats/hlsl/guides/reading-effects.md +64 -0
- package/docs/formats/hlsl/reference/advanced-analysis.md +66 -0
- package/docs/formats/hlsl/reference/api.md +98 -0
- package/docs/formats/hlsl/reference/classes/README.md +11 -0
- package/docs/formats/hlsl/reference/json-graph.md +100 -0
- package/docs/formats/hlsl/reference/portable-reflection.md +141 -0
- package/docs/formats/provenance.md +32 -17
- package/docs/formats/webgl/README.md +57 -0
- package/docs/formats/webgl/architecture.md +70 -0
- package/docs/formats/webgl/carbon-constant-layouts.md +326 -0
- package/docs/formats/webgl/decl-io.md +1234 -0
- package/docs/formats/webgl/effect-reflection.md +127 -0
- package/docs/formats/webgl/memory-structured.md +871 -0
- package/docs/formats/webgl/reference/classes/README.md +9 -0
- package/docs/formats/webgl/texture-sample.md +964 -0
- package/docs/formats/webgpu/README.md +84 -0
- package/docs/formats/webgpu/architecture.md +96 -0
- package/docs/formats/webgpu/formats/cewgpu.md +216 -0
- package/docs/formats/webgpu/guides/effect-packaging.md +191 -0
- package/docs/formats/webgpu/reference/api.md +197 -0
- package/docs/formats/webgpu/reference/classes/README.md +9 -0
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +1543 -0
- package/docs/formats/wwise.md +45 -4
- package/docs/reference/classes/core.md +80 -0
- package/docs/reference/classes/formats.md +24 -34
- package/docs/reference/events.md +25 -0
- package/docs/reference/motherlode-cache.md +22 -8
- package/docs/reference/workers.md +5 -5
- package/docs/roadmap.md +61 -41
- package/format-notices/bnk/NOTICE +5 -4
- package/format-notices/webgl/NOTICE +1 -1
- package/package.json +2 -1
- package/dist/formats/gr2/core/CjsFormatGr2.js +0 -273
- package/dist/formats/gr2/core/CjsFormatGr2.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js +0 -415
- package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js +0 -100
- package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/binary.js +0 -93
- package/dist/formats/webgpu/core/cewgpu/binary.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/tags.js +0 -17
- package/dist/formats/webgpu/core/cewgpu/tags.js.map +0 -1
- package/dist/formats/webgpu/core/effectPackageValidation.js +0 -1078
- package/dist/formats/webgpu/core/effectPackageValidation.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carbonEffectRecords.js","sources":["../../../../src/format/carbonEffect/carbonEffectRecords.js"],"sourcesContent":["// Source: trinity/shadercompiler/EffectData.h (Save methods)\n// Source: trinity/trinity/Shader/Tr2EffectDescription.cpp (Read)\n\nimport { CjsFormatWriteError } from \"../CjsFormatError.js\";\nimport { compareUtf8 } from \"../compareUtf8.js\";\n\n/**\n * The only description-blob version this module reads or writes.\n *\n * `DATA_VERSION` in `EffectData.h:10`. Carbon's reader accepts 2..15\n * (`Tr2EffectRes.cpp:209`) but annotates the v13/v14 field-order boundaries as\n * unverified — `// CHECK IS IT IN RIGHT FUNCTION?` at\n * `Tr2EffectDescription.cpp:177`, `// CHECK` at `:257` and `:578`. The v15\n * layout is the one with an authoritative writer to check against, it is the\n * only version the shipped corpus contains, and it is byte-identical to v14 in\n * the body — v15 differs from v14 only by the 36 outer header bytes.\n */\nexport const CARBON_EFFECT_DATA_VERSION = 15;\n\n/**\n * Annotation type codes (`EffectData.h:35-41`). Only `STRING` changes the wire\n * shape of the value that follows.\n */\nexport const CARBON_ANNOTATION_TYPE = Object.freeze({\n BOOL: 0,\n INT: 1,\n FLOAT: 2,\n STRING: 3\n});\n\n/**\n * Carbon's inclusive count limits, from the `SanityCheck` call sites in\n * `Tr2EffectDescription.cpp:28-36`. `SanityCheck` throws only when\n * `value > limit`, so each number is the largest accepted count.\n *\n * The absent entries are absent in Carbon too: `techniques`, `registers`,\n * `staticSamplers`, `constants`, `libraries`, `exports` and the per-annotation\n * counts are read with no limit at all, guarded only by the end-of-buffer\n * check. We do not invent caps Carbon does not have.\n */\nexport const CARBON_EFFECT_COUNT_CAPS = Object.freeze({\n pipelineInputs: 64,\n passes: 64,\n stages: 6,\n textures: 64,\n samplers: 64,\n uavs: 64,\n renderStates: 64,\n effectAnnotations: 256\n});\n\n/**\n * `SHADER_CONSTANTS_MAX` (`Tr2EffectDescription.h:160`) — Carbon clamps a\n * stage's default-constant-value copy to this without rejecting the file, while\n * still advancing the cursor by the untruncated size.\n */\nexport const CARBON_SHADER_CONSTANTS_MAX = 4096;\n\n/**\n * Compares two annotation names the way Carbon sorts annotation keys before\n * writing them (`strcmp`, `EffectData.h:613-616` and `:839-842`).\n *\n * `strcmp` orders by unsigned byte, which for names outside ASCII is not the\n * same as JavaScript's UTF-16 code-unit order — hence the explicit UTF-8\n * comparison.\n *\n * @param {string} a First name.\n * @param {string} b Second name.\n * @returns {number} Negative, zero, or positive ordering result.\n */\nexport function compareAnnotationNames(a, b)\n{\n return compareUtf8(a, b);\n}\n\n/**\n * Resolver that writes each arena reference back at the offset it was read\n * from, reusing the source arena verbatim.\n *\n * This is what proves field order independently of arena policy: a re-emit\n * through this resolver must reproduce the original description bytes exactly,\n * whatever the arena happens to contain.\n */\nexport const passthroughArena = Object.freeze({\n /**\n * Returns a parsed string reference's original offset.\n *\n * @param {{offset:number}} reference Parsed string reference.\n * @returns {number} Original arena offset.\n */\n string(reference)\n {\n return reference.offset;\n },\n\n /**\n * Returns a parsed blob reference's original offset.\n *\n * @param {{offset:number}} reference Parsed blob reference.\n * @returns {number} Original arena offset.\n */\n blob(reference)\n {\n return reference.offset;\n }\n});\n\n/**\n * Creates a resolver that re-interns every reference into a fresh string table,\n * so the emitted arena is rebuilt under Carbon's sorted-offset policy.\n *\n * @param {import(\"../CjsStringTable.js\").CjsStringTable} table Target arena.\n * @returns {{string:Function, blob:Function}} Arena resolver.\n */\nexport function internArena(table)\n{\n return {\n /**\n * Interns a string reference's text and returns its offset.\n *\n * @param {{value:string}} reference Parsed string reference.\n * @returns {number} Arena offset.\n */\n string(reference)\n {\n return table.offsetOf(table.addString(reference.value));\n },\n\n /**\n * Interns a blob reference's bytes and returns its offset. A zero-size\n * blob keeps its original reference — Carbon leaves the offset word\n * unset in that case, and the reader never dereferences it.\n *\n * @param {{size:number, offset:number, bytes:Uint8Array}} reference Parsed blob reference.\n * @returns {number} Arena offset.\n */\n blob(reference)\n {\n if (reference.size === 0) return reference.offset;\n return table.offsetOf(table.addBytes(reference.bytes));\n }\n };\n}\n\n/**\n * Creates a resolver that only interns, emitting a placeholder offset.\n *\n * Carbon resolves an arena offset while packing a body\n * (`PackedStream::Save(StringReference)`, `EffectData.h:187-193`), by which\n * point every string must already be in the table — a late `AddString` marks\n * the table dirty and the next `GetOffset` re-sorts it, silently invalidating\n * every offset already baked into a packed body. Carbon dodges this by\n * interning all late strings up front (`ShaderCompiler.cpp:686-694`, before the\n * packing loop at `:697-714`).\n *\n * Running the write walk twice — once collecting, once emitting — reproduces\n * that discipline without depending on a caller remembering it, and because\n * both passes traverse the same code they cannot drift apart.\n *\n * @param {import(\"../CjsStringTable.js\").CjsStringTable} table Target arena.\n * @returns {{string:Function, blob:Function}} Collect-only resolver.\n */\nexport function collectArena(table)\n{\n return {\n /**\n * Interns a string reference's text.\n *\n * @param {{value:string}} reference Parsed string reference.\n * @returns {number} Placeholder offset.\n */\n string(reference)\n {\n table.addString(reference.value);\n return 0;\n },\n\n /**\n * Interns a blob reference's bytes, skipping zero-size blobs.\n *\n * @param {{size:number, bytes:Uint8Array}} reference Parsed blob reference.\n * @returns {number} Placeholder offset.\n */\n blob(reference)\n {\n if (reference.size !== 0) table.addBytes(reference.bytes);\n return 0;\n }\n };\n}\n\n/**\n * Reads a bare `u32` arena offset and the NUL-terminated string behind it.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @returns {{offset:number, value:string}} String reference.\n */\nfunction readStringRef(reader)\n{\n const offset = reader.readUint32();\n return { offset, value: reader.readStringAt(offset) };\n}\n\n/**\n * Reads a `{u32 size, u32 offset}` blob reference.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @returns {{size:number, offset:number, bytes:Uint8Array}} Blob reference.\n */\nfunction readBlobRef(reader)\n{\n const size = reader.readUint32();\n const blob = reader.readTableBlobOptional(size);\n return { size, offset: blob.offset, bytes: blob.bytes };\n}\n\n/**\n * Writes a `{u32 size, u32 offset}` blob reference.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {{size:number}} reference Blob reference.\n */\nfunction writeBlobRef(writer, arena, reference)\n{\n writer.u32(reference.size);\n writer.u32(arena.blob(reference));\n}\n\n/**\n * An absent sized blob: zero length, Carbon's null offset. The offset word is\n * still written, and a reader must not dereference it.\n */\nconst EMPTY_BLOB = Object.freeze({ size: 0, offset: 0xffffffff, bytes: new Uint8Array(0) });\n\n/**\n * Error factory used by the write path's cap checks.\n *\n * @param {string} message Failure reason.\n * @param {object} details Structured details.\n * @returns {CjsFormatWriteError} Write error.\n */\nfunction writeError(message, details)\n{\n return new CjsFormatWriteError(message, details);\n}\n\n/**\n * Requires that a sized record parsed to exactly its declared end.\n *\n * This is the universal form of the rule the backend block discovered, and it\n * carries real weight: it is the successor to roughly 600 lines of cross-chunk\n * agreement checks that the container rewrite deletes. Those checks caught a\n * malformed *tree* — our writer emitting something structurally wrong — not only a\n * malformed file. Under a record layout a writer bug either fails to parse, which\n * is self-announcing, or it parses and leaves the cursor somewhere other than the\n * declared end. Trailing bytes therefore mean one of two things, both fatal: the\n * writer knew fields this reader does not, or the writer miscounted.\n *\n * Applying it to some sized records and not others is a gap that stays invisible\n * until a writer bug hides in one of the others, so every sized record gets it.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Reader at the record end.\n * @param {string} what Record name for the error message.\n * @param {Function} makeError Error factory.\n */\nfunction requireExhaustive(reader, what, makeError)\n{\n if (reader.remaining !== 0)\n {\n throw makeError(\n `Carbon effect ${what} has ${reader.remaining} unparsed trailing byte(s)`,\n { trailingBytes: reader.remaining, offset: reader.offset, end: reader.end }\n );\n }\n}\n\n/**\n * Rejects a count above Carbon's inclusive limit for that field.\n *\n * @param {number} value Count read or about to be written.\n * @param {string} field Cap key in `CARBON_EFFECT_COUNT_CAPS`.\n * @param {Function} makeError Error factory taking a message and details.\n * @returns {number} The count.\n */\nfunction sanityCheck(value, field, makeError)\n{\n const limit = CARBON_EFFECT_COUNT_CAPS[field];\n if (limit !== undefined && value > limit)\n {\n throw makeError(`Effect ${field} count ${value} exceeds Carbon's limit of ${limit}`, {\n field,\n value,\n limit\n });\n }\n return value;\n}\n\n/**\n * Reads one annotation map: `u8 count`, then name/type/value triples\n * (`ParameterAnnotation::Save` `EffectData.h:601-623`, `ReadAnnotations`\n * `Tr2EffectDescription.cpp:114-134`).\n *\n * A non-string value is kept as its raw four bytes. Carbon writes it through\n * the `float` member of a `{float,int32_t}` union and reads it back through a\n * different union, so the bytes are the only faithful representation; applying\n * an int/float conversion here would corrupt round-trips.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @returns {object[]} Annotation records.\n */\nfunction readAnnotations(reader)\n{\n const count = reader.readUint8();\n const annotations = [];\n for (let index = 0; index < count; index += 1)\n {\n const name = readStringRef(reader);\n const type = reader.readUint8();\n if (type === CARBON_ANNOTATION_TYPE.STRING)\n {\n annotations.push({ name, type, stringValue: readStringRef(reader), rawValue: null });\n }\n else\n {\n annotations.push({ name, type, stringValue: null, rawValue: Uint8Array.from(reader.readRaw(4)) });\n }\n }\n return annotations;\n}\n\n/**\n * Writes one annotation map.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object[]} annotations Annotation records.\n */\nfunction writeAnnotations(writer, arena, annotations)\n{\n writer.u8(annotations.length);\n for (const annotation of annotations)\n {\n writer.u32(arena.string(annotation.name));\n writer.u8(annotation.type);\n if (annotation.type === CARBON_ANNOTATION_TYPE.STRING)\n {\n writer.u32(arena.string(annotation.stringValue));\n }\n else\n {\n writer.bytes(annotation.rawValue);\n }\n }\n}\n\n/**\n * Reads one `Constant` (`EffectData.h:283-294`, `ReadConstant`\n * `Tr2EffectDescription.cpp:136-170`).\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @returns {object} Constant record.\n */\nfunction readConstant(reader)\n{\n return {\n name: readStringRef(reader),\n offset: reader.readUint32(),\n size: reader.readUint32(),\n type: reader.readUint8(),\n dimension: reader.readUint8(),\n elements: reader.readUint32(),\n isSRGB: reader.readUint8(),\n isAutoregister: reader.readUint8()\n };\n}\n\n/**\n * Writes one `Constant`.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object} constant Constant record.\n */\nfunction writeConstant(writer, arena, constant)\n{\n writer.u32(arena.string(constant.name));\n writer.u32(constant.offset);\n writer.u32(constant.size);\n writer.u8(constant.type);\n writer.u8(constant.dimension);\n writer.u32(constant.elements);\n writer.u8(constant.isSRGB);\n writer.u8(constant.isAutoregister);\n}\n\n/**\n * Reads one `Texture` (`EffectData.h:320-328`, `ReadResource`\n * `Tr2EffectDescription.cpp:172-190`). `count` is the reader's\n * `arrayElements`.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @returns {object} Texture record.\n */\nfunction readTexture(reader)\n{\n return {\n name: readStringRef(reader),\n type: reader.readUint8(),\n count: reader.readUint32(),\n isSRGB: reader.readUint8(),\n isAutoregister: reader.readUint8()\n };\n}\n\n/**\n * Writes one `Texture`.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object} texture Texture record.\n */\nfunction writeTexture(writer, arena, texture)\n{\n writer.u32(arena.string(texture.name));\n writer.u8(texture.type);\n writer.u32(texture.count);\n writer.u8(texture.isSRGB);\n writer.u8(texture.isAutoregister);\n}\n\n/**\n * Reads one `Uav` (`EffectData.h:345-352`, inline at\n * `Tr2EffectDescription.cpp:449-463`).\n *\n * A UAV record is one byte shorter than a texture record: it carries no\n * `isSRGB`. Carbon's reader hardcodes `isSRGB = false`\n * (`Tr2EffectDescription.cpp:450`) rather than reading it, and `Uav::Save`\n * omits it. Reusing a shared \"resource\" codec for both is the mistake this\n * comment exists to prevent.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @returns {object} UAV record.\n */\nfunction readUav(reader)\n{\n return {\n name: readStringRef(reader),\n type: reader.readUint8(),\n count: reader.readUint32(),\n isAutoregister: reader.readUint8()\n };\n}\n\n/**\n * Writes one `Uav`.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object} uav UAV record.\n */\nfunction writeUav(writer, arena, uav)\n{\n writer.u32(arena.string(uav.name));\n writer.u8(uav.type);\n writer.u32(uav.count);\n writer.u8(uav.isAutoregister);\n}\n\n/**\n * Reads one `Sampler` (`EffectData.h:368-390`, `ReadSampler`\n * `Tr2EffectDescription.cpp:192-232` plus the name at `:413` and `isDynamic`\n * at `:429`). Border colour here is four floats — unlike a static sampler,\n * where it is a one-byte enum.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @returns {object} Sampler record.\n */\nfunction readSampler(reader)\n{\n return {\n name: readStringRef(reader),\n comparison: reader.readUint8(),\n minFilter: reader.readUint8(),\n magFilter: reader.readUint8(),\n mipFilter: reader.readUint8(),\n addressU: reader.readUint8(),\n addressV: reader.readUint8(),\n addressW: reader.readUint8(),\n mipLODBias: reader.readFloat32(),\n maxAnisotropy: reader.readUint8(),\n comparisonFunc: reader.readUint8(),\n borderColor: [\n reader.readFloat32(),\n reader.readFloat32(),\n reader.readFloat32(),\n reader.readFloat32()\n ],\n minLOD: reader.readFloat32(),\n maxLOD: reader.readFloat32(),\n isDynamic: reader.readUint8()\n };\n}\n\n/**\n * Writes one `Sampler`.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object} sampler Sampler record.\n */\nfunction writeSampler(writer, arena, sampler)\n{\n writer.u32(arena.string(sampler.name));\n writer.u8(sampler.comparison);\n writer.u8(sampler.minFilter);\n writer.u8(sampler.magFilter);\n writer.u8(sampler.mipFilter);\n writer.u8(sampler.addressU);\n writer.u8(sampler.addressV);\n writer.u8(sampler.addressW);\n writer.f32(sampler.mipLODBias);\n writer.u8(sampler.maxAnisotropy);\n writer.u8(sampler.comparisonFunc);\n writer.f32(sampler.borderColor[0]);\n writer.f32(sampler.borderColor[1]);\n writer.f32(sampler.borderColor[2]);\n writer.f32(sampler.borderColor[3]);\n writer.f32(sampler.minLOD);\n writer.f32(sampler.maxLOD);\n writer.u8(sampler.isDynamic);\n}\n\n/**\n * Reads one `StaticSampler` (`EffectData.h:512-531`, read inside\n * `ReadRegisters` at `Tr2EffectDescription.cpp:324-365`). Border colour is a\n * one-byte enum here, and there is no name.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @returns {object} Static sampler record.\n */\nfunction readStaticSampler(reader)\n{\n return {\n registerIndex: reader.readUint32(),\n registerSpace: reader.readUint8(),\n comparison: reader.readUint8(),\n minFilter: reader.readUint8(),\n magFilter: reader.readUint8(),\n mipFilter: reader.readUint8(),\n addressU: reader.readUint8(),\n addressV: reader.readUint8(),\n addressW: reader.readUint8(),\n mipLODBias: reader.readFloat32(),\n maxAnisotropy: reader.readUint8(),\n comparisonFunc: reader.readUint8(),\n borderColor: reader.readUint8(),\n minLOD: reader.readFloat32(),\n maxLOD: reader.readFloat32()\n };\n}\n\n/**\n * Writes one `StaticSampler`.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} sampler Static sampler record.\n */\nfunction writeStaticSampler(writer, sampler)\n{\n writer.u32(sampler.registerIndex);\n writer.u8(sampler.registerSpace);\n writer.u8(sampler.comparison);\n writer.u8(sampler.minFilter);\n writer.u8(sampler.magFilter);\n writer.u8(sampler.mipFilter);\n writer.u8(sampler.addressU);\n writer.u8(sampler.addressV);\n writer.u8(sampler.addressW);\n writer.f32(sampler.mipLODBias);\n writer.u8(sampler.maxAnisotropy);\n writer.u8(sampler.comparisonFunc);\n writer.u8(sampler.borderColor);\n writer.f32(sampler.minLOD);\n writer.f32(sampler.maxLOD);\n}\n\n/**\n * Reads the `StageData` block: registers, static samplers, constants, default\n * constant values, textures, samplers, UAVs, annotations\n * (`StageData::Save` `EffectData.h:631-676`).\n *\n * Carbon's reader splits this single contiguous run across two functions —\n * `ReadRegisters` takes the first two sub-records\n * (`Tr2EffectDescription.cpp:258-367`) and `ReadInput` the remaining six\n * (`:369-472`). Keeping them adjacent here is what makes the split invisible.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @param {Function} makeError Error factory.\n * @returns {object} Stage data record.\n */\nfunction readStageData(reader, makeError)\n{\n const registers = [];\n const registerCount = reader.readUint8();\n for (let index = 0; index < registerCount; index += 1)\n {\n registers.push({\n registerType: reader.readUint8(),\n registerIndex: reader.readUint32(),\n registerCount: reader.readUint32(),\n registerSpace: reader.readUint8()\n });\n }\n\n const staticSamplers = [];\n const staticSamplerCount = reader.readUint8();\n for (let index = 0; index < staticSamplerCount; index += 1)\n {\n staticSamplers.push(readStaticSampler(reader));\n }\n\n const constants = [];\n const constantCount = reader.readUint32();\n for (let index = 0; index < constantCount; index += 1)\n {\n constants.push(readConstant(reader));\n }\n\n const defaultValues = readBlobRef(reader);\n\n const textures = [];\n const textureCount = sanityCheck(reader.readUint8(), \"textures\", makeError);\n for (let index = 0; index < textureCount; index += 1)\n {\n const registerIndex = reader.readUint8();\n textures.push({ registerIndex, ...readTexture(reader) });\n }\n\n const samplers = [];\n const samplerCount = sanityCheck(reader.readUint8(), \"samplers\", makeError);\n for (let index = 0; index < samplerCount; index += 1)\n {\n const registerIndex = reader.readUint8();\n samplers.push({ registerIndex, ...readSampler(reader) });\n }\n\n const uavs = [];\n const uavCount = sanityCheck(reader.readUint8(), \"uavs\", makeError);\n for (let index = 0; index < uavCount; index += 1)\n {\n const registerIndex = reader.readUint8();\n uavs.push({ registerIndex, ...readUav(reader) });\n }\n\n return {\n registers,\n staticSamplers,\n constants,\n defaultValues,\n textures,\n samplers,\n uavs,\n annotations: readAnnotations(reader)\n };\n}\n\n/**\n * Writes the `StageData` block.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object} stageData Stage data record.\n */\nfunction writeStageData(writer, arena, stageData)\n{\n writer.u8(stageData.registers.length);\n for (const register of stageData.registers)\n {\n writer.u8(register.registerType);\n writer.u32(register.registerIndex);\n writer.u32(register.registerCount);\n writer.u8(register.registerSpace);\n }\n\n writer.u8(stageData.staticSamplers.length);\n for (const sampler of stageData.staticSamplers)\n {\n writeStaticSampler(writer, sampler);\n }\n\n writer.u32(stageData.constants.length);\n for (const constant of stageData.constants)\n {\n writeConstant(writer, arena, constant);\n }\n\n writeBlobRef(writer, arena, stageData.defaultValues);\n\n // Carbon's compiler enforces none of these caps while its runtime rejects\n // anything above them, so an over-large effect compiles and then fails to\n // load. Check on the way out instead.\n sanityCheck(stageData.textures.length, \"textures\", writeError);\n sanityCheck(stageData.samplers.length, \"samplers\", writeError);\n sanityCheck(stageData.uavs.length, \"uavs\", writeError);\n\n writer.u8(stageData.textures.length);\n for (const texture of stageData.textures)\n {\n writer.u8(texture.registerIndex);\n writeTexture(writer, arena, texture);\n }\n\n writer.u8(stageData.samplers.length);\n for (const sampler of stageData.samplers)\n {\n writer.u8(sampler.registerIndex);\n writeSampler(writer, arena, sampler);\n }\n\n writer.u8(stageData.uavs.length);\n for (const uav of stageData.uavs)\n {\n writer.u8(uav.registerIndex);\n writeUav(writer, arena, uav);\n }\n\n writeAnnotations(writer, arena, stageData.annotations);\n}\n\n/**\n * Reads one stage (`StageInput::Save` `EffectData.h:691-709`,\n * `Tr2EffectDescription.cpp:532-585`).\n *\n * At v15 the program payload comes first and the signature tables follow.\n * Before v14 it was the other way round; the reorder is the v14 change, and\n * Carbon marks its own v14 branch `// CHECK` (`:578`). Verified against the\n * writer: `type`, `shaderSize`, `shaderData`, `threadGroupSize[0..2]`,\n * `pipelineInputs`, then `StageData`.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @param {Function} makeError Error factory.\n * @returns {object} Stage record.\n */\nfunction readStage(reader, makeError)\n{\n const type = reader.readUint8();\n const shaderData = readBlobRef(reader);\n const threadGroupSize = [ reader.readUint32(), reader.readUint32(), reader.readUint32() ];\n\n const pipelineInputs = [];\n const pipelineInputCount = sanityCheck(reader.readUint8(), \"pipelineInputs\", makeError);\n for (let index = 0; index < pipelineInputCount; index += 1)\n {\n pipelineInputs.push({\n usage: reader.readUint8(),\n registerIndex: reader.readUint8(),\n usageIndex: reader.readUint8(),\n usedMask: reader.readUint8(),\n type: reader.readUint8(),\n dimension: reader.readUint8()\n });\n }\n\n return {\n type,\n shaderData,\n threadGroupSize,\n pipelineInputs,\n ...readStageData(reader, makeError)\n };\n}\n\n/**\n * Writes one stage.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object} stage Stage record.\n */\nfunction writeStage(writer, arena, stage)\n{\n sanityCheck(stage.pipelineInputs.length, \"pipelineInputs\", writeError);\n writer.u8(stage.type);\n writeBlobRef(writer, arena, stage.shaderData);\n writer.u32(stage.threadGroupSize[0]);\n writer.u32(stage.threadGroupSize[1]);\n writer.u32(stage.threadGroupSize[2]);\n\n writer.u8(stage.pipelineInputs.length);\n for (const input of stage.pipelineInputs)\n {\n writer.u8(input.usage);\n writer.u8(input.registerIndex);\n writer.u8(input.usageIndex);\n writer.u8(input.usedMask);\n writer.u8(input.type);\n writer.u8(input.dimension);\n }\n\n writeStageData(writer, arena, stage);\n}\n\n/**\n * Reads one pass (`Pass::Save` `EffectData.h:724-738`).\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @param {Function} makeError Error factory.\n * @param {boolean} backend Whether the optional trailing block is present.\n * @returns {object} Pass record.\n */\nfunction readPass(reader, makeError, backend)\n{\n const stages = [];\n const stageCount = sanityCheck(reader.readUint8(), \"stages\", makeError);\n for (let index = 0; index < stageCount; index += 1)\n {\n stages.push(readStage(reader, makeError));\n }\n\n const renderStates = [];\n const stateCount = sanityCheck(reader.readUint8(), \"renderStates\", makeError);\n for (let index = 0; index < stateCount; index += 1)\n {\n renderStates.push({ state: reader.readUint32(), value: reader.readUint32() });\n }\n\n // The one optional trailing block, present only in our own containers. A\n // Carbon file ends the pass at the render-state table, so leaving this gate\n // closed reproduces Carbon's bytes exactly.\n const backendBlock = backend ? readBlobRef(reader) : null;\n\n return { stages, renderStates, ...(backendBlock ? { backendBlock } : {}) };\n}\n\n/**\n * Writes one pass.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object} pass Pass record.\n * @param {boolean} backend Whether to emit the optional trailing block.\n */\nfunction writePass(writer, arena, pass, backend)\n{\n writer.u8(pass.stages.length);\n for (const stage of pass.stages)\n {\n writeStage(writer, arena, stage);\n }\n writer.u8(pass.renderStates.length);\n for (const entry of pass.renderStates)\n {\n writer.u32(entry.state);\n writer.u32(entry.value);\n }\n if (backend)\n {\n writeBlobRef(writer, arena, pass.backendBlock ?? EMPTY_BLOB);\n }\n}\n\n/**\n * Reads one raytracing library (`Library::Save` `EffectData.h:760-775`,\n * `Tr2EffectDescription.cpp:675-721`). A library carries two `StageData`\n * blocks and no pipeline inputs, thread group size, or stage type.\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Source reader.\n * @param {Function} makeError Error factory.\n * @returns {object} Library record.\n */\nfunction readLibrary(reader, makeError)\n{\n const payloadSize = reader.readUint32();\n const shaderData = readBlobRef(reader);\n\n const exports = [];\n const exportCount = reader.readUint32();\n for (let index = 0; index < exportCount; index += 1)\n {\n exports.push({ type: reader.readUint8(), name: readStringRef(reader) });\n }\n\n return {\n payloadSize,\n shaderData,\n exports,\n hitGroupName: readStringRef(reader),\n globalInputs: readStageData(reader, makeError),\n localInputs: readStageData(reader, makeError)\n };\n}\n\n/**\n * Writes one raytracing library.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} arena Arena resolver.\n * @param {object} library Library record.\n */\nfunction writeLibrary(writer, arena, library)\n{\n writer.u32(library.payloadSize);\n writeBlobRef(writer, arena, library.shaderData);\n writer.u32(library.exports.length);\n for (const entry of library.exports)\n {\n writer.u8(entry.type);\n writer.u32(arena.string(entry.name));\n }\n writer.u32(arena.string(library.hitGroupName));\n writeStageData(writer, arena, library.globalInputs);\n writeStageData(writer, arena, library.localInputs);\n}\n\n/**\n * Reads a whole v15 description blob (`EffectData::Save`\n * `EffectData.h:821-849`, `Tr2EffectDescription::Read`\n * `Tr2EffectDescription.cpp:476-731`).\n *\n * @param {import(\"../CjsByteReader.js\").CjsByteReader} reader Reader positioned at the blob.\n * @param {object} [options] Read options.\n * @param {Function} [options.makeError] Error factory taking a message and details.\n * @param {boolean} [options.backend] Expect our optional per-pass trailing block.\n * Leave false for a Carbon file, which ends each pass at the render states.\n * @returns {object} Description record tree.\n */\nexport function readEffectDescription(reader, options = {})\n{\n const makeError = options.makeError\n ?? ((message, details) => reader._error(message, details));\n const backend = options.backend === true;\n\n const techniques = [];\n const techniqueCount = reader.readUint8();\n for (let techniqueIndex = 0; techniqueIndex < techniqueCount; techniqueIndex += 1)\n {\n const name = readStringRef(reader);\n\n const passes = [];\n const passCount = sanityCheck(reader.readUint8(), \"passes\", makeError);\n for (let passIndex = 0; passIndex < passCount; passIndex += 1)\n {\n passes.push(readPass(reader, makeError, backend));\n }\n\n const libraries = [];\n const libraryCount = reader.readUint8();\n for (let libraryIndex = 0; libraryIndex < libraryCount; libraryIndex += 1)\n {\n libraries.push(readLibrary(reader, makeError));\n }\n\n techniques.push({ name, passes, libraries });\n }\n\n const annotations = [];\n const parameterCount = sanityCheck(reader.readUint16(), \"effectAnnotations\", makeError);\n for (let index = 0; index < parameterCount; index += 1)\n {\n annotations.push({ name: readStringRef(reader), annotations: readAnnotations(reader) });\n }\n\n requireExhaustive(reader, \"description blob\", makeError);\n\n return { techniques, annotations };\n}\n\n/**\n * Writes a whole v15 description blob.\n *\n * The `arena` resolver decides what an arena reference becomes: `passthroughArena`\n * keeps the source offsets, `internArena(table)` re-interns into a new table.\n *\n * @param {import(\"../CjsByteWriter.js\").CjsByteWriter} writer Target writer.\n * @param {object} description Description record tree.\n * @param {object} [options] Write options.\n * @param {object} [options.arena] Arena resolver; defaults to passthrough.\n * @param {boolean} [options.backend] Emit our optional per-pass trailing block.\n * Leave false to produce bytes a Carbon reader accepts unchanged.\n * @returns {import(\"../CjsByteWriter.js\").CjsByteWriter} The writer.\n */\nexport function writeEffectDescription(writer, description, options = {})\n{\n const arena = options.arena ?? passthroughArena;\n const backend = options.backend === true;\n\n writer.u8(description.techniques.length);\n for (const technique of description.techniques)\n {\n writer.u32(arena.string(technique.name));\n writer.u8(sanityCheck(technique.passes.length, \"passes\", writeError));\n for (const pass of technique.passes)\n {\n sanityCheck(pass.stages.length, \"stages\", writeError);\n sanityCheck(pass.renderStates.length, \"renderStates\", writeError);\n writePass(writer, arena, pass, backend);\n }\n writer.u8(technique.libraries.length);\n for (const library of technique.libraries)\n {\n writeLibrary(writer, arena, library);\n }\n }\n\n writer.u16(sanityCheck(description.annotations.length, \"effectAnnotations\", writeError));\n for (const parameter of description.annotations)\n {\n writer.u32(arena.string(parameter.name));\n writeAnnotations(writer, arena, parameter.annotations);\n }\n\n return writer;\n}\n"],"names":["CARBON_EFFECT_DATA_VERSION","CARBON_ANNOTATION_TYPE","Object","freeze","BOOL","INT","FLOAT","STRING","CARBON_EFFECT_COUNT_CAPS","pipelineInputs","passes","stages","textures","samplers","uavs","renderStates","effectAnnotations","CARBON_SHADER_CONSTANTS_MAX","compareAnnotationNames","a","b","compareUtf8","passthroughArena","string","reference","offset","blob","internArena","table","offsetOf","addString","value","size","addBytes","bytes","collectArena","readStringRef","reader","readUint32","readStringAt","readBlobRef","readTableBlobOptional","writeBlobRef","writer","arena","u32","EMPTY_BLOB","Uint8Array","writeError","message","details","CjsFormatWriteError","requireExhaustive","what","makeError","remaining","trailingBytes","end","sanityCheck","field","limit","undefined","readAnnotations","count","readUint8","annotations","index","name","type","push","stringValue","rawValue","from","readRaw","writeAnnotations","u8","length","annotation","readConstant","dimension","elements","isSRGB","isAutoregister","writeConstant","constant","readTexture","writeTexture","texture","readUav","writeUav","uav","readSampler","comparison","minFilter","magFilter","mipFilter","addressU","addressV","addressW","mipLODBias","readFloat32","maxAnisotropy","comparisonFunc","borderColor","minLOD","maxLOD","isDynamic","writeSampler","sampler","f32","readStaticSampler","registerIndex","registerSpace","writeStaticSampler","readStageData","registers","registerCount","registerType","staticSamplers","staticSamplerCount","constants","constantCount","defaultValues","textureCount","samplerCount","uavCount","writeStageData","stageData","register","readStage","shaderData","threadGroupSize","pipelineInputCount","usage","usageIndex","usedMask","writeStage","stage","input","readPass","backend","stageCount","stateCount","state","backendBlock","writePass","pass","entry","readLibrary","payloadSize","exports","exportCount","hitGroupName","globalInputs","localInputs","writeLibrary","library","readEffectDescription","options","_error","techniques","techniqueCount","techniqueIndex","passCount","passIndex","libraries","libraryCount","libraryIndex","parameterCount","readUint16","writeEffectDescription","description","technique","u16","parameter"],"mappings":";;;AAAA;AACA;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,0BAA0B,GAAG;;AAE1C;AACA;AACA;AACA;MACaC,sBAAsB,GAAGC,MAAM,CAACC,MAAM,CAAC;AAChDC,EAAAA,IAAI,EAAE,CAAC;AACPC,EAAAA,GAAG,EAAE,CAAC;AACNC,EAAAA,KAAK,EAAE,CAAC;AACRC,EAAAA,MAAM,EAAE;AACZ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACaC,wBAAwB,GAAGN,MAAM,CAACC,MAAM,CAAC;AAClDM,EAAAA,cAAc,EAAE,EAAE;AAClBC,EAAAA,MAAM,EAAE,EAAE;AACVC,EAAAA,MAAM,EAAE,CAAC;AACTC,EAAAA,QAAQ,EAAE,EAAE;AACZC,EAAAA,QAAQ,EAAE,EAAE;AACZC,EAAAA,IAAI,EAAE,EAAE;AACRC,EAAAA,YAAY,EAAE,EAAE;AAChBC,EAAAA,iBAAiB,EAAE;AACvB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,MAAMC,2BAA2B,GAAG;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,sBAAsBA,CAACC,CAAC,EAAEC,CAAC,EAC3C;AACI,EAAA,OAAOC,WAAW,CAACF,CAAC,EAAEC,CAAC,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACaE,gBAAgB,GAAGpB,MAAM,CAACC,MAAM,CAAC;AAC1C;AACJ;AACA;AACA;AACA;AACA;EACIoB,MAAMA,CAACC,SAAS,EAChB;IACI,OAAOA,SAAS,CAACC,MAAM;EAC3B,CAAC;AAED;AACJ;AACA;AACA;AACA;AACA;EACIC,IAAIA,CAACF,SAAS,EACd;IACI,OAAOA,SAAS,CAACC,MAAM;AAC3B,EAAA;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,WAAWA,CAACC,KAAK,EACjC;EACI,OAAO;AACH;AACR;AACA;AACA;AACA;AACA;IACQL,MAAMA,CAACC,SAAS,EAChB;AACI,MAAA,OAAOI,KAAK,CAACC,QAAQ,CAACD,KAAK,CAACE,SAAS,CAACN,SAAS,CAACO,KAAK,CAAC,CAAC;IAC3D,CAAC;AAED;AACR;AACA;AACA;AACA;AACA;AACA;AACA;IACQL,IAAIA,CAACF,SAAS,EACd;MACI,IAAIA,SAAS,CAACQ,IAAI,KAAK,CAAC,EAAE,OAAOR,SAAS,CAACC,MAAM;AACjD,MAAA,OAAOG,KAAK,CAACC,QAAQ,CAACD,KAAK,CAACK,QAAQ,CAACT,SAAS,CAACU,KAAK,CAAC,CAAC;AAC1D,IAAA;GACH;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,YAAYA,CAACP,KAAK,EAClC;EACI,OAAO;AACH;AACR;AACA;AACA;AACA;AACA;IACQL,MAAMA,CAACC,SAAS,EAChB;AACII,MAAAA,KAAK,CAACE,SAAS,CAACN,SAAS,CAACO,KAAK,CAAC;AAChC,MAAA,OAAO,CAAC;IACZ,CAAC;AAED;AACR;AACA;AACA;AACA;AACA;IACQL,IAAIA,CAACF,SAAS,EACd;AACI,MAAA,IAAIA,SAAS,CAACQ,IAAI,KAAK,CAAC,EAAEJ,KAAK,CAACK,QAAQ,CAACT,SAAS,CAACU,KAAK,CAAC;AACzD,MAAA,OAAO,CAAC;AACZ,IAAA;GACH;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASE,aAAaA,CAACC,MAAM,EAC7B;AACI,EAAA,MAAMZ,MAAM,GAAGY,MAAM,CAACC,UAAU,EAAE;EAClC,OAAO;IAAEb,MAAM;AAAEM,IAAAA,KAAK,EAAEM,MAAM,CAACE,YAAY,CAACd,MAAM;GAAG;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASe,WAAWA,CAACH,MAAM,EAC3B;AACI,EAAA,MAAML,IAAI,GAAGK,MAAM,CAACC,UAAU,EAAE;AAChC,EAAA,MAAMZ,IAAI,GAAGW,MAAM,CAACI,qBAAqB,CAACT,IAAI,CAAC;EAC/C,OAAO;IAAEA,IAAI;IAAEP,MAAM,EAAEC,IAAI,CAACD,MAAM;IAAES,KAAK,EAAER,IAAI,CAACQ;GAAO;AAC3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASQ,YAAYA,CAACC,MAAM,EAAEC,KAAK,EAAEpB,SAAS,EAC9C;AACImB,EAAAA,MAAM,CAACE,GAAG,CAACrB,SAAS,CAACQ,IAAI,CAAC;EAC1BW,MAAM,CAACE,GAAG,CAACD,KAAK,CAAClB,IAAI,CAACF,SAAS,CAAC,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA,MAAMsB,UAAU,GAAG5C,MAAM,CAACC,MAAM,CAAC;AAAE6B,EAAAA,IAAI,EAAE,CAAC;AAAEP,EAAAA,MAAM,EAAE,UAAU;AAAES,EAAAA,KAAK,EAAE,IAAIa,UAAU,CAAC,CAAC;AAAE,CAAC,CAAC;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,UAAUA,CAACC,OAAO,EAAEC,OAAO,EACpC;AACI,EAAA,OAAO,IAAIC,mBAAmB,CAACF,OAAO,EAAEC,OAAO,CAAC;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASE,iBAAiBA,CAACf,MAAM,EAAEgB,IAAI,EAAEC,SAAS,EAClD;AACI,EAAA,IAAIjB,MAAM,CAACkB,SAAS,KAAK,CAAC,EAC1B;IACI,MAAMD,SAAS,CACX,CAAA,cAAA,EAAiBD,IAAI,QAAQhB,MAAM,CAACkB,SAAS,CAAA,0BAAA,CAA4B,EACzE;MAAEC,aAAa,EAAEnB,MAAM,CAACkB,SAAS;MAAE9B,MAAM,EAAEY,MAAM,CAACZ,MAAM;MAAEgC,GAAG,EAAEpB,MAAM,CAACoB;AAAI,KAC9E,CAAC;AACL,EAAA;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,WAAWA,CAAC3B,KAAK,EAAE4B,KAAK,EAAEL,SAAS,EAC5C;AACI,EAAA,MAAMM,KAAK,GAAGpD,wBAAwB,CAACmD,KAAK,CAAC;AAC7C,EAAA,IAAIC,KAAK,KAAKC,SAAS,IAAI9B,KAAK,GAAG6B,KAAK,EACxC;IACI,MAAMN,SAAS,CAAC,CAAA,OAAA,EAAUK,KAAK,UAAU5B,KAAK,CAAA,2BAAA,EAA8B6B,KAAK,CAAA,CAAE,EAAE;MACjFD,KAAK;MACL5B,KAAK;AACL6B,MAAAA;AACJ,KAAC,CAAC;AACN,EAAA;AACA,EAAA,OAAO7B,KAAK;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS+B,eAAeA,CAACzB,MAAM,EAC/B;AACI,EAAA,MAAM0B,KAAK,GAAG1B,MAAM,CAAC2B,SAAS,EAAE;EAChC,MAAMC,WAAW,GAAG,EAAE;AACtB,EAAA,KAAK,IAAIC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGH,KAAK,EAAEG,KAAK,IAAI,CAAC,EAC7C;AACI,IAAA,MAAMC,IAAI,GAAG/B,aAAa,CAACC,MAAM,CAAC;AAClC,IAAA,MAAM+B,IAAI,GAAG/B,MAAM,CAAC2B,SAAS,EAAE;AAC/B,IAAA,IAAII,IAAI,KAAKnE,sBAAsB,CAACM,MAAM,EAC1C;MACI0D,WAAW,CAACI,IAAI,CAAC;QAAEF,IAAI;QAAEC,IAAI;AAAEE,QAAAA,WAAW,EAAElC,aAAa,CAACC,MAAM,CAAC;AAAEkC,QAAAA,QAAQ,EAAE;AAAK,OAAC,CAAC;AACxF,IAAA,CAAC,MAED;MACIN,WAAW,CAACI,IAAI,CAAC;QAAEF,IAAI;QAAEC,IAAI;AAAEE,QAAAA,WAAW,EAAE,IAAI;QAAEC,QAAQ,EAAExB,UAAU,CAACyB,IAAI,CAACnC,MAAM,CAACoC,OAAO,CAAC,CAAC,CAAC;AAAE,OAAC,CAAC;AACrG,IAAA;AACJ,EAAA;AACA,EAAA,OAAOR,WAAW;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASS,gBAAgBA,CAAC/B,MAAM,EAAEC,KAAK,EAAEqB,WAAW,EACpD;AACItB,EAAAA,MAAM,CAACgC,EAAE,CAACV,WAAW,CAACW,MAAM,CAAC;AAC7B,EAAA,KAAK,MAAMC,UAAU,IAAIZ,WAAW,EACpC;IACItB,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAACsD,UAAU,CAACV,IAAI,CAAC,CAAC;AACzCxB,IAAAA,MAAM,CAACgC,EAAE,CAACE,UAAU,CAACT,IAAI,CAAC;AAC1B,IAAA,IAAIS,UAAU,CAACT,IAAI,KAAKnE,sBAAsB,CAACM,MAAM,EACrD;MACIoC,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAACsD,UAAU,CAACP,WAAW,CAAC,CAAC;AACpD,IAAA,CAAC,MAED;AACI3B,MAAAA,MAAM,CAACT,KAAK,CAAC2C,UAAU,CAACN,QAAQ,CAAC;AACrC,IAAA;AACJ,EAAA;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASO,YAAYA,CAACzC,MAAM,EAC5B;EACI,OAAO;AACH8B,IAAAA,IAAI,EAAE/B,aAAa,CAACC,MAAM,CAAC;AAC3BZ,IAAAA,MAAM,EAAEY,MAAM,CAACC,UAAU,EAAE;AAC3BN,IAAAA,IAAI,EAAEK,MAAM,CAACC,UAAU,EAAE;AACzB8B,IAAAA,IAAI,EAAE/B,MAAM,CAAC2B,SAAS,EAAE;AACxBe,IAAAA,SAAS,EAAE1C,MAAM,CAAC2B,SAAS,EAAE;AAC7BgB,IAAAA,QAAQ,EAAE3C,MAAM,CAACC,UAAU,EAAE;AAC7B2C,IAAAA,MAAM,EAAE5C,MAAM,CAAC2B,SAAS,EAAE;AAC1BkB,IAAAA,cAAc,EAAE7C,MAAM,CAAC2B,SAAS;GACnC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASmB,aAAaA,CAACxC,MAAM,EAAEC,KAAK,EAAEwC,QAAQ,EAC9C;EACIzC,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAAC6D,QAAQ,CAACjB,IAAI,CAAC,CAAC;AACvCxB,EAAAA,MAAM,CAACE,GAAG,CAACuC,QAAQ,CAAC3D,MAAM,CAAC;AAC3BkB,EAAAA,MAAM,CAACE,GAAG,CAACuC,QAAQ,CAACpD,IAAI,CAAC;AACzBW,EAAAA,MAAM,CAACgC,EAAE,CAACS,QAAQ,CAAChB,IAAI,CAAC;AACxBzB,EAAAA,MAAM,CAACgC,EAAE,CAACS,QAAQ,CAACL,SAAS,CAAC;AAC7BpC,EAAAA,MAAM,CAACE,GAAG,CAACuC,QAAQ,CAACJ,QAAQ,CAAC;AAC7BrC,EAAAA,MAAM,CAACgC,EAAE,CAACS,QAAQ,CAACH,MAAM,CAAC;AAC1BtC,EAAAA,MAAM,CAACgC,EAAE,CAACS,QAAQ,CAACF,cAAc,CAAC;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASG,WAAWA,CAAChD,MAAM,EAC3B;EACI,OAAO;AACH8B,IAAAA,IAAI,EAAE/B,aAAa,CAACC,MAAM,CAAC;AAC3B+B,IAAAA,IAAI,EAAE/B,MAAM,CAAC2B,SAAS,EAAE;AACxBD,IAAAA,KAAK,EAAE1B,MAAM,CAACC,UAAU,EAAE;AAC1B2C,IAAAA,MAAM,EAAE5C,MAAM,CAAC2B,SAAS,EAAE;AAC1BkB,IAAAA,cAAc,EAAE7C,MAAM,CAAC2B,SAAS;GACnC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASsB,YAAYA,CAAC3C,MAAM,EAAEC,KAAK,EAAE2C,OAAO,EAC5C;EACI5C,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAACgE,OAAO,CAACpB,IAAI,CAAC,CAAC;AACtCxB,EAAAA,MAAM,CAACgC,EAAE,CAACY,OAAO,CAACnB,IAAI,CAAC;AACvBzB,EAAAA,MAAM,CAACE,GAAG,CAAC0C,OAAO,CAACxB,KAAK,CAAC;AACzBpB,EAAAA,MAAM,CAACgC,EAAE,CAACY,OAAO,CAACN,MAAM,CAAC;AACzBtC,EAAAA,MAAM,CAACgC,EAAE,CAACY,OAAO,CAACL,cAAc,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASM,OAAOA,CAACnD,MAAM,EACvB;EACI,OAAO;AACH8B,IAAAA,IAAI,EAAE/B,aAAa,CAACC,MAAM,CAAC;AAC3B+B,IAAAA,IAAI,EAAE/B,MAAM,CAAC2B,SAAS,EAAE;AACxBD,IAAAA,KAAK,EAAE1B,MAAM,CAACC,UAAU,EAAE;AAC1B4C,IAAAA,cAAc,EAAE7C,MAAM,CAAC2B,SAAS;GACnC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASyB,QAAQA,CAAC9C,MAAM,EAAEC,KAAK,EAAE8C,GAAG,EACpC;EACI/C,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAACmE,GAAG,CAACvB,IAAI,CAAC,CAAC;AAClCxB,EAAAA,MAAM,CAACgC,EAAE,CAACe,GAAG,CAACtB,IAAI,CAAC;AACnBzB,EAAAA,MAAM,CAACE,GAAG,CAAC6C,GAAG,CAAC3B,KAAK,CAAC;AACrBpB,EAAAA,MAAM,CAACgC,EAAE,CAACe,GAAG,CAACR,cAAc,CAAC;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASS,WAAWA,CAACtD,MAAM,EAC3B;EACI,OAAO;AACH8B,IAAAA,IAAI,EAAE/B,aAAa,CAACC,MAAM,CAAC;AAC3BuD,IAAAA,UAAU,EAAEvD,MAAM,CAAC2B,SAAS,EAAE;AAC9B6B,IAAAA,SAAS,EAAExD,MAAM,CAAC2B,SAAS,EAAE;AAC7B8B,IAAAA,SAAS,EAAEzD,MAAM,CAAC2B,SAAS,EAAE;AAC7B+B,IAAAA,SAAS,EAAE1D,MAAM,CAAC2B,SAAS,EAAE;AAC7BgC,IAAAA,QAAQ,EAAE3D,MAAM,CAAC2B,SAAS,EAAE;AAC5BiC,IAAAA,QAAQ,EAAE5D,MAAM,CAAC2B,SAAS,EAAE;AAC5BkC,IAAAA,QAAQ,EAAE7D,MAAM,CAAC2B,SAAS,EAAE;AAC5BmC,IAAAA,UAAU,EAAE9D,MAAM,CAAC+D,WAAW,EAAE;AAChCC,IAAAA,aAAa,EAAEhE,MAAM,CAAC2B,SAAS,EAAE;AACjCsC,IAAAA,cAAc,EAAEjE,MAAM,CAAC2B,SAAS,EAAE;IAClCuC,WAAW,EAAE,CACTlE,MAAM,CAAC+D,WAAW,EAAE,EACpB/D,MAAM,CAAC+D,WAAW,EAAE,EACpB/D,MAAM,CAAC+D,WAAW,EAAE,EACpB/D,MAAM,CAAC+D,WAAW,EAAE,CACvB;AACDI,IAAAA,MAAM,EAAEnE,MAAM,CAAC+D,WAAW,EAAE;AAC5BK,IAAAA,MAAM,EAAEpE,MAAM,CAAC+D,WAAW,EAAE;AAC5BM,IAAAA,SAAS,EAAErE,MAAM,CAAC2B,SAAS;GAC9B;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS2C,YAAYA,CAAChE,MAAM,EAAEC,KAAK,EAAEgE,OAAO,EAC5C;EACIjE,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAACqF,OAAO,CAACzC,IAAI,CAAC,CAAC;AACtCxB,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAAChB,UAAU,CAAC;AAC7BjD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACf,SAAS,CAAC;AAC5BlD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACd,SAAS,CAAC;AAC5BnD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACb,SAAS,CAAC;AAC5BpD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACZ,QAAQ,CAAC;AAC3BrD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACX,QAAQ,CAAC;AAC3BtD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACV,QAAQ,CAAC;AAC3BvD,EAAAA,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACT,UAAU,CAAC;AAC9BxD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACP,aAAa,CAAC;AAChC1D,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACN,cAAc,CAAC;EACjC3D,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACL,WAAW,CAAC,CAAC,CAAC,CAAC;EAClC5D,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACL,WAAW,CAAC,CAAC,CAAC,CAAC;EAClC5D,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACL,WAAW,CAAC,CAAC,CAAC,CAAC;EAClC5D,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACL,WAAW,CAAC,CAAC,CAAC,CAAC;AAClC5D,EAAAA,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACJ,MAAM,CAAC;AAC1B7D,EAAAA,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACH,MAAM,CAAC;AAC1B9D,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACF,SAAS,CAAC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASI,iBAAiBA,CAACzE,MAAM,EACjC;EACI,OAAO;AACH0E,IAAAA,aAAa,EAAE1E,MAAM,CAACC,UAAU,EAAE;AAClC0E,IAAAA,aAAa,EAAE3E,MAAM,CAAC2B,SAAS,EAAE;AACjC4B,IAAAA,UAAU,EAAEvD,MAAM,CAAC2B,SAAS,EAAE;AAC9B6B,IAAAA,SAAS,EAAExD,MAAM,CAAC2B,SAAS,EAAE;AAC7B8B,IAAAA,SAAS,EAAEzD,MAAM,CAAC2B,SAAS,EAAE;AAC7B+B,IAAAA,SAAS,EAAE1D,MAAM,CAAC2B,SAAS,EAAE;AAC7BgC,IAAAA,QAAQ,EAAE3D,MAAM,CAAC2B,SAAS,EAAE;AAC5BiC,IAAAA,QAAQ,EAAE5D,MAAM,CAAC2B,SAAS,EAAE;AAC5BkC,IAAAA,QAAQ,EAAE7D,MAAM,CAAC2B,SAAS,EAAE;AAC5BmC,IAAAA,UAAU,EAAE9D,MAAM,CAAC+D,WAAW,EAAE;AAChCC,IAAAA,aAAa,EAAEhE,MAAM,CAAC2B,SAAS,EAAE;AACjCsC,IAAAA,cAAc,EAAEjE,MAAM,CAAC2B,SAAS,EAAE;AAClCuC,IAAAA,WAAW,EAAElE,MAAM,CAAC2B,SAAS,EAAE;AAC/BwC,IAAAA,MAAM,EAAEnE,MAAM,CAAC+D,WAAW,EAAE;AAC5BK,IAAAA,MAAM,EAAEpE,MAAM,CAAC+D,WAAW;GAC7B;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASa,kBAAkBA,CAACtE,MAAM,EAAEiE,OAAO,EAC3C;AACIjE,EAAAA,MAAM,CAACE,GAAG,CAAC+D,OAAO,CAACG,aAAa,CAAC;AACjCpE,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACI,aAAa,CAAC;AAChCrE,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAAChB,UAAU,CAAC;AAC7BjD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACf,SAAS,CAAC;AAC5BlD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACd,SAAS,CAAC;AAC5BnD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACb,SAAS,CAAC;AAC5BpD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACZ,QAAQ,CAAC;AAC3BrD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACX,QAAQ,CAAC;AAC3BtD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACV,QAAQ,CAAC;AAC3BvD,EAAAA,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACT,UAAU,CAAC;AAC9BxD,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACP,aAAa,CAAC;AAChC1D,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACN,cAAc,CAAC;AACjC3D,EAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACL,WAAW,CAAC;AAC9B5D,EAAAA,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACJ,MAAM,CAAC;AAC1B7D,EAAAA,MAAM,CAACkE,GAAG,CAACD,OAAO,CAACH,MAAM,CAAC;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASS,aAAaA,CAAC7E,MAAM,EAAEiB,SAAS,EACxC;EACI,MAAM6D,SAAS,GAAG,EAAE;AACpB,EAAA,MAAMC,aAAa,GAAG/E,MAAM,CAAC2B,SAAS,EAAE;AACxC,EAAA,KAAK,IAAIE,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGkD,aAAa,EAAElD,KAAK,IAAI,CAAC,EACrD;IACIiD,SAAS,CAAC9C,IAAI,CAAC;AACXgD,MAAAA,YAAY,EAAEhF,MAAM,CAAC2B,SAAS,EAAE;AAChC+C,MAAAA,aAAa,EAAE1E,MAAM,CAACC,UAAU,EAAE;AAClC8E,MAAAA,aAAa,EAAE/E,MAAM,CAACC,UAAU,EAAE;AAClC0E,MAAAA,aAAa,EAAE3E,MAAM,CAAC2B,SAAS;AACnC,KAAC,CAAC;AACN,EAAA;EAEA,MAAMsD,cAAc,GAAG,EAAE;AACzB,EAAA,MAAMC,kBAAkB,GAAGlF,MAAM,CAAC2B,SAAS,EAAE;AAC7C,EAAA,KAAK,IAAIE,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGqD,kBAAkB,EAAErD,KAAK,IAAI,CAAC,EAC1D;AACIoD,IAAAA,cAAc,CAACjD,IAAI,CAACyC,iBAAiB,CAACzE,MAAM,CAAC,CAAC;AAClD,EAAA;EAEA,MAAMmF,SAAS,GAAG,EAAE;AACpB,EAAA,MAAMC,aAAa,GAAGpF,MAAM,CAACC,UAAU,EAAE;AACzC,EAAA,KAAK,IAAI4B,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGuD,aAAa,EAAEvD,KAAK,IAAI,CAAC,EACrD;AACIsD,IAAAA,SAAS,CAACnD,IAAI,CAACS,YAAY,CAACzC,MAAM,CAAC,CAAC;AACxC,EAAA;AAEA,EAAA,MAAMqF,aAAa,GAAGlF,WAAW,CAACH,MAAM,CAAC;EAEzC,MAAMzB,QAAQ,GAAG,EAAE;AACnB,EAAA,MAAM+G,YAAY,GAAGjE,WAAW,CAACrB,MAAM,CAAC2B,SAAS,EAAE,EAAE,UAAU,EAAEV,SAAS,CAAC;AAC3E,EAAA,KAAK,IAAIY,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGyD,YAAY,EAAEzD,KAAK,IAAI,CAAC,EACpD;AACI,IAAA,MAAM6C,aAAa,GAAG1E,MAAM,CAAC2B,SAAS,EAAE;IACxCpD,QAAQ,CAACyD,IAAI,CAAC;MAAE0C,aAAa;MAAE,GAAG1B,WAAW,CAAChD,MAAM;AAAE,KAAC,CAAC;AAC5D,EAAA;EAEA,MAAMxB,QAAQ,GAAG,EAAE;AACnB,EAAA,MAAM+G,YAAY,GAAGlE,WAAW,CAACrB,MAAM,CAAC2B,SAAS,EAAE,EAAE,UAAU,EAAEV,SAAS,CAAC;AAC3E,EAAA,KAAK,IAAIY,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG0D,YAAY,EAAE1D,KAAK,IAAI,CAAC,EACpD;AACI,IAAA,MAAM6C,aAAa,GAAG1E,MAAM,CAAC2B,SAAS,EAAE;IACxCnD,QAAQ,CAACwD,IAAI,CAAC;MAAE0C,aAAa;MAAE,GAAGpB,WAAW,CAACtD,MAAM;AAAE,KAAC,CAAC;AAC5D,EAAA;EAEA,MAAMvB,IAAI,GAAG,EAAE;AACf,EAAA,MAAM+G,QAAQ,GAAGnE,WAAW,CAACrB,MAAM,CAAC2B,SAAS,EAAE,EAAE,MAAM,EAAEV,SAAS,CAAC;AACnE,EAAA,KAAK,IAAIY,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG2D,QAAQ,EAAE3D,KAAK,IAAI,CAAC,EAChD;AACI,IAAA,MAAM6C,aAAa,GAAG1E,MAAM,CAAC2B,SAAS,EAAE;IACxClD,IAAI,CAACuD,IAAI,CAAC;MAAE0C,aAAa;MAAE,GAAGvB,OAAO,CAACnD,MAAM;AAAE,KAAC,CAAC;AACpD,EAAA;EAEA,OAAO;IACH8E,SAAS;IACTG,cAAc;IACdE,SAAS;IACTE,aAAa;IACb9G,QAAQ;IACRC,QAAQ;IACRC,IAAI;IACJmD,WAAW,EAAEH,eAAe,CAACzB,MAAM;GACtC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASyF,cAAcA,CAACnF,MAAM,EAAEC,KAAK,EAAEmF,SAAS,EAChD;EACIpF,MAAM,CAACgC,EAAE,CAACoD,SAAS,CAACZ,SAAS,CAACvC,MAAM,CAAC;AACrC,EAAA,KAAK,MAAMoD,QAAQ,IAAID,SAAS,CAACZ,SAAS,EAC1C;AACIxE,IAAAA,MAAM,CAACgC,EAAE,CAACqD,QAAQ,CAACX,YAAY,CAAC;AAChC1E,IAAAA,MAAM,CAACE,GAAG,CAACmF,QAAQ,CAACjB,aAAa,CAAC;AAClCpE,IAAAA,MAAM,CAACE,GAAG,CAACmF,QAAQ,CAACZ,aAAa,CAAC;AAClCzE,IAAAA,MAAM,CAACgC,EAAE,CAACqD,QAAQ,CAAChB,aAAa,CAAC;AACrC,EAAA;EAEArE,MAAM,CAACgC,EAAE,CAACoD,SAAS,CAACT,cAAc,CAAC1C,MAAM,CAAC;AAC1C,EAAA,KAAK,MAAMgC,OAAO,IAAImB,SAAS,CAACT,cAAc,EAC9C;AACIL,IAAAA,kBAAkB,CAACtE,MAAM,EAAEiE,OAAO,CAAC;AACvC,EAAA;EAEAjE,MAAM,CAACE,GAAG,CAACkF,SAAS,CAACP,SAAS,CAAC5C,MAAM,CAAC;AACtC,EAAA,KAAK,MAAMQ,QAAQ,IAAI2C,SAAS,CAACP,SAAS,EAC1C;AACIrC,IAAAA,aAAa,CAACxC,MAAM,EAAEC,KAAK,EAAEwC,QAAQ,CAAC;AAC1C,EAAA;EAEA1C,YAAY,CAACC,MAAM,EAAEC,KAAK,EAAEmF,SAAS,CAACL,aAAa,CAAC;;AAEpD;AACA;AACA;EACAhE,WAAW,CAACqE,SAAS,CAACnH,QAAQ,CAACgE,MAAM,EAAE,UAAU,EAAE5B,UAAU,CAAC;EAC9DU,WAAW,CAACqE,SAAS,CAAClH,QAAQ,CAAC+D,MAAM,EAAE,UAAU,EAAE5B,UAAU,CAAC;EAC9DU,WAAW,CAACqE,SAAS,CAACjH,IAAI,CAAC8D,MAAM,EAAE,MAAM,EAAE5B,UAAU,CAAC;EAEtDL,MAAM,CAACgC,EAAE,CAACoD,SAAS,CAACnH,QAAQ,CAACgE,MAAM,CAAC;AACpC,EAAA,KAAK,MAAMW,OAAO,IAAIwC,SAAS,CAACnH,QAAQ,EACxC;AACI+B,IAAAA,MAAM,CAACgC,EAAE,CAACY,OAAO,CAACwB,aAAa,CAAC;AAChCzB,IAAAA,YAAY,CAAC3C,MAAM,EAAEC,KAAK,EAAE2C,OAAO,CAAC;AACxC,EAAA;EAEA5C,MAAM,CAACgC,EAAE,CAACoD,SAAS,CAAClH,QAAQ,CAAC+D,MAAM,CAAC;AACpC,EAAA,KAAK,MAAMgC,OAAO,IAAImB,SAAS,CAAClH,QAAQ,EACxC;AACI8B,IAAAA,MAAM,CAACgC,EAAE,CAACiC,OAAO,CAACG,aAAa,CAAC;AAChCJ,IAAAA,YAAY,CAAChE,MAAM,EAAEC,KAAK,EAAEgE,OAAO,CAAC;AACxC,EAAA;EAEAjE,MAAM,CAACgC,EAAE,CAACoD,SAAS,CAACjH,IAAI,CAAC8D,MAAM,CAAC;AAChC,EAAA,KAAK,MAAMc,GAAG,IAAIqC,SAAS,CAACjH,IAAI,EAChC;AACI6B,IAAAA,MAAM,CAACgC,EAAE,CAACe,GAAG,CAACqB,aAAa,CAAC;AAC5BtB,IAAAA,QAAQ,CAAC9C,MAAM,EAAEC,KAAK,EAAE8C,GAAG,CAAC;AAChC,EAAA;EAEAhB,gBAAgB,CAAC/B,MAAM,EAAEC,KAAK,EAAEmF,SAAS,CAAC9D,WAAW,CAAC;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASgE,SAASA,CAAC5F,MAAM,EAAEiB,SAAS,EACpC;AACI,EAAA,MAAMc,IAAI,GAAG/B,MAAM,CAAC2B,SAAS,EAAE;AAC/B,EAAA,MAAMkE,UAAU,GAAG1F,WAAW,CAACH,MAAM,CAAC;EACtC,MAAM8F,eAAe,GAAG,CAAE9F,MAAM,CAACC,UAAU,EAAE,EAAED,MAAM,CAACC,UAAU,EAAE,EAAED,MAAM,CAACC,UAAU,EAAE,CAAE;EAEzF,MAAM7B,cAAc,GAAG,EAAE;AACzB,EAAA,MAAM2H,kBAAkB,GAAG1E,WAAW,CAACrB,MAAM,CAAC2B,SAAS,EAAE,EAAE,gBAAgB,EAAEV,SAAS,CAAC;AACvF,EAAA,KAAK,IAAIY,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGkE,kBAAkB,EAAElE,KAAK,IAAI,CAAC,EAC1D;IACIzD,cAAc,CAAC4D,IAAI,CAAC;AAChBgE,MAAAA,KAAK,EAAEhG,MAAM,CAAC2B,SAAS,EAAE;AACzB+C,MAAAA,aAAa,EAAE1E,MAAM,CAAC2B,SAAS,EAAE;AACjCsE,MAAAA,UAAU,EAAEjG,MAAM,CAAC2B,SAAS,EAAE;AAC9BuE,MAAAA,QAAQ,EAAElG,MAAM,CAAC2B,SAAS,EAAE;AAC5BI,MAAAA,IAAI,EAAE/B,MAAM,CAAC2B,SAAS,EAAE;AACxBe,MAAAA,SAAS,EAAE1C,MAAM,CAAC2B,SAAS;AAC/B,KAAC,CAAC;AACN,EAAA;EAEA,OAAO;IACHI,IAAI;IACJ8D,UAAU;IACVC,eAAe;IACf1H,cAAc;AACd,IAAA,GAAGyG,aAAa,CAAC7E,MAAM,EAAEiB,SAAS;GACrC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASkF,UAAUA,CAAC7F,MAAM,EAAEC,KAAK,EAAE6F,KAAK,EACxC;EACI/E,WAAW,CAAC+E,KAAK,CAAChI,cAAc,CAACmE,MAAM,EAAE,gBAAgB,EAAE5B,UAAU,CAAC;AACtEL,EAAAA,MAAM,CAACgC,EAAE,CAAC8D,KAAK,CAACrE,IAAI,CAAC;EACrB1B,YAAY,CAACC,MAAM,EAAEC,KAAK,EAAE6F,KAAK,CAACP,UAAU,CAAC;EAC7CvF,MAAM,CAACE,GAAG,CAAC4F,KAAK,CAACN,eAAe,CAAC,CAAC,CAAC,CAAC;EACpCxF,MAAM,CAACE,GAAG,CAAC4F,KAAK,CAACN,eAAe,CAAC,CAAC,CAAC,CAAC;EACpCxF,MAAM,CAACE,GAAG,CAAC4F,KAAK,CAACN,eAAe,CAAC,CAAC,CAAC,CAAC;EAEpCxF,MAAM,CAACgC,EAAE,CAAC8D,KAAK,CAAChI,cAAc,CAACmE,MAAM,CAAC;AACtC,EAAA,KAAK,MAAM8D,KAAK,IAAID,KAAK,CAAChI,cAAc,EACxC;AACIkC,IAAAA,MAAM,CAACgC,EAAE,CAAC+D,KAAK,CAACL,KAAK,CAAC;AACtB1F,IAAAA,MAAM,CAACgC,EAAE,CAAC+D,KAAK,CAAC3B,aAAa,CAAC;AAC9BpE,IAAAA,MAAM,CAACgC,EAAE,CAAC+D,KAAK,CAACJ,UAAU,CAAC;AAC3B3F,IAAAA,MAAM,CAACgC,EAAE,CAAC+D,KAAK,CAACH,QAAQ,CAAC;AACzB5F,IAAAA,MAAM,CAACgC,EAAE,CAAC+D,KAAK,CAACtE,IAAI,CAAC;AACrBzB,IAAAA,MAAM,CAACgC,EAAE,CAAC+D,KAAK,CAAC3D,SAAS,CAAC;AAC9B,EAAA;AAEA+C,EAAAA,cAAc,CAACnF,MAAM,EAAEC,KAAK,EAAE6F,KAAK,CAAC;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASE,QAAQA,CAACtG,MAAM,EAAEiB,SAAS,EAAEsF,OAAO,EAC5C;EACI,MAAMjI,MAAM,GAAG,EAAE;AACjB,EAAA,MAAMkI,UAAU,GAAGnF,WAAW,CAACrB,MAAM,CAAC2B,SAAS,EAAE,EAAE,QAAQ,EAAEV,SAAS,CAAC;AACvE,EAAA,KAAK,IAAIY,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG2E,UAAU,EAAE3E,KAAK,IAAI,CAAC,EAClD;IACIvD,MAAM,CAAC0D,IAAI,CAAC4D,SAAS,CAAC5F,MAAM,EAAEiB,SAAS,CAAC,CAAC;AAC7C,EAAA;EAEA,MAAMvC,YAAY,GAAG,EAAE;AACvB,EAAA,MAAM+H,UAAU,GAAGpF,WAAW,CAACrB,MAAM,CAAC2B,SAAS,EAAE,EAAE,cAAc,EAAEV,SAAS,CAAC;AAC7E,EAAA,KAAK,IAAIY,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG4E,UAAU,EAAE5E,KAAK,IAAI,CAAC,EAClD;IACInD,YAAY,CAACsD,IAAI,CAAC;AAAE0E,MAAAA,KAAK,EAAE1G,MAAM,CAACC,UAAU,EAAE;AAAEP,MAAAA,KAAK,EAAEM,MAAM,CAACC,UAAU;AAAG,KAAC,CAAC;AACjF,EAAA;;AAEA;AACA;AACA;EACA,MAAM0G,YAAY,GAAGJ,OAAO,GAAGpG,WAAW,CAACH,MAAM,CAAC,GAAG,IAAI;EAEzD,OAAO;IAAE1B,MAAM;IAAEI,YAAY;AAAE,IAAA,IAAIiI,YAAY,GAAG;AAAEA,MAAAA;KAAc,GAAG,EAAE;GAAG;AAC9E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,SAASA,CAACtG,MAAM,EAAEC,KAAK,EAAEsG,IAAI,EAAEN,OAAO,EAC/C;EACIjG,MAAM,CAACgC,EAAE,CAACuE,IAAI,CAACvI,MAAM,CAACiE,MAAM,CAAC;AAC7B,EAAA,KAAK,MAAM6D,KAAK,IAAIS,IAAI,CAACvI,MAAM,EAC/B;AACI6H,IAAAA,UAAU,CAAC7F,MAAM,EAAEC,KAAK,EAAE6F,KAAK,CAAC;AACpC,EAAA;EACA9F,MAAM,CAACgC,EAAE,CAACuE,IAAI,CAACnI,YAAY,CAAC6D,MAAM,CAAC;AACnC,EAAA,KAAK,MAAMuE,KAAK,IAAID,IAAI,CAACnI,YAAY,EACrC;AACI4B,IAAAA,MAAM,CAACE,GAAG,CAACsG,KAAK,CAACJ,KAAK,CAAC;AACvBpG,IAAAA,MAAM,CAACE,GAAG,CAACsG,KAAK,CAACpH,KAAK,CAAC;AAC3B,EAAA;AACA,EAAA,IAAI6G,OAAO,EACX;IACIlG,YAAY,CAACC,MAAM,EAAEC,KAAK,EAAEsG,IAAI,CAACF,YAAY,IAAIlG,UAAU,CAAC;AAChE,EAAA;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASsG,WAAWA,CAAC/G,MAAM,EAAEiB,SAAS,EACtC;AACI,EAAA,MAAM+F,WAAW,GAAGhH,MAAM,CAACC,UAAU,EAAE;AACvC,EAAA,MAAM4F,UAAU,GAAG1F,WAAW,CAACH,MAAM,CAAC;EAEtC,MAAMiH,OAAO,GAAG,EAAE;AAClB,EAAA,MAAMC,WAAW,GAAGlH,MAAM,CAACC,UAAU,EAAE;AACvC,EAAA,KAAK,IAAI4B,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGqF,WAAW,EAAErF,KAAK,IAAI,CAAC,EACnD;IACIoF,OAAO,CAACjF,IAAI,CAAC;AAAED,MAAAA,IAAI,EAAE/B,MAAM,CAAC2B,SAAS,EAAE;MAAEG,IAAI,EAAE/B,aAAa,CAACC,MAAM;AAAE,KAAC,CAAC;AAC3E,EAAA;EAEA,OAAO;IACHgH,WAAW;IACXnB,UAAU;IACVoB,OAAO;AACPE,IAAAA,YAAY,EAAEpH,aAAa,CAACC,MAAM,CAAC;AACnCoH,IAAAA,YAAY,EAAEvC,aAAa,CAAC7E,MAAM,EAAEiB,SAAS,CAAC;AAC9CoG,IAAAA,WAAW,EAAExC,aAAa,CAAC7E,MAAM,EAAEiB,SAAS;GAC/C;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASqG,YAAYA,CAAChH,MAAM,EAAEC,KAAK,EAAEgH,OAAO,EAC5C;AACIjH,EAAAA,MAAM,CAACE,GAAG,CAAC+G,OAAO,CAACP,WAAW,CAAC;EAC/B3G,YAAY,CAACC,MAAM,EAAEC,KAAK,EAAEgH,OAAO,CAAC1B,UAAU,CAAC;EAC/CvF,MAAM,CAACE,GAAG,CAAC+G,OAAO,CAACN,OAAO,CAAC1E,MAAM,CAAC;AAClC,EAAA,KAAK,MAAMuE,KAAK,IAAIS,OAAO,CAACN,OAAO,EACnC;AACI3G,IAAAA,MAAM,CAACgC,EAAE,CAACwE,KAAK,CAAC/E,IAAI,CAAC;IACrBzB,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAAC4H,KAAK,CAAChF,IAAI,CAAC,CAAC;AACxC,EAAA;EACAxB,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAACqI,OAAO,CAACJ,YAAY,CAAC,CAAC;EAC9C1B,cAAc,CAACnF,MAAM,EAAEC,KAAK,EAAEgH,OAAO,CAACH,YAAY,CAAC;EACnD3B,cAAc,CAACnF,MAAM,EAAEC,KAAK,EAAEgH,OAAO,CAACF,WAAW,CAAC;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,qBAAqBA,CAACxH,MAAM,EAAEyH,OAAO,GAAG,EAAE,EAC1D;AACI,EAAA,MAAMxG,SAAS,GAAGwG,OAAO,CAACxG,SAAS,KAC3B,CAACL,OAAO,EAAEC,OAAO,KAAKb,MAAM,CAAC0H,MAAM,CAAC9G,OAAO,EAAEC,OAAO,CAAC,CAAC;AAC9D,EAAA,MAAM0F,OAAO,GAAGkB,OAAO,CAAClB,OAAO,KAAK,IAAI;EAExC,MAAMoB,UAAU,GAAG,EAAE;AACrB,EAAA,MAAMC,cAAc,GAAG5H,MAAM,CAAC2B,SAAS,EAAE;AACzC,EAAA,KAAK,IAAIkG,cAAc,GAAG,CAAC,EAAEA,cAAc,GAAGD,cAAc,EAAEC,cAAc,IAAI,CAAC,EACjF;AACI,IAAA,MAAM/F,IAAI,GAAG/B,aAAa,CAACC,MAAM,CAAC;IAElC,MAAM3B,MAAM,GAAG,EAAE;AACjB,IAAA,MAAMyJ,SAAS,GAAGzG,WAAW,CAACrB,MAAM,CAAC2B,SAAS,EAAE,EAAE,QAAQ,EAAEV,SAAS,CAAC;AACtE,IAAA,KAAK,IAAI8G,SAAS,GAAG,CAAC,EAAEA,SAAS,GAAGD,SAAS,EAAEC,SAAS,IAAI,CAAC,EAC7D;MACI1J,MAAM,CAAC2D,IAAI,CAACsE,QAAQ,CAACtG,MAAM,EAAEiB,SAAS,EAAEsF,OAAO,CAAC,CAAC;AACrD,IAAA;IAEA,MAAMyB,SAAS,GAAG,EAAE;AACpB,IAAA,MAAMC,YAAY,GAAGjI,MAAM,CAAC2B,SAAS,EAAE;AACvC,IAAA,KAAK,IAAIuG,YAAY,GAAG,CAAC,EAAEA,YAAY,GAAGD,YAAY,EAAEC,YAAY,IAAI,CAAC,EACzE;MACIF,SAAS,CAAChG,IAAI,CAAC+E,WAAW,CAAC/G,MAAM,EAAEiB,SAAS,CAAC,CAAC;AAClD,IAAA;IAEA0G,UAAU,CAAC3F,IAAI,CAAC;MAAEF,IAAI;MAAEzD,MAAM;AAAE2J,MAAAA;AAAU,KAAC,CAAC;AAChD,EAAA;EAEA,MAAMpG,WAAW,GAAG,EAAE;AACtB,EAAA,MAAMuG,cAAc,GAAG9G,WAAW,CAACrB,MAAM,CAACoI,UAAU,EAAE,EAAE,mBAAmB,EAAEnH,SAAS,CAAC;AACvF,EAAA,KAAK,IAAIY,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGsG,cAAc,EAAEtG,KAAK,IAAI,CAAC,EACtD;IACID,WAAW,CAACI,IAAI,CAAC;AAAEF,MAAAA,IAAI,EAAE/B,aAAa,CAACC,MAAM,CAAC;MAAE4B,WAAW,EAAEH,eAAe,CAACzB,MAAM;AAAE,KAAC,CAAC;AAC3F,EAAA;AAEAe,EAAAA,iBAAiB,CAACf,MAAM,EAAE,kBAAkB,EAAEiB,SAAS,CAAC;EAExD,OAAO;IAAE0G,UAAU;AAAE/F,IAAAA;GAAa;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASyG,sBAAsBA,CAAC/H,MAAM,EAAEgI,WAAW,EAAEb,OAAO,GAAG,EAAE,EACxE;AACI,EAAA,MAAMlH,KAAK,GAAGkH,OAAO,CAAClH,KAAK,IAAItB,gBAAgB;AAC/C,EAAA,MAAMsH,OAAO,GAAGkB,OAAO,CAAClB,OAAO,KAAK,IAAI;EAExCjG,MAAM,CAACgC,EAAE,CAACgG,WAAW,CAACX,UAAU,CAACpF,MAAM,CAAC;AACxC,EAAA,KAAK,MAAMgG,SAAS,IAAID,WAAW,CAACX,UAAU,EAC9C;IACIrH,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAACqJ,SAAS,CAACzG,IAAI,CAAC,CAAC;AACxCxB,IAAAA,MAAM,CAACgC,EAAE,CAACjB,WAAW,CAACkH,SAAS,CAAClK,MAAM,CAACkE,MAAM,EAAE,QAAQ,EAAE5B,UAAU,CAAC,CAAC;AACrE,IAAA,KAAK,MAAMkG,IAAI,IAAI0B,SAAS,CAAClK,MAAM,EACnC;MACIgD,WAAW,CAACwF,IAAI,CAACvI,MAAM,CAACiE,MAAM,EAAE,QAAQ,EAAE5B,UAAU,CAAC;MACrDU,WAAW,CAACwF,IAAI,CAACnI,YAAY,CAAC6D,MAAM,EAAE,cAAc,EAAE5B,UAAU,CAAC;MACjEiG,SAAS,CAACtG,MAAM,EAAEC,KAAK,EAAEsG,IAAI,EAAEN,OAAO,CAAC;AAC3C,IAAA;IACAjG,MAAM,CAACgC,EAAE,CAACiG,SAAS,CAACP,SAAS,CAACzF,MAAM,CAAC;AACrC,IAAA,KAAK,MAAMgF,OAAO,IAAIgB,SAAS,CAACP,SAAS,EACzC;AACIV,MAAAA,YAAY,CAAChH,MAAM,EAAEC,KAAK,EAAEgH,OAAO,CAAC;AACxC,IAAA;AACJ,EAAA;AAEAjH,EAAAA,MAAM,CAACkI,GAAG,CAACnH,WAAW,CAACiH,WAAW,CAAC1G,WAAW,CAACW,MAAM,EAAE,mBAAmB,EAAE5B,UAAU,CAAC,CAAC;AACxF,EAAA,KAAK,MAAM8H,SAAS,IAAIH,WAAW,CAAC1G,WAAW,EAC/C;IACItB,MAAM,CAACE,GAAG,CAACD,KAAK,CAACrB,MAAM,CAACuJ,SAAS,CAAC3G,IAAI,CAAC,CAAC;IACxCO,gBAAgB,CAAC/B,MAAM,EAAEC,KAAK,EAAEkI,SAAS,CAAC7G,WAAW,CAAC;AAC1D,EAAA;AAEA,EAAA,OAAOtB,MAAM;AACjB;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const textEncoder = new TextEncoder();
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Compares two strings by their UTF-8 bytes, unsigned.
|
|
5
|
+
*
|
|
6
|
+
* This is `strcmp` order, and it is the only string comparison allowed to decide
|
|
7
|
+
* emitted bytes anywhere in this package.
|
|
8
|
+
*
|
|
9
|
+
* `String.prototype.localeCompare` cannot be used for that job. Without an
|
|
10
|
+
* explicit locale it is implementation- and ICU-dependent, so the same input can
|
|
11
|
+
* order differently across Node builds; it treats case as a minor difference, so
|
|
12
|
+
* `"Z"` sorts *after* `"a"` where bytes put it before; and it gives punctuation
|
|
13
|
+
* variable weight, so `-`, `:` and `@` — which appear in every binding identity we
|
|
14
|
+
* sort — are not ordered by code point. Any of those is enough to make a build
|
|
15
|
+
* unreproducible.
|
|
16
|
+
*
|
|
17
|
+
* Carbon compares the same way, both in its string table (`Blob::operator<`,
|
|
18
|
+
* `StringTable.h:109-122`) and when it sorts annotation keys before writing them
|
|
19
|
+
* (`strcmp`, `EffectData.h:613-616`).
|
|
20
|
+
*
|
|
21
|
+
* @param {string} left First string.
|
|
22
|
+
* @param {string} right Second string.
|
|
23
|
+
* @returns {number} Negative, zero, or positive ordering result.
|
|
24
|
+
*/
|
|
25
|
+
function compareUtf8(left, right) {
|
|
26
|
+
const a = textEncoder.encode(String(left));
|
|
27
|
+
const b = textEncoder.encode(String(right));
|
|
28
|
+
const shared = Math.min(a.length, b.length);
|
|
29
|
+
for (let index = 0; index < shared; index += 1) {
|
|
30
|
+
if (a[index] !== b[index]) return a[index] - b[index];
|
|
31
|
+
}
|
|
32
|
+
return a.length - b.length;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { compareUtf8 };
|
|
36
|
+
//# sourceMappingURL=compareUtf8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compareUtf8.js","sources":["../../../src/format/compareUtf8.js"],"sourcesContent":["const textEncoder = new TextEncoder();\n\n/**\n * Compares two strings by their UTF-8 bytes, unsigned.\n *\n * This is `strcmp` order, and it is the only string comparison allowed to decide\n * emitted bytes anywhere in this package.\n *\n * `String.prototype.localeCompare` cannot be used for that job. Without an\n * explicit locale it is implementation- and ICU-dependent, so the same input can\n * order differently across Node builds; it treats case as a minor difference, so\n * `\"Z\"` sorts *after* `\"a\"` where bytes put it before; and it gives punctuation\n * variable weight, so `-`, `:` and `@` — which appear in every binding identity we\n * sort — are not ordered by code point. Any of those is enough to make a build\n * unreproducible.\n *\n * Carbon compares the same way, both in its string table (`Blob::operator<`,\n * `StringTable.h:109-122`) and when it sorts annotation keys before writing them\n * (`strcmp`, `EffectData.h:613-616`).\n *\n * @param {string} left First string.\n * @param {string} right Second string.\n * @returns {number} Negative, zero, or positive ordering result.\n */\nexport function compareUtf8(left, right)\n{\n const a = textEncoder.encode(String(left));\n const b = textEncoder.encode(String(right));\n const shared = Math.min(a.length, b.length);\n for (let index = 0; index < shared; index += 1)\n {\n if (a[index] !== b[index]) return a[index] - b[index];\n }\n return a.length - b.length;\n}\n\nexport default compareUtf8;\n"],"names":["textEncoder","TextEncoder","compareUtf8","left","right","a","encode","String","b","shared","Math","min","length","index"],"mappings":"AAAA,MAAMA,WAAW,GAAG,IAAIC,WAAW,EAAE;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,WAAWA,CAACC,IAAI,EAAEC,KAAK,EACvC;EACI,MAAMC,CAAC,GAAGL,WAAW,CAACM,MAAM,CAACC,MAAM,CAACJ,IAAI,CAAC,CAAC;EAC1C,MAAMK,CAAC,GAAGR,WAAW,CAACM,MAAM,CAACC,MAAM,CAACH,KAAK,CAAC,CAAC;AAC3C,EAAA,MAAMK,MAAM,GAAGC,IAAI,CAACC,GAAG,CAACN,CAAC,CAACO,MAAM,EAAEJ,CAAC,CAACI,MAAM,CAAC;AAC3C,EAAA,KAAK,IAAIC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGJ,MAAM,EAAEI,KAAK,IAAI,CAAC,EAC9C;AACI,IAAA,IAAIR,CAAC,CAACQ,KAAK,CAAC,KAAKL,CAAC,CAACK,KAAK,CAAC,EAAE,OAAOR,CAAC,CAACQ,KAAK,CAAC,GAAGL,CAAC,CAACK,KAAK,CAAC;AACzD,EAAA;AACA,EAAA,OAAOR,CAAC,CAACO,MAAM,GAAGJ,CAAC,CAACI,MAAM;AAC9B;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { CjsReader } from './CjsReader.js';
|
|
2
|
+
export { CjsFormatReadError, CjsFormatWriteError } from './CjsFormatError.js';
|
|
3
|
+
export { CjsByteReader } from './CjsByteReader.js';
|
|
4
|
+
export { CjsByteWriter } from './CjsByteWriter.js';
|
|
5
|
+
export { CJS_STRING_TABLE_NULL_REFERENCE, CjsStringTable, compareTableBlobs } from './CjsStringTable.js';
|
|
6
|
+
export { CARBON_ANNOTATION_TYPE, CARBON_EFFECT_COUNT_CAPS, CARBON_EFFECT_DATA_VERSION, CARBON_SHADER_CONSTANTS_MAX, collectArena, compareAnnotationNames, internArena, passthroughArena, readEffectDescription, writeEffectDescription } from './carbonEffect/carbonEffectRecords.js';
|
|
7
|
+
export { CARBON_BACKEND_RESOURCE_KIND, CARBON_BACKEND_TRANSFORM_FAMILY, CARBON_BACKEND_VISIBILITY, CARBON_EFFECT_BACKEND_BLOCK_VERSION, DETAIL_MAP_ARRAY_DEFAULTS, readBackendBlock, writeBackendBlock } from './carbonEffect/carbonEffectBackendBlock.js';
|
|
8
|
+
export { carbonDescriptionFromPortable } from './carbonEffect/carbonDescriptionFromPortable.js';
|
|
9
|
+
export { CARBON_EFFECT_RECORD_BYTES, CARBON_EFFECT_SOURCE_HASH_BYTES, CjsCarbonEffectBodyReader, CjsCarbonEffectReader } from './carbonEffect/CjsCarbonEffectReader.js';
|
|
10
|
+
export { CjsCarbonEffectWriter, writeCarbonEffectFile } from './carbonEffect/CjsCarbonEffectWriter.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { wwiseIdFromName, joinSoundbanksInfo, buildSoundbanksCatalog, parseSoundbanksInfo, isSoundbanksInfo } from './core/soundbanksInfo.js';
|
|
2
2
|
import { DEFAULT_VALUES, normalizeValues, readWithValues, inspectWithValues, isSupportedWithValues, toJsonValue, toBytes, extractMedia, isBNK, OUTPUT_MEDIA, OUTPUT_BNK_JSON, OUTPUT_JSON, OUTPUT_RAW, HIRC_TYPE_NAMES } from './core/helpers.js';
|
|
3
3
|
import { eventMediaFromBanks } from './core/graph.js';
|
|
4
|
+
import { parseEventAction } from './core/eventAction.js';
|
|
4
5
|
import { parseMusicSwitch, parseMusicPlaylist, parseMusicTrack, parseMusicSegment, musicNodesFromBanks } from './core/musicNodes.js';
|
|
6
|
+
import { parseSfxLayer, parseSfxSwitch, parseSfxRandomSequence, parseSfxAttenuation, parseSfxActorMixer, sfxNodesFromBanks } from './core/sfxNodes.js';
|
|
5
7
|
|
|
6
8
|
const FORMAT_NAME = "CjsBnkFormat";
|
|
7
9
|
|
|
@@ -209,7 +211,14 @@ class CjsBnkFormat {
|
|
|
209
211
|
* `parseMusicSegment/Track/Playlist/Switch`) turn the music-hierarchy
|
|
210
212
|
* entries (HIRC 10-13) into typed nodes - children, meter, cue markers,
|
|
211
213
|
* clips, playlist trees, decision trees, and transition rules. See
|
|
212
|
-
* core/musicNodes.js for the anchored, exact-end-validated parse.
|
|
214
|
+
* core/musicNodes.js for the anchored, exact-end-validated parse.
|
|
215
|
+
*
|
|
216
|
+
* The v150 authored-SFX decoders (`sfxNodesFromBanks` and the per-type
|
|
217
|
+
* Event Action, Random/Sequence, Switch, Layer, Actor-Mixer, and
|
|
218
|
+
* Attenuation parsers)
|
|
219
|
+
* preserve raw Wwise semantics for runtime-audio's optional builder.
|
|
220
|
+
* NodeBase facts, hierarchy-only Actor-Mixers, and attenuation objects
|
|
221
|
+
* remain distinct from playable container behavior.
|
|
213
222
|
*/
|
|
214
223
|
static wwise = Object.freeze({
|
|
215
224
|
isSoundbanksInfo,
|
|
@@ -218,11 +227,18 @@ class CjsBnkFormat {
|
|
|
218
227
|
joinSoundbanksInfo,
|
|
219
228
|
wwiseIdFromName,
|
|
220
229
|
eventMediaFromBanks,
|
|
230
|
+
parseEventAction,
|
|
221
231
|
musicNodesFromBanks,
|
|
222
232
|
parseMusicSegment,
|
|
223
233
|
parseMusicTrack,
|
|
224
234
|
parseMusicPlaylist,
|
|
225
|
-
parseMusicSwitch
|
|
235
|
+
parseMusicSwitch,
|
|
236
|
+
sfxNodesFromBanks,
|
|
237
|
+
parseSfxActorMixer,
|
|
238
|
+
parseSfxAttenuation,
|
|
239
|
+
parseSfxRandomSequence,
|
|
240
|
+
parseSfxSwitch,
|
|
241
|
+
parseSfxLayer
|
|
226
242
|
});
|
|
227
243
|
|
|
228
244
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CjsBnkFormat.js","sources":["../../../../src/formats/bnk/CjsBnkFormat.js"],"sourcesContent":["import {\r\n buildSoundbanksCatalog,\r\n isSoundbanksInfo,\r\n joinSoundbanksInfo,\r\n parseSoundbanksInfo,\r\n wwiseIdFromName\r\n} from \"./core/soundbanksInfo.js\";\r\nimport {\r\n DEFAULT_VALUES,\r\n HIRC_TYPE_NAMES,\r\n OUTPUT_BNK_JSON,\r\n OUTPUT_JSON,\r\n OUTPUT_MEDIA,\r\n OUTPUT_RAW,\r\n extractMedia,\r\n inspectWithValues,\r\n isBNK,\r\n isSupportedWithValues,\r\n normalizeValues,\r\n readWithValues,\r\n toBytes,\r\n toJsonValue\r\n} from \"./core/helpers.js\";\r\nimport { eventMediaFromBanks } from \"./core/graph.js\";\r\nimport {\r\n musicNodesFromBanks,\r\n parseMusicPlaylist,\r\n parseMusicSegment,\r\n parseMusicSwitch,\r\n parseMusicTrack\r\n} from \"./core/musicNodes.js\";\r\n\r\nconst FORMAT_NAME = \"CjsBnkFormat\";\r\n\r\n/**\r\n * Reader for Audiokinetic Wwise soundbank (.bnk) containers.\r\n *\r\n * Inspection decodes the bank header, embedded media index, object hierarchy\r\n * listing (with version-stable typed fields), and referenced bank names\r\n * without copying payloads. Read can emit the raw bank, debug JSON, or the\r\n * embedded media items undecoded. The read path stays a pure container\r\n * reader; the Wwise-domain toolkit (SoundbanksInfo catalog helpers, id hash,\r\n * event -> media graph resolution) is grouped under the `wwise` static.\r\n */\r\nexport class CjsBnkFormat\n{\n #values = DEFAULT_VALUES;\n\n /**\n * Browser-worker module declaration consumed by CjsResManWorkerLoader.\n */\n static worker = Object.freeze({\n module: import.meta.url,\n exportName: \"CjsBnkFormat\"\n });\n\r\n /**\r\n * Create a reusable bnk format profile.\r\n *\r\n * @param {object} [options] Default read/inspect options.\r\n */\r\n constructor(options = {})\r\n {\r\n this.SetValues(options);\r\n }\r\n\r\n /**\r\n * Merge options into this profile.\r\n *\r\n * @param {object} [options] Values to merge.\r\n * @returns {CjsBnkFormat} This format profile.\r\n */\r\n SetValues(options = {})\r\n {\r\n this.#values = normalizeValues(this.#values, options, FORMAT_NAME);\r\n return this;\r\n }\r\n\r\n /**\r\n * Get normalized profile values with optional per-call overrides.\r\n *\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Normalized read values.\r\n */\r\n GetValues(options = {})\r\n {\r\n return normalizeValues(this.#values, options, FORMAT_NAME);\r\n }\r\n\r\n /**\r\n * Read soundbank bytes with this profile.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n Read(input, options = {})\r\n {\r\n return readWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Read soundbank bytes asynchronously with this profile.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {Promise<object>} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n async ReadAsync(input, options = {})\r\n {\r\n return this.Read(input, options);\r\n }\r\n\r\n /**\r\n * Inspect soundbank bytes without copying media payloads.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Soundbank metadata.\r\n */\r\n Inspect(input, options = {})\r\n {\r\n return inspectWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Report whether soundbank input and requested output variants are supported.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Support/probe report.\r\n */\r\n IsSupported(input, options = {})\r\n {\r\n return isSupportedWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Convert format output into JSON-compatible debug data.\r\n *\r\n * @param {any} value Format output.\r\n * @returns {any} JSON-compatible value.\r\n */\r\n ToJSON(value)\r\n {\r\n return toJsonValue(value);\r\n }\r\n\r\n /**\r\n * One-shot soundbank read.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Read options.\r\n * @returns {object} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n static read(input, options = {})\r\n {\r\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * One-shot asynchronous soundbank read.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Read options.\r\n * @returns {Promise<object>} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n static async readAsync(input, options = {})\r\n {\r\n return CjsBnkFormat.read(input, options);\r\n }\r\n\r\n /**\r\n * One-shot soundbank inspection.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Inspect options.\r\n * @returns {object} Soundbank metadata.\r\n */\r\n static inspect(input, options = {})\r\n {\r\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * One-shot soundbank support probe.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Probe options.\r\n * @returns {object} Support/probe report.\r\n */\r\n static isSupported(input, options = {})\r\n {\r\n return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * Extract embedded media payloads as views over the soundbank bytes.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {number} [mediaId] Optional single media id filter.\r\n * @returns {Array<object>} Extracted media items with undecoded bytes.\r\n */\r\n static extractMedia(input, mediaId)\r\n {\r\n const bytes = toBytes(input);\r\n const metadata = inspectWithValues(bytes, DEFAULT_VALUES);\r\n return extractMedia(bytes, metadata, mediaId);\r\n }\r\n\r\n /**\r\n * Convert format output into JSON-compatible debug data.\r\n *\r\n * @param {any} value Format output.\r\n * @returns {any} JSON-compatible value.\r\n */\r\n static toJSON(value)\r\n {\r\n return toJsonValue(value);\r\n }\r\n\r\n /**\r\n * Test whether bytes look like a Wwise soundbank.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate soundbank bytes.\r\n * @returns {boolean} True when the BKHD header chunk is present.\r\n */\r\n static isBNK(input)\r\n {\r\n try\r\n {\r\n return isBNK(toBytes(input));\r\n }\r\n catch\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Wwise-domain toolkit, grouped apart from the container-reading statics -\r\n * the single home for the SoundbanksInfo catalog helpers\r\n * (`isSoundbanksInfo`, `parseSoundbanksInfo`, `buildSoundbanksCatalog`,\r\n * `joinSoundbanksInfo`), the id hash (`wwiseIdFromName`, FNV-1 of the\r\n * lowercased name), and event-graph resolution.\r\n *\r\n * `eventMediaFromBanks(inspections, options)` is graph interpretation over\r\n * `inspect()` results, not a read path: banks may split events from their\r\n * target objects (EVE keeps all events in one bank and their sounds in\r\n * others), so always pass every related bank to one call. Returns\r\n * `{ eventMedia: Map<eventObjectId, Set<wemId>>, diagnostics }`. See\r\n * core/graph.js for the walk policy.\r\n *\r\n * The interactive-music decoders (`musicNodesFromBanks` and the per-type\r\n * `parseMusicSegment/Track/Playlist/Switch`) turn the music-hierarchy\r\n * entries (HIRC 10-13) into typed nodes - children, meter, cue markers,\r\n * clips, playlist trees, decision trees, and transition rules. See\r\n * core/musicNodes.js for the anchored, exact-end-validated parse.\r\n */\r\n static wwise = Object.freeze({\r\n isSoundbanksInfo,\r\n parseSoundbanksInfo,\r\n buildSoundbanksCatalog,\r\n joinSoundbanksInfo,\r\n wwiseIdFromName,\r\n eventMediaFromBanks,\r\n musicNodesFromBanks,\r\n parseMusicSegment,\r\n parseMusicTrack,\r\n parseMusicPlaylist,\r\n parseMusicSwitch\r\n });\r\n\r\n /**\r\n * Emit targets for this format (canonical frozen enum).\r\n */\r\n static Output = Object.freeze({\r\n RAW: OUTPUT_RAW,\r\n JSON: OUTPUT_JSON,\r\n BNK_JSON: OUTPUT_BNK_JSON,\r\n MEDIA: OUTPUT_MEDIA\r\n });\r\n\r\n static HIRC_TYPE_NAMES = HIRC_TYPE_NAMES;\r\n\r\n static type = Object.freeze([ \"audio\" ]);\r\n\r\n static mediaTypes = Object.freeze([ \"audio\" ]);\r\n\r\n static inputTypes = Object.freeze([ \"bnk\" ]);\r\n\r\n static outputTypes = Object.freeze([ OUTPUT_RAW, OUTPUT_MEDIA ]);\r\n\r\n static debugOutputTypes = Object.freeze([ OUTPUT_BNK_JSON, OUTPUT_RAW ]);\r\n}\r\n\r\nexport default CjsBnkFormat;\r\n"],"names":["FORMAT_NAME","CjsBnkFormat","DEFAULT_VALUES","worker","Object","freeze","module","import","meta","url","exportName","constructor","options","SetValues","normalizeValues","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","IsSupported","isSupportedWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","isSupported","extractMedia","mediaId","bytes","toBytes","metadata","toJSON","isBNK","wwise","isSoundbanksInfo","parseSoundbanksInfo","buildSoundbanksCatalog","joinSoundbanksInfo","wwiseIdFromName","eventMediaFromBanks","musicNodesFromBanks","parseMusicSegment","parseMusicTrack","parseMusicPlaylist","parseMusicSwitch","Output","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","BNK_JSON","OUTPUT_BNK_JSON","MEDIA","OUTPUT_MEDIA","HIRC_TYPE_NAMES","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CjsBnkFormat.js","sources":["../../../../src/formats/bnk/CjsBnkFormat.js"],"sourcesContent":["import {\n buildSoundbanksCatalog,\r\n isSoundbanksInfo,\r\n joinSoundbanksInfo,\r\n parseSoundbanksInfo,\r\n wwiseIdFromName\r\n} from \"./core/soundbanksInfo.js\";\r\nimport {\r\n DEFAULT_VALUES,\r\n HIRC_TYPE_NAMES,\r\n OUTPUT_BNK_JSON,\r\n OUTPUT_JSON,\r\n OUTPUT_MEDIA,\r\n OUTPUT_RAW,\r\n extractMedia,\r\n inspectWithValues,\r\n isBNK,\r\n isSupportedWithValues,\r\n normalizeValues,\r\n readWithValues,\r\n toBytes,\r\n toJsonValue\r\n} from \"./core/helpers.js\";\r\nimport { eventMediaFromBanks } from \"./core/graph.js\";\nimport { parseEventAction } from \"./core/eventAction.js\";\nimport {\r\n musicNodesFromBanks,\r\n parseMusicPlaylist,\r\n parseMusicSegment,\r\n parseMusicSwitch,\r\n parseMusicTrack\r\n} from \"./core/musicNodes.js\";\nimport {\n parseSfxActorMixer,\n parseSfxAttenuation,\n parseSfxLayer,\n parseSfxRandomSequence,\n parseSfxSwitch,\n sfxNodesFromBanks\n} from \"./core/sfxNodes.js\";\n\r\nconst FORMAT_NAME = \"CjsBnkFormat\";\r\n\r\n/**\r\n * Reader for Audiokinetic Wwise soundbank (.bnk) containers.\r\n *\r\n * Inspection decodes the bank header, embedded media index, object hierarchy\r\n * listing (with version-stable typed fields), and referenced bank names\r\n * without copying payloads. Read can emit the raw bank, debug JSON, or the\r\n * embedded media items undecoded. The read path stays a pure container\r\n * reader; the Wwise-domain toolkit (SoundbanksInfo catalog helpers, id hash,\r\n * event -> media graph resolution) is grouped under the `wwise` static.\r\n */\r\nexport class CjsBnkFormat\n{\n #values = DEFAULT_VALUES;\n\n /**\n * Browser-worker module declaration consumed by CjsResManWorkerLoader.\n */\n static worker = Object.freeze({\n module: import.meta.url,\n exportName: \"CjsBnkFormat\"\n });\n\r\n /**\r\n * Create a reusable bnk format profile.\r\n *\r\n * @param {object} [options] Default read/inspect options.\r\n */\r\n constructor(options = {})\r\n {\r\n this.SetValues(options);\r\n }\r\n\r\n /**\r\n * Merge options into this profile.\r\n *\r\n * @param {object} [options] Values to merge.\r\n * @returns {CjsBnkFormat} This format profile.\r\n */\r\n SetValues(options = {})\r\n {\r\n this.#values = normalizeValues(this.#values, options, FORMAT_NAME);\r\n return this;\r\n }\r\n\r\n /**\r\n * Get normalized profile values with optional per-call overrides.\r\n *\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Normalized read values.\r\n */\r\n GetValues(options = {})\r\n {\r\n return normalizeValues(this.#values, options, FORMAT_NAME);\r\n }\r\n\r\n /**\r\n * Read soundbank bytes with this profile.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n Read(input, options = {})\r\n {\r\n return readWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Read soundbank bytes asynchronously with this profile.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {Promise<object>} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n async ReadAsync(input, options = {})\r\n {\r\n return this.Read(input, options);\r\n }\r\n\r\n /**\r\n * Inspect soundbank bytes without copying media payloads.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Soundbank metadata.\r\n */\r\n Inspect(input, options = {})\r\n {\r\n return inspectWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Report whether soundbank input and requested output variants are supported.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Support/probe report.\r\n */\r\n IsSupported(input, options = {})\r\n {\r\n return isSupportedWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Convert format output into JSON-compatible debug data.\r\n *\r\n * @param {any} value Format output.\r\n * @returns {any} JSON-compatible value.\r\n */\r\n ToJSON(value)\r\n {\r\n return toJsonValue(value);\r\n }\r\n\r\n /**\r\n * One-shot soundbank read.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Read options.\r\n * @returns {object} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n static read(input, options = {})\r\n {\r\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * One-shot asynchronous soundbank read.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Read options.\r\n * @returns {Promise<object>} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n static async readAsync(input, options = {})\r\n {\r\n return CjsBnkFormat.read(input, options);\r\n }\r\n\r\n /**\r\n * One-shot soundbank inspection.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Inspect options.\r\n * @returns {object} Soundbank metadata.\r\n */\r\n static inspect(input, options = {})\r\n {\r\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * One-shot soundbank support probe.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Probe options.\r\n * @returns {object} Support/probe report.\r\n */\r\n static isSupported(input, options = {})\r\n {\r\n return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * Extract embedded media payloads as views over the soundbank bytes.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {number} [mediaId] Optional single media id filter.\r\n * @returns {Array<object>} Extracted media items with undecoded bytes.\r\n */\r\n static extractMedia(input, mediaId)\r\n {\r\n const bytes = toBytes(input);\r\n const metadata = inspectWithValues(bytes, DEFAULT_VALUES);\r\n return extractMedia(bytes, metadata, mediaId);\r\n }\r\n\r\n /**\r\n * Convert format output into JSON-compatible debug data.\r\n *\r\n * @param {any} value Format output.\r\n * @returns {any} JSON-compatible value.\r\n */\r\n static toJSON(value)\r\n {\r\n return toJsonValue(value);\r\n }\r\n\r\n /**\r\n * Test whether bytes look like a Wwise soundbank.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate soundbank bytes.\r\n * @returns {boolean} True when the BKHD header chunk is present.\r\n */\r\n static isBNK(input)\r\n {\r\n try\r\n {\r\n return isBNK(toBytes(input));\r\n }\r\n catch\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Wwise-domain toolkit, grouped apart from the container-reading statics -\r\n * the single home for the SoundbanksInfo catalog helpers\r\n * (`isSoundbanksInfo`, `parseSoundbanksInfo`, `buildSoundbanksCatalog`,\r\n * `joinSoundbanksInfo`), the id hash (`wwiseIdFromName`, FNV-1 of the\r\n * lowercased name), and event-graph resolution.\r\n *\r\n * `eventMediaFromBanks(inspections, options)` is graph interpretation over\r\n * `inspect()` results, not a read path: banks may split events from their\r\n * target objects (EVE keeps all events in one bank and their sounds in\r\n * others), so always pass every related bank to one call. Returns\r\n * `{ eventMedia: Map<eventObjectId, Set<wemId>>, diagnostics }`. See\r\n * core/graph.js for the walk policy.\r\n *\r\n * The interactive-music decoders (`musicNodesFromBanks` and the per-type\r\n * `parseMusicSegment/Track/Playlist/Switch`) turn the music-hierarchy\r\n * entries (HIRC 10-13) into typed nodes - children, meter, cue markers,\r\n * clips, playlist trees, decision trees, and transition rules. See\r\n * core/musicNodes.js for the anchored, exact-end-validated parse.\n *\n * The v150 authored-SFX decoders (`sfxNodesFromBanks` and the per-type\n * Event Action, Random/Sequence, Switch, Layer, Actor-Mixer, and\n * Attenuation parsers)\n * preserve raw Wwise semantics for runtime-audio's optional builder.\n * NodeBase facts, hierarchy-only Actor-Mixers, and attenuation objects\n * remain distinct from playable container behavior.\n */\r\n static wwise = Object.freeze({\r\n isSoundbanksInfo,\r\n parseSoundbanksInfo,\r\n buildSoundbanksCatalog,\r\n joinSoundbanksInfo,\r\n wwiseIdFromName,\n eventMediaFromBanks,\n parseEventAction,\n musicNodesFromBanks,\r\n parseMusicSegment,\r\n parseMusicTrack,\n parseMusicPlaylist,\n parseMusicSwitch,\n sfxNodesFromBanks,\n parseSfxActorMixer,\n parseSfxAttenuation,\n parseSfxRandomSequence,\n parseSfxSwitch,\n parseSfxLayer\n });\n\r\n /**\r\n * Emit targets for this format (canonical frozen enum).\r\n */\r\n static Output = Object.freeze({\r\n RAW: OUTPUT_RAW,\r\n JSON: OUTPUT_JSON,\r\n BNK_JSON: OUTPUT_BNK_JSON,\r\n MEDIA: OUTPUT_MEDIA\r\n });\r\n\r\n static HIRC_TYPE_NAMES = HIRC_TYPE_NAMES;\r\n\r\n static type = Object.freeze([ \"audio\" ]);\r\n\r\n static mediaTypes = Object.freeze([ \"audio\" ]);\r\n\r\n static inputTypes = Object.freeze([ \"bnk\" ]);\r\n\r\n static outputTypes = Object.freeze([ OUTPUT_RAW, OUTPUT_MEDIA ]);\r\n\r\n static debugOutputTypes = Object.freeze([ OUTPUT_BNK_JSON, OUTPUT_RAW ]);\r\n}\r\n\r\nexport default CjsBnkFormat;\r\n"],"names":["FORMAT_NAME","CjsBnkFormat","DEFAULT_VALUES","worker","Object","freeze","module","import","meta","url","exportName","constructor","options","SetValues","normalizeValues","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","IsSupported","isSupportedWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","isSupported","extractMedia","mediaId","bytes","toBytes","metadata","toJSON","isBNK","wwise","isSoundbanksInfo","parseSoundbanksInfo","buildSoundbanksCatalog","joinSoundbanksInfo","wwiseIdFromName","eventMediaFromBanks","parseEventAction","musicNodesFromBanks","parseMusicSegment","parseMusicTrack","parseMusicPlaylist","parseMusicSwitch","sfxNodesFromBanks","parseSfxActorMixer","parseSfxAttenuation","parseSfxRandomSequence","parseSfxSwitch","parseSfxLayer","Output","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","BNK_JSON","OUTPUT_BNK_JSON","MEDIA","OUTPUT_MEDIA","HIRC_TYPE_NAMES","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes"],"mappings":"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"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
// Exact Wwise v150 HIRC 3 Event Action decoding. The container reader keeps
|
|
2
|
+
// the raw payload; this module adds typed action data only when a recognized
|
|
3
|
+
// layout consumes that payload exactly.
|
|
4
|
+
|
|
5
|
+
const WWISE_EVENT_ACTION_VERSION = 150;
|
|
6
|
+
const PROPERTY_NAMES = Object.freeze({
|
|
7
|
+
0x39: "delayTime",
|
|
8
|
+
0x3a: "transitionTime",
|
|
9
|
+
0x3b: "probability"
|
|
10
|
+
});
|
|
11
|
+
const ACTION_NAMES = Object.freeze({
|
|
12
|
+
0x0102: "stop",
|
|
13
|
+
0x0103: "stop",
|
|
14
|
+
0x0105: "stop",
|
|
15
|
+
0x0203: "pause",
|
|
16
|
+
0x0205: "pause",
|
|
17
|
+
0x0303: "resume",
|
|
18
|
+
0x0305: "resume",
|
|
19
|
+
0x0403: "play",
|
|
20
|
+
0x0503: "play-and-continue",
|
|
21
|
+
0x0a02: "set-voice-volume",
|
|
22
|
+
0x0a03: "set-voice-volume",
|
|
23
|
+
0x0b02: "reset-voice-volume",
|
|
24
|
+
0x0b03: "reset-voice-volume",
|
|
25
|
+
0x2103: "post-event"
|
|
26
|
+
});
|
|
27
|
+
const ACTIVE_ACTION_TYPES = new Set([0x0102, 0x0103, 0x0105, 0x0203, 0x0205, 0x0303, 0x0305]);
|
|
28
|
+
const PLAY_ACTION_TYPES = new Set([0x0403, 0x0503]);
|
|
29
|
+
const VOICE_VOLUME_ACTION_TYPES = new Set([0x0a02, 0x0a03, 0x0b02, 0x0b03]);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Decodes one exact Wwise v150 HIRC Event Action body.
|
|
33
|
+
*
|
|
34
|
+
* The input begins after the HIRC object's leading u32 identity. Unknown
|
|
35
|
+
* action types, other bank versions, truncated bodies, and recognized bodies
|
|
36
|
+
* with trailing bytes return null so callers retain their shallow/raw view.
|
|
37
|
+
*
|
|
38
|
+
* @param {Uint8Array} payload Event Action body.
|
|
39
|
+
* @param {object} [options] Decode options.
|
|
40
|
+
* @param {number} [options.bankVersion=150] Wwise bank generator version.
|
|
41
|
+
* @returns {object|null} Typed action data, or null when not exact.
|
|
42
|
+
*/
|
|
43
|
+
function parseEventAction(payload, {
|
|
44
|
+
bankVersion = WWISE_EVENT_ACTION_VERSION
|
|
45
|
+
} = {}) {
|
|
46
|
+
if (!(payload instanceof Uint8Array) || Number(bankVersion) !== WWISE_EVENT_ACTION_VERSION) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const cursor = new ActionCursor(payload);
|
|
51
|
+
const actionType = cursor.u16();
|
|
52
|
+
const actionName = ACTION_NAMES[actionType];
|
|
53
|
+
if (!actionName) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const targetId = cursor.u32();
|
|
57
|
+
const targetFlags = cursor.u8();
|
|
58
|
+
const properties = ReadProperties(cursor);
|
|
59
|
+
const ranges = ReadRanges(cursor);
|
|
60
|
+
const result = {
|
|
61
|
+
actionType,
|
|
62
|
+
actionName,
|
|
63
|
+
actionFamily: actionType >> 8 & 0xff,
|
|
64
|
+
actionMode: ActionMode(actionType & 0xff),
|
|
65
|
+
actionScope: ActionScope(actionType & 0xff),
|
|
66
|
+
targetId,
|
|
67
|
+
targetIsBus: (targetFlags & 0x01) !== 0,
|
|
68
|
+
targetFlags,
|
|
69
|
+
properties,
|
|
70
|
+
ranges,
|
|
71
|
+
...ProjectKnownProperties(properties, ranges)
|
|
72
|
+
};
|
|
73
|
+
if (PLAY_ACTION_TYPES.has(actionType)) {
|
|
74
|
+
result.fadeCurve = cursor.u8();
|
|
75
|
+
result.bankId = cursor.u32();
|
|
76
|
+
result.bankType = cursor.u32();
|
|
77
|
+
} else if (ACTIVE_ACTION_TYPES.has(actionType)) {
|
|
78
|
+
result.fadeCurve = cursor.u8();
|
|
79
|
+
result.actionFlags = cursor.u8();
|
|
80
|
+
const exceptionCount = cursor.varUint();
|
|
81
|
+
const exceptions = [];
|
|
82
|
+
if (exceptionCount > 65536) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
for (let index = 0; index < exceptionCount; index++) {
|
|
86
|
+
const exceptionTargetId = cursor.u32();
|
|
87
|
+
const exceptionTargetFlags = cursor.u8();
|
|
88
|
+
exceptions.push({
|
|
89
|
+
targetId: exceptionTargetId,
|
|
90
|
+
targetIsBus: (exceptionTargetFlags & 0x01) !== 0,
|
|
91
|
+
targetFlags: exceptionTargetFlags
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
result.exceptions = exceptions;
|
|
95
|
+
} else if (VOICE_VOLUME_ACTION_TYPES.has(actionType)) {
|
|
96
|
+
if (!HasExactVoiceVolumeProperties(properties) || ranges.length !== 0) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const fadeCurve = cursor.u8();
|
|
100
|
+
const rawValueMode = cursor.u8();
|
|
101
|
+
const volumeDb = cursor.f32();
|
|
102
|
+
const volumeRangeDb = {
|
|
103
|
+
min: cursor.f32(),
|
|
104
|
+
max: cursor.f32()
|
|
105
|
+
};
|
|
106
|
+
const trailingFlags = cursor.u8();
|
|
107
|
+
const resetting = actionName === "reset-voice-volume";
|
|
108
|
+
if (targetFlags & ~0x01 || fadeCurve > 8 || rawValueMode !== 1 && rawValueMode !== 2 || !Number.isFinite(volumeDb) || !Number.isFinite(volumeRangeDb.min) || !Number.isFinite(volumeRangeDb.max) || resetting && (volumeDb !== 0 || volumeRangeDb.min !== 0 || volumeRangeDb.max !== 0) || trailingFlags !== 0) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
result.fadeCurve = fadeCurve;
|
|
112
|
+
if (!resetting) {
|
|
113
|
+
result.valueMode = rawValueMode === 1 ? "absolute" : "relative";
|
|
114
|
+
result.volumeDb = volumeDb;
|
|
115
|
+
result.volumeRangeDb = volumeRangeDb;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return cursor.at === payload.byteLength ? result : null;
|
|
119
|
+
} catch (error) {
|
|
120
|
+
if (error instanceof RangeError) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function HasExactVoiceVolumeProperties(properties) {
|
|
127
|
+
const ids = properties.map(property => property.id);
|
|
128
|
+
return ids.every(id => id === 0x39 || id === 0x3a) && new Set(ids).size === ids.length;
|
|
129
|
+
}
|
|
130
|
+
function ReadProperties(cursor) {
|
|
131
|
+
const count = cursor.u8();
|
|
132
|
+
if (count > 255 || cursor.remaining < count + count * 4) {
|
|
133
|
+
throw new RangeError("Event Action property bundle is truncated");
|
|
134
|
+
}
|
|
135
|
+
const ids = [];
|
|
136
|
+
const values = [];
|
|
137
|
+
for (let index = 0; index < count; index++) {
|
|
138
|
+
ids.push(cursor.u8());
|
|
139
|
+
}
|
|
140
|
+
for (let index = 0; index < count; index++) {
|
|
141
|
+
values.push(cursor.u32());
|
|
142
|
+
}
|
|
143
|
+
return ids.map((id, index) => {
|
|
144
|
+
const rawValue = values[index];
|
|
145
|
+
return {
|
|
146
|
+
id,
|
|
147
|
+
name: PROPERTY_NAMES[id] ?? `property-${id}`,
|
|
148
|
+
value: PropertyValue(id, rawValue),
|
|
149
|
+
rawValue
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function ReadRanges(cursor) {
|
|
154
|
+
const count = cursor.u8();
|
|
155
|
+
if (count > 255 || cursor.remaining < count + count * 8) {
|
|
156
|
+
throw new RangeError("Event Action range bundle is truncated");
|
|
157
|
+
}
|
|
158
|
+
const ids = [];
|
|
159
|
+
for (let index = 0; index < count; index++) {
|
|
160
|
+
ids.push(cursor.u8());
|
|
161
|
+
}
|
|
162
|
+
return ids.map(id => {
|
|
163
|
+
const rawMin = cursor.u32();
|
|
164
|
+
const rawMax = cursor.u32();
|
|
165
|
+
return {
|
|
166
|
+
id,
|
|
167
|
+
name: PROPERTY_NAMES[id] ?? `property-${id}`,
|
|
168
|
+
min: RangeValue(id, rawMin),
|
|
169
|
+
max: RangeValue(id, rawMax),
|
|
170
|
+
rawMin,
|
|
171
|
+
rawMax
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
function ProjectKnownProperties(properties, ranges) {
|
|
176
|
+
const result = {};
|
|
177
|
+
for (const property of properties) {
|
|
178
|
+
if (property.id === 0x39) result.delayTimeMs = property.value;else if (property.id === 0x3a) {
|
|
179
|
+
result.transitionTimeMs = property.value;
|
|
180
|
+
} else if (property.id === 0x3b) {
|
|
181
|
+
result.probability = property.value;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
for (const range of ranges) {
|
|
185
|
+
const value = {
|
|
186
|
+
min: range.min,
|
|
187
|
+
max: range.max
|
|
188
|
+
};
|
|
189
|
+
if (range.id === 0x39) result.delayRangeMs = value;else if (range.id === 0x3a) result.transitionRangeMs = value;
|
|
190
|
+
}
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
function PropertyValue(id, rawValue) {
|
|
194
|
+
if (id === 0x39 || id === 0x3a) {
|
|
195
|
+
return rawValue | 0;
|
|
196
|
+
}
|
|
197
|
+
if (id === 0x3b) {
|
|
198
|
+
const bytes = new ArrayBuffer(4);
|
|
199
|
+
const view = new DataView(bytes);
|
|
200
|
+
view.setUint32(0, rawValue, true);
|
|
201
|
+
return view.getFloat32(0, true);
|
|
202
|
+
}
|
|
203
|
+
return rawValue;
|
|
204
|
+
}
|
|
205
|
+
function RangeValue(id, rawValue) {
|
|
206
|
+
return id === 0x39 || id === 0x3a ? rawValue | 0 : rawValue;
|
|
207
|
+
}
|
|
208
|
+
function ActionMode(value) {
|
|
209
|
+
if (value === 0x02 || value === 0x03) return "element";
|
|
210
|
+
if (value === 0x04 || value === 0x05) return "all";
|
|
211
|
+
if (value === 0x08 || value === 0x09) return "all-except";
|
|
212
|
+
return "unknown";
|
|
213
|
+
}
|
|
214
|
+
function ActionScope(value) {
|
|
215
|
+
if (value === 0x02 || value === 0x04 || value === 0x08) {
|
|
216
|
+
return "global";
|
|
217
|
+
}
|
|
218
|
+
if (value === 0x03 || value === 0x05 || value === 0x09) {
|
|
219
|
+
return "game-object";
|
|
220
|
+
}
|
|
221
|
+
return "unknown";
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** Bounds-aware cursor over one Wwise Event Action payload. */
|
|
225
|
+
class ActionCursor {
|
|
226
|
+
/**
|
|
227
|
+
* Creates a cursor at the start of an Event Action payload.
|
|
228
|
+
*
|
|
229
|
+
* @param {Uint8Array} bytes Event Action payload bytes.
|
|
230
|
+
*/
|
|
231
|
+
constructor(bytes) {
|
|
232
|
+
this.bytes = bytes;
|
|
233
|
+
this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
234
|
+
this.at = 0;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Gets the number of unread payload bytes. */
|
|
238
|
+
get remaining() {
|
|
239
|
+
return this.bytes.byteLength - this.at;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Verifies that a read fits within the payload.
|
|
244
|
+
*
|
|
245
|
+
* @param {number} size Number of bytes to read.
|
|
246
|
+
* @throws {RangeError} The payload is truncated.
|
|
247
|
+
*/
|
|
248
|
+
require(size) {
|
|
249
|
+
if (this.at + size > this.bytes.byteLength) {
|
|
250
|
+
throw new RangeError("Event Action payload is truncated");
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Reads an unsigned 8-bit integer. */
|
|
255
|
+
u8() {
|
|
256
|
+
this.require(1);
|
|
257
|
+
return this.bytes[this.at++];
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** Reads a little-endian unsigned 16-bit integer. */
|
|
261
|
+
u16() {
|
|
262
|
+
this.require(2);
|
|
263
|
+
const value = this.view.getUint16(this.at, true);
|
|
264
|
+
this.at += 2;
|
|
265
|
+
return value;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/** Reads a little-endian unsigned 32-bit integer. */
|
|
269
|
+
u32() {
|
|
270
|
+
this.require(4);
|
|
271
|
+
const value = this.view.getUint32(this.at, true);
|
|
272
|
+
this.at += 4;
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Reads a little-endian 32-bit floating-point number. */
|
|
277
|
+
f32() {
|
|
278
|
+
this.require(4);
|
|
279
|
+
const value = this.view.getFloat32(this.at, true);
|
|
280
|
+
this.at += 4;
|
|
281
|
+
return value;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** Reads a canonical Wwise variable-length unsigned integer. */
|
|
285
|
+
varUint() {
|
|
286
|
+
let value = 0;
|
|
287
|
+
for (let count = 0; count < 5; count++) {
|
|
288
|
+
const byte = this.u8();
|
|
289
|
+
if (count === 0 && byte === 0x80) {
|
|
290
|
+
throw new RangeError("Event Action exception count is non-canonical");
|
|
291
|
+
}
|
|
292
|
+
if (value > 0x01ffffff) {
|
|
293
|
+
throw new RangeError("Event Action exception count overflows u32");
|
|
294
|
+
}
|
|
295
|
+
value = value * 128 + (byte & 0x7f);
|
|
296
|
+
if ((byte & 0x80) === 0) {
|
|
297
|
+
return value >>> 0;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
throw new RangeError("Event Action exception count is truncated");
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export { WWISE_EVENT_ACTION_VERSION, parseEventAction };
|
|
305
|
+
//# sourceMappingURL=eventAction.js.map
|