@carbonenginejs/runtime-resource 0.9.0 → 0.9.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.
Files changed (74) hide show
  1. package/NOTICE +5 -3
  2. package/README.md +1 -1
  3. package/dist/CjsResourceSource.js +9 -0
  4. package/dist/CjsResourceSource.js.map +1 -1
  5. package/dist/format/CjsFormat.js +5 -0
  6. package/dist/format/CjsFormat.js.map +1 -1
  7. package/dist/formats/black/core/CjsBlackBinaryReader.js +4 -0
  8. package/dist/formats/black/core/CjsBlackBinaryReader.js.map +1 -1
  9. package/dist/formats/black/core/CjsBlackPropertyReaders.js +5 -0
  10. package/dist/formats/black/core/CjsBlackPropertyReaders.js.map +1 -1
  11. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +4 -0
  12. package/dist/formats/black/core/CjsBlackSchemaRegistry.js.map +1 -1
  13. package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js +4 -0
  14. package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js.map +1 -0
  15. package/dist/formats/black/core/blackDefinitions.js +1 -1
  16. package/dist/formats/black/core/blackDefinitions.js.map +1 -1
  17. package/dist/formats/black/core/blackSchema.js +1 -1
  18. package/dist/formats/bnk/core/musicNodes.js +4 -0
  19. package/dist/formats/bnk/core/musicNodes.js.map +1 -1
  20. package/dist/formats/cmf/core/binary.js +5 -0
  21. package/dist/formats/cmf/core/binary.js.map +1 -1
  22. package/dist/formats/dds/CjsDdsFormat.js +7 -0
  23. package/dist/formats/dds/CjsDdsFormat.js.map +1 -1
  24. package/dist/formats/dds/core/bc7.js +7 -2
  25. package/dist/formats/dds/core/bc7.js.map +1 -1
  26. package/dist/formats/fbx/core/helpers.js +10 -0
  27. package/dist/formats/fbx/core/helpers.js.map +1 -1
  28. package/dist/formats/flac/CjsFlacFormat.js +6 -0
  29. package/dist/formats/flac/CjsFlacFormat.js.map +1 -1
  30. package/dist/formats/gif/CjsGifFormat.js +5 -0
  31. package/dist/formats/gif/CjsGifFormat.js.map +1 -1
  32. package/dist/formats/jpeg/CjsJpegFormat.js +6 -0
  33. package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -1
  34. package/dist/formats/jpeg/core/jpeg.js +10 -0
  35. package/dist/formats/jpeg/core/jpeg.js.map +1 -1
  36. package/dist/formats/mp3/CjsMp3Format.js +5 -0
  37. package/dist/formats/mp3/CjsMp3Format.js.map +1 -1
  38. package/dist/formats/mp4/CjsMp4Format.js +6 -0
  39. package/dist/formats/mp4/CjsMp4Format.js.map +1 -1
  40. package/dist/formats/ogg/CjsOggFormat.js +6 -0
  41. package/dist/formats/ogg/CjsOggFormat.js.map +1 -1
  42. package/dist/formats/ogg/core/vorbis.js +5 -0
  43. package/dist/formats/ogg/core/vorbis.js.map +1 -1
  44. package/dist/formats/png/CjsPngFormat.js +6 -0
  45. package/dist/formats/png/CjsPngFormat.js.map +1 -1
  46. package/dist/formats/red/core/blackDefinitions.js +1 -1
  47. package/dist/formats/stl/core/stl.js +5 -0
  48. package/dist/formats/stl/core/stl.js.map +1 -1
  49. package/dist/formats/tga/CjsTgaFormat.js +5 -0
  50. package/dist/formats/tga/CjsTgaFormat.js.map +1 -1
  51. package/dist/formats/wav/CjsWavFormat.js +6 -0
  52. package/dist/formats/wav/CjsWavFormat.js.map +1 -1
  53. package/dist/formats/webm/CjsWebmFormat.js +6 -0
  54. package/dist/formats/webm/CjsWebmFormat.js.map +1 -1
  55. package/dist/formats/webp/CjsWebpFormat.js +5 -0
  56. package/dist/formats/webp/CjsWebpFormat.js.map +1 -1
  57. package/dist/formats/wem/CjsWemFormat.js +3 -2
  58. package/dist/formats/wem/CjsWemFormat.js.map +1 -1
  59. package/dist/formats/yaml/CjsYamlFormat.js +6 -0
  60. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  61. package/dist/formats/yaml/core/CjsYamlReader.js +6 -0
  62. package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
  63. package/docs/README.md +4 -0
  64. package/docs/formats/README.md +7 -6
  65. package/docs/formats/gr2.md +161 -0
  66. package/docs/reference/classes/README.md +33 -0
  67. package/docs/reference/classes/core.md +106 -0
  68. package/docs/reference/classes/dropped.md +46 -0
  69. package/docs/reference/classes/formats.md +522 -0
  70. package/docs/reference/classes/resources.md +346 -0
  71. package/docs/reference/classes/texture.md +26 -0
  72. package/package.json +1 -1
  73. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +0 -4
  74. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"musicNodes.js","sources":["../../../../../src/formats/bnk/core/musicNodes.js"],"sourcesContent":["// Wwise interactive-music node decoding: typed payloads for music-segment\r\n// (10), music-track (11), music-switch-container (12), and\r\n// music-playlist-container (13) HIRC entries. Exposed through\r\n// `CjsBnkFormat.wwise` next to the event graph walk - interpretation over\r\n// `inspect()` results, never part of the format read path.\r\n//\r\n// Verified against EVE soundbanks (bank generator version 150 / Wwise\r\n// 2022.1): 2,484 tracks, 1,326 segments, 214 playlists, and 54 switch\r\n// containers across music.bnk + music_essential.bnk all decode with the\r\n// exact-end validation below (2026-07-19 corpus run).\r\n//\r\n// Approach: consumers of these nodes (music schedulers) only need the fields\r\n// AFTER the variable-length NodeBaseParams block - children, meter, stingers,\r\n// and each type's tail - so segment/playlist/switch payloads are parsed from\r\n// a children+meter ANCHOR (a u32 child count and child ids that exist in the\r\n// bank, followed by a plausible AkMeterInfo) and the parse is accepted only\r\n// when it consumes the payload EXACTLY to its end. Track clips live at the\r\n// head (before NodeBaseParams) and the track's type block is tail-validated\r\n// the same way.\r\n\r\nclass MusicCursor\r\n{\r\n constructor(bytes, offset = 0)\r\n {\r\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n this.bytes = bytes;\r\n this.at = offset;\r\n }\r\n\r\n get remaining()\r\n {\r\n return this.bytes.byteLength - this.at;\r\n }\r\n\r\n u8()\r\n {\r\n return this.view.getUint8(this.at++);\r\n }\r\n\r\n u16()\r\n {\r\n const value = this.view.getUint16(this.at, true);\r\n this.at += 2;\r\n return value;\r\n }\r\n\r\n s16()\r\n {\r\n const value = this.view.getInt16(this.at, true);\r\n this.at += 2;\r\n return value;\r\n }\r\n\r\n u32()\r\n {\r\n const value = this.view.getUint32(this.at, true);\r\n this.at += 4;\r\n return value;\r\n }\r\n\r\n s32()\r\n {\r\n const value = this.view.getInt32(this.at, true);\r\n this.at += 4;\r\n return value;\r\n }\r\n\r\n f32()\r\n {\r\n const value = this.view.getFloat32(this.at, true);\r\n this.at += 4;\r\n return value;\r\n }\r\n\r\n f64()\r\n {\r\n const value = this.view.getFloat64(this.at, true);\r\n this.at += 8;\r\n return value;\r\n }\r\n\r\n stringZ()\r\n {\r\n let end = this.at;\r\n while (end < this.bytes.byteLength && this.bytes[end] !== 0) end++;\r\n let value = \"\";\r\n for (let i = this.at; i < end; i++) value += String.fromCharCode(this.bytes[i]);\r\n this.at = end + 1;\r\n return value;\r\n }\r\n}\r\n\r\nfunction plausibleMeter(view, at, byteLength)\r\n{\r\n if (at + 22 > byteLength) return false;\r\n const grid = view.getFloat64(at, true);\r\n const offset = view.getFloat64(at + 8, true);\r\n const tempo = view.getFloat32(at + 16, true);\r\n const beats = view.getUint8(at + 20);\r\n const beatValue = view.getUint8(at + 21);\r\n return Number.isFinite(grid) && grid >= 0 && grid < 600000\r\n && Number.isFinite(offset) && offset >= 0 && offset < 600000\r\n && Number.isFinite(tempo) && tempo > 0 && tempo < 1000\r\n && beats >= 1 && beats <= 64\r\n && [ 1, 2, 4, 8, 16, 32 ].includes(beatValue);\r\n}\r\n\r\nfunction findAnchors(bytes, knownIds)\r\n{\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n const anchors = [];\r\n for (let at = 1; at + 4 <= bytes.byteLength; at++)\r\n {\r\n const count = view.getUint32(at, true);\r\n if (count > 256 || at + 4 + count * 4 + 22 > bytes.byteLength) continue;\r\n let valid = true;\r\n for (let i = 0; i < count; i++)\r\n {\r\n if (!knownIds.has(view.getUint32(at + 4 + i * 4, true)))\r\n {\r\n valid = false;\r\n break;\r\n }\r\n }\r\n if (valid && plausibleMeter(view, at + 4 + count * 4, bytes.byteLength))\r\n {\r\n anchors.push(at);\r\n }\r\n }\r\n return anchors;\r\n}\r\n\r\nfunction readMusicNodeTail(cursor)\r\n{\r\n const childCount = cursor.u32();\r\n const children = [];\r\n for (let i = 0; i < childCount; i++) children.push(cursor.u32());\r\n const meter = {\r\n gridPeriod: cursor.f64(),\r\n gridOffset: cursor.f64(),\r\n tempo: cursor.f32(),\r\n beatsPerBar: cursor.u8(),\r\n beatValue: cursor.u8()\r\n };\r\n const meterOverride = cursor.u8() !== 0;\r\n const stingerCount = cursor.u32();\r\n const stingers = [];\r\n for (let i = 0; i < stingerCount; i++)\r\n {\r\n stingers.push({\r\n triggerId: cursor.u32(),\r\n segmentId: cursor.u32(),\r\n syncPlayAt: cursor.u32(),\r\n cueFilterHash: cursor.u32(),\r\n dontRepeatTime: cursor.s32(),\r\n numSegmentLookAhead: cursor.u32()\r\n });\r\n }\r\n return { children, meter, meterOverride, stingers };\r\n}\r\n\r\n/** AkMusicTransNodeParams: transition rules shared by playlist + switch containers. */\r\nfunction readTransRules(cursor)\r\n{\r\n const ruleCount = cursor.u32();\r\n if (ruleCount > 4096) throw new RangeError(\"rule count\");\r\n const rules = [];\r\n for (let i = 0; i < ruleCount; i++)\r\n {\r\n const srcCount = cursor.u32();\r\n if (srcCount > 1024) throw new RangeError(\"src count\");\r\n const srcIds = [];\r\n for (let j = 0; j < srcCount; j++) srcIds.push(cursor.s32());\r\n const dstCount = cursor.u32();\r\n if (dstCount > 1024) throw new RangeError(\"dst count\");\r\n const dstIds = [];\r\n for (let j = 0; j < dstCount; j++) dstIds.push(cursor.s32());\r\n const src = {\r\n transitionTime: cursor.s32(), fadeCurve: cursor.u32(), fadeOffset: cursor.s32(),\r\n syncType: cursor.u32(), cueFilterHash: cursor.u32(), playPostExit: cursor.u8() !== 0\r\n };\r\n const dst = {\r\n transitionTime: cursor.s32(), fadeCurve: cursor.u32(), fadeOffset: cursor.s32(),\r\n cueFilterHash: cursor.u32(), jumpToId: cursor.u32(), jumpToType: cursor.u16(),\r\n entryType: cursor.u16(), playPreEntry: cursor.u8() !== 0,\r\n matchSourceCueName: cursor.u8() !== 0\r\n };\r\n let transitionSegment = null;\r\n if (cursor.u8() !== 0)\r\n {\r\n transitionSegment = {\r\n segmentId: cursor.u32(),\r\n fadeIn: { transitionTime: cursor.s32(), fadeCurve: cursor.u32(), fadeOffset: cursor.s32() },\r\n fadeOut: { transitionTime: cursor.s32(), fadeCurve: cursor.u32(), fadeOffset: cursor.s32() },\r\n playPreEntry: cursor.u8() !== 0,\r\n playPostExit: cursor.u8() !== 0\r\n };\r\n }\r\n rules.push({ srcIds, dstIds, src, dst, transitionSegment });\r\n }\r\n return rules;\r\n}\r\n\r\n/**\r\n * Decode a music-segment (HIRC 10) payload: children, meter, stingers,\r\n * duration, and entry/exit markers.\r\n *\r\n * @param {Uint8Array} bytes Entry payload view from `inspect()`.\r\n * @param {Set<number>} knownIds Every HIRC object id in the same bank.\r\n * @returns {object|null} Decoded segment, or null when no anchored parse consumes the payload exactly.\r\n */\r\nexport function parseMusicSegment(bytes, knownIds)\r\n{\r\n for (const anchor of findAnchors(bytes, knownIds))\r\n {\r\n try\r\n {\r\n const cursor = new MusicCursor(bytes, anchor);\r\n const node = readMusicNodeTail(cursor);\r\n const duration = cursor.f64();\r\n if (!Number.isFinite(duration) || duration < 0 || duration > 36000000) continue;\r\n const markerCount = cursor.u32();\r\n if (markerCount > 1024) continue;\r\n const markers = [];\r\n for (let i = 0; i < markerCount; i++)\r\n {\r\n markers.push({ id: cursor.u32(), position: cursor.f64(), name: cursor.stringZ() });\r\n }\r\n if (cursor.at !== bytes.byteLength) continue;\r\n if (markers.some(marker => !Number.isFinite(marker.position) || marker.position < 0)) continue;\r\n return { ...node, duration, markers };\r\n }\r\n catch\r\n {\r\n continue;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode a music-track (HIRC 11) payload: sources, clips (play position and\r\n * trims per subtrack), track type, and switch parameters for switch tracks.\r\n *\r\n * @param {Uint8Array} bytes Entry payload view from `inspect()`.\r\n * @returns {object|null} Decoded track, or null when neither tail layout validates.\r\n */\r\nexport function parseMusicTrack(bytes)\r\n{\r\n const cursor = new MusicCursor(bytes, 0);\r\n cursor.u8(); // uFlags (midi/override bits)\r\n const sourceCount = cursor.u32();\r\n if (sourceCount > 512) return null;\r\n const sources = [];\r\n for (let i = 0; i < sourceCount; i++)\r\n {\r\n const pluginId = cursor.u32();\r\n const streamType = cursor.u8();\r\n const sourceId = cursor.u32();\r\n const inMemoryMediaSize = cursor.u32();\r\n const sourceBits = cursor.u8();\r\n if ((pluginId & 0x0f) === 0x02)\r\n {\r\n const size = cursor.u32();\r\n cursor.at += size;\r\n }\r\n sources.push({ pluginId, streamType, sourceId, inMemoryMediaSize, sourceBits });\r\n }\r\n const clipCount = cursor.u32();\r\n if (clipCount > 4096) return null;\r\n const clips = [];\r\n for (let i = 0; i < clipCount; i++)\r\n {\r\n clips.push({\r\n trackId: cursor.u32(),\r\n sourceId: cursor.u32(),\r\n eventId: cursor.u32(),\r\n playAt: cursor.f64(),\r\n beginTrimOffset: cursor.f64(),\r\n endTrimOffset: cursor.f64(),\r\n srcDuration: cursor.f64()\r\n });\r\n }\r\n const subTrackCount = clipCount > 0 ? cursor.u32() : 0;\r\n const autoCount = cursor.u32();\r\n if (autoCount > 4096) return null;\r\n for (let i = 0; i < autoCount; i++)\r\n {\r\n cursor.u32(); // clip index\r\n cursor.u32(); // automation type\r\n const points = cursor.u32();\r\n if (points > 65536) return null;\r\n cursor.at += points * 12;\r\n }\r\n const headEnd = cursor.at;\r\n\r\n // Tail: [NodeBaseParams...] u8 trackType, [switch+trans params when the\r\n // type is 3], f32 lookAheadTime. The switch layout is tried FIRST because\r\n // it validates every field to the exact payload end - the simple layout\r\n // only checks one byte, and a switch tail ending in zero bytes would\r\n // satisfy it falsely.\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n const end = bytes.byteLength;\r\n for (let typeAt = headEnd; typeAt <= end - 5; typeAt++)\r\n {\r\n if (view.getUint8(typeAt) !== 3) continue;\r\n const tail = new MusicCursor(bytes, typeAt + 1);\r\n try\r\n {\r\n const groupType = tail.u8();\r\n if (groupType > 1) continue;\r\n const groupId = tail.u32();\r\n const defaultSwitch = tail.u32();\r\n const assocCount = tail.u32();\r\n if (assocCount > 1024) continue;\r\n const assoc = [];\r\n for (let i = 0; i < assocCount; i++) assoc.push(tail.u32());\r\n const trans = {\r\n srcTransitionTime: tail.s32(), srcFadeCurve: tail.u32(), srcFadeOffset: tail.s32(),\r\n syncType: tail.u32(), cueFilterHash: tail.u32(),\r\n dstTransitionTime: tail.s32(), dstFadeCurve: tail.u32(), dstFadeOffset: tail.s32()\r\n };\r\n const lookAheadTime = tail.f32();\r\n if (tail.at !== end) continue;\r\n return {\r\n sources, clips, subTrackCount,\r\n trackType: 3,\r\n lookAheadTime,\r\n switchParams: { groupType, groupId, defaultSwitch, assoc, trans }\r\n };\r\n }\r\n catch\r\n {\r\n continue;\r\n }\r\n }\r\n const simpleAt = end - 5;\r\n if (simpleAt >= headEnd)\r\n {\r\n const type = view.getUint8(simpleAt);\r\n if (type <= 2)\r\n {\r\n return {\r\n sources, clips, subTrackCount,\r\n trackType: type,\r\n lookAheadTime: view.getFloat32(end - 4, true),\r\n switchParams: null\r\n };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode a music-playlist-container (HIRC 13) payload: children, meter,\r\n * stingers, transition rules, and the flat pre-order playlist tree.\r\n *\r\n * @param {Uint8Array} bytes Entry payload view from `inspect()`.\r\n * @param {Set<number>} knownIds Every HIRC object id in the same bank.\r\n * @returns {object|null} Decoded playlist container, or null when no anchored parse validates.\r\n */\r\nexport function parseMusicPlaylist(bytes, knownIds)\r\n{\r\n for (const anchor of findAnchors(bytes, knownIds))\r\n {\r\n try\r\n {\r\n const cursor = new MusicCursor(bytes, anchor);\r\n const node = readMusicNodeTail(cursor);\r\n const rules = readTransRules(cursor);\r\n const itemCount = cursor.u32();\r\n if (itemCount > 8192) continue;\r\n if (cursor.remaining !== itemCount * 30) continue;\r\n const items = [];\r\n for (let i = 0; i < itemCount; i++)\r\n {\r\n items.push({\r\n segmentId: cursor.u32(),\r\n playlistItemId: cursor.u32(),\r\n childCount: cursor.u32(),\r\n rsType: cursor.s32(),\r\n loop: cursor.s16(),\r\n loopMin: cursor.s16(),\r\n loopMax: cursor.s16(),\r\n weight: cursor.u32(),\r\n avoidRepeatCount: cursor.u16(),\r\n usingWeight: cursor.u8() !== 0,\r\n shuffle: cursor.u8() !== 0\r\n });\r\n }\r\n if (cursor.at !== bytes.byteLength) continue;\r\n return { ...node, rules, playlist: items };\r\n }\r\n catch\r\n {\r\n continue;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode a music-switch-container (HIRC 12) payload: children, meter,\r\n * stingers, transition rules, argument groups, and the decision tree.\r\n *\r\n * @param {Uint8Array} bytes Entry payload view from `inspect()`.\r\n * @param {Set<number>} knownIds Every HIRC object id in the same bank.\r\n * @returns {object|null} Decoded switch container, or null when no anchored parse validates.\r\n */\r\nexport function parseMusicSwitch(bytes, knownIds)\r\n{\r\n for (const anchor of findAnchors(bytes, knownIds))\r\n {\r\n try\r\n {\r\n const cursor = new MusicCursor(bytes, anchor);\r\n const node = readMusicNodeTail(cursor);\r\n const rules = readTransRules(cursor);\r\n const continuePlayback = cursor.u8() !== 0;\r\n const treeDepth = cursor.u32();\r\n if (treeDepth > 16) continue;\r\n const argumentGroups = [];\r\n for (let i = 0; i < treeDepth; i++) argumentGroups.push({ groupId: cursor.u32() });\r\n for (let i = 0; i < treeDepth; i++) argumentGroups[i].groupType = cursor.u8();\r\n const treeDataSize = cursor.u32();\r\n const mode = cursor.u8();\r\n if (cursor.remaining !== treeDataSize) continue;\r\n if (treeDataSize % 12 !== 0) continue;\r\n const treeNodes = [];\r\n const nodeCount = treeDataSize / 12;\r\n for (let i = 0; i < nodeCount; i++)\r\n {\r\n const key = cursor.u32();\r\n // 4-byte union: leaf = audioNodeId, internal = childrenIdx + count.\r\n const audioNodeId = cursor.view.getUint32(cursor.at, true);\r\n const childrenIdx = cursor.u16();\r\n const childrenCount = cursor.u16();\r\n const weight = cursor.u16();\r\n const probability = cursor.u16();\r\n treeNodes.push({ key, audioNodeId, childrenIdx, childrenCount, weight, probability });\r\n }\r\n if (cursor.at !== bytes.byteLength) continue;\r\n return { ...node, rules, continuePlayback, argumentGroups, mode, treeNodes };\r\n }\r\n catch\r\n {\r\n continue;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nconst MUSIC_PARSERS = Object.freeze({\r\n 10: (payload, knownIds) => parseMusicSegment(payload, knownIds),\r\n 11: payload => parseMusicTrack(payload),\r\n 12: (payload, knownIds) => parseMusicSwitch(payload, knownIds),\r\n 13: (payload, knownIds) => parseMusicPlaylist(payload, knownIds)\r\n});\r\n\r\nconst MUSIC_TYPE_NAMES = Object.freeze({\r\n 10: \"music-segment\",\r\n 11: \"music-track\",\r\n 12: \"music-switch-container\",\r\n 13: \"music-playlist-container\"\r\n});\r\n\r\n/**\r\n * Decode every interactive-music node across one or more inspected banks.\r\n *\r\n * @param {Array<object>} inspections `CjsBnkFormat.inspect()` results for every related music bank.\r\n * @returns {{nodes: Map<number, object>, diagnostics: {parsed: number, failed: Array<{bank: string, type: string, id: number}>}}} Decoded nodes keyed by object id plus per-entry failures.\r\n */\r\nexport function musicNodesFromBanks(inspections)\r\n{\r\n const banks = Array.isArray(inspections) ? inspections : [ inspections ];\r\n const nodes = new Map();\r\n const failed = [];\r\n let parsed = 0;\r\n for (const inspection of banks)\r\n {\r\n const knownIds = new Set();\r\n for (const entry of inspection.hirc ?? []) knownIds.add(entry.id);\r\n for (const entry of inspection.hirc ?? [])\r\n {\r\n const parser = MUSIC_PARSERS[entry.type];\r\n if (!parser) continue;\r\n const payload = entry.payload instanceof Uint8Array ? entry.payload : null;\r\n const decoded = payload ? parser(payload, knownIds) : null;\r\n if (!decoded)\r\n {\r\n failed.push({ bank: inspection.source || \"\", type: MUSIC_TYPE_NAMES[entry.type], id: entry.id });\r\n continue;\r\n }\r\n parsed++;\r\n nodes.set(entry.id, { id: entry.id, type: MUSIC_TYPE_NAMES[entry.type], bank: inspection.source || \"\", ...decoded });\r\n }\r\n }\r\n return { nodes, diagnostics: { parsed, failed } };\r\n}\r\n"],"names":["MusicCursor","constructor","bytes","offset","view","DataView","buffer","byteOffset","byteLength","at","remaining","u8","getUint8","u16","value","getUint16","s16","getInt16","u32","getUint32","s32","getInt32","f32","getFloat32","f64","getFloat64","stringZ","end","i","String","fromCharCode","plausibleMeter","grid","tempo","beats","beatValue","Number","isFinite","includes","findAnchors","knownIds","anchors","count","valid","has","push","readMusicNodeTail","cursor","childCount","children","meter","gridPeriod","gridOffset","beatsPerBar","meterOverride","stingerCount","stingers","triggerId","segmentId","syncPlayAt","cueFilterHash","dontRepeatTime","numSegmentLookAhead","readTransRules","ruleCount","RangeError","rules","srcCount","srcIds","j","dstCount","dstIds","src","transitionTime","fadeCurve","fadeOffset","syncType","playPostExit","dst","jumpToId","jumpToType","entryType","playPreEntry","matchSourceCueName","transitionSegment","fadeIn","fadeOut","parseMusicSegment","anchor","node","duration","markerCount","markers","id","position","name","some","marker","parseMusicTrack","sourceCount","sources","pluginId","streamType","sourceId","inMemoryMediaSize","sourceBits","size","clipCount","clips","trackId","eventId","playAt","beginTrimOffset","endTrimOffset","srcDuration","subTrackCount","autoCount","points","headEnd","typeAt","tail","groupType","groupId","defaultSwitch","assocCount","assoc","trans","srcTransitionTime","srcFadeCurve","srcFadeOffset","dstTransitionTime","dstFadeCurve","dstFadeOffset","lookAheadTime","trackType","switchParams","simpleAt","type","parseMusicPlaylist","itemCount","items","playlistItemId","rsType","loop","loopMin","loopMax","weight","avoidRepeatCount","usingWeight","shuffle","playlist","parseMusicSwitch","continuePlayback","treeDepth","argumentGroups","treeDataSize","mode","treeNodes","nodeCount","key","audioNodeId","childrenIdx","childrenCount","probability","MUSIC_PARSERS","Object","freeze","payload","MUSIC_TYPE_NAMES","musicNodesFromBanks","inspections","banks","Array","isArray","nodes","Map","failed","parsed","inspection","Set","entry","hirc","add","parser","Uint8Array","decoded","bank","source","set","diagnostics"],"mappings":"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"}
