@flighthq/scene3d-formats 0.2.1-next.840.857425c

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/dist/awd2Inflate.d.ts +4 -0
  2. package/dist/awd2Inflate.d.ts.map +1 -0
  3. package/dist/awd2Inflate.js +249 -0
  4. package/dist/awd2Inflate.js.map +1 -0
  5. package/dist/awd2Parse.d.ts +7 -0
  6. package/dist/awd2Parse.d.ts.map +1 -0
  7. package/dist/awd2Parse.js +1533 -0
  8. package/dist/awd2Parse.js.map +1 -0
  9. package/dist/awd2Schema.d.ts +44 -0
  10. package/dist/awd2Schema.d.ts.map +1 -0
  11. package/dist/awd2Schema.js +67 -0
  12. package/dist/awd2Schema.js.map +1 -0
  13. package/dist/gltfParse.d.ts +9 -0
  14. package/dist/gltfParse.d.ts.map +1 -0
  15. package/dist/gltfParse.js +1456 -0
  16. package/dist/gltfParse.js.map +1 -0
  17. package/dist/gltfPunctualLights.d.ts +3 -0
  18. package/dist/gltfPunctualLights.d.ts.map +1 -0
  19. package/dist/gltfPunctualLights.js +103 -0
  20. package/dist/gltfPunctualLights.js.map +1 -0
  21. package/dist/index.d.ts +12 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +12 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/md2Parse.d.ts +5 -0
  26. package/dist/md2Parse.d.ts.map +1 -0
  27. package/dist/md2Parse.js +408 -0
  28. package/dist/md2Parse.js.map +1 -0
  29. package/dist/md2Schema.d.ts +12 -0
  30. package/dist/md2Schema.d.ts.map +1 -0
  31. package/dist/md2Schema.js +193 -0
  32. package/dist/md2Schema.js.map +1 -0
  33. package/dist/md5AnimParse.d.ts +3 -0
  34. package/dist/md5AnimParse.d.ts.map +1 -0
  35. package/dist/md5AnimParse.js +385 -0
  36. package/dist/md5AnimParse.js.map +1 -0
  37. package/dist/md5Parse.d.ts +6 -0
  38. package/dist/md5Parse.d.ts.map +1 -0
  39. package/dist/md5Parse.js +635 -0
  40. package/dist/md5Parse.js.map +1 -0
  41. package/dist/mtlParse.d.ts +3 -0
  42. package/dist/mtlParse.d.ts.map +1 -0
  43. package/dist/mtlParse.js +256 -0
  44. package/dist/mtlParse.js.map +1 -0
  45. package/dist/objParse.d.ts +5 -0
  46. package/dist/objParse.d.ts.map +1 -0
  47. package/dist/objParse.js +464 -0
  48. package/dist/objParse.js.map +1 -0
  49. package/dist/sceneSkeleton.d.ts +3 -0
  50. package/dist/sceneSkeleton.d.ts.map +1 -0
  51. package/dist/sceneSkeleton.js +34 -0
  52. package/dist/sceneSkeleton.js.map +1 -0
  53. package/dist/shared.d.ts +18 -0
  54. package/dist/shared.d.ts.map +1 -0
  55. package/dist/shared.js +143 -0
  56. package/dist/shared.js.map +1 -0
  57. package/dist/threeDsParse.d.ts +4 -0
  58. package/dist/threeDsParse.d.ts.map +1 -0
  59. package/dist/threeDsParse.js +718 -0
  60. package/dist/threeDsParse.js.map +1 -0
  61. package/package.json +55 -0
  62. package/src/awd2Inflate.test.ts +118 -0
  63. package/src/awd2Parse.test.ts +2431 -0
  64. package/src/gltfParse.test.ts +2339 -0
  65. package/src/gltfPunctualLights.test.ts +184 -0
  66. package/src/gltfTreeShaking.test.ts +45 -0
  67. package/src/md2Parse.test.ts +1033 -0
  68. package/src/md5AnimParse.test.ts +673 -0
  69. package/src/md5Parse.test.ts +1094 -0
  70. package/src/mtlParse.test.ts +244 -0
  71. package/src/objParse.test.ts +690 -0
  72. package/src/sceneSkeleton.test.ts +35 -0
  73. package/src/shared.test.ts +210 -0
  74. package/src/threeDsParse.test.ts +1089 -0
