@carbonenginejs/runtime-resource 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/formats/bnk/CjsBnkFormat.js +12 -2
- package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
- 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 +53 -11
- package/dist/formats/bnk/core/helpers.js.map +1 -1
- package/dist/formats/bnk/core/sfxNodes.js +532 -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/analysis.js +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/binary.js +3 -3
- package/dist/formats/webgl/core/cewg/binary.js.map +1 -1
- package/dist/formats/webgl/core/effectPackage.js +6 -3
- package/dist/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/formats/webgl/core/effectPackageValidation.js +1 -1
- package/dist/formats/webgl/core/effectPackageValidation.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/core/packageMetadata.js +2 -2
- package/dist/formats/webgpu/core/packageMetadata.js.map +1 -1
- 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 +76 -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 +97 -0
- package/docs/formats/hlsl/reference/classes/README.md +16 -0
- package/docs/formats/hlsl/reference/classes/carbon-compatibility.md +66 -0
- package/docs/formats/hlsl/reference/classes/public-api.md +26 -0
- package/docs/formats/hlsl/reference/classes/tr2-effect-model.md +150 -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 +9 -4
- 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 +96 -0
- package/docs/formats/webgl/texture-sample.md +964 -0
- package/docs/formats/webgpu/README.md +81 -0
- package/docs/formats/webgpu/architecture.md +93 -0
- package/docs/formats/webgpu/formats/cewgpu.md +479 -0
- package/docs/formats/webgpu/guides/effect-packaging.md +199 -0
- package/docs/formats/webgpu/reference/api.md +197 -0
- package/docs/formats/webgpu/reference/classes/README.md +66 -0
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +1442 -0
- package/docs/formats/wwise.md +16 -1
- package/docs/reference/classes/formats.md +10 -10
- package/format-notices/bnk/NOTICE +5 -4
- package/format-notices/webgl/NOTICE +1 -1
- package/package.json +1 -1
- package/dist/formats/gr2/core/CjsFormatGr2.js +0 -273
- package/dist/formats/gr2/core/CjsFormatGr2.js.map +0 -1
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Readers for Wwise SoundbanksInfo metadata (the `soundbanksinfo.json` file
|
|
3
|
-
* generated next to soundbanks).
|
|
4
|
-
*
|
|
5
|
-
* SoundbanksInfo is the authoring-name authority for soundbank content: it
|
|
6
|
-
* maps media ids to original source paths and lists per-bank events, switch
|
|
7
|
-
* groups, state groups, and game parameters. These helpers normalize that
|
|
8
|
-
* document and join it against `CjsBnkFormat` inspection output; they never
|
|
9
|
-
* touch audio bytes.
|
|
1
|
+
/**
|
|
2
|
+
* Readers for Wwise SoundbanksInfo metadata (the `soundbanksinfo.json` file
|
|
3
|
+
* generated next to soundbanks).
|
|
4
|
+
*
|
|
5
|
+
* SoundbanksInfo is the authoring-name authority for soundbank content: it
|
|
6
|
+
* maps media ids to original source paths and lists per-bank events, switch
|
|
7
|
+
* groups, state groups, and game parameters. These helpers normalize that
|
|
8
|
+
* document and join it against `CjsBnkFormat` inspection output; they never
|
|
9
|
+
* touch audio bytes.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
/**
|
|
13
|
-
* Compute the Wwise 32-bit id for a name.
|
|
14
|
-
*
|
|
15
|
-
* Wwise derives bank, event, and language ids as the FNV-1 32-bit hash of the
|
|
16
|
-
* lowercased name (verified against EVE build 3421648 bank and language ids).
|
|
17
|
-
*
|
|
18
|
-
* @param {string} name Bank, event, switch, or language name.
|
|
19
|
-
* @returns {number} Unsigned 32-bit Wwise id.
|
|
12
|
+
/**
|
|
13
|
+
* Compute the Wwise 32-bit id for a name.
|
|
14
|
+
*
|
|
15
|
+
* Wwise derives bank, event, and language ids as the FNV-1 32-bit hash of the
|
|
16
|
+
* lowercased name (verified against EVE build 3421648 bank and language ids).
|
|
17
|
+
*
|
|
18
|
+
* @param {string} name Bank, event, switch, or language name.
|
|
19
|
+
* @returns {number} Unsigned 32-bit Wwise id.
|
|
20
20
|
*/
|
|
21
21
|
function wwiseIdFromName(name) {
|
|
22
22
|
let hash = 2166136261 >>> 0;
|
|
@@ -51,11 +51,11 @@ function toSoundbanksInfoDocument(input) {
|
|
|
51
51
|
return document;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/**
|
|
55
|
-
* Test whether input looks like a Wwise SoundbanksInfo document.
|
|
56
|
-
*
|
|
57
|
-
* @param {Uint8Array|ArrayBuffer|DataView|string|object} input Candidate document.
|
|
58
|
-
* @returns {boolean} True when a SoundBanksInfo bank list is present.
|
|
54
|
+
/**
|
|
55
|
+
* Test whether input looks like a Wwise SoundbanksInfo document.
|
|
56
|
+
*
|
|
57
|
+
* @param {Uint8Array|ArrayBuffer|DataView|string|object} input Candidate document.
|
|
58
|
+
* @returns {boolean} True when a SoundBanksInfo bank list is present.
|
|
59
59
|
*/
|
|
60
60
|
function isSoundbanksInfo(input) {
|
|
61
61
|
try {
|
|
@@ -66,11 +66,11 @@ function isSoundbanksInfo(input) {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
/**
|
|
70
|
-
* Parse SoundbanksInfo into a normalized camelCase summary.
|
|
71
|
-
*
|
|
72
|
-
* @param {Uint8Array|ArrayBuffer|DataView|string|object} input SoundbanksInfo JSON bytes, text, or object.
|
|
73
|
-
* @returns {object} Normalized document summary with per-bank details.
|
|
69
|
+
/**
|
|
70
|
+
* Parse SoundbanksInfo into a normalized camelCase summary.
|
|
71
|
+
*
|
|
72
|
+
* @param {Uint8Array|ArrayBuffer|DataView|string|object} input SoundbanksInfo JSON bytes, text, or object.
|
|
73
|
+
* @returns {object} Normalized document summary with per-bank details.
|
|
74
74
|
*/
|
|
75
75
|
function parseSoundbanksInfo(input) {
|
|
76
76
|
const document = toSoundbanksInfoDocument(input);
|
|
@@ -98,23 +98,27 @@ function parseSoundbanksInfo(input) {
|
|
|
98
98
|
return summary;
|
|
99
99
|
}
|
|
100
100
|
function normalizeBank(bank) {
|
|
101
|
+
const media = Array.isArray(bank.Media) ? bank.Media : bank.IncludedMemoryFiles || [];
|
|
102
|
+
const events = Array.isArray(bank.Events) ? bank.Events : bank.IncludedEvents || [];
|
|
101
103
|
return {
|
|
102
104
|
id: String(bank.Id ?? ""),
|
|
103
105
|
type: bank.Type || "",
|
|
104
106
|
language: bank.Language || "",
|
|
105
107
|
shortName: bank.ShortName || "",
|
|
106
108
|
path: bank.Path || "",
|
|
107
|
-
media:
|
|
109
|
+
media: media.map(entry => ({
|
|
108
110
|
id: String(entry.Id ?? ""),
|
|
109
111
|
shortName: entry.ShortName || "",
|
|
110
112
|
cachePath: entry.CachePath || "",
|
|
113
|
+
path: entry.Path || "",
|
|
111
114
|
language: entry.Language || "",
|
|
112
115
|
streaming: entry.Streaming === "true",
|
|
113
|
-
location: entry.Location || ""
|
|
116
|
+
location: entry.Location || (Array.isArray(bank.IncludedMemoryFiles) ? "Memory" : "")
|
|
114
117
|
})),
|
|
115
|
-
events:
|
|
118
|
+
events: events.map(entry => ({
|
|
116
119
|
id: String(entry.Id ?? ""),
|
|
117
|
-
name: entry.Name || ""
|
|
120
|
+
name: entry.Name || "",
|
|
121
|
+
maxAttenuation: finiteNumber(entry.MaxAttenuation, 0)
|
|
118
122
|
})),
|
|
119
123
|
switchGroups: (bank.SwitchGroups || []).map(group => ({
|
|
120
124
|
id: String(group.Id ?? ""),
|
|
@@ -138,15 +142,19 @@ function normalizeBank(bank) {
|
|
|
138
142
|
}))
|
|
139
143
|
};
|
|
140
144
|
}
|
|
145
|
+
function finiteNumber(value, fallback) {
|
|
146
|
+
const number = Number(value);
|
|
147
|
+
return Number.isFinite(number) ? number : fallback;
|
|
148
|
+
}
|
|
141
149
|
|
|
142
|
-
/**
|
|
143
|
-
* Build id-keyed lookup tables from SoundbanksInfo.
|
|
144
|
-
*
|
|
145
|
-
* Media ids repeat across language variants of the same bank, so
|
|
146
|
-
* `mediaById[id]` is an array of entries; event ids are unique.
|
|
147
|
-
*
|
|
148
|
-
* @param {Uint8Array|ArrayBuffer|DataView|string|object} input SoundbanksInfo JSON bytes, text, or object.
|
|
149
|
-
* @returns {object} Catalog with banksById, mediaById, eventsById, and eventsByName.
|
|
150
|
+
/**
|
|
151
|
+
* Build id-keyed lookup tables from SoundbanksInfo.
|
|
152
|
+
*
|
|
153
|
+
* Media ids repeat across language variants of the same bank, so
|
|
154
|
+
* `mediaById[id]` is an array of entries; event ids are unique.
|
|
155
|
+
*
|
|
156
|
+
* @param {Uint8Array|ArrayBuffer|DataView|string|object} input SoundbanksInfo JSON bytes, text, or object.
|
|
157
|
+
* @returns {object} Catalog with banksById, mediaById, eventsById, and eventsByName.
|
|
150
158
|
*/
|
|
151
159
|
function buildSoundbanksCatalog(input) {
|
|
152
160
|
const parsed = parseSoundbanksInfo(input);
|
|
@@ -189,18 +197,18 @@ function buildSoundbanksCatalog(input) {
|
|
|
189
197
|
return catalog;
|
|
190
198
|
}
|
|
191
199
|
|
|
192
|
-
/**
|
|
193
|
-
* Join a `CjsBnkFormat` inspection result with a SoundbanksInfo catalog.
|
|
194
|
-
*
|
|
195
|
-
* Annotates the bank's embedded media and HIRC event listing with authoring
|
|
196
|
-
* names. Entries with no catalog match keep `null` name fields rather than
|
|
197
|
-
* being dropped, so counts stay aligned with the inspected bank. Language
|
|
198
|
-
* variants of a bank share one bank id; the inspected BKHD `languageId`
|
|
199
|
-
* (an FNV-1 hash of the language name) selects the exact variant.
|
|
200
|
-
*
|
|
201
|
-
* @param {object} bankInfo `CjsBnkFormat` inspect output.
|
|
202
|
-
* @param {object} catalog `buildSoundbanksCatalog` output.
|
|
203
|
-
* @returns {object} Bank/media/event annotations for the inspected bank.
|
|
200
|
+
/**
|
|
201
|
+
* Join a `CjsBnkFormat` inspection result with a SoundbanksInfo catalog.
|
|
202
|
+
*
|
|
203
|
+
* Annotates the bank's embedded media and HIRC event listing with authoring
|
|
204
|
+
* names. Entries with no catalog match keep `null` name fields rather than
|
|
205
|
+
* being dropped, so counts stay aligned with the inspected bank. Language
|
|
206
|
+
* variants of a bank share one bank id; the inspected BKHD `languageId`
|
|
207
|
+
* (an FNV-1 hash of the language name) selects the exact variant.
|
|
208
|
+
*
|
|
209
|
+
* @param {object} bankInfo `CjsBnkFormat` inspect output.
|
|
210
|
+
* @param {object} catalog `buildSoundbanksCatalog` output.
|
|
211
|
+
* @returns {object} Bank/media/event annotations for the inspected bank.
|
|
204
212
|
*/
|
|
205
213
|
function joinSoundbanksInfo(bankInfo, catalog) {
|
|
206
214
|
const bankId = String(bankInfo.bankId ?? "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"soundbanksInfo.js","sources":["../../../../../src/formats/bnk/core/soundbanksInfo.js"],"sourcesContent":["/**\n * Readers for Wwise SoundbanksInfo metadata (the `soundbanksinfo.json` file\n * generated next to soundbanks).\n *\n * SoundbanksInfo is the authoring-name authority for soundbank content: it\n * maps media ids to original source paths and lists per-bank events, switch\n * groups, state groups, and game parameters. These helpers normalize that\n * document and join it against `CjsBnkFormat` inspection output; they never\n * touch audio bytes.\n */\n\n/**\n * Compute the Wwise 32-bit id for a name.\n *\n * Wwise derives bank, event, and language ids as the FNV-1 32-bit hash of the\n * lowercased name (verified against EVE build 3421648 bank and language ids).\n *\n * @param {string} name Bank, event, switch, or language name.\n * @returns {number} Unsigned 32-bit Wwise id.\n */\nexport function wwiseIdFromName(name)\n{\n let hash = 2166136261 >>> 0;\n const text = String(name).toLowerCase();\n for (let i = 0; i < text.length; i++)\n {\n hash = Math.imul(hash, 16777619) >>> 0;\n hash = (hash ^ text.charCodeAt(i)) >>> 0;\n }\n return hash;\n}\n\n/** Converts the current BNK format reader value to soundbanks info document. */\nexport function toSoundbanksInfoDocument(input)\n{\n let value = input;\n if (value instanceof ArrayBuffer) value = new Uint8Array(value);\n if (ArrayBuffer.isView(value)) value = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n if (value instanceof Uint8Array) value = utf8String(value);\n if (typeof value === \"string\")\n {\n try\n {\n value = JSON.parse(value);\n }\n catch (error)\n {\n throw new TypeError(`CjsBnkFormat: SoundbanksInfo input is not valid JSON (${error.message})`);\n }\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n {\n throw new TypeError(\"CjsBnkFormat: SoundbanksInfo input must be JSON bytes, text, or an object\");\n }\n const document = value.SoundBanksInfo || value;\n if (!document || typeof document !== \"object\" || !Array.isArray(document.SoundBanks))\n {\n throw new TypeError(\"CjsBnkFormat: input has no SoundBanksInfo.SoundBanks document\");\n }\n return document;\n}\n\n/**\n * Test whether input looks like a Wwise SoundbanksInfo document.\n *\n * @param {Uint8Array|ArrayBuffer|DataView|string|object} input Candidate document.\n * @returns {boolean} True when a SoundBanksInfo bank list is present.\n */\nexport function isSoundbanksInfo(input)\n{\n try\n {\n toSoundbanksInfoDocument(input);\n return true;\n }\n catch\n {\n return false;\n }\n}\n\n/**\n * Parse SoundbanksInfo into a normalized camelCase summary.\n *\n * @param {Uint8Array|ArrayBuffer|DataView|string|object} input SoundbanksInfo JSON bytes, text, or object.\n * @returns {object} Normalized document summary with per-bank details.\n */\nexport function parseSoundbanksInfo(input)\n{\n const document = toSoundbanksInfoDocument(input);\n const banks = document.SoundBanks.map(normalizeBank);\n const summary = {\n platform: document.Platform || \"\",\n basePlatform: document.BasePlatform || \"\",\n schemaVersion: document.SchemaVersion || \"\",\n soundBankVersion: document.SoundBankVersion || \"\",\n bankCount: banks.length,\n mediaCount: 0,\n streamingMediaCount: 0,\n eventCount: 0,\n languages: [],\n banks\n };\n\n const languages = new Set();\n for (const bank of banks)\n {\n summary.mediaCount += bank.media.length;\n summary.streamingMediaCount += bank.media.filter((entry) => entry.streaming).length;\n summary.eventCount += bank.events.length;\n if (bank.language) languages.add(bank.language);\n }\n summary.languages = [ ...languages ].sort();\n return summary;\n}\n\nfunction normalizeBank(bank)\n{\n return {\n id: String(bank.Id ?? \"\"),\n type: bank.Type || \"\",\n language: bank.Language || \"\",\n shortName: bank.ShortName || \"\",\n path: bank.Path || \"\",\n media: (bank.Media || []).map((entry) => ({\n id: String(entry.Id ?? \"\"),\n shortName: entry.ShortName || \"\",\n cachePath: entry.CachePath || \"\",\n language: entry.Language || \"\",\n streaming: entry.Streaming === \"true\",\n location: entry.Location || \"\"\n })),\n events: (bank.Events || []).map((entry) => ({\n id: String(entry.Id ?? \"\"),\n name: entry.Name || \"\"\n })),\n switchGroups: (bank.SwitchGroups || []).map((group) => ({\n id: String(group.Id ?? \"\"),\n name: group.Name || \"\",\n switches: (group.Switches || []).map((entry) => ({\n id: String(entry.Id ?? \"\"),\n name: entry.Name || \"\"\n }))\n })),\n stateGroups: (bank.StateGroups || []).map((group) => ({\n id: String(group.Id ?? \"\"),\n name: group.Name || \"\",\n states: (group.States || []).map((entry) => ({\n id: String(entry.Id ?? \"\"),\n name: entry.Name || \"\"\n }))\n })),\n gameParameters: (bank.GameParameters || []).map((entry) => ({\n id: String(entry.Id ?? \"\"),\n name: entry.Name || \"\"\n }))\n };\n}\n\n/**\n * Build id-keyed lookup tables from SoundbanksInfo.\n *\n * Media ids repeat across language variants of the same bank, so\n * `mediaById[id]` is an array of entries; event ids are unique.\n *\n * @param {Uint8Array|ArrayBuffer|DataView|string|object} input SoundbanksInfo JSON bytes, text, or object.\n * @returns {object} Catalog with banksById, mediaById, eventsById, and eventsByName.\n */\nexport function buildSoundbanksCatalog(input)\n{\n const parsed = parseSoundbanksInfo(input);\n const catalog = {\n platform: parsed.platform,\n soundBankVersion: parsed.soundBankVersion,\n bankCount: parsed.bankCount,\n mediaCount: parsed.mediaCount,\n eventCount: parsed.eventCount,\n languages: parsed.languages,\n banksById: {},\n bankVariantsById: {},\n mediaById: {},\n eventsById: {},\n eventsByName: {}\n };\n\n for (const bank of parsed.banks)\n {\n if (!catalog.banksById[bank.id]) catalog.banksById[bank.id] = bank;\n if (!catalog.bankVariantsById[bank.id]) catalog.bankVariantsById[bank.id] = [];\n catalog.bankVariantsById[bank.id].push(bank);\n for (const entry of bank.media)\n {\n const reference = {\n ...entry,\n bankId: bank.id,\n bankName: bank.shortName\n };\n if (!catalog.mediaById[entry.id]) catalog.mediaById[entry.id] = [];\n catalog.mediaById[entry.id].push(reference);\n }\n for (const entry of bank.events)\n {\n const reference = {\n ...entry,\n bankId: bank.id,\n bankName: bank.shortName\n };\n catalog.eventsById[entry.id] = reference;\n catalog.eventsByName[entry.name] = reference;\n }\n }\n\n return catalog;\n}\n\n/**\n * Join a `CjsBnkFormat` inspection result with a SoundbanksInfo catalog.\n *\n * Annotates the bank's embedded media and HIRC event listing with authoring\n * names. Entries with no catalog match keep `null` name fields rather than\n * being dropped, so counts stay aligned with the inspected bank. Language\n * variants of a bank share one bank id; the inspected BKHD `languageId`\n * (an FNV-1 hash of the language name) selects the exact variant.\n *\n * @param {object} bankInfo `CjsBnkFormat` inspect output.\n * @param {object} catalog `buildSoundbanksCatalog` output.\n * @returns {object} Bank/media/event annotations for the inspected bank.\n */\nexport function joinSoundbanksInfo(bankInfo, catalog)\n{\n const bankId = String(bankInfo.bankId ?? \"\");\n const variants = catalog.bankVariantsById[bankId] || [];\n const bank = variants.find((variant) => wwiseIdFromName(variant.language) === bankInfo.languageId) ||\n catalog.banksById[bankId] ||\n null;\n const bankLanguage = bank ? bank.language : \"\";\n\n const media = (bankInfo.media || []).map((entry) =>\n {\n const references = catalog.mediaById[String(entry.id)] || [];\n const match = references.find((reference) => reference.bankId === bankId && reference.language === bankLanguage) ||\n references.find((reference) => reference.bankId === bankId) ||\n references[0] ||\n null;\n return {\n id: entry.id,\n length: entry.length,\n available: entry.available,\n shortName: match ? match.shortName : null,\n cachePath: match ? match.cachePath : null,\n language: match ? match.language : null,\n streaming: match ? match.streaming : null\n };\n });\n\n const events = (bankInfo.hirc || [])\n .filter((entry) => entry.typeName === \"event\")\n .map((entry) =>\n {\n const match = catalog.eventsById[String(entry.id)] || null;\n return {\n id: entry.id,\n name: match ? match.name : null,\n bankName: match ? match.bankName : null\n };\n });\n\n return {\n bankId,\n bank,\n media,\n namedMediaCount: media.filter((entry) => entry.shortName !== null).length,\n events,\n namedEventCount: events.filter((entry) => entry.name !== null).length\n };\n}\n\nfunction utf8String(bytes)\n{\n if (typeof TextDecoder !== \"undefined\") return new TextDecoder(\"utf-8\").decode(bytes);\n let value = \"\";\n for (let i = 0; i < bytes.length; i++) value += String.fromCharCode(bytes[i]);\n return value;\n}\n"],"names":["wwiseIdFromName","name","hash","text","String","toLowerCase","i","length","Math","imul","charCodeAt","toSoundbanksInfoDocument","input","value","ArrayBuffer","Uint8Array","isView","buffer","byteOffset","byteLength","utf8String","JSON","parse","error","TypeError","message","Array","isArray","document","SoundBanksInfo","SoundBanks","isSoundbanksInfo","parseSoundbanksInfo","banks","map","normalizeBank","summary","platform","Platform","basePlatform","BasePlatform","schemaVersion","SchemaVersion","soundBankVersion","SoundBankVersion","bankCount","mediaCount","streamingMediaCount","eventCount","languages","Set","bank","media","filter","entry","streaming","events","language","add","sort","id","Id","type","Type","Language","shortName","ShortName","path","Path","Media","cachePath","CachePath","Streaming","location","Location","Events","Name","switchGroups","SwitchGroups","group","switches","Switches","stateGroups","StateGroups","states","States","gameParameters","GameParameters","buildSoundbanksCatalog","parsed","catalog","banksById","bankVariantsById","mediaById","eventsById","eventsByName","push","reference","bankId","bankName","joinSoundbanksInfo","bankInfo","variants","find","variant","languageId","bankLanguage","references","match","available","hirc","typeName","namedMediaCount","namedEventCount","bytes","TextDecoder","decode","fromCharCode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"soundbanksInfo.js","sources":["../../../../../src/formats/bnk/core/soundbanksInfo.js"],"sourcesContent":["/**\r\n * Readers for Wwise SoundbanksInfo metadata (the `soundbanksinfo.json` file\r\n * generated next to soundbanks).\r\n *\r\n * SoundbanksInfo is the authoring-name authority for soundbank content: it\r\n * maps media ids to original source paths and lists per-bank events, switch\r\n * groups, state groups, and game parameters. These helpers normalize that\r\n * document and join it against `CjsBnkFormat` inspection output; they never\r\n * touch audio bytes.\r\n */\r\n\r\n/**\r\n * Compute the Wwise 32-bit id for a name.\r\n *\r\n * Wwise derives bank, event, and language ids as the FNV-1 32-bit hash of the\r\n * lowercased name (verified against EVE build 3421648 bank and language ids).\r\n *\r\n * @param {string} name Bank, event, switch, or language name.\r\n * @returns {number} Unsigned 32-bit Wwise id.\r\n */\r\nexport function wwiseIdFromName(name)\r\n{\r\n let hash = 2166136261 >>> 0;\r\n const text = String(name).toLowerCase();\r\n for (let i = 0; i < text.length; i++)\r\n {\r\n hash = Math.imul(hash, 16777619) >>> 0;\r\n hash = (hash ^ text.charCodeAt(i)) >>> 0;\r\n }\r\n return hash;\r\n}\r\n\r\n/** Converts the current BNK format reader value to soundbanks info document. */\r\nexport function toSoundbanksInfoDocument(input)\r\n{\r\n let value = input;\r\n if (value instanceof ArrayBuffer) value = new Uint8Array(value);\r\n if (ArrayBuffer.isView(value)) value = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\r\n if (value instanceof Uint8Array) value = utf8String(value);\r\n if (typeof value === \"string\")\r\n {\r\n try\r\n {\r\n value = JSON.parse(value);\r\n }\r\n catch (error)\r\n {\r\n throw new TypeError(`CjsBnkFormat: SoundbanksInfo input is not valid JSON (${error.message})`);\r\n }\r\n }\r\n if (!value || typeof value !== \"object\" || Array.isArray(value))\r\n {\r\n throw new TypeError(\"CjsBnkFormat: SoundbanksInfo input must be JSON bytes, text, or an object\");\r\n }\r\n const document = value.SoundBanksInfo || value;\r\n if (!document || typeof document !== \"object\" || !Array.isArray(document.SoundBanks))\r\n {\r\n throw new TypeError(\"CjsBnkFormat: input has no SoundBanksInfo.SoundBanks document\");\r\n }\r\n return document;\r\n}\r\n\r\n/**\r\n * Test whether input looks like a Wwise SoundbanksInfo document.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView|string|object} input Candidate document.\r\n * @returns {boolean} True when a SoundBanksInfo bank list is present.\r\n */\r\nexport function isSoundbanksInfo(input)\r\n{\r\n try\r\n {\r\n toSoundbanksInfoDocument(input);\r\n return true;\r\n }\r\n catch\r\n {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Parse SoundbanksInfo into a normalized camelCase summary.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView|string|object} input SoundbanksInfo JSON bytes, text, or object.\r\n * @returns {object} Normalized document summary with per-bank details.\r\n */\r\nexport function parseSoundbanksInfo(input)\r\n{\r\n const document = toSoundbanksInfoDocument(input);\r\n const banks = document.SoundBanks.map(normalizeBank);\r\n const summary = {\r\n platform: document.Platform || \"\",\r\n basePlatform: document.BasePlatform || \"\",\r\n schemaVersion: document.SchemaVersion || \"\",\r\n soundBankVersion: document.SoundBankVersion || \"\",\r\n bankCount: banks.length,\r\n mediaCount: 0,\r\n streamingMediaCount: 0,\r\n eventCount: 0,\r\n languages: [],\r\n banks\r\n };\r\n\r\n const languages = new Set();\r\n for (const bank of banks)\r\n {\r\n summary.mediaCount += bank.media.length;\r\n summary.streamingMediaCount += bank.media.filter((entry) => entry.streaming).length;\r\n summary.eventCount += bank.events.length;\r\n if (bank.language) languages.add(bank.language);\r\n }\r\n summary.languages = [ ...languages ].sort();\r\n return summary;\r\n}\r\n\r\nfunction normalizeBank(bank)\r\n{\r\n const media = Array.isArray(bank.Media)\r\n ? bank.Media\r\n : bank.IncludedMemoryFiles || [];\r\n const events = Array.isArray(bank.Events)\r\n ? bank.Events\r\n : bank.IncludedEvents || [];\r\n\r\n return {\r\n id: String(bank.Id ?? \"\"),\r\n type: bank.Type || \"\",\r\n language: bank.Language || \"\",\r\n shortName: bank.ShortName || \"\",\r\n path: bank.Path || \"\",\r\n media: media.map((entry) => ({\r\n id: String(entry.Id ?? \"\"),\r\n shortName: entry.ShortName || \"\",\r\n cachePath: entry.CachePath || \"\",\r\n path: entry.Path || \"\",\r\n language: entry.Language || \"\",\r\n streaming: entry.Streaming === \"true\",\r\n location: entry.Location\r\n || (Array.isArray(bank.IncludedMemoryFiles)\r\n ? \"Memory\"\r\n : \"\")\r\n })),\r\n events: events.map((entry) => ({\r\n id: String(entry.Id ?? \"\"),\r\n name: entry.Name || \"\",\r\n maxAttenuation: finiteNumber(entry.MaxAttenuation, 0)\r\n })),\r\n switchGroups: (bank.SwitchGroups || []).map((group) => ({\r\n id: String(group.Id ?? \"\"),\r\n name: group.Name || \"\",\r\n switches: (group.Switches || []).map((entry) => ({\r\n id: String(entry.Id ?? \"\"),\r\n name: entry.Name || \"\"\r\n }))\r\n })),\r\n stateGroups: (bank.StateGroups || []).map((group) => ({\r\n id: String(group.Id ?? \"\"),\r\n name: group.Name || \"\",\r\n states: (group.States || []).map((entry) => ({\r\n id: String(entry.Id ?? \"\"),\r\n name: entry.Name || \"\"\r\n }))\r\n })),\r\n gameParameters: (bank.GameParameters || []).map((entry) => ({\r\n id: String(entry.Id ?? \"\"),\r\n name: entry.Name || \"\"\r\n }))\r\n };\r\n}\r\n\r\nfunction finiteNumber(value, fallback)\r\n{\r\n const number = Number(value);\r\n\r\n return Number.isFinite(number) ? number : fallback;\r\n}\r\n\r\n/**\r\n * Build id-keyed lookup tables from SoundbanksInfo.\r\n *\r\n * Media ids repeat across language variants of the same bank, so\r\n * `mediaById[id]` is an array of entries; event ids are unique.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView|string|object} input SoundbanksInfo JSON bytes, text, or object.\r\n * @returns {object} Catalog with banksById, mediaById, eventsById, and eventsByName.\r\n */\r\nexport function buildSoundbanksCatalog(input)\r\n{\r\n const parsed = parseSoundbanksInfo(input);\r\n const catalog = {\r\n platform: parsed.platform,\r\n soundBankVersion: parsed.soundBankVersion,\r\n bankCount: parsed.bankCount,\r\n mediaCount: parsed.mediaCount,\r\n eventCount: parsed.eventCount,\r\n languages: parsed.languages,\r\n banksById: {},\r\n bankVariantsById: {},\r\n mediaById: {},\r\n eventsById: {},\r\n eventsByName: {}\r\n };\r\n\r\n for (const bank of parsed.banks)\r\n {\r\n if (!catalog.banksById[bank.id]) catalog.banksById[bank.id] = bank;\r\n if (!catalog.bankVariantsById[bank.id]) catalog.bankVariantsById[bank.id] = [];\r\n catalog.bankVariantsById[bank.id].push(bank);\r\n for (const entry of bank.media)\r\n {\r\n const reference = {\r\n ...entry,\r\n bankId: bank.id,\r\n bankName: bank.shortName\r\n };\r\n if (!catalog.mediaById[entry.id]) catalog.mediaById[entry.id] = [];\r\n catalog.mediaById[entry.id].push(reference);\r\n }\r\n for (const entry of bank.events)\r\n {\r\n const reference = {\r\n ...entry,\r\n bankId: bank.id,\r\n bankName: bank.shortName\r\n };\r\n catalog.eventsById[entry.id] = reference;\r\n catalog.eventsByName[entry.name] = reference;\r\n }\r\n }\r\n\r\n return catalog;\r\n}\r\n\r\n/**\r\n * Join a `CjsBnkFormat` inspection result with a SoundbanksInfo catalog.\r\n *\r\n * Annotates the bank's embedded media and HIRC event listing with authoring\r\n * names. Entries with no catalog match keep `null` name fields rather than\r\n * being dropped, so counts stay aligned with the inspected bank. Language\r\n * variants of a bank share one bank id; the inspected BKHD `languageId`\r\n * (an FNV-1 hash of the language name) selects the exact variant.\r\n *\r\n * @param {object} bankInfo `CjsBnkFormat` inspect output.\r\n * @param {object} catalog `buildSoundbanksCatalog` output.\r\n * @returns {object} Bank/media/event annotations for the inspected bank.\r\n */\r\nexport function joinSoundbanksInfo(bankInfo, catalog)\r\n{\r\n const bankId = String(bankInfo.bankId ?? \"\");\r\n const variants = catalog.bankVariantsById[bankId] || [];\r\n const bank = variants.find((variant) => wwiseIdFromName(variant.language) === bankInfo.languageId) ||\r\n catalog.banksById[bankId] ||\r\n null;\r\n const bankLanguage = bank ? bank.language : \"\";\r\n\r\n const media = (bankInfo.media || []).map((entry) =>\r\n {\r\n const references = catalog.mediaById[String(entry.id)] || [];\r\n const match = references.find((reference) => reference.bankId === bankId && reference.language === bankLanguage) ||\r\n references.find((reference) => reference.bankId === bankId) ||\r\n references[0] ||\r\n null;\r\n return {\r\n id: entry.id,\r\n length: entry.length,\r\n available: entry.available,\r\n shortName: match ? match.shortName : null,\r\n cachePath: match ? match.cachePath : null,\r\n language: match ? match.language : null,\r\n streaming: match ? match.streaming : null\r\n };\r\n });\r\n\r\n const events = (bankInfo.hirc || [])\r\n .filter((entry) => entry.typeName === \"event\")\r\n .map((entry) =>\r\n {\r\n const match = catalog.eventsById[String(entry.id)] || null;\r\n return {\r\n id: entry.id,\r\n name: match ? match.name : null,\r\n bankName: match ? match.bankName : null\r\n };\r\n });\r\n\r\n return {\r\n bankId,\r\n bank,\r\n media,\r\n namedMediaCount: media.filter((entry) => entry.shortName !== null).length,\r\n events,\r\n namedEventCount: events.filter((entry) => entry.name !== null).length\r\n };\r\n}\r\n\r\nfunction utf8String(bytes)\r\n{\r\n if (typeof TextDecoder !== \"undefined\") return new TextDecoder(\"utf-8\").decode(bytes);\r\n let value = \"\";\r\n for (let i = 0; i < bytes.length; i++) value += String.fromCharCode(bytes[i]);\r\n return value;\r\n}\r\n"],"names":["wwiseIdFromName","name","hash","text","String","toLowerCase","i","length","Math","imul","charCodeAt","toSoundbanksInfoDocument","input","value","ArrayBuffer","Uint8Array","isView","buffer","byteOffset","byteLength","utf8String","JSON","parse","error","TypeError","message","Array","isArray","document","SoundBanksInfo","SoundBanks","isSoundbanksInfo","parseSoundbanksInfo","banks","map","normalizeBank","summary","platform","Platform","basePlatform","BasePlatform","schemaVersion","SchemaVersion","soundBankVersion","SoundBankVersion","bankCount","mediaCount","streamingMediaCount","eventCount","languages","Set","bank","media","filter","entry","streaming","events","language","add","sort","Media","IncludedMemoryFiles","Events","IncludedEvents","id","Id","type","Type","Language","shortName","ShortName","path","Path","cachePath","CachePath","Streaming","location","Location","Name","maxAttenuation","finiteNumber","MaxAttenuation","switchGroups","SwitchGroups","group","switches","Switches","stateGroups","StateGroups","states","States","gameParameters","GameParameters","fallback","number","Number","isFinite","buildSoundbanksCatalog","parsed","catalog","banksById","bankVariantsById","mediaById","eventsById","eventsByName","push","reference","bankId","bankName","joinSoundbanksInfo","bankInfo","variants","find","variant","languageId","bankLanguage","references","match","available","hirc","typeName","namedMediaCount","namedEventCount","bytes","TextDecoder","decode","fromCharCode"],"mappings":"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"}
|
|
@@ -1,24 +1,267 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { curves } from './core/curves.js';
|
|
2
2
|
import { GR2_MAGICS, bytesToHex } from './core/reader.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
* Runtime adaptation of the migrated `format-gr2` reader: the copied engine
|
|
8
|
-
* under core/ keeps its donor behavior (including the legacy `CjsFormatGr2`
|
|
9
|
-
* name), while this class adds the runtime-resource format-contract statics
|
|
10
|
-
* ResMan uses for byte probing and async reads.
|
|
11
|
-
*/
|
|
12
|
-
|
|
3
|
+
import { tangents } from './core/tangents.js';
|
|
4
|
+
import { isGsfRaw, projectGsf, inspectGsfRaw } from './core/gsf.js';
|
|
5
|
+
import { DEFAULT_VALUES, normalizeValues, validateClassKey, validateClass, readWithValues, readRawInput, inspectRawGr2Result, toJsonValue, OUTPUT_JSON, OUTPUT_GR2, OUTPUT_GR2_JSON, OUTPUT_CMF, OUTPUT_RAW, CLASS_KEYS } from './core/helpers.js';
|
|
13
6
|
|
|
14
7
|
/**
|
|
15
8
|
* CarbonEngineJS-facing GR2 (Granny 3D) and GSF (Granny State) reader.
|
|
16
9
|
*
|
|
17
10
|
* The Cjs prefix marks this as a JavaScript format/construction boundary. It
|
|
18
11
|
* reads `.gr2` geometry/skeleton/animation graphs and `.gsf` state profiles,
|
|
19
|
-
* emitting GR2 JSON, hydrated caller classes, or CMF-shaped output
|
|
12
|
+
* emitting GR2 JSON, hydrated caller-supplied classes, or CMF-shaped output,
|
|
13
|
+
* without pretending those classes are the engine runtime itself.
|
|
20
14
|
*/
|
|
21
|
-
class CjsGr2Format
|
|
15
|
+
class CjsGr2Format {
|
|
16
|
+
#emit = DEFAULT_VALUES.emit;
|
|
17
|
+
#decompressCurves = DEFAULT_VALUES.decompressCurves;
|
|
18
|
+
#unpackTangents = DEFAULT_VALUES.unpackTangents;
|
|
19
|
+
#rebuildMissingNormals = DEFAULT_VALUES.rebuildMissingNormals;
|
|
20
|
+
#rebuildMissingTangents = DEFAULT_VALUES.rebuildMissingTangents;
|
|
21
|
+
#rebuildMissingBiNormals = DEFAULT_VALUES.rebuildMissingBiNormals;
|
|
22
|
+
#classes = {};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a reusable format profile.
|
|
26
|
+
*
|
|
27
|
+
* @param {object} [options] Default format/build values.
|
|
28
|
+
*/
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
this.SetValues(options);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Set format values for this reusable profile.
|
|
35
|
+
*
|
|
36
|
+
* @param {object} [options] Values to merge into the profile.
|
|
37
|
+
* @returns {CjsGr2Format} This format profile.
|
|
38
|
+
*/
|
|
39
|
+
SetValues(options = {}) {
|
|
40
|
+
const values = normalizeValues(this.GetValues(), options);
|
|
41
|
+
this.#emit = values.emit;
|
|
42
|
+
this.#decompressCurves = values.decompressCurves;
|
|
43
|
+
this.#unpackTangents = values.unpackTangents;
|
|
44
|
+
this.#rebuildMissingNormals = values.rebuildMissingNormals;
|
|
45
|
+
this.#rebuildMissingTangents = values.rebuildMissingTangents;
|
|
46
|
+
this.#rebuildMissingBiNormals = values.rebuildMissingBiNormals;
|
|
47
|
+
this.#classes = values.classes;
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get this profile's current values, optionally with per-call overrides.
|
|
53
|
+
*
|
|
54
|
+
* @param {object} [options] Optional values to merge into a copy.
|
|
55
|
+
* @returns {object} A copy of the effective values.
|
|
56
|
+
*/
|
|
57
|
+
GetValues(options = {}) {
|
|
58
|
+
return normalizeValues({
|
|
59
|
+
emit: this.#emit,
|
|
60
|
+
decompressCurves: this.#decompressCurves,
|
|
61
|
+
unpackTangents: this.#unpackTangents,
|
|
62
|
+
rebuildMissingNormals: this.#rebuildMissingNormals,
|
|
63
|
+
rebuildMissingTangents: this.#rebuildMissingTangents,
|
|
64
|
+
rebuildMissingBiNormals: this.#rebuildMissingBiNormals,
|
|
65
|
+
classes: this.#classes
|
|
66
|
+
}, options);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Set multiple GR2 JSON node constructors for this profile.
|
|
71
|
+
*
|
|
72
|
+
* @param {object} [classes] Map of node class keys to constructors.
|
|
73
|
+
* @returns {CjsGr2Format} This format profile.
|
|
74
|
+
*/
|
|
75
|
+
SetClasses(classes = {}) {
|
|
76
|
+
return this.SetValues({
|
|
77
|
+
classes
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Set a GR2 JSON node constructor for this profile.
|
|
83
|
+
*
|
|
84
|
+
* @param {string} type Node class key.
|
|
85
|
+
* @param {Function|null|undefined} Class Constructor to use, or nullish to delete.
|
|
86
|
+
* @returns {CjsGr2Format} This format profile.
|
|
87
|
+
*/
|
|
88
|
+
SetClass(type, Class) {
|
|
89
|
+
validateClassKey(type);
|
|
90
|
+
if (Class === null || Class === undefined) {
|
|
91
|
+
delete this.#classes[type];
|
|
92
|
+
return this;
|
|
93
|
+
}
|
|
94
|
+
validateClass(type, Class);
|
|
95
|
+
this.#classes = {
|
|
96
|
+
...this.#classes,
|
|
97
|
+
[type]: Class
|
|
98
|
+
};
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Get a configured GR2 JSON node constructor.
|
|
104
|
+
*
|
|
105
|
+
* @param {string} type Node class key.
|
|
106
|
+
* @returns {Function|undefined}
|
|
107
|
+
*/
|
|
108
|
+
GetClass(type) {
|
|
109
|
+
validateClassKey(type);
|
|
110
|
+
return this.#classes[type];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Whether this reader has a constructor for a GR2 JSON node key.
|
|
115
|
+
*
|
|
116
|
+
* @param {string} type Node class key.
|
|
117
|
+
* @returns {boolean}
|
|
118
|
+
*/
|
|
119
|
+
HasClass(type) {
|
|
120
|
+
return !!this.GetClass(type);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Parse a .gr2 buffer and return JSON by default, classes when configured,
|
|
125
|
+
* or raw reflection data when `emit` is "raw".
|
|
126
|
+
*
|
|
127
|
+
* @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.
|
|
128
|
+
* @param {object} [options] Per-call values.
|
|
129
|
+
* @returns {object}
|
|
130
|
+
*/
|
|
131
|
+
Read(input, options = {}) {
|
|
132
|
+
return readWithValues(this, input, this.GetValues(options));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Parse a .gr2 buffer into the reflected Granny object graph.
|
|
137
|
+
*
|
|
138
|
+
* @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.
|
|
139
|
+
* @returns {object}
|
|
140
|
+
*/
|
|
141
|
+
ReadRaw(input) {
|
|
142
|
+
return readRawInput(input);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Return a stable, lightweight summary for a GR2 buffer or raw result.
|
|
147
|
+
*
|
|
148
|
+
* @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.
|
|
149
|
+
* @returns {object}
|
|
150
|
+
*/
|
|
151
|
+
Inspect(input) {
|
|
152
|
+
return inspectRawGr2Result(this.ReadRaw(input));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Whether input is a Granny State document carried by the GR2 container. */
|
|
156
|
+
IsGSF(input) {
|
|
157
|
+
return isGsfRaw(this.ReadRaw(input));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Read the GState semantic projection, or raw reflected data with `emit: "raw"`. */
|
|
161
|
+
ReadGSF(input, options = {}) {
|
|
162
|
+
const raw = this.ReadRaw(input);
|
|
163
|
+
return options.emit === "raw" ? raw : projectGsf(raw);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Inspect a GSF document and its referenced GR2 animations. */
|
|
167
|
+
InspectGSF(input) {
|
|
168
|
+
return inspectGsfRaw(this.ReadRaw(input));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Convert format output to plain JSON-compatible data.
|
|
173
|
+
*
|
|
174
|
+
* @param {object} value Format output to convert.
|
|
175
|
+
* @returns {any} Plain JSON-compatible data.
|
|
176
|
+
*/
|
|
177
|
+
ToJSON(value) {
|
|
178
|
+
return toJsonValue(value);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Static one-shot read. Static methods use camelCase by convention.
|
|
183
|
+
*
|
|
184
|
+
* @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.
|
|
185
|
+
* @param {object} [options] Reader and post-processing values.
|
|
186
|
+
* @returns {object}
|
|
187
|
+
*/
|
|
188
|
+
static read(input, options = {}) {
|
|
189
|
+
return readWithValues(CjsGr2Format, input, normalizeValues(DEFAULT_VALUES, options));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Static one-shot raw read.
|
|
194
|
+
*
|
|
195
|
+
* @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.
|
|
196
|
+
* @returns {object}
|
|
197
|
+
*/
|
|
198
|
+
static readRaw(input) {
|
|
199
|
+
return readRawInput(input);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Static one-shot inspection.
|
|
204
|
+
*
|
|
205
|
+
* @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.
|
|
206
|
+
* @returns {object}
|
|
207
|
+
*/
|
|
208
|
+
static inspect(input) {
|
|
209
|
+
return inspectRawGr2Result(readRawInput(input));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** Whether input is a Granny State document carried by the GR2 container. */
|
|
213
|
+
static isGsf(input) {
|
|
214
|
+
try {
|
|
215
|
+
return isGsfRaw(readRawInput(input));
|
|
216
|
+
} catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Read the GState semantic projection, or raw reflected data with `emit: "raw"`. */
|
|
222
|
+
static readGsf(input, options = {}) {
|
|
223
|
+
const raw = readRawInput(input);
|
|
224
|
+
return options.emit === "raw" ? raw : projectGsf(raw);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Async one-shot GSF read for standard format API compatibility. */
|
|
228
|
+
static readGsfAsync(input, options = {}) {
|
|
229
|
+
return Promise.resolve(this.readGsf(input, options));
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Inspect a GSF document and its referenced GR2 animations. */
|
|
233
|
+
static inspectGsf(input) {
|
|
234
|
+
return inspectGsfRaw(readRawInput(input));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Static JSON-compatible conversion.
|
|
239
|
+
*
|
|
240
|
+
* @param {object} value Format output to convert.
|
|
241
|
+
* @returns {any} Plain JSON-compatible data.
|
|
242
|
+
*/
|
|
243
|
+
static toJSON(value) {
|
|
244
|
+
return toJsonValue(value);
|
|
245
|
+
}
|
|
246
|
+
static OUTPUT_JSON = OUTPUT_JSON;
|
|
247
|
+
static OUTPUT_GR2 = OUTPUT_GR2;
|
|
248
|
+
static OUTPUT_GR2_JSON = OUTPUT_GR2_JSON;
|
|
249
|
+
static OUTPUT_CMF = OUTPUT_CMF;
|
|
250
|
+
static OUTPUT_RAW = OUTPUT_RAW;
|
|
251
|
+
static CLASS_KEYS = CLASS_KEYS;
|
|
252
|
+
static type = Object.freeze(["geometry"]);
|
|
253
|
+
static mediaTypes = Object.freeze(["geometry"]);
|
|
254
|
+
static inputTypes = Object.freeze(["gr2", "gsf"]);
|
|
255
|
+
static outputTypes = Object.freeze([OUTPUT_GR2, OUTPUT_CMF]);
|
|
256
|
+
static debugOutputTypes = Object.freeze([OUTPUT_JSON, OUTPUT_GR2_JSON, OUTPUT_RAW]);
|
|
257
|
+
static curves = curves;
|
|
258
|
+
static tangents = tangents;
|
|
259
|
+
static gsf = Object.freeze({
|
|
260
|
+
isRaw: isGsfRaw,
|
|
261
|
+
project: projectGsf,
|
|
262
|
+
inspectRaw: inspectGsfRaw
|
|
263
|
+
});
|
|
264
|
+
|
|
22
265
|
/**
|
|
23
266
|
* Cheap magic probe for GR2/GSF byte streams.
|
|
24
267
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CjsGr2Format.js","sources":["../../../../src/formats/gr2/CjsGr2Format.js"],"sourcesContent":["/**\n * Exposed CarbonEngineJS-facing GR2/GSF format class.\n *\n * Runtime adaptation of the migrated `format-gr2` reader: the copied engine\n * under core/ keeps its donor behavior (including the legacy `CjsFormatGr2`\n * name), while this class adds the runtime-resource format-contract statics\n * ResMan uses for byte probing and async reads.\n */\n\nimport { CjsFormatGr2 } from \"./core/CjsFormatGr2.js\";\nimport { GR2_MAGICS, bytesToHex } from \"./core/reader.js\";\n\n/**\n * CarbonEngineJS-facing GR2 (Granny 3D) and GSF (Granny State) reader.\n *\n * The Cjs prefix marks this as a JavaScript format/construction boundary. It\n * reads `.gr2` geometry/skeleton/animation graphs and `.gsf` state profiles,\n * emitting GR2 JSON, hydrated caller classes, or CMF-shaped output.\n */\nexport class CjsGr2Format extends CjsFormatGr2\n{\n /**\n * Cheap magic probe for GR2/GSF byte streams.\n *\n * @param {Uint8Array} bytes Candidate source bytes.\n * @returns {boolean} True when the 16-byte Granny magic is recognized.\n */\n static isSupported(bytes)\n {\n if (!bytes || bytes.length < 16) return false;\n return bytesToHex(bytes.subarray(0, 16)) in GR2_MAGICS;\n }\n\n /**\n * Async read entrypoint for the resource-manager contract.\n *\n * @param {Uint8Array} bytes Source bytes.\n * @param {object} [options] Read options (emit, classes, conversions).\n * @returns {Promise<object>} The emitted GR2/GSF result.\n */\n static async readAsync(bytes, options = {})\n {\n return CjsGr2Format.read(bytes, options);\n }\n}\n\nexport default CjsGr2Format;\n"],"names":["CjsGr2Format","CjsFormatGr2","isSupported","bytes","length","bytesToHex","subarray","GR2_MAGICS","readAsync","options","read"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAY,SAASC,YAAY,CAC9C;AACI;AACJ;AACA;AACA;AACA;AACA;EACI,OAAOC,WAAWA,CAACC,KAAK,EACxB;IACI,IAAI,CAACA,KAAK,IAAIA,KAAK,CAACC,MAAM,GAAG,EAAE,EAAE,OAAO,KAAK;AAC7C,IAAA,OAAOC,UAAU,CAACF,KAAK,CAACG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAIC,UAAU;AAC1D,EAAA;;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACI,aAAaC,SAASA,CAACL,KAAK,EAAEM,OAAO,GAAG,EAAE,EAC1C;AACI,IAAA,OAAOT,YAAY,CAACU,IAAI,CAACP,KAAK,EAAEM,OAAO,CAAC;AAC5C,EAAA;AACJ;;;;"}
|
|
1
|
+
{"version":3,"file":"CjsGr2Format.js","sources":["../../../../src/formats/gr2/CjsGr2Format.js"],"sourcesContent":["\nimport { curves } from \"./core/curves.js\";\nimport { GR2_MAGICS, bytesToHex } from \"./core/reader.js\";\nimport { tangents } from \"./core/tangents.js\";\nimport { inspectGsfRaw, isGsfRaw, projectGsf } from \"./core/gsf.js\";\nimport {\n CLASS_KEYS,\n DEFAULT_VALUES,\n OUTPUT_CMF,\n OUTPUT_GR2,\n OUTPUT_GR2_JSON,\n OUTPUT_JSON,\n OUTPUT_RAW,\n inspectRawGr2Result,\n normalizeValues,\n readRawInput,\n readWithValues,\n toJsonValue,\n validateClass,\n validateClassKey\n} from \"./core/helpers.js\";\n\n/**\n * CarbonEngineJS-facing GR2 (Granny 3D) and GSF (Granny State) reader.\n *\n * The Cjs prefix marks this as a JavaScript format/construction boundary. It\n * reads `.gr2` geometry/skeleton/animation graphs and `.gsf` state profiles,\n * emitting GR2 JSON, hydrated caller-supplied classes, or CMF-shaped output,\n * without pretending those classes are the engine runtime itself.\n */\nexport class CjsGr2Format\n{\n\n #emit = DEFAULT_VALUES.emit;\n #decompressCurves = DEFAULT_VALUES.decompressCurves;\n #unpackTangents = DEFAULT_VALUES.unpackTangents;\n #rebuildMissingNormals = DEFAULT_VALUES.rebuildMissingNormals;\n #rebuildMissingTangents = DEFAULT_VALUES.rebuildMissingTangents;\n #rebuildMissingBiNormals = DEFAULT_VALUES.rebuildMissingBiNormals;\n #classes = {};\n\n /**\n * Create a reusable format profile.\n *\n * @param {object} [options] Default format/build values.\n */\n constructor(options = {})\n {\n this.SetValues(options);\n }\n\n /**\n * Set format values for this reusable profile.\n *\n * @param {object} [options] Values to merge into the profile.\n * @returns {CjsGr2Format} This format profile.\n */\n SetValues(options = {})\n {\n const values = normalizeValues(this.GetValues(), options);\n\n this.#emit = values.emit;\n this.#decompressCurves = values.decompressCurves;\n this.#unpackTangents = values.unpackTangents;\n this.#rebuildMissingNormals = values.rebuildMissingNormals;\n this.#rebuildMissingTangents = values.rebuildMissingTangents;\n this.#rebuildMissingBiNormals = values.rebuildMissingBiNormals;\n this.#classes = values.classes;\n\n return this;\n }\n\n /**\n * Get this profile's current values, optionally with per-call overrides.\n *\n * @param {object} [options] Optional values to merge into a copy.\n * @returns {object} A copy of the effective values.\n */\n GetValues(options = {})\n {\n return normalizeValues({\n emit: this.#emit,\n decompressCurves: this.#decompressCurves,\n unpackTangents: this.#unpackTangents,\n rebuildMissingNormals: this.#rebuildMissingNormals,\n rebuildMissingTangents: this.#rebuildMissingTangents,\n rebuildMissingBiNormals: this.#rebuildMissingBiNormals,\n classes: this.#classes\n }, options);\n }\n\n /**\n * Set multiple GR2 JSON node constructors for this profile.\n *\n * @param {object} [classes] Map of node class keys to constructors.\n * @returns {CjsGr2Format} This format profile.\n */\n SetClasses(classes = {})\n {\n return this.SetValues({ classes });\n }\n\n /**\n * Set a GR2 JSON node constructor for this profile.\n *\n * @param {string} type Node class key.\n * @param {Function|null|undefined} Class Constructor to use, or nullish to delete.\n * @returns {CjsGr2Format} This format profile.\n */\n SetClass(type, Class)\n {\n validateClassKey(type);\n if (Class === null || Class === undefined)\n {\n delete this.#classes[type];\n return this;\n }\n\n validateClass(type, Class);\n this.#classes = { ...this.#classes, [type]: Class };\n return this;\n }\n\n /**\n * Get a configured GR2 JSON node constructor.\n *\n * @param {string} type Node class key.\n * @returns {Function|undefined}\n */\n GetClass(type)\n {\n validateClassKey(type);\n return this.#classes[type];\n }\n\n /**\n * Whether this reader has a constructor for a GR2 JSON node key.\n *\n * @param {string} type Node class key.\n * @returns {boolean}\n */\n HasClass(type)\n {\n return !!this.GetClass(type);\n }\n\n /**\n * Parse a .gr2 buffer and return JSON by default, classes when configured,\n * or raw reflection data when `emit` is \"raw\".\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @param {object} [options] Per-call values.\n * @returns {object}\n */\n Read(input, options = {})\n {\n return readWithValues(this, input, this.GetValues(options));\n }\n\n /**\n * Parse a .gr2 buffer into the reflected Granny object graph.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @returns {object}\n */\n ReadRaw(input)\n {\n return readRawInput(input);\n }\n\n /**\n * Return a stable, lightweight summary for a GR2 buffer or raw result.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @returns {object}\n */\n Inspect(input)\n {\n return inspectRawGr2Result(this.ReadRaw(input));\n }\n\n /** Whether input is a Granny State document carried by the GR2 container. */\n IsGSF(input)\n {\n return isGsfRaw(this.ReadRaw(input));\n }\n\n /** Read the GState semantic projection, or raw reflected data with `emit: \"raw\"`. */\n ReadGSF(input, options = {})\n {\n const raw = this.ReadRaw(input);\n return options.emit === \"raw\" ? raw : projectGsf(raw);\n }\n\n /** Inspect a GSF document and its referenced GR2 animations. */\n InspectGSF(input)\n {\n return inspectGsfRaw(this.ReadRaw(input));\n }\n\n /**\n * Convert format output to plain JSON-compatible data.\n *\n * @param {object} value Format output to convert.\n * @returns {any} Plain JSON-compatible data.\n */\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Static one-shot read. Static methods use camelCase by convention.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @param {object} [options] Reader and post-processing values.\n * @returns {object}\n */\n static read(input, options = {})\n {\n return readWithValues(CjsGr2Format, input, normalizeValues(DEFAULT_VALUES, options));\n }\n\n /**\n * Static one-shot raw read.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @returns {object}\n */\n static readRaw(input)\n {\n return readRawInput(input);\n }\n\n /**\n * Static one-shot inspection.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @returns {object}\n */\n static inspect(input)\n {\n return inspectRawGr2Result(readRawInput(input));\n }\n\n /** Whether input is a Granny State document carried by the GR2 container. */\n static isGsf(input)\n {\n try\n {\n return isGsfRaw(readRawInput(input));\n }\n catch\n {\n return false;\n }\n }\n\n /** Read the GState semantic projection, or raw reflected data with `emit: \"raw\"`. */\n static readGsf(input, options = {})\n {\n const raw = readRawInput(input);\n return options.emit === \"raw\" ? raw : projectGsf(raw);\n }\n\n /** Async one-shot GSF read for standard format API compatibility. */\n static readGsfAsync(input, options = {})\n {\n return Promise.resolve(this.readGsf(input, options));\n }\n\n /** Inspect a GSF document and its referenced GR2 animations. */\n static inspectGsf(input)\n {\n return inspectGsfRaw(readRawInput(input));\n }\n\n /**\n * Static JSON-compatible conversion.\n *\n * @param {object} value Format output to convert.\n * @returns {any} Plain JSON-compatible data.\n */\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n static OUTPUT_JSON = OUTPUT_JSON;\n static OUTPUT_GR2 = OUTPUT_GR2;\n static OUTPUT_GR2_JSON = OUTPUT_GR2_JSON;\n static OUTPUT_CMF = OUTPUT_CMF;\n static OUTPUT_RAW = OUTPUT_RAW;\n static CLASS_KEYS = CLASS_KEYS;\n static type = Object.freeze([ \"geometry\" ]);\n static mediaTypes = Object.freeze([ \"geometry\" ]);\n static inputTypes = Object.freeze([ \"gr2\", \"gsf\" ]);\n static outputTypes = Object.freeze([ OUTPUT_GR2, OUTPUT_CMF ]);\n static debugOutputTypes = Object.freeze([ OUTPUT_JSON, OUTPUT_GR2_JSON, OUTPUT_RAW ]);\n static curves = curves;\n static tangents = tangents;\n static gsf = Object.freeze({ isRaw: isGsfRaw, project: projectGsf, inspectRaw: inspectGsfRaw });\n\n /**\n * Cheap magic probe for GR2/GSF byte streams.\n *\n * @param {Uint8Array} bytes Candidate source bytes.\n * @returns {boolean} True when the 16-byte Granny magic is recognized.\n */\n static isSupported(bytes)\n {\n if (!bytes || bytes.length < 16) return false;\n return bytesToHex(bytes.subarray(0, 16)) in GR2_MAGICS;\n }\n\n /**\n * Async read entrypoint for the resource-manager contract.\n *\n * @param {Uint8Array} bytes Source bytes.\n * @param {object} [options] Read options (emit, classes, conversions).\n * @returns {Promise<object>} The emitted GR2/GSF result.\n */\n static async readAsync(bytes, options = {})\n {\n return CjsGr2Format.read(bytes, options);\n }\n\n}\n\nexport default CjsGr2Format;\n"],"names":["CjsGr2Format","DEFAULT_VALUES","emit","decompressCurves","unpackTangents","rebuildMissingNormals","rebuildMissingTangents","rebuildMissingBiNormals","constructor","options","SetValues","values","normalizeValues","GetValues","classes","SetClasses","SetClass","type","Class","validateClassKey","undefined","validateClass","GetClass","HasClass","Read","input","readWithValues","ReadRaw","readRawInput","Inspect","inspectRawGr2Result","IsGSF","isGsfRaw","ReadGSF","raw","projectGsf","InspectGSF","inspectGsfRaw","ToJSON","value","toJsonValue","read","readRaw","inspect","isGsf","readGsf","readGsfAsync","Promise","resolve","inspectGsf","toJSON","OUTPUT_JSON","OUTPUT_GR2","OUTPUT_GR2_JSON","OUTPUT_CMF","OUTPUT_RAW","CLASS_KEYS","Object","freeze","mediaTypes","inputTypes","outputTypes","debugOutputTypes","curves","tangents","gsf","isRaw","project","inspectRaw","isSupported","bytes","length","bytesToHex","subarray","GR2_MAGICS","readAsync"],"mappings":"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"}
|