1
+ {"version":3,"file":"musicNodes.js","sources":["../../../../../src/formats/bnk/core/musicNodes.js"],"sourcesContent":["// Wwise interactive-music node decoding: typed payloads for music-segment\r\n// (10), music-track (11), music-switch-container (12), and\r\n// music-playlist-container (13) HIRC entries. Exposed through\r\n// `CjsBnkFormat.wwise` next to the event graph walk - interpretation over\r\n// `inspect()` results, never part of the format read path.\r\n//\r\n// Verified against EVE soundbanks (bank generator version 150 / Wwise\r\n// 2022.1): 2,484 tracks, 1,326 segments, 214 playlists, and 54 switch\r\n// containers across music.bnk + music_essential.bnk all decode with the\r\n// exact-end validation below (2026-07-19 corpus run).\r\n//\r\n// Approach: consumers of these nodes (music schedulers) only need the fields\r\n// AFTER the variable-length NodeBaseParams block - children, meter, stingers,\r\n// and each type's tail - so segment/playlist/switch payloads are parsed from\r\n// a children+meter ANCHOR (a u32 child count and child ids that exist in the\r\n// bank, followed by a plausible AkMeterInfo) and the parse is accepted only\r\n// when it consumes the payload EXACTLY to its end. Track clips live at the\r\n// head (before NodeBaseParams) and the track's type block is tail-validated\r\n// the same way.\r\n\r\n/**\n * Little-endian byte cursor over HIRC payload bytes used to decode Wwise\n * interactive-music node payloads with exact-end validation.\n */\nclass MusicCursor\r\n{\r\n constructor(bytes, offset = 0)\r\n {\r\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n this.bytes = bytes;\r\n this.at = offset;\r\n }\r\n\r\n get remaining()\r\n {\r\n return this.bytes.byteLength - this.at;\r\n }\r\n\r\n u8()\r\n {\r\n return this.view.getUint8(this.at++);\r\n }\r\n\r\n u16()\r\n {\r\n const value = this.view.getUint16(this.at, true);\r\n this.at += 2;\r\n return value;\r\n }\r\n\r\n s16()\r\n {\r\n const value = this.view.getInt16(this.at, true);\r\n this.at += 2;\r\n return value;\r\n }\r\n\r\n u32()\r\n {\r\n const value = this.view.getUint32(this.at, true);\r\n this.at += 4;\r\n return value;\r\n }\r\n\r\n s32()\r\n {\r\n const value = this.view.getInt32(this.at, true);\r\n this.at += 4;\r\n return value;\r\n }\r\n\r\n f32()\r\n {\r\n const value = this.view.getFloat32(this.at, true);\r\n this.at += 4;\r\n return value;\r\n }\r\n\r\n f64()\r\n {\r\n const value = this.view.getFloat64(this.at, true);\r\n this.at += 8;\r\n return value;\r\n }\r\n\r\n stringZ()\r\n {\r\n let end = this.at;\r\n while (end < this.bytes.byteLength && this.bytes[end] !== 0) end++;\r\n let value = \"\";\r\n for (let i = this.at; i < end; i++) value += String.fromCharCode(this.bytes[i]);\r\n this.at = end + 1;\r\n return value;\r\n }\r\n}\r\n\r\nfunction plausibleMeter(view, at, byteLength)\r\n{\r\n if (at + 22 > byteLength) return false;\r\n const grid = view.getFloat64(at, true);\r\n const offset = view.getFloat64(at + 8, true);\r\n const tempo = view.getFloat32(at + 16, true);\r\n const beats = view.getUint8(at + 20);\r\n const beatValue = view.getUint8(at + 21);\r\n return Number.isFinite(grid) && grid >= 0 && grid < 600000\r\n && Number.isFinite(offset) && offset >= 0 && offset < 600000\r\n && Number.isFinite(tempo) && tempo > 0 && tempo < 1000\r\n && beats >= 1 && beats <= 64\r\n && [ 1, 2, 4, 8, 16, 32 ].includes(beatValue);\r\n}\r\n\r\nfunction findAnchors(bytes, knownIds)\r\n{\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n const anchors = [];\r\n for (let at = 1; at + 4 <= bytes.byteLength; at++)\r\n {\r\n const count = view.getUint32(at, true);\r\n if (count > 256 || at + 4 + count * 4 + 22 > bytes.byteLength) continue;\r\n let valid = true;\r\n for (let i = 0; i < count; i++)\r\n {\r\n if (!knownIds.has(view.getUint32(at + 4 + i * 4, true)))\r\n {\r\n valid = false;\r\n break;\r\n }\r\n }\r\n if (valid && plausibleMeter(view, at + 4 + count * 4, bytes.byteLength))\r\n {\r\n anchors.push(at);\r\n }\r\n }\r\n return anchors;\r\n}\r\n\r\nfunction readMusicNodeTail(cursor)\r\n{\r\n const childCount = cursor.u32();\r\n const children = [];\r\n for (let i = 0; i < childCount; i++) children.push(cursor.u32());\r\n const meter = {\r\n gridPeriod: cursor.f64(),\r\n gridOffset: cursor.f64(),\r\n tempo: cursor.f32(),\r\n beatsPerBar: cursor.u8(),\r\n beatValue: cursor.u8()\r\n };\r\n const meterOverride = cursor.u8() !== 0;\r\n const stingerCount = cursor.u32();\r\n const stingers = [];\r\n for (let i = 0; i < stingerCount; i++)\r\n {\r\n stingers.push({\r\n triggerId: cursor.u32(),\r\n segmentId: cursor.u32(),\r\n syncPlayAt: cursor.u32(),\r\n cueFilterHash: cursor.u32(),\r\n dontRepeatTime: cursor.s32(),\r\n numSegmentLookAhead: cursor.u32()\r\n });\r\n }\r\n return { children, meter, meterOverride, stingers };\r\n}\r\n\r\n/** AkMusicTransNodeParams: transition rules shared by playlist + switch containers. */\r\nfunction readTransRules(cursor)\r\n{\r\n const ruleCount = cursor.u32();\r\n if (ruleCount > 4096) throw new RangeError(\"rule count\");\r\n const rules = [];\r\n for (let i = 0; i < ruleCount; i++)\r\n {\r\n const srcCount = cursor.u32();\r\n if (srcCount > 1024) throw new RangeError(\"src count\");\r\n const srcIds = [];\r\n for (let j = 0; j < srcCount; j++) srcIds.push(cursor.s32());\r\n const dstCount = cursor.u32();\r\n if (dstCount > 1024) throw new RangeError(\"dst count\");\r\n const dstIds = [];\r\n for (let j = 0; j < dstCount; j++) dstIds.push(cursor.s32());\r\n const src = {\r\n transitionTime: cursor.s32(), fadeCurve: cursor.u32(), fadeOffset: cursor.s32(),\r\n syncType: cursor.u32(), cueFilterHash: cursor.u32(), playPostExit: cursor.u8() !== 0\r\n };\r\n const dst = {\r\n transitionTime: cursor.s32(), fadeCurve: cursor.u32(), fadeOffset: cursor.s32(),\r\n cueFilterHash: cursor.u32(), jumpToId: cursor.u32(), jumpToType: cursor.u16(),\r\n entryType: cursor.u16(), playPreEntry: cursor.u8() !== 0,\r\n matchSourceCueName: cursor.u8() !== 0\r\n };\r\n let transitionSegment = null;\r\n if (cursor.u8() !== 0)\r\n {\r\n transitionSegment = {\r\n segmentId: cursor.u32(),\r\n fadeIn: { transitionTime: cursor.s32(), fadeCurve: cursor.u32(), fadeOffset: cursor.s32() },\r\n fadeOut: { transitionTime: cursor.s32(), fadeCurve: cursor.u32(), fadeOffset: cursor.s32() },\r\n playPreEntry: cursor.u8() !== 0,\r\n playPostExit: cursor.u8() !== 0\r\n };\r\n }\r\n rules.push({ srcIds, dstIds, src, dst, transitionSegment });\r\n }\r\n return rules;\r\n}\r\n\r\n/**\r\n * Decode a music-segment (HIRC 10) payload: children, meter, stingers,\r\n * duration, and entry/exit markers.\r\n *\r\n * @param {Uint8Array} bytes Entry payload view from `inspect()`.\r\n * @param {Set<number>} knownIds Every HIRC object id in the same bank.\r\n * @returns {object|null} Decoded segment, or null when no anchored parse consumes the payload exactly.\r\n */\r\nexport function parseMusicSegment(bytes, knownIds)\r\n{\r\n for (const anchor of findAnchors(bytes, knownIds))\r\n {\r\n try\r\n {\r\n const cursor = new MusicCursor(bytes, anchor);\r\n const node = readMusicNodeTail(cursor);\r\n const duration = cursor.f64();\r\n if (!Number.isFinite(duration) || duration < 0 || duration > 36000000) continue;\r\n const markerCount = cursor.u32();\r\n if (markerCount > 1024) continue;\r\n const markers = [];\r\n for (let i = 0; i < markerCount; i++)\r\n {\r\n markers.push({ id: cursor.u32(), position: cursor.f64(), name: cursor.stringZ() });\r\n }\r\n if (cursor.at !== bytes.byteLength) continue;\r\n if (markers.some(marker => !Number.isFinite(marker.position) || marker.position < 0)) continue;\r\n return { ...node, duration, markers };\r\n }\r\n catch\r\n {\r\n continue;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode a music-track (HIRC 11) payload: sources, clips (play position and\r\n * trims per subtrack), track type, and switch parameters for switch tracks.\r\n *\r\n * @param {Uint8Array} bytes Entry payload view from `inspect()`.\r\n * @returns {object|null} Decoded track, or null when neither tail layout validates.\r\n */\r\nexport function parseMusicTrack(bytes)\r\n{\r\n const cursor = new MusicCursor(bytes, 0);\r\n cursor.u8(); // uFlags (midi/override bits)\r\n const sourceCount = cursor.u32();\r\n if (sourceCount > 512) return null;\r\n const sources = [];\r\n for (let i = 0; i < sourceCount; i++)\r\n {\r\n const pluginId = cursor.u32();\r\n const streamType = cursor.u8();\r\n const sourceId = cursor.u32();\r\n const inMemoryMediaSize = cursor.u32();\r\n const sourceBits = cursor.u8();\r\n if ((pluginId & 0x0f) === 0x02)\r\n {\r\n const size = cursor.u32();\r\n cursor.at += size;\r\n }\r\n sources.push({ pluginId, streamType, sourceId, inMemoryMediaSize, sourceBits });\r\n }\r\n const clipCount = cursor.u32();\r\n if (clipCount > 4096) return null;\r\n const clips = [];\r\n for (let i = 0; i < clipCount; i++)\r\n {\r\n clips.push({\r\n trackId: cursor.u32(),\r\n sourceId: cursor.u32(),\r\n eventId: cursor.u32(),\r\n playAt: cursor.f64(),\r\n beginTrimOffset: cursor.f64(),\r\n endTrimOffset: cursor.f64(),\r\n srcDuration: cursor.f64()\r\n });\r\n }\r\n const subTrackCount = clipCount > 0 ? cursor.u32() : 0;\r\n const autoCount = cursor.u32();\r\n if (autoCount > 4096) return null;\r\n for (let i = 0; i < autoCount; i++)\r\n {\r\n cursor.u32(); // clip index\r\n cursor.u32(); // automation type\r\n const points = cursor.u32();\r\n if (points > 65536) return null;\r\n cursor.at += points * 12;\r\n }\r\n const headEnd = cursor.at;\r\n\r\n // Tail: [NodeBaseParams...] u8 trackType, [switch+trans params when the\r\n // type is 3], f32 lookAheadTime. The switch layout is tried FIRST because\r\n // it validates every field to the exact payload end - the simple layout\r\n // only checks one byte, and a switch tail ending in zero bytes would\r\n // satisfy it falsely.\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n const end = bytes.byteLength;\r\n for (let typeAt = headEnd; typeAt <= end - 5; typeAt++)\r\n {\r\n if (view.getUint8(typeAt) !== 3) continue;\r\n const tail = new MusicCursor(bytes, typeAt + 1);\r\n try\r\n {\r\n const groupType = tail.u8();\r\n if (groupType > 1) continue;\r\n const groupId = tail.u32();\r\n const defaultSwitch = tail.u32();\r\n const assocCount = tail.u32();\r\n if (assocCount > 1024) continue;\r\n const assoc = [];\r\n for (let i = 0; i < assocCount; i++) assoc.push(tail.u32());\r\n const trans = {\r\n srcTransitionTime: tail.s32(), srcFadeCurve: tail.u32(), srcFadeOffset: tail.s32(),\r\n syncType: tail.u32(), cueFilterHash: tail.u32(),\r\n dstTransitionTime: tail.s32(), dstFadeCurve: tail.u32(), dstFadeOffset: tail.s32()\r\n };\r\n const lookAheadTime = tail.f32();\r\n if (tail.at !== end) continue;\r\n return {\r\n sources, clips, subTrackCount,\r\n trackType: 3,\r\n lookAheadTime,\r\n switchParams: { groupType, groupId, defaultSwitch, assoc, trans }\r\n };\r\n }\r\n catch\r\n {\r\n continue;\r\n }\r\n }\r\n const simpleAt = end - 5;\r\n if (simpleAt >= headEnd)\r\n {\r\n const type = view.getUint8(simpleAt);\r\n if (type <= 2)\r\n {\r\n return {\r\n sources, clips, subTrackCount,\r\n trackType: type,\r\n lookAheadTime: view.getFloat32(end - 4, true),\r\n switchParams: null\r\n };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode a music-playlist-container (HIRC 13) payload: children, meter,\r\n * stingers, transition rules, and the flat pre-order playlist tree.\r\n *\r\n * @param {Uint8Array} bytes Entry payload view from `inspect()`.\r\n * @param {Set<number>} knownIds Every HIRC object id in the same bank.\r\n * @returns {object|null} Decoded playlist container, or null when no anchored parse validates.\r\n */\r\nexport function parseMusicPlaylist(bytes, knownIds)\r\n{\r\n for (const anchor of findAnchors(bytes, knownIds))\r\n {\r\n try\r\n {\r\n const cursor = new MusicCursor(bytes, anchor);\r\n const node = readMusicNodeTail(cursor);\r\n const rules = readTransRules(cursor);\r\n const itemCount = cursor.u32();\r\n if (itemCount > 8192) continue;\r\n if (cursor.remaining !== itemCount * 30) continue;\r\n const items = [];\r\n for (let i = 0; i < itemCount; i++)\r\n {\r\n items.push({\r\n segmentId: cursor.u32(),\r\n playlistItemId: cursor.u32(),\r\n childCount: cursor.u32(),\r\n rsType: cursor.s32(),\r\n loop: cursor.s16(),\r\n loopMin: cursor.s16(),\r\n loopMax: cursor.s16(),\r\n weight: cursor.u32(),\r\n avoidRepeatCount: cursor.u16(),\r\n usingWeight: cursor.u8() !== 0,\r\n shuffle: cursor.u8() !== 0\r\n });\r\n }\r\n if (cursor.at !== bytes.byteLength) continue;\r\n return { ...node, rules, playlist: items };\r\n }\r\n catch\r\n {\r\n continue;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode a music-switch-container (HIRC 12) payload: children, meter,\r\n * stingers, transition rules, argument groups, and the decision tree.\r\n *\r\n * @param {Uint8Array} bytes Entry payload view from `inspect()`.\r\n * @param {Set<number>} knownIds Every HIRC object id in the same bank.\r\n * @returns {object|null} Decoded switch container, or null when no anchored parse validates.\r\n */\r\nexport function parseMusicSwitch(bytes, knownIds)\r\n{\r\n for (const anchor of findAnchors(bytes, knownIds))\r\n {\r\n try\r\n {\r\n const cursor = new MusicCursor(bytes, anchor);\r\n const node = readMusicNodeTail(cursor);\r\n const rules = readTransRules(cursor);\r\n const continuePlayback = cursor.u8() !== 0;\r\n const treeDepth = cursor.u32();\r\n if (treeDepth > 16) continue;\r\n const argumentGroups = [];\r\n for (let i = 0; i < treeDepth; i++) argumentGroups.push({ groupId: cursor.u32() });\r\n for (let i = 0; i < treeDepth; i++) argumentGroups[i].groupType = cursor.u8();\r\n const treeDataSize = cursor.u32();\r\n const mode = cursor.u8();\r\n if (cursor.remaining !== treeDataSize) continue;\r\n if (treeDataSize % 12 !== 0) continue;\r\n const treeNodes = [];\r\n const nodeCount = treeDataSize / 12;\r\n for (let i = 0; i < nodeCount; i++)\r\n {\r\n const key = cursor.u32();\r\n // 4-byte union: leaf = audioNodeId, internal = childrenIdx + count.\r\n const audioNodeId = cursor.view.getUint32(cursor.at, true);\r\n const childrenIdx = cursor.u16();\r\n const childrenCount = cursor.u16();\r\n const weight = cursor.u16();\r\n const probability = cursor.u16();\r\n treeNodes.push({ key, audioNodeId, childrenIdx, childrenCount, weight, probability });\r\n }\r\n if (cursor.at !== bytes.byteLength) continue;\r\n return { ...node, rules, continuePlayback, argumentGroups, mode, treeNodes };\r\n }\r\n catch\r\n {\r\n continue;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nconst MUSIC_PARSERS = Object.freeze({\r\n 10: (payload, knownIds) => parseMusicSegment(payload, knownIds),\r\n 11: payload => parseMusicTrack(payload),\r\n 12: (payload, knownIds) => parseMusicSwitch(payload, knownIds),\r\n 13: (payload, knownIds) => parseMusicPlaylist(payload, knownIds)\r\n});\r\n\r\nconst MUSIC_TYPE_NAMES = Object.freeze({\r\n 10: \"music-segment\",\r\n 11: \"music-track\",\r\n 12: \"music-switch-container\",\r\n 13: \"music-playlist-container\"\r\n});\r\n\r\n/**\r\n * Decode every interactive-music node across one or more inspected banks.\r\n *\r\n * @param {Array<object>} inspections `CjsBnkFormat.inspect()` results for every related music bank.\r\n * @returns {{nodes: Map<number, object>, diagnostics: {parsed: number, failed: Array<{bank: string, type: string, id: number}>}}} Decoded nodes keyed by object id plus per-entry failures.\r\n */\r\nexport function musicNodesFromBanks(inspections)\r\n{\r\n const banks = Array.isArray(inspections) ? inspections : [ inspections ];\r\n const nodes = new Map();\r\n const failed = [];\r\n let parsed = 0;\r\n for (const inspection of banks)\r\n {\r\n const knownIds = new Set();\r\n for (const entry of inspection.hirc ?? []) knownIds.add(entry.id);\r\n for (const entry of inspection.hirc ?? [])\r\n {\r\n const parser = MUSIC_PARSERS[entry.type];\r\n if (!parser) continue;\r\n const payload = entry.payload instanceof Uint8Array ? entry.payload : null;\r\n const decoded = payload ? parser(payload, knownIds) : null;\r\n if (!decoded)\r\n {\r\n failed.push({ bank: inspection.source || \"\", type: MUSIC_TYPE_NAMES[entry.type], id: entry.id });\r\n continue;\r\n }\r\n parsed++;\r\n nodes.set(entry.id, { id: entry.id, type: MUSIC_TYPE_NAMES[entry.type], bank: inspection.source || \"\", ...decoded });\r\n }\r\n }\r\n return { nodes, diagnostics: { parsed, failed } };\r\n}\r\n"],"names":["MusicCursor","constructor","bytes","offset","view","DataView","buffer","byteOffset","byteLength","at","remaining","u8","getUint8","u16","value","getUint16","s16","getInt16","u32","getUint32","s32","getInt32","f32","getFloat32","f64","getFloat64","stringZ","end","i","String","fromCharCode","plausibleMeter","grid","tempo","beats","beatValue","Number","isFinite","includes","findAnchors","knownIds","anchors","count","valid","has","push","readMusicNodeTail","cursor","childCount","children","meter","gridPeriod","gridOffset","beatsPerBar","meterOverride","stingerCount","stingers","triggerId","segmentId","syncPlayAt","cueFilterHash","dontRepeatTime","numSegmentLookAhead","readTransRules","ruleCount","RangeError","rules","srcCount","srcIds","j","dstCount","dstIds","src","transitionTime","fadeCurve","fadeOffset","syncType","playPostExit","dst","jumpToId","jumpToType","entryType","playPreEntry","matchSourceCueName","transitionSegment","fadeIn","fadeOut","parseMusicSegment","anchor","node","duration","markerCount","markers","id","position","name","some","marker","parseMusicTrack","sourceCount","sources","pluginId","streamType","sourceId","inMemoryMediaSize","sourceBits","size","clipCount","clips","trackId","eventId","playAt","beginTrimOffset","endTrimOffset","srcDuration","subTrackCount","autoCount","points","headEnd","typeAt","tail","groupType","groupId","defaultSwitch","assocCount","assoc","trans","srcTransitionTime","srcFadeCurve","srcFadeOffset","dstTransitionTime","dstFadeCurve","dstFadeOffset","lookAheadTime","trackType","switchParams","simpleAt","type","parseMusicPlaylist","itemCount","items","playlistItemId","rsType","loop","loopMin","loopMax","weight","avoidRepeatCount","usingWeight","shuffle","playlist","parseMusicSwitch","continuePlayback","treeDepth","argumentGroups","treeDataSize","mode","treeNodes","nodeCount","key","audioNodeId","childrenIdx","childrenCount","probability","MUSIC_PARSERS","Object","freeze","payload","MUSIC_TYPE_NAMES","musicNodesFromBanks","inspections","banks","Array","isArray","nodes","Map","failed","parsed","inspection","Set","entry","hirc","add","parser","Uint8Array","decoded","bank","source","set","diagnostics"],"mappings":"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"}
@@ -11,6 +11,11 @@ function asUint8Array(input) {
11
11
  }
