@yali-engine/gltf 0.0.0-stage → 0.4.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/parse.js ADDED
@@ -0,0 +1,541 @@
1
+ import { YaliError } from '@yali-engine/core';
2
+ import { mat4 } from '@yali-engine/math';
3
+ const GLB_MAGIC = 0x46546c67;
4
+ const CHUNK_JSON = 0x4e4f534a;
5
+ const CHUNK_BIN = 0x004e4942;
6
+ /** Extensions this loader decodes. Anything else in `extensionsRequired` fails clearly. */
7
+ const SUPPORTED = new Set(['KHR_materials_emissive_strength', 'KHR_materials_clearcoat', 'KHR_materials_transmission', 'KHR_materials_sheen', 'KHR_materials_ior', 'KHR_materials_volume', 'KHR_mesh_quantization', 'EXT_meshopt_compression', 'MSFT_lod', 'KHR_texture_basisu', 'YALI_clusters', 'YALI_cluster_pages', 'KHR_materials_dispersion']);
8
+ const COMPONENTS = { SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4, MAT2: 4, MAT3: 9, MAT4: 16 };
9
+ function bad(message, fix = 'Check the file with the Khronos glTF validator.') {
10
+ return new YaliError('GLTF_INVALID', message, fix);
11
+ }
12
+ /**
13
+ * Parses a glTF 2.0 asset (`.glb`, or `.gltf` with embedded or external buffers) into
14
+ * plain arrays (DESIGN.md §9; ADR-0047). Pure and allocation-heavy by nature: it runs in a
15
+ * decode worker.
16
+ *
17
+ * @example
18
+ * const scene = await parseGltf(new Uint8Array(await (await fetch('/temple.glb')).arrayBuffer()));
19
+ * scene.meshes[0].primitives[0].positions; // Float32Array
20
+ */
21
+ export async function parseGltf(bytes, options = {}) {
22
+ let json;
23
+ let bin = null;
24
+ const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
25
+ if (bytes.byteLength >= 12 && dv.getUint32(0, true) === GLB_MAGIC) {
26
+ if (dv.getUint32(4, true) !== 2)
27
+ throw bad(`GLB version ${dv.getUint32(4, true)} is not 2.`, 'Export glTF 2.0.');
28
+ let o = 12;
29
+ json = {};
30
+ while (o + 8 <= bytes.byteLength) {
31
+ const len = dv.getUint32(o, true);
32
+ const type = dv.getUint32(o + 4, true);
33
+ const chunk = bytes.subarray(o + 8, o + 8 + len);
34
+ if (type === CHUNK_JSON)
35
+ json = JSON.parse(new TextDecoder().decode(chunk));
36
+ else if (type === CHUNK_BIN && !bin)
37
+ bin = chunk;
38
+ o += 8 + len;
39
+ }
40
+ }
41
+ else {
42
+ try {
43
+ json = JSON.parse(new TextDecoder().decode(bytes));
44
+ }
45
+ catch {
46
+ throw bad('This is neither a GLB nor glTF JSON.');
47
+ }
48
+ }
49
+ if (!String(json.asset?.version ?? '').startsWith('2'))
50
+ throw bad(`glTF version ${json.asset?.version} is not 2.x.`, 'Export glTF 2.0.');
51
+ const warnings = [];
52
+ for (const ext of json.extensionsRequired ?? []) {
53
+ if (!SUPPORTED.has(ext)) {
54
+ throw new YaliError('GLTF_EXTENSION', `The file requires ${ext}, which this loader does not decode yet.`, 'Export without that extension.');
55
+ }
56
+ }
57
+ // Buffers: the GLB's BIN chunk, data URIs, or external files.
58
+ const buffers = await Promise.all((json.buffers ?? []).map(async (b, i) => {
59
+ if (b.uri === undefined) {
60
+ // A meshopt fallback buffer holds no data: every view into it is decoded instead.
61
+ if (b.extensions?.EXT_meshopt_compression?.fallback)
62
+ return new Uint8Array(0);
63
+ if (!bin)
64
+ throw bad(`Buffer ${i} has no uri and the file has no BIN chunk.`);
65
+ return bin;
66
+ }
67
+ const uri = String(b.uri);
68
+ if (uri.startsWith('data:')) {
69
+ const comma = uri.indexOf(',');
70
+ const data = uri.slice(comma + 1);
71
+ if (!uri.slice(0, comma).endsWith(';base64'))
72
+ return new TextEncoder().encode(decodeURIComponent(data));
73
+ const s = atob(data);
74
+ const out = new Uint8Array(s.length);
75
+ for (let k = 0; k < s.length; k++)
76
+ out[k] = s.charCodeAt(k);
77
+ return out;
78
+ }
79
+ const url = new URL(uri, options.baseUrl ?? 'file:///').href;
80
+ if (options.fetchBuffer)
81
+ return options.fetchBuffer(url);
82
+ const r = await fetch(url);
83
+ if (!r.ok)
84
+ throw bad(`Buffer ${i} (${url}) could not be fetched: HTTP ${r.status}.`, 'Check that the .bin sits next to the .gltf.');
85
+ return new Uint8Array(await r.arrayBuffer());
86
+ }));
87
+ const totalBytes = buffers.reduce((n, b) => n + b.byteLength, 0);
88
+ // EXT_meshopt_compression (ADR-0047, increment 1b): such buffer views are decoded once,
89
+ // here in the decode worker, with meshoptimizer's decoder (loaded only when needed).
90
+ const decodedViews = new Map();
91
+ const meshoptViews = (json.bufferViews ?? []).map((v, i) => [i, v.extensions?.EXT_meshopt_compression]).filter(([, e]) => e);
92
+ if (meshoptViews.length) {
93
+ const { MeshoptDecoder } = await import('meshoptimizer/decoder');
94
+ await MeshoptDecoder.ready;
95
+ for (const [i, e] of meshoptViews) {
96
+ const src = buffers[e.buffer];
97
+ const source = src.subarray(e.byteOffset ?? 0, (e.byteOffset ?? 0) + e.byteLength);
98
+ const target = new Uint8Array(e.count * e.byteStride);
99
+ MeshoptDecoder.decodeGltfBuffer(target, e.count, e.byteStride, source, e.mode, e.filter);
100
+ decodedViews.set(i, target);
101
+ }
102
+ }
103
+ // A buffer view's bytes as a fresh copy (meshopt-decoded when it was compressed).
104
+ const viewBytes = (index) => {
105
+ const view = json.bufferViews?.[index];
106
+ if (!view)
107
+ throw bad(`Buffer view ${index} does not exist.`);
108
+ const decoded = decodedViews.get(index);
109
+ if (decoded)
110
+ return decoded.slice();
111
+ const buf = buffers[view.buffer];
112
+ return buf.slice(view.byteOffset ?? 0, (view.byteOffset ?? 0) + view.byteLength);
113
+ };
114
+ // YALI_clusters (ADR-0121): checked against the primitive's vertex count; a bad one is skipped with a warning.
115
+ const clustersOf = (p, vertexCount, where) => {
116
+ const e = p.extensions?.YALI_clusters;
117
+ if (!e)
118
+ return null;
119
+ const u32 = (b) => new Uint32Array(b.buffer, b.byteOffset, b.byteLength >> 2);
120
+ const words = viewBytes(e.words);
121
+ const vertices = viewBytes(e.vertices);
122
+ const triangles = viewBytes(e.triangles);
123
+ const ids = u32(vertices);
124
+ let wrong = words.byteLength % 4 !== 0 || vertices.byteLength % 4 !== 0 || !(e.corners > 0);
125
+ for (let i = 0; i < ids.length && !wrong; i++)
126
+ wrong = ids[i] >= vertexCount;
127
+ if (wrong) {
128
+ warnings.push(`${where}: YALI_clusters does not match the primitive's ${vertexCount} vertices; its clusters are built at load instead`);
129
+ return null;
130
+ }
131
+ return { lod: e.lod === true, words: u32(words), vertices: ids, triangles, corners: Number(e.corners) };
132
+ };
133
+ // YALI_cluster_pages (ADR-0134): its tables checked; a bad one is skipped with a warning (the root mesh still draws).
134
+ const pagesOf = (p, where) => {
135
+ const e = p.extensions?.YALI_cluster_pages;
136
+ if (!e)
137
+ return null;
138
+ const u32 = (b) => new Uint32Array(b.buffer, b.byteOffset, b.byteLength >> 2);
139
+ const words = u32(viewBytes(e.words));
140
+ const pages = u32(viewBytes(e.pages));
141
+ const rootData = viewBytes(e.rootData);
142
+ const roots = Number(e.roots);
143
+ const np = pages.length / 5;
144
+ const rootEnd = roots > 0 && roots <= np ? pages[(roots - 1) * 5 + 3] + pages[(roots - 1) * 5 + 4] : -1;
145
+ if (words.length % 32 !== 0 || pages.length % 5 !== 0 || !(roots >= 1) || rootEnd !== rootData.byteLength || typeof e.uri !== 'string' || !(e.slotVertices >= 0)) {
146
+ warnings.push(`${where}: YALI_cluster_pages is malformed; only its root mesh is drawn`);
147
+ return null;
148
+ }
149
+ return { words, pages, roots, localIds: Number(e.localIds), triangleBytes: Number(e.triangleBytes), corners: Number(e.corners), slotVertices: Number(e.slotVertices), rootData, uri: e.uri, base: Number(e.base ?? 0) };
150
+ };
151
+ const accessor = (index, as) => {
152
+ const a = json.accessors?.[index];
153
+ if (!a)
154
+ throw bad(`Accessor ${index} does not exist.`);
155
+ if (a.sparse)
156
+ throw bad(`Accessor ${index} is sparse, which this loader does not read yet.`, 'Export without sparse accessors.');
157
+ const size = COMPONENTS[a.type];
158
+ if (!size)
159
+ throw bad(`Accessor ${index} has type ${a.type}.`);
160
+ const count = a.count;
161
+ const out = as === 'float' ? new Float32Array(count * size) : new Uint32Array(count * size);
162
+ if (a.bufferView === undefined)
163
+ return { data: out, size, count }; // all zeros, per the spec
164
+ const view = json.bufferViews[a.bufferView];
165
+ const decoded = decodedViews.get(a.bufferView);
166
+ const buf = decoded ?? buffers[view.buffer];
167
+ const ct = a.componentType;
168
+ const bytesPer = ct === 5126 || ct === 5125 ? 4 : ct === 5122 || ct === 5123 ? 2 : 1;
169
+ const ext = view.extensions?.EXT_meshopt_compression;
170
+ const stride = decoded ? ext.byteStride : (view.byteStride ?? size * bytesPer);
171
+ const base = buf.byteOffset + (decoded ? 0 : (view.byteOffset ?? 0)) + (a.byteOffset ?? 0);
172
+ const d = new DataView(buf.buffer);
173
+ const norm = a.normalized === true;
174
+ for (let i = 0; i < count; i++) {
175
+ const row = base + i * stride;
176
+ for (let c = 0; c < size; c++) {
177
+ const p = row + c * bytesPer;
178
+ let v;
179
+ switch (ct) {
180
+ case 5126:
181
+ v = d.getFloat32(p, true);
182
+ break;
183
+ case 5125:
184
+ v = d.getUint32(p, true);
185
+ break;
186
+ case 5123:
187
+ v = d.getUint16(p, true);
188
+ if (norm)
189
+ v /= 65535;
190
+ break;
191
+ case 5122:
192
+ v = d.getInt16(p, true);
193
+ if (norm)
194
+ v = Math.max(v / 32767, -1);
195
+ break;
196
+ case 5121:
197
+ v = d.getUint8(p);
198
+ if (norm)
199
+ v /= 255;
200
+ break;
201
+ case 5120:
202
+ v = d.getInt8(p);
203
+ if (norm)
204
+ v = Math.max(v / 127, -1);
205
+ break;
206
+ default: throw bad(`Accessor ${index} has component type ${ct}.`);
207
+ }
208
+ out[i * size + c] = v;
209
+ }
210
+ }
211
+ return { data: out, size, count };
212
+ };
213
+ // MSFT_lod (M2 increment 2b): a node lists coarser nodes; their meshes are this mesh's
214
+ // levels. A level is kept as an index list when its primitive shares the base
215
+ // primitive's POSITION accessor (so it draws from the same pooled vertices) and carries
216
+ // its error; meshes used only as levels are not decoded on their own.
217
+ const lodMeshesOf = new Map();
218
+ const lodNodes = new Set();
219
+ for (const n of (json.nodes ?? [])) {
220
+ const ids = n.extensions?.MSFT_lod?.ids;
221
+ if (n.mesh === undefined || !Array.isArray(ids))
222
+ continue;
223
+ // Every node's levels are LOD nodes, even when the mesh's levels were read from an
224
+ // earlier node (a mesh on 36 nodes lists its levels 36 times).
225
+ for (const id of ids)
226
+ lodNodes.add(id);
227
+ if (!lodMeshesOf.has(n.mesh))
228
+ lodMeshesOf.set(n.mesh, ids.map((id) => json.nodes?.[id]?.mesh).filter((m) => typeof m === 'number'));
229
+ }
230
+ const baseMeshes = new Set((json.nodes ?? []).filter((_, i) => !lodNodes.has(i)).map((n) => n.mesh));
231
+ const lodOnly = new Set([...lodMeshesOf.values()].flat().filter((m) => !baseMeshes.has(m)));
232
+ const lodsOf = (mi, pi, p) => {
233
+ const out = [];
234
+ for (const lm of lodMeshesOf.get(mi) ?? []) {
235
+ const lp = json.meshes?.[lm]?.primitives?.[pi];
236
+ if (!lp || lp.indices === undefined || lp.indices === p.indices)
237
+ continue;
238
+ if (lp.attributes?.POSITION !== p.attributes.POSITION) {
239
+ warnings.push(`mesh ${mi} primitive ${pi}: MSFT_lod level (mesh ${lm}) has its own vertices; only levels over the same vertices are used`);
240
+ break;
241
+ }
242
+ const error = lp.extras?.yaliLodError;
243
+ if (typeof error !== 'number') {
244
+ warnings.push(`mesh ${mi} primitive ${pi}: MSFT_lod level (mesh ${lm}) has no extras.yaliLodError; levels without an error are not used`);
245
+ break;
246
+ }
247
+ out.push({ indices: accessor(lp.indices, 'uint').data, error });
248
+ }
249
+ return out;
250
+ };
251
+ let vertices = 0;
252
+ let triangles = 0;
253
+ const meshes = (json.meshes ?? []).map((m, mi) => ({
254
+ name: String(m.name ?? `mesh${mi}`),
255
+ weights: Array.isArray(m.weights) ? m.weights.map(Number) : new Array(m.primitives?.[0]?.targets?.length ?? 0).fill(0),
256
+ primitives: lodOnly.has(mi) ? [] : (m.primitives ?? []).flatMap((p, pi) => {
257
+ if ((p.mode ?? 4) !== 4) {
258
+ warnings.push(`mesh ${mi} primitive ${pi}: mode ${p.mode} (only triangle lists are drawn)`);
259
+ return [];
260
+ }
261
+ if (p.attributes?.POSITION === undefined) {
262
+ warnings.push(`mesh ${mi} primitive ${pi}: no POSITION`);
263
+ return [];
264
+ }
265
+ const pos = accessor(p.attributes.POSITION, 'float');
266
+ if (pos.size !== 3)
267
+ throw bad(`mesh ${mi} primitive ${pi}: POSITION is not VEC3.`);
268
+ const positions = pos.data;
269
+ const indices = p.indices !== undefined ? accessor(p.indices, 'uint').data : Uint32Array.from({ length: pos.count }, (_, i) => i);
270
+ const normals = p.attributes.NORMAL !== undefined ? accessor(p.attributes.NORMAL, 'float').data : smoothNormals(positions, indices);
271
+ const uvs = p.attributes.TEXCOORD_0 !== undefined ? accessor(p.attributes.TEXCOORD_0, 'float').data : null;
272
+ const skin = p.attributes.JOINTS_0 !== undefined && p.attributes.WEIGHTS_0 !== undefined ? readSkin(p.attributes, pos.count, accessor, warnings, `mesh ${mi} primitive ${pi}`) : null;
273
+ const min = [Infinity, Infinity, Infinity];
274
+ const max = [-Infinity, -Infinity, -Infinity];
275
+ for (let i = 0; i < positions.length; i += 3) {
276
+ for (let c = 0; c < 3; c++) {
277
+ if (positions[i + c] < min[c])
278
+ min[c] = positions[i + c];
279
+ if (positions[i + c] > max[c])
280
+ max[c] = positions[i + c];
281
+ }
282
+ }
283
+ vertices += pos.count;
284
+ triangles += indices.length / 3;
285
+ const targets = (p.targets ?? []).map((t) => ({
286
+ positions: t.POSITION !== undefined ? accessor(t.POSITION, 'float').data : new Float32Array(pos.count * 3),
287
+ normals: t.NORMAL !== undefined ? accessor(t.NORMAL, 'float').data : null,
288
+ }));
289
+ return [{ positions, normals, uvs, indices, material: p.material ?? -1, min, max, lods: lodsOf(mi, pi, p), skin, targets, clusters: clustersOf(p, pos.count, `mesh ${mi} primitive ${pi}`), pages: pagesOf(p, `mesh ${mi} primitive ${pi}`) }];
290
+ }),
291
+ }));
292
+ // Textures name an image (KHR_texture_basisu's source first: it is the KTX2 one).
293
+ const textureImage = (t) => {
294
+ if (!t || t.index === undefined)
295
+ return null;
296
+ const tex = json.textures?.[t.index];
297
+ const image = tex?.extensions?.KHR_texture_basisu?.source ?? tex?.source;
298
+ if (image === undefined) {
299
+ warnings.push(`Texture ${t.index} has no image; ignored.`);
300
+ return null;
301
+ }
302
+ if ((t.texCoord ?? 0) !== 0)
303
+ warnings.push(`Texture ${t.index} uses UV set ${t.texCoord}; only the first is read, so it maps with UV 0.`);
304
+ return { image, texCoord: t.texCoord ?? 0 };
305
+ };
306
+ const materials = (json.materials ?? []).map((m, i) => {
307
+ const pbr = m.pbrMetallicRoughness ?? {};
308
+ const c = pbr.baseColorFactor ?? [1, 1, 1, 1];
309
+ const e = m.emissiveFactor ?? [0, 0, 0];
310
+ const strength = m.extensions?.KHR_materials_emissive_strength?.emissiveStrength ?? 1;
311
+ const cc = m.extensions?.KHR_materials_clearcoat;
312
+ const tr = m.extensions?.KHR_materials_transmission;
313
+ const sh = m.extensions?.KHR_materials_sheen;
314
+ const sc = sh?.sheenColorFactor ?? [0, 0, 0];
315
+ const vol = m.extensions?.KHR_materials_volume;
316
+ const ac = vol?.attenuationColor ?? [1, 1, 1];
317
+ if (cc?.clearcoatNormalTexture)
318
+ warnings.push(`Material ${i}'s clearcoat normal map is not read: the coat uses the base normal.`);
319
+ if (sh?.sheenRoughnessTexture)
320
+ warnings.push(`Material ${i}'s sheen roughness map is not read: its factor applies.`);
321
+ return {
322
+ name: String(m.name ?? `material${i}`),
323
+ baseColor: [c[0], c[1], c[2], c[3]],
324
+ metallic: pbr.metallicFactor ?? 1,
325
+ roughness: pbr.roughnessFactor ?? 1,
326
+ emissive: [e[0] * strength, e[1] * strength, e[2] * strength],
327
+ normalScale: m.normalTexture?.scale ?? 1,
328
+ occlusionStrength: m.occlusionTexture?.strength ?? 1,
329
+ alphaMode: m.alphaMode === 'MASK' || m.alphaMode === 'BLEND' ? m.alphaMode : 'OPAQUE',
330
+ alphaCutoff: m.alphaCutoff ?? 0.5,
331
+ doubleSided: m.doubleSided === true,
332
+ baseColorTexture: textureImage(pbr.baseColorTexture),
333
+ metallicRoughnessTexture: textureImage(pbr.metallicRoughnessTexture),
334
+ normalTexture: textureImage(m.normalTexture),
335
+ occlusionTexture: textureImage(m.occlusionTexture),
336
+ emissiveTexture: textureImage(m.emissiveTexture),
337
+ clearcoat: cc?.clearcoatFactor ?? 0,
338
+ clearcoatRoughness: cc?.clearcoatRoughnessFactor ?? 0,
339
+ clearcoatTexture: textureImage(cc?.clearcoatTexture),
340
+ clearcoatRoughnessTexture: textureImage(cc?.clearcoatRoughnessTexture),
341
+ transmission: tr?.transmissionFactor ?? 0,
342
+ transmissionTexture: textureImage(tr?.transmissionTexture),
343
+ sheenColor: sh ? [sc[0], sc[1], sc[2]] : [0, 0, 0],
344
+ sheenRoughness: sh?.sheenRoughnessFactor ?? 0,
345
+ sheenColorTexture: textureImage(sh?.sheenColorTexture),
346
+ ior: m.extensions?.KHR_materials_ior?.ior ?? 1.5,
347
+ thickness: vol?.thicknessFactor ?? 0,
348
+ thicknessTexture: textureImage(vol?.thicknessTexture),
349
+ dispersion: m.extensions?.KHR_materials_dispersion?.dispersion ?? 0,
350
+ attenuationColor: [ac[0], ac[1], ac[2]],
351
+ attenuationDistance: vol?.attenuationDistance ?? Infinity,
352
+ };
353
+ });
354
+ const images = (json.images ?? []).map((im) => {
355
+ const mimeType = String(im.mimeType ?? '');
356
+ if (im.bufferView !== undefined) {
357
+ const v = json.bufferViews[im.bufferView];
358
+ const data = decodedViews.get(im.bufferView) ?? buffers[v.buffer].subarray(v.byteOffset ?? 0, (v.byteOffset ?? 0) + v.byteLength);
359
+ return { mimeType, bytes: data, url: null };
360
+ }
361
+ const uri = String(im.uri ?? '');
362
+ if (uri.startsWith('data:')) {
363
+ const comma = uri.indexOf(',');
364
+ const s = atob(uri.slice(comma + 1));
365
+ const out = new Uint8Array(s.length);
366
+ for (let k = 0; k < s.length; k++)
367
+ out[k] = s.charCodeAt(k);
368
+ return { mimeType: mimeType || uri.slice(5, uri.indexOf(';')), bytes: out, url: null };
369
+ }
370
+ const sizes = Array.isArray(im.extras?.yaliSizes) ? im.extras.yaliSizes.filter((x) => typeof x === 'number' && x > 0).sort((a, b) => a - b) : [];
371
+ return { mimeType, bytes: null, url: new URL(uri, options.baseUrl ?? 'file:///').href, ...(sizes.length ? { sizes } : {}) };
372
+ });
373
+ const nodes = (json.nodes ?? []).map((n, i) => {
374
+ let t = [0, 0, 0];
375
+ let r = [0, 0, 0, 1];
376
+ let s = [1, 1, 1];
377
+ if (Array.isArray(n.matrix))
378
+ mat4.decompose(t, r, s, n.matrix);
379
+ else {
380
+ if (n.translation)
381
+ t = [n.translation[0], n.translation[1], n.translation[2]];
382
+ if (n.rotation)
383
+ r = [n.rotation[0], n.rotation[1], n.rotation[2], n.rotation[3]];
384
+ if (n.scale)
385
+ s = [n.scale[0], n.scale[1], n.scale[2]];
386
+ }
387
+ return { name: String(n.name ?? `node${i}`), mesh: n.mesh ?? -1, skin: n.skin ?? -1, children: n.children ?? [], t, r, s };
388
+ });
389
+ const skins = (json.skins ?? []).map((k, i) => {
390
+ const joints = k.joints ?? [];
391
+ let ibm = new Float32Array(joints.length * 16);
392
+ if (k.inverseBindMatrices !== undefined)
393
+ ibm = accessor(k.inverseBindMatrices, 'float').data;
394
+ else
395
+ for (let j = 0; j < joints.length; j++)
396
+ ibm.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], j * 16);
397
+ if (ibm.length !== joints.length * 16)
398
+ throw bad(`Skin ${i}: ${ibm.length / 16} inverse bind matrices for ${joints.length} joints.`);
399
+ return { name: String(k.name ?? `skin${i}`), joints, inverseBindMatrices: ibm };
400
+ });
401
+ const animations = (json.animations ?? []).map((a, i) => ({
402
+ name: String(a.name ?? `animation${i}`),
403
+ channels: (a.channels ?? []).flatMap((c) => {
404
+ const sampler = a.samplers?.[c.sampler];
405
+ const path = c.target?.path;
406
+ if (!sampler || c.target?.node === undefined || !['translation', 'rotation', 'scale', 'weights'].includes(path)) {
407
+ warnings.push(`animation ${i}: a channel without a node, a sampler or a known path (${path}) is skipped`);
408
+ return [];
409
+ }
410
+ const times = accessor(sampler.input, 'float').data;
411
+ const out = accessor(sampler.output, 'float');
412
+ const interpolation = sampler.interpolation ?? 'LINEAR';
413
+ const width = path === 'weights' ? out.data.length / (times.length * (interpolation === 'CUBICSPLINE' ? 3 : 1)) : path === 'rotation' ? 4 : 3;
414
+ if (interpolation === 'CUBICSPLINE') {
415
+ const r = resampleCubic(times, out.data, width, path === 'rotation');
416
+ return [{ node: c.target.node, path, interpolation: 'LINEAR', times: r.times, values: r.values }];
417
+ }
418
+ return [{ node: c.target.node, path, interpolation: interpolation === 'STEP' ? 'STEP' : 'LINEAR', times, values: out.data }];
419
+ }),
420
+ }));
421
+ const sceneIndex = json.scene ?? 0;
422
+ let roots = json.scenes?.[sceneIndex]?.nodes ?? [];
423
+ if (roots.length === 0 && nodes.length > 0) {
424
+ // No scene: every node that is nobody's child (and no other node's LOD) is a root.
425
+ const child = new Set(nodes.flatMap((n) => n.children));
426
+ roots = nodes.map((_, i) => i).filter((i) => !child.has(i) && !lodNodes.has(i));
427
+ }
428
+ return { nodes, skins, animations, roots, meshes, materials, images, stats: { vertices, triangles, bytes: totalBytes }, warnings };
429
+ }
430
+ /** Rate (keys per second) a CUBICSPLINE sampler is resampled to LINEAR at (ADR-0083). */
431
+ export const CUBIC_RESAMPLE_HZ = 60;
432
+ /**
433
+ * A glTF CUBICSPLINE sampler (per key: in-tangent, value, out-tangent) as LINEAR keys at
434
+ * `CUBIC_RESAMPLE_HZ` plus every original key, evaluated with the spec's Hermite form;
435
+ * rotations are normalized.
436
+ */
437
+ export function resampleCubic(times, data, width, rotation) {
438
+ const n = times.length;
439
+ const at = [];
440
+ for (let k = 0; k + 1 < n; k++) {
441
+ const t0 = times[k];
442
+ const t1 = times[k + 1];
443
+ const steps = Math.max(1, Math.ceil((t1 - t0) * CUBIC_RESAMPLE_HZ));
444
+ for (let s = 0; s < steps; s++)
445
+ at.push(t0 + ((t1 - t0) * s) / steps);
446
+ }
447
+ if (n > 0)
448
+ at.push(times[n - 1]);
449
+ const outT = Float32Array.from(at);
450
+ const outV = new Float32Array(at.length * width);
451
+ const v = (k, part, c) => data[(k * 3 + part) * width + c];
452
+ let k = 0;
453
+ for (let i = 0; i < at.length; i++) {
454
+ const t = at[i];
455
+ while (k + 2 < n && times[k + 1] <= t)
456
+ k++;
457
+ const span = k + 1 < n ? times[k + 1] - times[k] : 0;
458
+ const u = span > 0 ? Math.min(1, Math.max(0, (t - times[k]) / span)) : 0;
459
+ const u2 = u * u;
460
+ const u3 = u2 * u;
461
+ for (let c = 0; c < width; c++) {
462
+ if (span === 0) {
463
+ outV[i * width + c] = v(k, 1, c);
464
+ continue;
465
+ }
466
+ const p0 = v(k, 1, c);
467
+ const m0 = v(k, 2, c) * span;
468
+ const p1 = v(k + 1, 1, c);
469
+ const m1 = v(k + 1, 0, c) * span;
470
+ outV[i * width + c] = (2 * u3 - 3 * u2 + 1) * p0 + (u3 - 2 * u2 + u) * m0 + (-2 * u3 + 3 * u2) * p1 + (u3 - u2) * m1;
471
+ }
472
+ if (rotation) {
473
+ const o = i * 4;
474
+ const l = Math.hypot(outV[o], outV[o + 1], outV[o + 2], outV[o + 3]) || 1;
475
+ for (let c = 0; c < 4; c++)
476
+ outV[o + c] /= l;
477
+ }
478
+ }
479
+ return { times: outT, values: outV };
480
+ }
481
+ /** A primitive's skin attributes: 4 joints and 4 normalized weights per vertex (sets past the first folded into the 4 largest). */
482
+ function readSkin(attrs, count, accessor, warnings, where) {
483
+ const sets = [];
484
+ for (let s = 0; attrs[`JOINTS_${s}`] !== undefined && attrs[`WEIGHTS_${s}`] !== undefined; s++) {
485
+ sets.push({ j: accessor(attrs[`JOINTS_${s}`], 'uint').data, w: accessor(attrs[`WEIGHTS_${s}`], 'float').data });
486
+ }
487
+ if (sets.length > 1)
488
+ warnings.push(`${where}: ${sets.length * 4} influences per vertex folded into the 4 largest (ADR-0083)`);
489
+ const joints = new Uint16Array(count * 4);
490
+ const weights = new Float32Array(count * 4);
491
+ const cj = [];
492
+ const cw = [];
493
+ for (let v = 0; v < count; v++) {
494
+ cj.length = 0;
495
+ cw.length = 0;
496
+ for (const s of sets) {
497
+ for (let c = 0; c < 4; c++) {
498
+ const w = s.w[v * 4 + c];
499
+ if (w > 0) {
500
+ cj.push(s.j[v * 4 + c]);
501
+ cw.push(w);
502
+ }
503
+ }
504
+ }
505
+ // The 4 largest, in decreasing weight (stable for ties).
506
+ const order = cw.map((_, i) => i).sort((a, b) => cw[b] - cw[a] || a - b).slice(0, 4);
507
+ let sum = 0;
508
+ for (const i of order)
509
+ sum += cw[i];
510
+ order.forEach((i, c) => {
511
+ joints[v * 4 + c] = cj[i];
512
+ weights[v * 4 + c] = sum > 0 ? cw[i] / sum : 0;
513
+ });
514
+ // An orphan keeps all-zero weights: the shader draws it unskinned (Character XYZ's LBS copies
515
+ // it through) rather than collapsing it to a joint.
516
+ }
517
+ return { joints, weights };
518
+ }
519
+ /** Area-weighted smooth normals for a triangle list. */
520
+ function smoothNormals(p, idx) {
521
+ const n = new Float32Array(p.length);
522
+ for (let i = 0; i + 2 < idx.length; i += 3) {
523
+ const a = idx[i] * 3, b = idx[i + 1] * 3, c = idx[i + 2] * 3;
524
+ const ux = p[b] - p[a], uy = p[b + 1] - p[a + 1], uz = p[b + 2] - p[a + 2];
525
+ const vx = p[c] - p[a], vy = p[c + 1] - p[a + 1], vz = p[c + 2] - p[a + 2];
526
+ const nx = uy * vz - uz * vy, ny = uz * vx - ux * vz, nz = ux * vy - uy * vx;
527
+ for (const k of [a, b, c]) {
528
+ n[k] += nx;
529
+ n[k + 1] += ny;
530
+ n[k + 2] += nz;
531
+ }
532
+ }
533
+ for (let i = 0; i < n.length; i += 3) {
534
+ const l = Math.hypot(n[i], n[i + 1], n[i + 2]) || 1;
535
+ n[i] /= l;
536
+ n[i + 1] /= l;
537
+ n[i + 2] /= l;
538
+ }
539
+ return n;
540
+ }
541
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { DecodedTexture, Variant } from '@yali-engine/ktx2';
2
+ import type { GltfImage, GltfScene } from './parse.ts';
3
+ /** What `decodeGltf` needs to make a model's textures (the render plugin's texture store). */
4
+ export interface GltfTextureOptions {
5
+ /** Texels per side at most (the store's size class). */
6
+ readonly maxSize: number;
7
+ /** The store's compressed family: KTX2 images of it load as they are. */
8
+ readonly family: Variant;
9
+ }
10
+ /** A material's textures as indices into `DecodedGltf.textures` (-1 = none). */
11
+ export interface MaterialTextures {
12
+ readonly baseColor: number;
13
+ readonly normal: number;
14
+ /** Occlusion (R), roughness (G), metalness (B): glTF's two textures merged when they differ. */
15
+ readonly orm: number;
16
+ readonly emissive: number;
17
+ /** True when the material has an occlusion texture (else the ORM's R must not apply). */
18
+ readonly occlusion: boolean;
19
+ /** The extensions' maps (ADR-0093), -1 for none: linear, except the sheen colour. */
20
+ readonly clearcoat: number;
21
+ readonly clearcoatRoughness: number;
22
+ readonly transmission: number;
23
+ readonly sheenColor: number;
24
+ /** The volume's thickness (G, ADR-0125). */
25
+ readonly thickness: number;
26
+ }
27
+ /**
28
+ * The variant file to fetch for an external KTX2: this device's family, and of the sizes
29
+ * `yali convert` wrote, the smallest that covers the store's size class (the full one when
30
+ * none is listed): a T0 phone fetches `rock.astc.512.ktx2`, not the 2048² file.
31
+ */
32
+ export declare function sizedVariant(im: GltfImage, family: Variant, maxSize: number): string;
33
+ /**
34
+ * Decodes the textures `scene`'s materials use (ADR-0066), in the decode worker: PNG / JPEG /
35
+ * WebP to RGBA8 squares with sRGB-correct mips, KTX2 GPU-native files as they are when they
36
+ * match the store's family. glTF's occlusion and metallic-roughness textures become one ORM
37
+ * texture. Images are fetched (`url`) or read from the file once each, whatever shares them.
38
+ */
39
+ export declare function decodeGltfTextures(scene: GltfScene, o: GltfTextureOptions, warnings: string[]): Promise<{
40
+ textures: DecodedTexture[];
41
+ materials: MaterialTextures[];
42
+ }>;