@@ -0,0 +1,464 @@
1
+ import { createTransform3D } from '@flighthq/geometry';
2
+ import { reportImportDiagnostic } from '@flighthq/importdiagnostics';
3
+ import { createBlinnPhongMaterial } from '@flighthq/materials';
4
+ import { createMeshGeometry } from '@flighthq/mesh';
5
+ import { createScene3DFromDocument } from '@flighthq/scene3d';
6
+ import { ImportDiagnosticSeverity, MeshKind } from '@flighthq/types';
7
+ import { CANONICAL_FLOATS_PER_VERTEX, CANONICAL_LAYOUT, createExternalTextureRef } from './shared';
8
+ // Parses a Wavefront OBJ text source into a Scene3D. Convenience over `createScene3DFromDocument(parseObj
9
+ // (source, materials))`. See parseObj for the import model.
10
+ export function createScene3DFromObj(source, materials, diagnostics) {
11
+ return createScene3DFromDocument(parseObj(source, materials, diagnostics));
12
+ }
13
+ // Parses a Wavefront OBJ text source into a format-neutral Scene3DDocument. Each group (`g`) or object
14
+ // (`o`) — and any top-level faces before the first group — becomes one document Mesh (inline geometry),
15
+ // using the canonical vertex layout. A group that spans several `usemtl` materials becomes a single Mesh
16
+ // with one MeshSubset per material (contiguous index ranges) and a positional `materials` index array —
17
+ // not a wrapper over per-material child meshes. The optional `materials` argument supplies the material
18
+ // library referenced by `mtllib`/`usemtl`; each named material becomes a BlinnPhongMaterial (MTL's own
19
+ // Kd/Ks/Ns shading model) in the document's materials table, deduped by name. Without the library,
20
+ // material directives are acknowledged but the subset's material index stays absent (resolving to
21
+ // DefaultMaterialKind at draw time). Assemble into a live Scene3D with `createScene3DFromDocument`.
22
+ //
23
+ // Supported directives: `v`, `vn`, `vt`, `f`, `g`, `o`, `mtllib`, `usemtl`. Faces may be
24
+ // triangles, quads, or N-gons (fan-triangulated). Face vertex references support independent
25
+ // position/uv/normal indices (`v/vt/vn`, `v//vn`, `v/vt`) and negative (relative) indices.
26
+ //
27
+ // Malformed lines record a diagnostic and are skipped; the function never throws on bad input.
28
+ export function parseObj(source, materials, diagnostics) {
29
+ const positions = [];
30
+ const normals = [];
31
+ const uvs = [];
32
+ const document = {
33
+ animations: [],
34
+ cameras: [],
35
+ lights: [],
36
+ materials: [],
37
+ meshes: [],
38
+ metadata: null,
39
+ nodes: [],
40
+ resources: [],
41
+ scenes: [{ rootNodes: [] }],
42
+ skins: [],
43
+ };
44
+ // Name of the current group/object scope (undefined for top-level faces before the first group).
45
+ let currentGroupName;
46
+ // Material-keyed face collectors for the current group. Each key is a material name (or '' for
47
+ // no active material). The value accumulates interleaved vertex data and triangle indices for
48
+ // that material within the current group scope; each key becomes one subset of the group's Mesh.
49
+ let materialBuckets = new Map();
50
+ let activeMaterial = '';
51
+ // One document material index per MTL material name, shared across every mesh (and group) that uses it.
52
+ const resolvedMaterials = new Map();
53
+ // Repeated malformed lines/tokens are tallied here and flushed as ONE crumb per (kind, discriminator)
54
+ // after the parse — the collector contract forbids a per-element report inside this line loop. Null (and
55
+ // every tally call a no-op) when no collector is engaged, so an unopted parse stays allocation-free.
56
+ const objDrops = diagnostics ? new Map() : null;
57
+ const lines = source.split('\n');
58
+ for (let i = 0; i < lines.length; i++) {
59
+ const raw = lines[i].trim();
60
+ if (raw.length === 0 || raw.charCodeAt(0) === 35)
61
+ continue; // skip empty and # comments
62
+ const spaceIndex = raw.indexOf(' ');
63
+ if (spaceIndex < 0) {
64
+ // A bare recognized directive (no arguments). For v/vn/vt/f it drops the geometry it announced — a
65
+ // data-dropping branch, not a silent no-op. Bare `g` is the spec-defined DEFAULT (unnamed) group and
66
+ // bare `usemtl` the spec-defined DEFAULT material (white / no material) — Wavefront Appendix B1 — so both
67
+ // stay silent (valid input, no substitution). Bare `o` has NO spec default (the spec always names an
68
+ // object): the importer RECOVERS with an unnamed boundary, which the collector contract requires be
69
+ // recorded (a Recover crumb = continued with a substitute).
70
+ if (raw === 'v')
71
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.vertex-malformed', 'too-few-components', {
72
+ firstLine: i + 1,
73
+ reason: 'too-few-components',
74
+ });
75
+ else if (raw === 'vn')
76
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.normal-malformed', 'too-few-components', {
77
+ firstLine: i + 1,
78
+ reason: 'too-few-components',
79
+ });
80
+ else if (raw === 'vt')
81
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.uv-malformed', 'too-few-components', {
82
+ firstLine: i + 1,
83
+ reason: 'too-few-components',
84
+ });
85
+ else if (raw === 'f')
86
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.face-too-few-vertices', '', { firstLine: i + 1 });
87
+ else if (raw === 'g' || raw === 'o') {
88
+ // A bare `o` is unnamed input the spec does not define — record the recovery before performing it.
89
+ if (raw === 'o')
90
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Recover, 'obj.object-name-missing', '', {
91
+ firstLine: i + 1,
92
+ });
93
+ // Close the current group and enter the unnamed group — the same boundary a named g/o makes.
94
+ flushGroup(materialBuckets, currentGroupName, document, materials, resolvedMaterials, diagnostics);
95
+ materialBuckets = new Map();
96
+ currentGroupName = undefined;
97
+ }
98
+ else if (raw === 'usemtl') {
99
+ // Reset to the default material rather than leaving the previous one bound to subsequent faces.
100
+ activeMaterial = '';
101
+ }
102
+ // A bare `mtllib` names no library file; the library is supplied via the `materials` param, so — like a
103
+ // filename-bearing `mtllib` — it is a deliberate no-op (nothing to load, no authored data dropped).
104
+ continue;
105
+ }
106
+ const directive = raw.slice(0, spaceIndex);
107
+ const args = raw.slice(spaceIndex + 1).trim();
108
+ switch (directive) {
109
+ case 'v': {
110
+ const parts = args.split(/\s+/);
111
+ if (parts.length < 3) {
112
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.vertex-malformed', 'too-few-components', {
113
+ firstLine: i + 1,
114
+ reason: 'too-few-components',
115
+ });
116
+ break;
117
+ }
118
+ const x = parseFloat(parts[0]);
119
+ const y = parseFloat(parts[1]);
120
+ const z = parseFloat(parts[2]);
121
+ if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {
122
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.vertex-malformed', 'non-numeric', {
123
+ firstLine: i + 1,
124
+ reason: 'non-numeric',
125
+ });
126
+ break;
127
+ }
128
+ positions.push(x, y, z);
129
+ break;
130
+ }
131
+ case 'vn': {
132
+ const parts = args.split(/\s+/);
133
+ if (parts.length < 3) {
134
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.normal-malformed', 'too-few-components', {
135
+ firstLine: i + 1,
136
+ reason: 'too-few-components',
137
+ });
138
+ break;
139
+ }
140
+ const x = parseFloat(parts[0]);
141
+ const y = parseFloat(parts[1]);
142
+ const z = parseFloat(parts[2]);
143
+ if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {
144
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.normal-malformed', 'non-numeric', {
145
+ firstLine: i + 1,
146
+ reason: 'non-numeric',
147
+ });
148
+ break;
149
+ }
150
+ normals.push(x, y, z);
151
+ break;
152
+ }
153
+ case 'vt': {
154
+ const parts = args.split(/\s+/);
155
+ if (parts.length < 2) {
156
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.uv-malformed', 'too-few-components', {
157
+ firstLine: i + 1,
158
+ reason: 'too-few-components',
159
+ });
160
+ break;
161
+ }
162
+ const u = parseFloat(parts[0]);
163
+ const v = parseFloat(parts[1]);
164
+ if (!Number.isFinite(u) || !Number.isFinite(v)) {
165
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.uv-malformed', 'non-numeric', {
166
+ firstLine: i + 1,
167
+ reason: 'non-numeric',
168
+ });
169
+ break;
170
+ }
171
+ uvs.push(u, 1 - v);
172
+ break;
173
+ }
174
+ case 'f': {
175
+ const vertexTokens = args.split(/\s+/);
176
+ if (vertexTokens.length < 3) {
177
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.face-too-few-vertices', '', {
178
+ firstLine: i + 1,
179
+ });
180
+ break;
181
+ }
182
+ const bucket = getOrCreateBucket(materialBuckets, activeMaterial);
183
+ const faceIndices = [];
184
+ for (let vi = 0; vi < vertexTokens.length; vi++) {
185
+ const idx = parseFaceVertex(vertexTokens[vi], positions, uvs, normals, bucket, objDrops, i);
186
+ if (idx < 0)
187
+ break;
188
+ faceIndices.push(idx);
189
+ }
190
+ // Fan-triangulate the polygon.
191
+ if (faceIndices.length >= 3) {
192
+ for (let t = 1; t < faceIndices.length - 1; t++) {
193
+ bucket.indices.push(faceIndices[0], faceIndices[t], faceIndices[t + 1]);
194
+ }
195
+ }
196
+ break;
197
+ }
198
+ case 'g':
199
+ case 'o': {
200
+ // A group/object boundary flushes the accumulated faces as one Mesh (one subset per
201
+ // material) and starts a fresh group. `usemtl` state persists across the boundary per the
202
+ // OBJ spec — `g`/`o` name geometry, they do not reset the active material.
203
+ flushGroup(materialBuckets, currentGroupName, document, materials, resolvedMaterials, diagnostics);
204
+ materialBuckets = new Map();
205
+ currentGroupName = args || undefined;
206
+ break;
207
+ }
208
+ case 'usemtl': {
209
+ activeMaterial = args;
210
+ break;
211
+ }
212
+ case 'mtllib': {
213
+ // Acknowledged; the caller passes the parsed material library via the `materials` param.
214
+ break;
215
+ }
216
+ // Recognized OBJ directives Flight does not model: `s` (smoothing groups), `l`/`p` (line/point
217
+ // primitives). Crumb them (Skip) per directive so the drop is not silent; a truly-unknown directive
218
+ // falls through the default and stays silent (it is not an authored Flight-representable feature).
219
+ case 's':
220
+ case 'l':
221
+ case 'p':
222
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Skip, 'obj.directive-unsupported', directive, {
223
+ directive,
224
+ firstLine: i + 1,
225
+ });
226
+ break;
227
+ default:
228
+ break;
229
+ }
230
+ }
231
+ // Flush the final group's accumulated faces.
232
+ flushGroup(materialBuckets, currentGroupName, document, materials, resolvedMaterials, diagnostics);
233
+ // Emit the aggregated malformed-line/token tallies here in parseObj (the emitting function, so `parseObj`
234
+ // is the crumbs' origin per the collector contract) — one crumb per (kind, discriminator) with its count.
235
+ if (objDrops !== null) {
236
+ for (const tally of objDrops.values()) {
237
+ reportImportDiagnostic(diagnostics, tally.severity, tally.kind, 'parseObj', {
238
+ ...tally.detail,
239
+ count: tally.count,
240
+ });
241
+ }
242
+ }
243
+ return document;
244
+ }
245
+ function getOrCreateBucket(buckets, material) {
246
+ let bucket = buckets.get(material);
247
+ if (bucket === undefined) {
248
+ bucket = { dedup: new Map(), indices: [], vertices: [] };
249
+ buckets.set(material, bucket);
250
+ }
251
+ return bucket;
252
+ }
253
+ // Parses one face vertex token (e.g. "1/2/3", "1//3", "1/2", "1") and emits the vertex into the
254
+ // bucket, returning the emitted vertex index. Returns -1 on malformed input.
255
+ function parseFaceVertex(token, positions, uvs, normals, bucket, objDrops, lineIndex) {
256
+ const parts = token.split('/');
257
+ const posCount = positions.length / 3;
258
+ const uvCount = uvs.length / 2;
259
+ const normalCount = normals.length / 3;
260
+ // Position index (1-based, may be negative). Every drop is tallied — parseFaceVertex runs once per face
261
+ // vertex, so a per-token report would violate the collector's aggregate-once contract; the parseObj-level
262
+ // flush emits every tallied crumb (its origin).
263
+ const rawPosIdx = parseInt(parts[0], 10);
264
+ if (!Number.isFinite(rawPosIdx) || rawPosIdx === 0) {
265
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.face-vertex-invalid', '', {
266
+ firstLine: lineIndex + 1,
267
+ firstToken: token,
268
+ });
269
+ return -1;
270
+ }
271
+ const posIdx = rawPosIdx > 0 ? rawPosIdx - 1 : posCount + rawPosIdx;
272
+ if (posIdx < 0 || posIdx >= posCount) {
273
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Drop, 'obj.position-index-out-of-range', '', {
274
+ firstIndex: rawPosIdx,
275
+ firstLine: lineIndex + 1,
276
+ });
277
+ return -1;
278
+ }
279
+ // Optional uv/normal refs: a present-but-invalid token (non-numeric, zero, OR out of range) drops that
280
+ // attribute and keeps the vertex (Recover). The raw token in `firstToken` describes every case uniformly.
281
+ let uvIdx = -1;
282
+ if (parts.length >= 2 && parts[1].length > 0) {
283
+ uvIdx = resolveFaceAttrIndex(parts[1], uvCount);
284
+ if (uvIdx < 0) {
285
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Recover, 'obj.uv-index-invalid', '', {
286
+ firstLine: lineIndex + 1,
287
+ firstToken: parts[1],
288
+ });
289
+ }
290
+ }
291
+ let normalIdx = -1;
292
+ if (parts.length >= 3 && parts[2].length > 0) {
293
+ normalIdx = resolveFaceAttrIndex(parts[2], normalCount);
294
+ if (normalIdx < 0) {
295
+ tallyObjDrop(objDrops, ImportDiagnosticSeverity.Recover, 'obj.normal-index-invalid', '', {
296
+ firstLine: lineIndex + 1,
297
+ firstToken: parts[2],
298
+ });
299
+ }
300
+ }
301
+ // Dedup key: unique combination of resolved indices.
302
+ const key = `${posIdx}/${uvIdx}/${normalIdx}`;
303
+ const existing = bucket.dedup.get(key);
304
+ if (existing !== undefined)
305
+ return existing;
306
+ const vertexIndex = bucket.vertices.length / CANONICAL_FLOATS_PER_VERTEX;
307
+ // Position (3 floats).
308
+ bucket.vertices.push(positions[posIdx * 3], positions[posIdx * 3 + 1], positions[posIdx * 3 + 2]);
309
+ // Normal (3 floats).
310
+ if (normalIdx >= 0) {
311
+ bucket.vertices.push(normals[normalIdx * 3], normals[normalIdx * 3 + 1], normals[normalIdx * 3 + 2]);
312
+ }
313
+ else {
314
+ bucket.vertices.push(0, 0, 0);
315
+ }
316
+ // Tangent (4 floats) — OBJ does not carry tangents; zero-filled.
317
+ bucket.vertices.push(0, 0, 0, 0);
318
+ // UV (2 floats).
319
+ if (uvIdx >= 0) {
320
+ bucket.vertices.push(uvs[uvIdx * 2], uvs[uvIdx * 2 + 1]);
321
+ }
322
+ else {
323
+ bucket.vertices.push(0, 0);
324
+ }
325
+ bucket.dedup.set(key, vertexIndex);
326
+ return vertexIndex;
327
+ }
328
+ // Flushes a group's accumulated material buckets as ONE Mesh: the buckets' vertex records are
329
+ // concatenated into a single interleaved buffer and their triangles into a single index buffer,
330
+ // with one MeshSubset per non-empty bucket addressing that material's contiguous index range. The
331
+ // Mesh's positional `materials` array carries one entry per subset — the Flight material the
332
+ // bucket's `usemtl` name resolves to, or null when the name is unknown or no library was supplied
333
+ // (a null slot resolves to DefaultMaterialKind at draw time). A single-material group is one Mesh
334
+ // with one subset spanning the whole buffer; a multi-material group is one Mesh with several
335
+ // subsets, never a wrapper over per-material child meshes. A group with no faces adds nothing.
336
+ function flushGroup(buckets, name, document, library, resolvedMaterials, diagnostics) {
337
+ const vertices = [];
338
+ const indices = [];
339
+ const subsets = [];
340
+ const materials = [];
341
+ for (const [materialName, bucket] of buckets) {
342
+ if (bucket.indices.length === 0)
343
+ continue;
344
+ // Rebase this bucket's local indices onto the combined vertex buffer (its vertices are appended
345
+ // after everything already collected), then record its contiguous index range as one subset.
346
+ const vertexBase = vertices.length / CANONICAL_FLOATS_PER_VERTEX;
347
+ const indexOffset = indices.length;
348
+ for (let k = 0; k < bucket.indices.length; k++)
349
+ indices.push(bucket.indices[k] + vertexBase);
350
+ for (let k = 0; k < bucket.vertices.length; k++)
351
+ vertices.push(bucket.vertices[k]);
352
+ subsets.push({ indexCount: bucket.indices.length, indexOffset });
353
+ materials.push(resolveObjMaterial(materialName, library, resolvedMaterials, document, diagnostics));
354
+ }
355
+ if (subsets.length === 0)
356
+ return;
357
+ const geometry = createMeshGeometry({
358
+ indices: Uint32Array.from(indices),
359
+ layout: CANONICAL_LAYOUT,
360
+ subsets,
361
+ vertices: new Float32Array(vertices),
362
+ });
363
+ const meshIndex = document.meshes.length;
364
+ const mesh = { geometry, materials };
365
+ document.meshes.push(mesh);
366
+ const nodeIndex = document.nodes.length;
367
+ const node = { children: [], kind: MeshKind, mesh: meshIndex, transform: createTransform3D() };
368
+ if (name !== undefined)
369
+ node.name = name;
370
+ document.nodes.push(node);
371
+ document.scenes[0].rootNodes.push(nodeIndex);
372
+ }
373
+ // Converts a parsed MTL material to Flight's BlinnPhongMaterial — OBJ/MTL's own shading model.
374
+ // Kd → diffuse, Ks → specular, Ns → shininess, d (dissolve) → diffuse alpha plus blend mode, and the
375
+ // map_Kd/map_Ks/bump filenames → Unresolved External texture refs (the parser references, it does not
376
+ // load). Ka/map_Ka and the illum model have no Blinn-Phong equivalent — ambient is a scene light in
377
+ // Flight, not a material property — so they are dropped; a caller wanting metallic-roughness PBR
378
+ // converts explicitly downstream.
379
+ function objMaterialToBlinnPhong(material, document) {
380
+ const result = createBlinnPhongMaterial({
381
+ diffuse: packObjColor(material.diffuse, material.dissolve),
382
+ diffuseMap: externalObjTexture(material.mapDiffuse, document),
383
+ normalMap: externalObjTexture(material.mapBump, document),
384
+ shininess: material.specularExponent,
385
+ specular: packObjColor(material.specular, 1),
386
+ specularMap: externalObjTexture(material.mapSpecular, document),
387
+ });
388
+ // A dissolve below 1 is a translucent material; carry it as the diffuse alpha (above) plus a blend
389
+ // alphaMode so the renderer actually blends rather than treating the alpha as coverage-only.
390
+ if (material.dissolve < 1)
391
+ result.alphaMode = 'blend';
392
+ return result;
393
+ }
394
+ // Wraps an MTL texture filename as an Unresolved External resource ref; null filename → no map.
395
+ function externalObjTexture(uri, document) {
396
+ return uri === null ? null : createExternalTextureRef(uri, null, document.resources);
397
+ }
398
+ // Packs an MTL sRGB-space [r,g,b] triple (each in [0,1]) plus an alpha into a 0xRRGGBBAA integer.
399
+ function packObjColor(rgb, alpha) {
400
+ const r = clampChannel(rgb[0]);
401
+ const g = clampChannel(rgb[1]);
402
+ const b = clampChannel(rgb[2]);
403
+ const a = clampChannel(alpha);
404
+ return ((r << 24) | (g << 16) | (b << 8) | a) >>> 0;
405
+ }
406
+ function clampChannel(value) {
407
+ return Math.round(Math.min(1, Math.max(0, value)) * 0xff);
408
+ }
409
+ // Resolves an MTL material name to a document material INDEX, memoizing so a name shared across meshes
410
+ // registers one material entry. Empty name (no `usemtl`) or unknown name → -1 (no material; the assembler
411
+ // resolves an out-of-range index to null, DefaultMaterialKind at draw time). A resolved material is
412
+ // appended to the document's materials table and its index cached by name.
413
+ //
414
+ // A `usemtl` name absent from a SUPPLIED library drops that subset's authored material assignment — a
415
+ // data-dropping branch, so it records `obj.material-missing` (deduped by the same name cache, one crumb per
416
+ // distinct missing name). When no library was supplied at all the drop is the documented intentional path
417
+ // (materials resolved downstream), so it stays quiet.
418
+ function resolveObjMaterial(name, library, cache, document, diagnostics) {
419
+ if (name === '')
420
+ return -1;
421
+ const cached = cache.get(name);
422
+ if (cached !== undefined)
423
+ return cached;
424
+ const parsed = library?.materials.get(name);
425
+ if (parsed === undefined) {
426
+ if (library !== undefined) {
427
+ reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Drop, 'obj.material-missing', 'resolveObjMaterial', {
428
+ name,
429
+ });
430
+ }
431
+ cache.set(name, -1);
432
+ return -1;
433
+ }
434
+ const material = objMaterialToBlinnPhong(parsed, document);
435
+ // Preserve the MTL `newmtl` handle as the material's authored name (findScene3DMaterialByName).
436
+ material.name = name;
437
+ const index = document.materials.length;
438
+ document.materials.push(material);
439
+ cache.set(name, index);
440
+ return index;
441
+ }
442
+ // Resolves a 1-based (possibly negative) OBJ face attribute index against `count`; -1 when the token is
443
+ // non-numeric, zero, or resolves outside the table — every case of which drops that attribute reference.
444
+ function resolveFaceAttrIndex(token, count) {
445
+ const raw = parseInt(token, 10);
446
+ if (!Number.isFinite(raw) || raw === 0)
447
+ return -1;
448
+ const idx = raw > 0 ? raw - 1 : count + raw;
449
+ return idx < 0 || idx >= count ? -1 : idx;
450
+ }
451
+ // Records one offender against its (kind, discriminator) tally — the aggregate-once alternative to a
452
+ // per-element `reportImportDiagnostic` in the parse loop. No-op (and never allocates) when no collector is
453
+ // engaged. `firstDetail` is kept from the FIRST offender; later ones only bump the count.
454
+ function tallyObjDrop(tallies, severity, kind, discriminator, firstDetail) {
455
+ if (tallies === null)
456
+ return;
457
+ const key = `${kind}|${discriminator}`;
458
+ const existing = tallies.get(key);
459
+ if (existing === undefined)
460
+ tallies.set(key, { count: 1, detail: firstDetail, kind, severity });
461
+ else
462
+ existing.count++;
463
+ }
464
+ //# sourceMappingURL=objParse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objParse.js","sourceRoot":"","sources":["../src/objParse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAe9D,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEnG,0GAA0G;AAC1G,4DAA4D;AAC5D,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,SAAwC,EACxC,WAAgC;IAEhC,OAAO,yBAAyB,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,uGAAuG;AACvG,wGAAwG;AACxG,yGAAyG;AACzG,wGAAwG;AACxG,wGAAwG;AACxG,uGAAuG;AACvG,mGAAmG;AACnG,kGAAkG;AAClG,oGAAoG;AACpG,EAAE;AACF,yFAAyF;AACzF,6FAA6F;AAC7F,2FAA2F;AAC3F,EAAE;AACF,+FAA+F;AAC/F,MAAM,UAAU,QAAQ,CACtB,MAAc,EACd,SAAwC,EACxC,WAAgC;IAEhC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAoB;QAChC,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC3B,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,iGAAiG;IACjG,IAAI,gBAAoC,CAAC;IAEzC,+FAA+F;IAC/F,8FAA8F;IAC9F,iGAAiG;IACjG,IAAI,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;IACxD,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,wGAAwG;IACxG,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEpD,sGAAsG;IACtG,yGAAyG;IACzG,qGAAqG;IACrG,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,EAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,SAAS,CAAC,4BAA4B;QAExF,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,mGAAmG;YACnG,qGAAqG;YACrG,0GAA0G;YAC1G,qGAAqG;YACrG,oGAAoG;YACpG,4DAA4D;YAC5D,IAAI,GAAG,KAAK,GAAG;gBACb,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,EAAE,oBAAoB,EAAE;oBAClG,SAAS,EAAE,CAAC,GAAG,CAAC;oBAChB,MAAM,EAAE,oBAAoB;iBAC7B,CAAC,CAAC;iBACA,IAAI,GAAG,KAAK,IAAI;gBACnB,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,EAAE,oBAAoB,EAAE;oBAClG,SAAS,EAAE,CAAC,GAAG,CAAC;oBAChB,MAAM,EAAE,oBAAoB;iBAC7B,CAAC,CAAC;iBACA,IAAI,GAAG,KAAK,IAAI;gBACnB,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,EAAE;oBAC9F,SAAS,EAAE,CAAC,GAAG,CAAC;oBAChB,MAAM,EAAE,oBAAoB;iBAC7B,CAAC,CAAC;iBACA,IAAI,GAAG,KAAK,GAAG;gBAClB,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,2BAA2B,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBAC1G,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBACpC,mGAAmG;gBACnG,IAAI,GAAG,KAAK,GAAG;oBACb,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,EAAE,EAAE,EAAE;wBACtF,SAAS,EAAE,CAAC,GAAG,CAAC;qBACjB,CAAC,CAAC;gBACL,6FAA6F;gBAC7F,UAAU,CAAC,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;gBACnG,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;gBACpD,gBAAgB,GAAG,SAAS,CAAC;YAC/B,CAAC;iBAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,gGAAgG;gBAChG,cAAc,GAAG,EAAE,CAAC;YACtB,CAAC;YACD,wGAAwG;YACxG,oGAAoG;YACpG,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE9C,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,EAAE,oBAAoB,EAAE;wBAClG,SAAS,EAAE,CAAC,GAAG,CAAC;wBAChB,MAAM,EAAE,oBAAoB;qBAC7B,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtE,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,EAAE,aAAa,EAAE;wBAC3F,SAAS,EAAE,CAAC,GAAG,CAAC;wBAChB,MAAM,EAAE,aAAa;qBACtB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxB,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,CAAC,CAAC;gBACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,EAAE,oBAAoB,EAAE;wBAClG,SAAS,EAAE,CAAC,GAAG,CAAC;wBAChB,MAAM,EAAE,oBAAoB;qBAC7B,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtE,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,EAAE,aAAa,EAAE;wBAC3F,SAAS,EAAE,CAAC,GAAG,CAAC;wBAChB,MAAM,EAAE,aAAa;qBACtB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,CAAC,CAAC;gBACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,EAAE;wBAC9F,SAAS,EAAE,CAAC,GAAG,CAAC;wBAChB,MAAM,EAAE,oBAAoB;qBAC7B,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/C,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE;wBACvF,SAAS,EAAE,CAAC,GAAG,CAAC;wBAChB,MAAM,EAAE,aAAa;qBACtB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,2BAA2B,EAAE,EAAE,EAAE;wBACrF,SAAS,EAAE,CAAC,GAAG,CAAC;qBACjB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;gBAClE,MAAM,WAAW,GAAa,EAAE,CAAC;gBAEjC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;oBAChD,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;oBAC5F,IAAI,GAAG,GAAG,CAAC;wBAAE,MAAM;oBACnB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC;gBAED,+BAA+B;gBAC/B,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;wBAChD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC1E,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,oFAAoF;gBACpF,0FAA0F;gBAC1F,2EAA2E;gBAC3E,UAAU,CAAC,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;gBACnG,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;gBACpD,gBAAgB,GAAG,IAAI,IAAI,SAAS,CAAC;gBACrC,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,yFAAyF;gBACzF,MAAM;YACR,CAAC;YACD,+FAA+F;YAC/F,oGAAoG;YACpG,mGAAmG;YACnG,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC;YACT,KAAK,GAAG;gBACN,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,2BAA2B,EAAE,SAAS,EAAE;oBAC5F,SAAS;oBACT,SAAS,EAAE,CAAC,GAAG,CAAC;iBACjB,CAAC,CAAC;gBACH,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,UAAU,CAAC,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAEnG,0GAA0G;IAC1G,0GAA0G;IAC1G,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,sBAAsB,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE;gBAC1E,GAAG,KAAK,CAAC,MAAM;gBACf,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAWD,SAAS,iBAAiB,CAAC,OAAoC,EAAE,QAAgB;IAC/E,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gGAAgG;AAChG,6EAA6E;AAC7E,SAAS,eAAe,CACtB,KAAa,EACb,SAA4B,EAC5B,GAAsB,EACtB,OAA0B,EAC1B,MAAsB,EACtB,QAA0C,EAC1C,SAAiB;IAEjB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvC,wGAAwG;IACxG,0GAA0G;IAC1G,gDAAgD;IAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACnD,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,yBAAyB,EAAE,EAAE,EAAE;YACnF,SAAS,EAAE,SAAS,GAAG,CAAC;YACxB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC;IACpE,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;QACrC,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,iCAAiC,EAAE,EAAE,EAAE;YAC3F,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,SAAS,GAAG,CAAC;SACzB,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAED,uGAAuG;IACvG,0GAA0G;IAC1G,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,OAAO,EAAE,sBAAsB,EAAE,EAAE,EAAE;gBACnF,SAAS,EAAE,SAAS,GAAG,CAAC;gBACxB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACxD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,OAAO,EAAE,0BAA0B,EAAE,EAAE,EAAE;gBACvF,SAAS,EAAE,SAAS,GAAG,CAAC;gBACxB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAE5C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,2BAA2B,CAAC;IAEzE,uBAAuB;IACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAElG,qBAAqB;IACrB,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,iEAAiE;IACjE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjC,iBAAiB;IACjB,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACnC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,8FAA8F;AAC9F,gGAAgG;AAChG,kGAAkG;AAClG,6FAA6F;AAC7F,kGAAkG;AAClG,kGAAkG;AAClG,6FAA6F;AAC7F,+FAA+F;AAC/F,SAAS,UAAU,CACjB,OAA8C,EAC9C,IAAwB,EACxB,QAAyB,EACzB,OAAiD,EACjD,iBAAsC,EACtC,WAA2C;IAE3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE1C,gGAAgG;QAChG,6FAA6F;QAC7F,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,2BAA2B,CAAC;QACjE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnF,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACjE,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC,MAAM,EAAE,gBAAgB;QACxB,OAAO;QACP,QAAQ,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC;KACrC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACzC,MAAM,IAAI,GAAwB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC1D,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACxC,MAAM,IAAI,GAAwB,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC;IACpH,IAAI,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,+FAA+F;AAC/F,qGAAqG;AACrG,sGAAsG;AACtG,oGAAoG;AACpG,iGAAiG;AACjG,kCAAkC;AAClC,SAAS,uBAAuB,CAAC,QAA+B,EAAE,QAAyB;IACzF,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACtC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAC1D,UAAU,EAAE,kBAAkB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;QAC7D,SAAS,EAAE,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzD,SAAS,EAAE,QAAQ,CAAC,gBAAgB;QACpC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5C,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;KAChE,CAAC,CAAC;IACH,mGAAmG;IACnG,6FAA6F;IAC7F,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gGAAgG;AAChG,SAAS,kBAAkB,CAAC,GAAkB,EAAE,QAAyB;IACvE,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvF,CAAC;AAED,kGAAkG;AAClG,SAAS,YAAY,CAAC,GAAsC,EAAE,KAAa;IACzE,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,uGAAuG;AACvG,0GAA0G;AAC1G,oGAAoG;AACpG,2EAA2E;AAC3E,EAAE;AACF,sGAAsG;AACtG,4GAA4G;AAC5G,0GAA0G;AAC1G,sDAAsD;AACtD,SAAS,kBAAkB,CACzB,IAAY,EACZ,OAAiD,EACjD,KAA0B,EAC1B,QAAyB,EACzB,WAA2C;IAE3C,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,MAAM,MAAM,GAAG,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,sBAAsB,CAAC,WAAW,EAAE,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,EAAE,oBAAoB,EAAE;gBAC/G,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAwB,CAAC;IAClF,gGAAgG;IAChG,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAmC,CAAC,CAAC;IAC7D,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wGAAwG;AACxG,yGAAyG;AACzG,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAa;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC;IAC5C,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC5C,CAAC;AAaD,qGAAqG;AACrG,2GAA2G;AAC3G,0FAA0F;AAC1F,SAAS,YAAY,CACnB,OAAyC,EACzC,QAAkC,EAClC,IAAY,EACZ,aAAqB,EACrB,WAAsD;IAEtD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO;IAC7B,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,aAAa,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;;QAC3F,QAAQ,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Node3D } from '@flighthq/types';
2
+ export declare function findScene3DSkeletonJoints(root: Readonly<Node3D>): readonly Node3D[] | null;
3
+ //# sourceMappingURL=sceneSkeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneSkeleton.d.ts","sourceRoot":"","sources":["../src/sceneSkeleton.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAoBpD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAW1F"}
@@ -0,0 +1,34 @@
1
+ import { getNodeChildren } from '@flighthq/node';
2
+ import { isMesh } from '@flighthq/scene3d';
3
+ // Walks a built scene for the first skinned mesh and returns its skeleton's joint nodes — the same node
4
+ // handles the skin was bound to, so an animation clip bound to them deforms the mesh. Null when the scene
5
+ // has no skinned mesh.
6
+ //
7
+ // This is the PUBLIC joint-finder for the multi-clip skeletal-import workflow: import the mesh once, then
8
+ // bind several animations to its skeleton by name-safe joint handles rather than re-collecting them by
9
+ // hand. For a single `.md5anim` prefer the `importMd5Mesh(meshSource, animSource)` composer, which uses
10
+ // this internally; for MULTIPLE clips against one mesh, `createScene3DFromMd5Mesh` produces a scene with no
11
+ // animation, and this finds the joints each `parseMd5Anim` binds to:
12
+ //
13
+ // const scene = createScene3DFromMd5Mesh(meshSource);
14
+ // const joints = findScene3DSkeletonJoints(scene.root)!;
15
+ // scene.animations['walk'] = parseMd5Anim(walkSource, joints)!;
16
+ // scene.animations['run'] = parseMd5Anim(runSource, joints)!;
17
+ //
18
+ // Use this rather than hand-rolling `getNodeChildByName(root, 'skeleton')` + a manual descendant walk: the
19
+ // MD5/AWD anim binders match channels to joints by NAME, so any joint set carrying the right names works,
20
+ // but this returns the skin's own joint array directly — the canonical, order-and-name-correct handle set.
21
+ export function findScene3DSkeletonJoints(root) {
22
+ const stack = [...getNodeChildren(root)];
23
+ while (stack.length > 0) {
24
+ const node = stack.pop();
25
+ if (isMesh(node)) {
26
+ const skin = node.skin;
27
+ if (skin != null)
28
+ return skin.skeleton.joints;
29
+ }
30
+ stack.push(...getNodeChildren(node));
31
+ }
32
+ return null;
33
+ }
34
+ //# sourceMappingURL=sceneSkeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneSkeleton.js","sourceRoot":"","sources":["../src/sceneSkeleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,wGAAwG;AACxG,0GAA0G;AAC1G,uBAAuB;AACvB,EAAE;AACF,0GAA0G;AAC1G,uGAAuG;AACvG,wGAAwG;AACxG,4GAA4G;AAC5G,qEAAqE;AACrE,EAAE;AACF,wDAAwD;AACxD,2DAA2D;AAC3D,kEAAkE;AAClE,gEAAgE;AAChE,EAAE;AACF,2GAA2G;AAC3G,0GAA0G;AAC1G,2GAA2G;AAC3G,MAAM,UAAU,yBAAyB,CAAC,IAAsB;IAC9D,MAAM,KAAK,GAAa,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC1B,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,GAAI,IAAwB,CAAC,IAAI,CAAC;YAC5C,IAAI,IAAI,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { EmbeddedImageResourceReference, ExternalImageResourceReference, ImageResourceReference, SkinInfluence, Texture, VertexAttributeLayout } from '@flighthq/types';
2
+ export declare const CANONICAL_FLOATS_PER_VERTEX = 12;
3
+ export declare const CANONICAL_LAYOUT: VertexAttributeLayout;
4
+ export declare const SKINNED_FLOATS_PER_VERTEX: number;
5
+ export declare const MAX_SKIN_INFLUENCES = 4;
6
+ export declare function buildEmbeddedImageResourceReference(bytes: Uint8Array, mimeType: string | null): EmbeddedImageResourceReference;
7
+ export declare function buildExternalImageResourceReference(uri: string, basePath?: string | null): ExternalImageResourceReference;
8
+ export declare function convertPositionsZUpToYUp(values: ArrayLike<number> & {
9
+ [i: number]: number;
10
+ }, stride?: number, offset?: number): void;
11
+ export declare function convertQuaternionsZUpToYUp(values: number[], stride?: number, offset?: number): void;
12
+ export declare function convertTransformLhToRh(transform: Float64Array): void;
13
+ export declare function createEmbeddedTextureRef(bytes: Uint8Array, mimeType: string | null, resources?: ImageResourceReference[]): Texture;
14
+ export declare function createExternalTextureRef(uri: string, basePath?: string | null, resources?: ImageResourceReference[]): Texture;
15
+ export declare function negateVec3Z(values: number[]): void;
16
+ export declare function packSkinInfluences(influences: SkinInfluence[], outJoints: number[], outWeights: number[]): void;
17
+ export declare function reverseTriangleWinding(indices: number[]): void;
18
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,aAAa,EACb,OAAO,EACP,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAGzB,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,gBAAgB,EAAE,qBAQ9B,CAAC;AAIF,eAAO,MAAM,yBAAyB,QAAoD,CAAC;AAK3F,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,8BAA8B,CAQhC;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,GAAG,IAAW,GAC7B,8BAA8B,CAShC;AAWD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACnD,MAAM,SAAI,EACV,MAAM,SAAI,GACT,IAAI,CAMN;AAID,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,SAAI,EAAE,MAAM,SAAI,GAAG,IAAI,CAMzF;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI,CAQpE;AAMD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,SAAS,CAAC,EAAE,sBAAsB,EAAE,GACnC,OAAO,CAYT;AAOD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,SAAS,CAAC,EAAE,sBAAsB,EAAE,GACnC,OAAO,CAYT;AAKD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAIlD;AAQD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAc/G;AAMD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAM9D"}