12
12
  throw new TypeError("CMF input must be a Uint8Array, Buffer, ArrayBuffer, or typed-array view");
13
13
  }
14
+
15
+ /**
16
+ * Bounds-checked little-endian offset reader over CMF file bytes, including
17
+ * 64-bit integer reads guarded against unsafe values.
18
+ */
14
19
  class BinaryReader {
15
20
  constructor(bytes) {
16
21
  this.bytes = asUint8Array(bytes);
@@ -1 +1 @@
1
- {"version":3,"file":"binary.js","sources":["../../../../../src/formats/cmf/core/binary.js"],"sourcesContent":["const textDecoder = new TextDecoder();\n\nexport function asUint8Array(input)\n{\n if (input instanceof Uint8Array)\n {\n return input;\n }\n\n if (input instanceof ArrayBuffer)\n {\n return new Uint8Array(input);\n }\n\n if (ArrayBuffer.isView(input))\n {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n\n throw new TypeError(\"CMF input must be a Uint8Array, Buffer, ArrayBuffer, or typed-array view\");\n}\n\nexport class BinaryReader\n{\n constructor(bytes)\n {\n this.bytes = asUint8Array(bytes);\n this.view = new DataView(this.bytes.buffer, this.bytes.byteOffset, this.bytes.byteLength);\n }\n\n require(offset, size, label = \"read\")\n {\n if (!Number.isInteger(offset) || offset < 0 || offset + size > this.bytes.byteLength)\n {\n throw new RangeError(`CMF ${label} is outside file bounds`);\n }\n }\n\n u8(offset)\n {\n this.require(offset, 1);\n return this.view.getUint8(offset);\n }\n\n u16(offset)\n {\n this.require(offset, 2);\n return this.view.getUint16(offset, true);\n }\n\n u32(offset)\n {\n this.require(offset, 4);\n return this.view.getUint32(offset, true);\n }\n\n i32(offset)\n {\n this.require(offset, 4);\n return this.view.getInt32(offset, true);\n }\n\n f32(offset)\n {\n this.require(offset, 4);\n return this.view.getFloat32(offset, true);\n }\n\n u64(offset)\n {\n this.require(offset, 8);\n const value = this.view.getBigUint64(offset, true);\n if (value > BigInt(Number.MAX_SAFE_INTEGER))\n {\n throw new RangeError(\"CMF integer is larger than Number.MAX_SAFE_INTEGER\");\n }\n return Number(value);\n }\n\n i64(offset)\n {\n this.require(offset, 8);\n const value = this.view.getBigInt64(offset, true);\n if (value > BigInt(Number.MAX_SAFE_INTEGER) || value < BigInt(Number.MIN_SAFE_INTEGER))\n {\n throw new RangeError(\"CMF integer is outside the safe JavaScript number range\");\n }\n return Number(value);\n }\n\n bytesAt(offset, size)\n {\n this.require(offset, size, \"byte slice\");\n return this.bytes.subarray(offset, offset + size);\n }\n\n string(offset, byteSize)\n {\n if (byteSize === 0)\n {\n return \"\";\n }\n\n return textDecoder.decode(this.bytesAt(offset, byteSize));\n }\n}\n\nexport function enumName(names, value)\n{\n return names[value] ?? `Unknown(${value})`;\n}\n\nexport function readVector3(reader, offset)\n{\n return [\n reader.f32(offset),\n reader.f32(offset + 4),\n reader.f32(offset + 8)\n ];\n}\n\nexport function readQuaternion(reader, offset)\n{\n return [\n reader.f32(offset),\n reader.f32(offset + 4),\n reader.f32(offset + 8),\n reader.f32(offset + 12)\n ];\n}\n\nexport function readMatrix(reader, offset)\n{\n const values = [];\n for (let i = 0; i < 16; i++)\n {\n values.push(reader.f32(offset + i * 4));\n }\n return values;\n}\n\nexport function readBounds(reader, offset)\n{\n return {\n min: readVector3(reader, offset),\n max: readVector3(reader, offset + 12)\n };\n}\n\nexport function crc32(bytes, start = 0, end = bytes.byteLength)\n{\n let crc = 0xffffffff;\n const table = crc32Table();\n for (let i = start; i < end; i++)\n {\n crc = (crc >>> 8) ^ table[(crc ^ bytes[i]) & 0xff];\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nlet cachedCrc32Table = null;\n\nfunction crc32Table()\n{\n if (cachedCrc32Table)\n {\n return cachedCrc32Table;\n }\n\n cachedCrc32Table = new Uint32Array(256);\n for (let i = 0; i < 256; i++)\n {\n let c = i;\n for (let k = 0; k < 8; k++)\n {\n c = (c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1);\n }\n cachedCrc32Table[i] = c >>> 0;\n }\n return cachedCrc32Table;\n}\n"],"names":["textDecoder","TextDecoder","asUint8Array","input","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","TypeError","BinaryReader","constructor","bytes","view","DataView","require","offset","size","label","Number","isInteger","RangeError","u8","getUint8","u16","getUint16","u32","getUint32","i32","getInt32","f32","getFloat32","u64","value","getBigUint64","BigInt","MAX_SAFE_INTEGER","i64","getBigInt64","MIN_SAFE_INTEGER","bytesAt","subarray","string","byteSize","decode","enumName","names","readVector3","reader","readQuaternion","readMatrix","values","i","push","readBounds","min","max","crc32","start","end","crc","table","crc32Table","cachedCrc32Table","Uint32Array","c","k"],"mappings":"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"}
1
+ {"version":3,"file":"binary.js","sources":["../../../../../src/formats/cmf/core/binary.js"],"sourcesContent":["const textDecoder = new TextDecoder();\n\nexport function asUint8Array(input)\n{\n if (input instanceof Uint8Array)\n {\n return input;\n }\n\n if (input instanceof ArrayBuffer)\n {\n return new Uint8Array(input);\n }\n\n if (ArrayBuffer.isView(input))\n {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n\n throw new TypeError(\"CMF input must be a Uint8Array, Buffer, ArrayBuffer, or typed-array view\");\n}\n\n/**\n * Bounds-checked little-endian offset reader over CMF file bytes, including\n * 64-bit integer reads guarded against unsafe values.\n */\nexport class BinaryReader\n{\n constructor(bytes)\n {\n this.bytes = asUint8Array(bytes);\n this.view = new DataView(this.bytes.buffer, this.bytes.byteOffset, this.bytes.byteLength);\n }\n\n require(offset, size, label = \"read\")\n {\n if (!Number.isInteger(offset) || offset < 0 || offset + size > this.bytes.byteLength)\n {\n throw new RangeError(`CMF ${label} is outside file bounds`);\n }\n }\n\n u8(offset)\n {\n this.require(offset, 1);\n return this.view.getUint8(offset);\n }\n\n u16(offset)\n {\n this.require(offset, 2);\n return this.view.getUint16(offset, true);\n }\n\n u32(offset)\n {\n this.require(offset, 4);\n return this.view.getUint32(offset, true);\n }\n\n i32(offset)\n {\n this.require(offset, 4);\n return this.view.getInt32(offset, true);\n }\n\n f32(offset)\n {\n this.require(offset, 4);\n return this.view.getFloat32(offset, true);\n }\n\n u64(offset)\n {\n this.require(offset, 8);\n const value = this.view.getBigUint64(offset, true);\n if (value > BigInt(Number.MAX_SAFE_INTEGER))\n {\n throw new RangeError(\"CMF integer is larger than Number.MAX_SAFE_INTEGER\");\n }\n return Number(value);\n }\n\n i64(offset)\n {\n this.require(offset, 8);\n const value = this.view.getBigInt64(offset, true);\n if (value > BigInt(Number.MAX_SAFE_INTEGER) || value < BigInt(Number.MIN_SAFE_INTEGER))\n {\n throw new RangeError(\"CMF integer is outside the safe JavaScript number range\");\n }\n return Number(value);\n }\n\n bytesAt(offset, size)\n {\n this.require(offset, size, \"byte slice\");\n return this.bytes.subarray(offset, offset + size);\n }\n\n string(offset, byteSize)\n {\n if (byteSize === 0)\n {\n return \"\";\n }\n\n return textDecoder.decode(this.bytesAt(offset, byteSize));\n }\n}\n\nexport function enumName(names, value)\n{\n return names[value] ?? `Unknown(${value})`;\n}\n\nexport function readVector3(reader, offset)\n{\n return [\n reader.f32(offset),\n reader.f32(offset + 4),\n reader.f32(offset + 8)\n ];\n}\n\nexport function readQuaternion(reader, offset)\n{\n return [\n reader.f32(offset),\n reader.f32(offset + 4),\n reader.f32(offset + 8),\n reader.f32(offset + 12)\n ];\n}\n\nexport function readMatrix(reader, offset)\n{\n const values = [];\n for (let i = 0; i < 16; i++)\n {\n values.push(reader.f32(offset + i * 4));\n }\n return values;\n}\n\nexport function readBounds(reader, offset)\n{\n return {\n min: readVector3(reader, offset),\n max: readVector3(reader, offset + 12)\n };\n}\n\nexport function crc32(bytes, start = 0, end = bytes.byteLength)\n{\n let crc = 0xffffffff;\n const table = crc32Table();\n for (let i = start; i < end; i++)\n {\n crc = (crc >>> 8) ^ table[(crc ^ bytes[i]) & 0xff];\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nlet cachedCrc32Table = null;\n\nfunction crc32Table()\n{\n if (cachedCrc32Table)\n {\n return cachedCrc32Table;\n }\n\n cachedCrc32Table = new Uint32Array(256);\n for (let i = 0; i < 256; i++)\n {\n let c = i;\n for (let k = 0; k < 8; k++)\n {\n c = (c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1);\n }\n cachedCrc32Table[i] = c >>> 0;\n }\n return cachedCrc32Table;\n}\n"],"names":["textDecoder","TextDecoder","asUint8Array","input","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","TypeError","BinaryReader","constructor","bytes","view","DataView","require","offset","size","label","Number","isInteger","RangeError","u8","getUint8","u16","getUint16","u32","getUint32","i32","getInt32","f32","getFloat32","u64","value","getBigUint64","BigInt","MAX_SAFE_INTEGER","i64","getBigInt64","MIN_SAFE_INTEGER","bytesAt","subarray","string","byteSize","decode","enumName","names","readVector3","reader","readQuaternion","readMatrix","values","i","push","readBounds","min","max","crc32","start","end","crc","table","crc32Table","cachedCrc32Table","Uint32Array","c","k"],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  import { DEFAULT_VALUES, normalizeValues, readWithValues, inspectWithValues, isSupportedWithValues, toJsonValue, isDDS, toBytes, OUTPUT_JSON, OUTPUT_RAW, OUTPUT_RGBA, OUTPUT_TEXTURE, OUTPUT_IMAGE } from './core/helpers.js';
2
2
 
3
3
  const FORMAT_NAME = "CjsDdsFormat";
4
+
5
+ /**
6
+ * DDS texture format profile that inspects header metadata, probes output
7
+ * support, and reads DDS bytes into raw, GPU-free texture, image, or
8
+ * software-decoded RGBA and float payloads (BC1-BC5, BC7, and BC6H
9
+ * included).
10
+ */
4
11
  class CjsDdsFormat {
5
12
  #values = DEFAULT_VALUES;
6
13
 
@@ -1 +1 @@
1
- {"version":3,"file":"CjsDdsFormat.js","sources":["../../../../src/formats/dds/CjsDdsFormat.js"],"sourcesContent":["import {\n DEFAULT_VALUES,\n OUTPUT_IMAGE,\n OUTPUT_JSON,\n OUTPUT_RAW,\n OUTPUT_RGBA,\n OUTPUT_TEXTURE,\n inspectWithValues,\n isDDS,\n isSupportedWithValues,\n normalizeValues,\n readWithValues,\n toBytes,\n toJsonValue\n} from \"./core/helpers.js\";\n\nconst FORMAT_NAME = \"CjsDdsFormat\";\n\nexport class CjsDdsFormat\n{\n #values = DEFAULT_VALUES;\n\n /**\n * Create a reusable DDS format profile.\n *\n * @param {object} [options] Default read/inspect options.\n */\n constructor(options = {})\n {\n this.SetValues(options);\n }\n\n /**\n * Merge options into this profile.\n *\n * @param {object} [options] Values to merge.\n * @returns {CjsDdsFormat} This format profile.\n */\n SetValues(options = {})\n {\n this.#values = normalizeValues(this.#values, { inputType: \"dds\", ...options }, FORMAT_NAME);\n return this;\n }\n\n /**\n * Get normalized profile values with optional per-call overrides.\n *\n * @param {object} [options] Per-call values.\n * @returns {object} Normalized read values.\n */\n GetValues(options = {})\n {\n return normalizeValues(this.#values, { inputType: \"dds\", ...options }, FORMAT_NAME);\n }\n\n /**\n * Read DDS bytes with this profile.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} GPU-free raw/debug/texture payload for the selected emit target.\n */\n Read(input, options = {})\n {\n return readWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Read DDS bytes asynchronously with this profile.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {Promise<object>} GPU-free raw/debug/texture payload for the selected emit target.\n */\n async ReadAsync(input, options = {})\n {\n return this.Read(input, options);\n }\n\n /**\n * Inspect DDS bytes without decoding texture data.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} DDS header metadata.\n */\n Inspect(input, options = {})\n {\n return inspectWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Report whether DDS input and requested output variants are supported.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} Support/probe report.\n */\n IsSupported(input, options = {})\n {\n return isSupportedWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Convert format output into JSON-compatible debug data.\n *\n * @param {any} value Format output.\n * @returns {any} JSON-compatible value.\n */\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * One-shot DDS read.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Read options.\n * @returns {object} GPU-free raw/debug/texture payload for the selected emit target.\n */\n static read(input, options = {})\n {\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * One-shot asynchronous DDS read.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Read options.\n * @returns {Promise<object>} GPU-free raw/debug/texture payload for the selected emit target.\n */\n static async readAsync(input, options = {})\n {\n return CjsDdsFormat.read(input, options);\n }\n\n /**\n * One-shot DDS inspection.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Inspect options.\n * @returns {object} DDS header metadata.\n */\n static inspect(input, options = {})\n {\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * One-shot DDS support probe.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Probe options.\n * @returns {object} Support/probe report.\n */\n static isSupported(input, options = {})\n {\n return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * Convert format output into JSON-compatible debug data.\n *\n * @param {any} value Format output.\n * @returns {any} JSON-compatible value.\n */\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Test whether bytes look like a DDS file.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate DDS bytes.\n * @returns {boolean} True when the DDS header is present and sized correctly.\n */\n static isDDS(input)\n {\n try\n {\n return isDDS(toBytes(input));\n }\n catch\n {\n return false;\n }\n }\n\n /**\n * Emit targets for this format (canonical frozen enum).\n */\n static Output = Object.freeze({\n IMAGE: OUTPUT_IMAGE,\n TEXTURE: OUTPUT_TEXTURE,\n RGBA: OUTPUT_RGBA,\n RAW: OUTPUT_RAW,\n JSON: OUTPUT_JSON\n });\n static OUTPUT_DDS_JSON = \"ddsJson\";\n static type = Object.freeze([ \"texture\", \"image\" ]);\n static mediaTypes = Object.freeze([ \"texture\", \"image\" ]);\n static inputTypes = Object.freeze([ \"dds\" ]);\n static outputTypes = Object.freeze([ OUTPUT_TEXTURE, OUTPUT_IMAGE, OUTPUT_RGBA ]);\n static debugOutputTypes = Object.freeze([ \"ddsJson\", OUTPUT_RAW ]);\n}\n\nexport default CjsDdsFormat;\n"],"names":["FORMAT_NAME","CjsDdsFormat","DEFAULT_VALUES","constructor","options","SetValues","normalizeValues","inputType","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","IsSupported","isSupportedWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","isSupported","toJSON","isDDS","toBytes","Output","Object","freeze","IMAGE","OUTPUT_IMAGE","TEXTURE","OUTPUT_TEXTURE","RGBA","OUTPUT_RGBA","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","OUTPUT_DDS_JSON","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes"],"mappings":"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"}
1
+ {"version":3,"file":"CjsDdsFormat.js","sources":["../../../../src/formats/dds/CjsDdsFormat.js"],"sourcesContent":["import {\n DEFAULT_VALUES,\n OUTPUT_IMAGE,\n OUTPUT_JSON,\n OUTPUT_RAW,\n OUTPUT_RGBA,\n OUTPUT_TEXTURE,\n inspectWithValues,\n isDDS,\n isSupportedWithValues,\n normalizeValues,\n readWithValues,\n toBytes,\n toJsonValue\n} from \"./core/helpers.js\";\n\nconst FORMAT_NAME = \"CjsDdsFormat\";\n\n/**\n * DDS texture format profile that inspects header metadata, probes output\n * support, and reads DDS bytes into raw, GPU-free texture, image, or\n * software-decoded RGBA and float payloads (BC1-BC5, BC7, and BC6H\n * included).\n */\nexport class CjsDdsFormat\n{\n #values = DEFAULT_VALUES;\n\n /**\n * Create a reusable DDS format profile.\n *\n * @param {object} [options] Default read/inspect options.\n */\n constructor(options = {})\n {\n this.SetValues(options);\n }\n\n /**\n * Merge options into this profile.\n *\n * @param {object} [options] Values to merge.\n * @returns {CjsDdsFormat} This format profile.\n */\n SetValues(options = {})\n {\n this.#values = normalizeValues(this.#values, { inputType: \"dds\", ...options }, FORMAT_NAME);\n return this;\n }\n\n /**\n * Get normalized profile values with optional per-call overrides.\n *\n * @param {object} [options] Per-call values.\n * @returns {object} Normalized read values.\n */\n GetValues(options = {})\n {\n return normalizeValues(this.#values, { inputType: \"dds\", ...options }, FORMAT_NAME);\n }\n\n /**\n * Read DDS bytes with this profile.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} GPU-free raw/debug/texture payload for the selected emit target.\n */\n Read(input, options = {})\n {\n return readWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Read DDS bytes asynchronously with this profile.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {Promise<object>} GPU-free raw/debug/texture payload for the selected emit target.\n */\n async ReadAsync(input, options = {})\n {\n return this.Read(input, options);\n }\n\n /**\n * Inspect DDS bytes without decoding texture data.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} DDS header metadata.\n */\n Inspect(input, options = {})\n {\n return inspectWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Report whether DDS input and requested output variants are supported.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Per-call values.\n * @returns {object} Support/probe report.\n */\n IsSupported(input, options = {})\n {\n return isSupportedWithValues(input, this.GetValues(options), \"dds\");\n }\n\n /**\n * Convert format output into JSON-compatible debug data.\n *\n * @param {any} value Format output.\n * @returns {any} JSON-compatible value.\n */\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * One-shot DDS read.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Read options.\n * @returns {object} GPU-free raw/debug/texture payload for the selected emit target.\n */\n static read(input, options = {})\n {\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * One-shot asynchronous DDS read.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Read options.\n * @returns {Promise<object>} GPU-free raw/debug/texture payload for the selected emit target.\n */\n static async readAsync(input, options = {})\n {\n return CjsDdsFormat.read(input, options);\n }\n\n /**\n * One-shot DDS inspection.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Inspect options.\n * @returns {object} DDS header metadata.\n */\n static inspect(input, options = {})\n {\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * One-shot DDS support probe.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input DDS bytes.\n * @param {object} [options] Probe options.\n * @returns {object} Support/probe report.\n */\n static isSupported(input, options = {})\n {\n return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"dds\", ...options }, FORMAT_NAME), \"dds\");\n }\n\n /**\n * Convert format output into JSON-compatible debug data.\n *\n * @param {any} value Format output.\n * @returns {any} JSON-compatible value.\n */\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Test whether bytes look like a DDS file.\n *\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate DDS bytes.\n * @returns {boolean} True when the DDS header is present and sized correctly.\n */\n static isDDS(input)\n {\n try\n {\n return isDDS(toBytes(input));\n }\n catch\n {\n return false;\n }\n }\n\n /**\n * Emit targets for this format (canonical frozen enum).\n */\n static Output = Object.freeze({\n IMAGE: OUTPUT_IMAGE,\n TEXTURE: OUTPUT_TEXTURE,\n RGBA: OUTPUT_RGBA,\n RAW: OUTPUT_RAW,\n JSON: OUTPUT_JSON\n });\n static OUTPUT_DDS_JSON = \"ddsJson\";\n static type = Object.freeze([ \"texture\", \"image\" ]);\n static mediaTypes = Object.freeze([ \"texture\", \"image\" ]);\n static inputTypes = Object.freeze([ \"dds\" ]);\n static outputTypes = Object.freeze([ OUTPUT_TEXTURE, OUTPUT_IMAGE, OUTPUT_RGBA ]);\n static debugOutputTypes = Object.freeze([ \"ddsJson\", OUTPUT_RAW ]);\n}\n\nexport default CjsDdsFormat;\n"],"names":["FORMAT_NAME","CjsDdsFormat","DEFAULT_VALUES","constructor","options","SetValues","normalizeValues","inputType","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","IsSupported","isSupportedWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","isSupported","toJSON","isDDS","toBytes","Output","Object","freeze","IMAGE","OUTPUT_IMAGE","TEXTURE","OUTPUT_TEXTURE","RGBA","OUTPUT_RGBA","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","OUTPUT_DDS_JSON","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes"],"mappings":"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"}
@@ -121,7 +121,7 @@ function decodeBc7(source, width, height, rowPitch = Math.ceil(width / 4) * 16)
121
121
  function decodeBc7Block(block) {
122
122
  if (block.byteLength < 16) throw new RangeError("BC7 block must contain 16 bytes");
123
123
  if (block[0] === 0) return new Uint8Array(16 * 4);
124
- const reader = new BitReader(block);
124
+ const reader = new Bc7BitReader(block);
125
125
  let mode = 0;
126
126
  while (mode < 8 && reader.read(1) === 0) mode++;
127
127
  if (mode === 8) return new Uint8Array(16 * 4);
@@ -231,7 +231,12 @@ function copyBlock(block, output, width, height, blockX, blockY) {
231
231
  }
232
232
  }
233
233
  }
234
- class BitReader {
234
+
235
+ /**
236
+ * LSB-first bit reader over a single 128-bit BC7 block bitstream for the
237
+ * software BC7 decoder.
238
+ */
239
+ class Bc7BitReader {
235
240
  constructor(bytes) {
236
241
  this.bytes = bytes;
237
242
  this.offset = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"bc7.js","sources":["../../../../../src/formats/dds/core/bc7.js"],"sourcesContent":["// BC7 is defined as a little-endian 128-bit block format. The mode and\n// partition constants below are the fixed tables from the Khronos Data Format\n// Specification, section 20.1. The decoder itself is CarbonEngineJS code.\n\nconst MODE = Object.freeze([\n { subsets: 3, partitionBits: 4, rotationBits: 0, selectionBits: 0, colorBits: 4, alphaBits: 0, endpointPBits: 1, sharedPBits: 0, indexBits: 3, secondaryIndexBits: 0 },\n { subsets: 2, partitionBits: 6, rotationBits: 0, selectionBits: 0, colorBits: 6, alphaBits: 0, endpointPBits: 0, sharedPBits: 1, indexBits: 3, secondaryIndexBits: 0 },\n { subsets: 3, partitionBits: 6, rotationBits: 0, selectionBits: 0, colorBits: 5, alphaBits: 0, endpointPBits: 0, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 0 },\n { subsets: 2, partitionBits: 6, rotationBits: 0, selectionBits: 0, colorBits: 7, alphaBits: 0, endpointPBits: 1, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 0 },\n { subsets: 1, partitionBits: 0, rotationBits: 2, selectionBits: 1, colorBits: 5, alphaBits: 6, endpointPBits: 0, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 3 },\n { subsets: 1, partitionBits: 0, rotationBits: 2, selectionBits: 0, colorBits: 7, alphaBits: 8, endpointPBits: 0, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 2 },\n { subsets: 1, partitionBits: 0, rotationBits: 0, selectionBits: 0, colorBits: 7, alphaBits: 7, endpointPBits: 1, sharedPBits: 0, indexBits: 4, secondaryIndexBits: 0 },\n { subsets: 2, partitionBits: 6, rotationBits: 0, selectionBits: 0, colorBits: 5, alphaBits: 5, endpointPBits: 1, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 0 }\n]);\n\nconst WEIGHTS = Object.freeze({\n 2: new Uint8Array([ 0, 21, 43, 64 ]),\n 3: new Uint8Array([ 0, 9, 18, 27, 37, 46, 55, 64 ]),\n 4: new Uint8Array([ 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 ])\n});\n\n// One bit per texel, in y-major order.\nconst PARTITIONS_2 = new Uint16Array([\n 0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80,\n 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000,\n 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce,\n 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c,\n 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a,\n 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660,\n 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c,\n 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22\n]);\n\n// Two bits per texel, in y-major order.\nconst PARTITIONS_3 = new Uint32Array([\n 0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050,\n 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250,\n 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500,\n 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200,\n 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50,\n 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600,\n 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000,\n 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254\n]);\n\nconst ANCHOR_2 = new Uint8Array([\n 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n 15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2,\n 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6,\n 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15\n]);\n\nconst ANCHOR_3_SECOND = new Uint8Array([\n 3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3,\n 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6, 8, 5, 15, 15,\n 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, 15, 15, 15, 15,\n 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3\n]);\n\nconst ANCHOR_3_THIRD = new Uint8Array([\n 15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, 15, 15, 8,\n 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, 6, 10, 15, 15, 10, 8,\n 15, 3, 15, 10, 10, 8, 9, 10, 6, 15, 8, 15, 3, 6, 6, 8,\n 15, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8\n]);\n\nexport function decodeBc7(source, width, height, rowPitch = Math.ceil(width / 4) * 16)\n{\n const rgba = new Uint8Array(width * height * 4);\n const blockRows = Math.ceil(height / 4);\n const blockColumns = Math.ceil(width / 4);\n\n for (let blockY = 0; blockY < blockRows; blockY++)\n {\n for (let blockX = 0; blockX < blockColumns; blockX++)\n {\n const blockOffset = blockY * rowPitch + blockX * 16;\n const pixels = decodeBc7Block(source.subarray(blockOffset, blockOffset + 16));\n copyBlock(pixels, rgba, width, height, blockX, blockY);\n }\n }\n\n return rgba;\n}\n\nexport function decodeBc7Block(block)\n{\n if (block.byteLength < 16) throw new RangeError(\"BC7 block must contain 16 bytes\");\n if (block[0] === 0) return new Uint8Array(16 * 4);\n\n const reader = new BitReader(block);\n let mode = 0;\n while (mode < 8 && reader.read(1) === 0) mode++;\n if (mode === 8) return new Uint8Array(16 * 4);\n\n const info = MODE[mode];\n const partition = reader.read(info.partitionBits);\n const rotation = reader.read(info.rotationBits);\n const selection = reader.read(info.selectionBits);\n const endpointCount = info.subsets * 2;\n const endpoints = Array.from({ length: endpointCount }, () => [ 0, 0, 0, 255 ]);\n\n for (let channel = 0; channel < 3; channel++)\n {\n for (let endpoint = 0; endpoint < endpointCount; endpoint++)\n {\n endpoints[endpoint][channel] = reader.read(info.colorBits);\n }\n }\n\n if (info.alphaBits)\n {\n for (let endpoint = 0; endpoint < endpointCount; endpoint++)\n {\n endpoints[endpoint][3] = reader.read(info.alphaBits);\n }\n }\n\n const pBits = new Uint8Array(endpointCount);\n if (info.endpointPBits)\n {\n for (let endpoint = 0; endpoint < endpointCount; endpoint++) pBits[endpoint] = reader.read(1);\n }\n else if (info.sharedPBits)\n {\n for (let subset = 0; subset < info.subsets; subset++)\n {\n const pBit = reader.read(1);\n pBits[subset * 2] = pBit;\n pBits[subset * 2 + 1] = pBit;\n }\n }\n\n const colorPrecision = info.colorBits + (info.endpointPBits || info.sharedPBits ? 1 : 0);\n const alphaPrecision = info.alphaBits + (info.alphaBits && (info.endpointPBits || info.sharedPBits) ? 1 : 0);\n for (let endpoint = 0; endpoint < endpointCount; endpoint++)\n {\n for (let channel = 0; channel < 3; channel++)\n {\n const value = info.endpointPBits || info.sharedPBits\n ? (endpoints[endpoint][channel] << 1) | pBits[endpoint]\n : endpoints[endpoint][channel];\n endpoints[endpoint][channel] = expandEndpoint(value, colorPrecision);\n }\n\n if (info.alphaBits)\n {\n const value = info.endpointPBits || info.sharedPBits\n ? (endpoints[endpoint][3] << 1) | pBits[endpoint]\n : endpoints[endpoint][3];\n endpoints[endpoint][3] = expandEndpoint(value, alphaPrecision);\n }\n }\n\n const primary = readIndices(reader, info.indexBits, info.subsets, partition);\n const secondary = info.secondaryIndexBits\n ? readIndices(reader, info.secondaryIndexBits, info.subsets, partition)\n : primary;\n const colorUsesSecondary = info.selectionBits && selection === 1;\n const alphaUsesSecondary = info.secondaryIndexBits && (!info.selectionBits || selection === 0);\n const colorIndices = colorUsesSecondary ? secondary : primary;\n const alphaIndices = alphaUsesSecondary ? secondary : primary;\n const colorIndexBits = colorUsesSecondary ? info.secondaryIndexBits : info.indexBits;\n const alphaIndexBits = alphaUsesSecondary ? info.secondaryIndexBits : info.indexBits;\n const pixels = new Uint8Array(16 * 4);\n\n for (let pixel = 0; pixel < 16; pixel++)\n {\n const subset = getSubset(info.subsets, partition, pixel);\n const first = endpoints[subset * 2];\n const second = endpoints[subset * 2 + 1];\n const output = pixel * 4;\n\n for (let channel = 0; channel < 3; channel++)\n {\n pixels[output + channel] = interpolate(first[channel], second[channel], colorIndices[pixel], colorIndexBits);\n }\n pixels[output + 3] = interpolate(first[3], second[3], alphaIndices[pixel], alphaIndexBits);\n\n if (rotation)\n {\n const channel = rotation - 1;\n const value = pixels[output + channel];\n pixels[output + channel] = pixels[output + 3];\n pixels[output + 3] = value;\n }\n }\n\n return pixels;\n}\n\nfunction readIndices(reader, bitCount, subsets, partition)\n{\n const indices = new Uint8Array(16);\n for (let pixel = 0; pixel < 16; pixel++)\n {\n const subset = getSubset(subsets, partition, pixel);\n const isAnchor = pixel === getAnchor(subsets, partition, subset);\n indices[pixel] = reader.read(bitCount - (isAnchor ? 1 : 0));\n }\n return indices;\n}\n\nfunction getSubset(subsets, partition, pixel)\n{\n if (subsets === 1) return 0;\n if (subsets === 2) return (PARTITIONS_2[partition] >>> pixel) & 1;\n return (PARTITIONS_3[partition] >>> (pixel * 2)) & 3;\n}\n\nfunction getAnchor(subsets, partition, subset)\n{\n if (subset === 0) return 0;\n if (subsets === 2) return ANCHOR_2[partition];\n return subset === 1 ? ANCHOR_3_SECOND[partition] : ANCHOR_3_THIRD[partition];\n}\n\nfunction expandEndpoint(value, bitCount)\n{\n if (bitCount === 8) return value;\n return (value << (8 - bitCount)) | (value >>> (2 * bitCount - 8));\n}\n\nfunction interpolate(first, second, index, bitCount)\n{\n const weight = WEIGHTS[bitCount][index];\n return ((64 - weight) * first + weight * second + 32) >>> 6;\n}\n\nfunction copyBlock(block, output, width, height, blockX, blockY)\n{\n for (let y = 0; y < 4; y++)\n {\n const outputY = blockY * 4 + y;\n if (outputY >= height) continue;\n\n for (let x = 0; x < 4; x++)\n {\n const outputX = blockX * 4 + x;\n if (outputX >= width) continue;\n const sourceOffset = (y * 4 + x) * 4;\n output.set(block.subarray(sourceOffset, sourceOffset + 4), (outputY * width + outputX) * 4);\n }\n }\n}\n\nclass BitReader\n{\n constructor(bytes)\n {\n this.bytes = bytes;\n this.offset = 0;\n }\n\n read(bitCount)\n {\n let value = 0;\n for (let bit = 0; bit < bitCount; bit++)\n {\n if (this.offset >= 128) throw new RangeError(\"BC7 block bitstream exceeds 128 bits\");\n value |= ((this.bytes[this.offset >>> 3] >>> (this.offset & 7)) & 1) << bit;\n this.offset++;\n }\n return value;\n }\n}\n"],"names":["MODE","Object","freeze","subsets","partitionBits","rotationBits","selectionBits","colorBits","alphaBits","endpointPBits","sharedPBits","indexBits","secondaryIndexBits","WEIGHTS","Uint8Array","PARTITIONS_2","Uint16Array","PARTITIONS_3","Uint32Array","ANCHOR_2","ANCHOR_3_SECOND","ANCHOR_3_THIRD","decodeBc7","source","width","height","rowPitch","Math","ceil","rgba","blockRows","blockColumns","blockY","blockX","blockOffset","pixels","decodeBc7Block","subarray","copyBlock","block","byteLength","RangeError","reader","BitReader","mode","read","info","partition","rotation","selection","endpointCount","endpoints","Array","from","length","channel","endpoint","pBits","subset","pBit","colorPrecision","alphaPrecision","value","expandEndpoint","primary","readIndices","secondary","colorUsesSecondary","alphaUsesSecondary","colorIndices","alphaIndices","colorIndexBits","alphaIndexBits","pixel","getSubset","first","second","output","interpolate","bitCount","indices","isAnchor","getAnchor","index","weight","y","outputY","x","outputX","sourceOffset","set","constructor","bytes","offset","bit"],"mappings":"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"}
1
+ {"version":3,"file":"bc7.js","sources":["../../../../../src/formats/dds/core/bc7.js"],"sourcesContent":["// BC7 is defined as a little-endian 128-bit block format. The mode and\n// partition constants below are the fixed tables from the Khronos Data Format\n// Specification, section 20.1. The decoder itself is CarbonEngineJS code.\n\nconst MODE = Object.freeze([\n { subsets: 3, partitionBits: 4, rotationBits: 0, selectionBits: 0, colorBits: 4, alphaBits: 0, endpointPBits: 1, sharedPBits: 0, indexBits: 3, secondaryIndexBits: 0 },\n { subsets: 2, partitionBits: 6, rotationBits: 0, selectionBits: 0, colorBits: 6, alphaBits: 0, endpointPBits: 0, sharedPBits: 1, indexBits: 3, secondaryIndexBits: 0 },\n { subsets: 3, partitionBits: 6, rotationBits: 0, selectionBits: 0, colorBits: 5, alphaBits: 0, endpointPBits: 0, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 0 },\n { subsets: 2, partitionBits: 6, rotationBits: 0, selectionBits: 0, colorBits: 7, alphaBits: 0, endpointPBits: 1, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 0 },\n { subsets: 1, partitionBits: 0, rotationBits: 2, selectionBits: 1, colorBits: 5, alphaBits: 6, endpointPBits: 0, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 3 },\n { subsets: 1, partitionBits: 0, rotationBits: 2, selectionBits: 0, colorBits: 7, alphaBits: 8, endpointPBits: 0, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 2 },\n { subsets: 1, partitionBits: 0, rotationBits: 0, selectionBits: 0, colorBits: 7, alphaBits: 7, endpointPBits: 1, sharedPBits: 0, indexBits: 4, secondaryIndexBits: 0 },\n { subsets: 2, partitionBits: 6, rotationBits: 0, selectionBits: 0, colorBits: 5, alphaBits: 5, endpointPBits: 1, sharedPBits: 0, indexBits: 2, secondaryIndexBits: 0 }\n]);\n\nconst WEIGHTS = Object.freeze({\n 2: new Uint8Array([ 0, 21, 43, 64 ]),\n 3: new Uint8Array([ 0, 9, 18, 27, 37, 46, 55, 64 ]),\n 4: new Uint8Array([ 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 ])\n});\n\n// One bit per texel, in y-major order.\nconst PARTITIONS_2 = new Uint16Array([\n 0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80,\n 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000,\n 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce,\n 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c,\n 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a,\n 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660,\n 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c,\n 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22\n]);\n\n// Two bits per texel, in y-major order.\nconst PARTITIONS_3 = new Uint32Array([\n 0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050,\n 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250,\n 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500,\n 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200,\n 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50,\n 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600,\n 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000,\n 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254\n]);\n\nconst ANCHOR_2 = new Uint8Array([\n 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\n 15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2,\n 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6,\n 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15\n]);\n\nconst ANCHOR_3_SECOND = new Uint8Array([\n 3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3,\n 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6, 8, 5, 15, 15,\n 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, 15, 15, 15, 15,\n 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3\n]);\n\nconst ANCHOR_3_THIRD = new Uint8Array([\n 15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, 15, 15, 8,\n 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, 6, 10, 15, 15, 10, 8,\n 15, 3, 15, 10, 10, 8, 9, 10, 6, 15, 8, 15, 3, 6, 6, 8,\n 15, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8\n]);\n\nexport function decodeBc7(source, width, height, rowPitch = Math.ceil(width / 4) * 16)\n{\n const rgba = new Uint8Array(width * height * 4);\n const blockRows = Math.ceil(height / 4);\n const blockColumns = Math.ceil(width / 4);\n\n for (let blockY = 0; blockY < blockRows; blockY++)\n {\n for (let blockX = 0; blockX < blockColumns; blockX++)\n {\n const blockOffset = blockY * rowPitch + blockX * 16;\n const pixels = decodeBc7Block(source.subarray(blockOffset, blockOffset + 16));\n copyBlock(pixels, rgba, width, height, blockX, blockY);\n }\n }\n\n return rgba;\n}\n\nexport function decodeBc7Block(block)\n{\n if (block.byteLength < 16) throw new RangeError(\"BC7 block must contain 16 bytes\");\n if (block[0] === 0) return new Uint8Array(16 * 4);\n\n const reader = new Bc7BitReader(block);\n let mode = 0;\n while (mode < 8 && reader.read(1) === 0) mode++;\n if (mode === 8) return new Uint8Array(16 * 4);\n\n const info = MODE[mode];\n const partition = reader.read(info.partitionBits);\n const rotation = reader.read(info.rotationBits);\n const selection = reader.read(info.selectionBits);\n const endpointCount = info.subsets * 2;\n const endpoints = Array.from({ length: endpointCount }, () => [ 0, 0, 0, 255 ]);\n\n for (let channel = 0; channel < 3; channel++)\n {\n for (let endpoint = 0; endpoint < endpointCount; endpoint++)\n {\n endpoints[endpoint][channel] = reader.read(info.colorBits);\n }\n }\n\n if (info.alphaBits)\n {\n for (let endpoint = 0; endpoint < endpointCount; endpoint++)\n {\n endpoints[endpoint][3] = reader.read(info.alphaBits);\n }\n }\n\n const pBits = new Uint8Array(endpointCount);\n if (info.endpointPBits)\n {\n for (let endpoint = 0; endpoint < endpointCount; endpoint++) pBits[endpoint] = reader.read(1);\n }\n else if (info.sharedPBits)\n {\n for (let subset = 0; subset < info.subsets; subset++)\n {\n const pBit = reader.read(1);\n pBits[subset * 2] = pBit;\n pBits[subset * 2 + 1] = pBit;\n }\n }\n\n const colorPrecision = info.colorBits + (info.endpointPBits || info.sharedPBits ? 1 : 0);\n const alphaPrecision = info.alphaBits + (info.alphaBits && (info.endpointPBits || info.sharedPBits) ? 1 : 0);\n for (let endpoint = 0; endpoint < endpointCount; endpoint++)\n {\n for (let channel = 0; channel < 3; channel++)\n {\n const value = info.endpointPBits || info.sharedPBits\n ? (endpoints[endpoint][channel] << 1) | pBits[endpoint]\n : endpoints[endpoint][channel];\n endpoints[endpoint][channel] = expandEndpoint(value, colorPrecision);\n }\n\n if (info.alphaBits)\n {\n const value = info.endpointPBits || info.sharedPBits\n ? (endpoints[endpoint][3] << 1) | pBits[endpoint]\n : endpoints[endpoint][3];\n endpoints[endpoint][3] = expandEndpoint(value, alphaPrecision);\n }\n }\n\n const primary = readIndices(reader, info.indexBits, info.subsets, partition);\n const secondary = info.secondaryIndexBits\n ? readIndices(reader, info.secondaryIndexBits, info.subsets, partition)\n : primary;\n const colorUsesSecondary = info.selectionBits && selection === 1;\n const alphaUsesSecondary = info.secondaryIndexBits && (!info.selectionBits || selection === 0);\n const colorIndices = colorUsesSecondary ? secondary : primary;\n const alphaIndices = alphaUsesSecondary ? secondary : primary;\n const colorIndexBits = colorUsesSecondary ? info.secondaryIndexBits : info.indexBits;\n const alphaIndexBits = alphaUsesSecondary ? info.secondaryIndexBits : info.indexBits;\n const pixels = new Uint8Array(16 * 4);\n\n for (let pixel = 0; pixel < 16; pixel++)\n {\n const subset = getSubset(info.subsets, partition, pixel);\n const first = endpoints[subset * 2];\n const second = endpoints[subset * 2 + 1];\n const output = pixel * 4;\n\n for (let channel = 0; channel < 3; channel++)\n {\n pixels[output + channel] = interpolate(first[channel], second[channel], colorIndices[pixel], colorIndexBits);\n }\n pixels[output + 3] = interpolate(first[3], second[3], alphaIndices[pixel], alphaIndexBits);\n\n if (rotation)\n {\n const channel = rotation - 1;\n const value = pixels[output + channel];\n pixels[output + channel] = pixels[output + 3];\n pixels[output + 3] = value;\n }\n }\n\n return pixels;\n}\n\nfunction readIndices(reader, bitCount, subsets, partition)\n{\n const indices = new Uint8Array(16);\n for (let pixel = 0; pixel < 16; pixel++)\n {\n const subset = getSubset(subsets, partition, pixel);\n const isAnchor = pixel === getAnchor(subsets, partition, subset);\n indices[pixel] = reader.read(bitCount - (isAnchor ? 1 : 0));\n }\n return indices;\n}\n\nfunction getSubset(subsets, partition, pixel)\n{\n if (subsets === 1) return 0;\n if (subsets === 2) return (PARTITIONS_2[partition] >>> pixel) & 1;\n return (PARTITIONS_3[partition] >>> (pixel * 2)) & 3;\n}\n\nfunction getAnchor(subsets, partition, subset)\n{\n if (subset === 0) return 0;\n if (subsets === 2) return ANCHOR_2[partition];\n return subset === 1 ? ANCHOR_3_SECOND[partition] : ANCHOR_3_THIRD[partition];\n}\n\nfunction expandEndpoint(value, bitCount)\n{\n if (bitCount === 8) return value;\n return (value << (8 - bitCount)) | (value >>> (2 * bitCount - 8));\n}\n\nfunction interpolate(first, second, index, bitCount)\n{\n const weight = WEIGHTS[bitCount][index];\n return ((64 - weight) * first + weight * second + 32) >>> 6;\n}\n\nfunction copyBlock(block, output, width, height, blockX, blockY)\n{\n for (let y = 0; y < 4; y++)\n {\n const outputY = blockY * 4 + y;\n if (outputY >= height) continue;\n\n for (let x = 0; x < 4; x++)\n {\n const outputX = blockX * 4 + x;\n if (outputX >= width) continue;\n const sourceOffset = (y * 4 + x) * 4;\n output.set(block.subarray(sourceOffset, sourceOffset + 4), (outputY * width + outputX) * 4);\n }\n }\n}\n\n/**\n * LSB-first bit reader over a single 128-bit BC7 block bitstream for the\n * software BC7 decoder.\n */\nclass Bc7BitReader\n{\n constructor(bytes)\n {\n this.bytes = bytes;\n this.offset = 0;\n }\n\n read(bitCount)\n {\n let value = 0;\n for (let bit = 0; bit < bitCount; bit++)\n {\n if (this.offset >= 128) throw new RangeError(\"BC7 block bitstream exceeds 128 bits\");\n value |= ((this.bytes[this.offset >>> 3] >>> (this.offset & 7)) & 1) << bit;\n this.offset++;\n }\n return value;\n }\n}\n"],"names":["MODE","Object","freeze","subsets","partitionBits","rotationBits","selectionBits","colorBits","alphaBits","endpointPBits","sharedPBits","indexBits","secondaryIndexBits","WEIGHTS","Uint8Array","PARTITIONS_2","Uint16Array","PARTITIONS_3","Uint32Array","ANCHOR_2","ANCHOR_3_SECOND","ANCHOR_3_THIRD","decodeBc7","source","width","height","rowPitch","Math","ceil","rgba","blockRows","blockColumns","blockY","blockX","blockOffset","pixels","decodeBc7Block","subarray","copyBlock","block","byteLength","RangeError","reader","Bc7BitReader","mode","read","info","partition","rotation","selection","endpointCount","endpoints","Array","from","length","channel","endpoint","pBits","subset","pBit","colorPrecision","alphaPrecision","value","expandEndpoint","primary","readIndices","secondary","colorUsesSecondary","alphaUsesSecondary","colorIndices","alphaIndices","colorIndexBits","alphaIndexBits","pixel","getSubset","first","second","output","interpolate","bitCount","indices","isAnchor","getAnchor","index","weight","y","outputY","x","outputX","sourceOffset","set","constructor","bytes","offset","bit"],"mappings":"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"}
@@ -1026,6 +1026,11 @@ function adler32(bytes) {
1026
1026
  }
1027
1027
  return (b << 16 >>> 0 | a) >>> 0;
1028
1028
  }
1029
+
1030
+ /**
1031
+ * Bit reader over a zlib/deflate stream used to inflate compressed FBX
1032
+ * property arrays.
1033
+ */
1029
1034
  class DeflateBitReader {
1030
1035
  constructor(bytes) {
1031
1036
  this.bytes = bytes;
@@ -1070,6 +1075,11 @@ class DeflateBitReader {
1070
1075
  return low | high << 8;
1071
1076
  }
1072
1077
  }
1078
+
1079
+ /**
1080
+ * Canonical Huffman decode table built from deflate code lengths for
1081
+ * inflating compressed FBX property arrays.
1082
+ */
1073
1083
  class DeflateHuffmanTable {
1074
1084
  constructor(lengths) {
1075
1085
  this.tables = [];